目录
1 用 numpy 快速求数组的各种统计量:mean, var, std
1.1 数据准备
1.2 直接用np的公式求解
1.3 注意问题
1.4 用print() 输出内容,显示效果
2 为了验证公式的背后的理解,下面是详细的展开公式的求法
2.1 均值mean的详细
2.2 方差var的详细
2.2.1 一个比较奇怪的问题
2.2 (数组-均值)→离差数组→离差平方数组→离差平方和数
2.3 方差 var
2.4 标准差std
3 各种类型的数据平均数: min, max ,mean ,median, mode() 的求法
3.1 min, max ,mean ,median
3.2 众数mode()需要间接求
4 四分位数
4.1 什么是四分位数
4.2 如何求?
5 上面的所有测试代码 和对应测试结果
5.1 测试代码
5.2 测试结果
6 如果需要统计 pd.DataFrame的某些列/字段的统计量呢?
6.1 如果是统计某列的整体属性
6.2 如果是统计pd.DataFrame的某列的分组属性,需要分组统计呢?
6.3 利用pd.DataFrame.groupby()方法,进行统计
6.4 下面是上述使用pd.DataFrame.groupby()的例子
1 用 numpy 快速求数组的各种统计量:mean, var, std
1.1 数据准备
- 先生成一个纯数字列表,list1=[1,2,3,4,5,6,7,8,9,10]
- 转化为np的数组,array1=np.array(list1)
1.2 直接用np的公式求解
- mu1=np.mean(array1)
- var1=np.var(array1) #默认缺省 ddof=0,方差有偏估计
- var11=np.var(array1,ddof=1) #ddof 无偏估计
- std1=np.std(array1)
- std11=np.std(array1,ddof=1)
1.3 注意问题
# 以前可以用 scipy.mean() 等方法求,现在要被取消了,所以会报错
#报错 scipy.mean is deprecated and will be removed in SciPy 2.0.0
#mu1=sp.mean(array1)
#var1=sp.var(array1)
#std1=sp.std(array1)
import scipy as sp
import numpy as np
import pandas as pd
list1=[1,2,3,4,5,6,7,8,9,10]
array1=np.array(list1)
#现在只能用numpy求这些
mu1=np.mean(array1)
var1=np.var(array1) #默认缺省 ddof=0,方差有偏估计
var11=np.var(array1,ddof=1) #ddof 无偏估计
std1=np.std(array1)
std11=np.std(array1,ddof=1)
1.4 用print() 输出内容,显示效果
- 不适合的
- print("mu1%d=" %555) #%d %s 只适合数字,字符串,不适合变量,变量当参数会报错
- 比较老旧的用法
- print("var1={0}".format(var1)) #适合变量带入,不灵活,不能用参数名需要标数字对应
- print("var11={0}".format(var11))
- 好用但是比较山寨的
- print("mu1=" ,mu1) #比较山寨,但是可以
- 最好用的
- print(f"std1={std1}") #适合变量带入,带入的是参数名,灵活
- print(f"std11={std11}")
2 为了验证公式的背后的理解,下面是详细的展开公式的求法
2.1 均值mean的详细
- 求sum,使用np.sum
- 求数组长度 len()
- 求均值 mu=np.sum/len()
2.2 方差var的详细
2.2.1 一个比较奇怪的问题
#无法一步数组-数字,然后求和???
#报错 SyntaxError: invalid decimal literal
#ss=np.sum((array1-mu2)**2)
#ss=sum((array1-mu2)**2)
2.2 (数组-均值)→离差数组→离差平方数组→离差平方和数
- (数组-均值)→离差数组→离差平方数组→离差平方和数
- #必须得拆开求SS?
- xx=array1-mu2 # 离差数组(数组)
- yy=xx**2 # 离差平方数组(数组)
- ss=sum(yy) # SS就是离差平方和(数字!)
- print("离差数组xx=",xx)
- print("离差平方数组yy=",yy)
- print("离差平方和ss=",ss)
2.3 方差 var
- 我们只能得到样本方差,但是我们可以估计出总体方差
- 样本方差=有偏(总体)方差var=ss/n
- 无偏(总体)方差var=ss/(n-1)
2.4 标准差std
- 样本标准差
- 样本无偏标准差
- 总体无偏标准差
import scipy as sp
import numpy as np
import pandas as pd
list1=[1,2,3,4,5,6,7,8,9,10]
array1=np.array(list1)
# 下面是展开的求法,求数组的各种统计量------------验证上面内容
sum2=np.sum(array1)
#n=np.len(array1)
n=len(array1) #len()是python的基础方法
mu2=sum2/n
#无法一步数组-数字,然后求和???
#报错 SyntaxError: invalid decimal literal
#ss=np.sum((array1-mu2)**2)
#ss=sum((array1-mu2)**2)
#必须得拆开求SS?
xx=array1-mu2 # 离差数组(数组)
yy=xx**2 # 离差平方数组(数组)
ss=sum(yy) # SS就是离差平方和(数字!)
print("离差数组xx=",xx)
print("离差平方数组yy=",yy)
print("离差平方和ss=",ss)
var2=ss/n
var22=ss/(n-1)
std2=np.sqrt(var2)
std22=np.sqrt(var22)
#结果和上面是相同的
print("mu2=" ,mu2)
print("var2={0}".format(var2))
print("var22={0}".format(var22))
print(f"std2={std2}")
print(f"std22={std22}")
3 各种类型的数据平均数: min, max ,mean ,median, mode() 的求法
3.1 min, max ,mean ,median
#其他统计内容
- print(np.min(array1))
- print(np.max(array1))
- print(np.mean(array1))
- print(np.median(array1))
#其他统计内容
print(np.min(array1))
print(np.max(array1))
print(np.mean(array1))
print(np.median(array1))
countList = np.bincount(np.array(array1))
mode = np.argmax(countList)
print(mode)
3.2 众数mode()需要间接求
numpy无法直接求众数,这个方法是网上查的
- 主要思路就是求每个数的出现次数,然后去查对应出现次数最多的元素就是众数。
- countList = np.bincount(np.array(array1))
- #np.bincount用于统计输入数组中每个数值出现的次数
- #np.argmax是用于取得数组中每一行或者每一列的的最大值
- mode = np.argmax(countList)
- print(mode)
4 四分位数
4.1 什么是四分位数
- 其实四分位数,就是 0%,25% ,50%,75%,100% 这5个点组成的四个均等1/4长线段
- 本身0%,100% 就是min 和 max
- 新加25% ,50%,75% 即可区分4个1/4四分位的线段
4.2 如何求?
- sp.stats.scoreatpercentile(array1,25) 即25%,即1/4分位的数
print("#四分位数")
#四分位数
print(sp.stats.scoreatpercentile(array1,0))
print(sp.stats.scoreatpercentile(array1,25))
print(sp.stats.scoreatpercentile(array1,50))
print(sp.stats.scoreatpercentile(array1,75))
print(sp.stats.scoreatpercentile(array1,100))
5 上面的所有测试代码 和对应测试结果
5.1 测试代码
import scipy as sp
import numpy as np
import pandas as pd
list1=[1,2,3,4,5,6,7,8,9,10]
array1=np.array(list1)
print("#日常用法----用numpy 快速求数组的各种统计量")
# 用numpy 快速求数组的各种统计量----------日常用法
#报错 scipy.mean is deprecated and will be removed in SciPy 2.0.0
#mu1=sp.mean(array1)
#var1=sp.var(array1)
#std1=sp.std(array1)
#现在只能用numpy求这些
mu1=np.mean(array1)
var1=np.var(array1) #默认缺省 ddof=0,方差有偏估计
var11=np.var(array1,ddof=1) #ddof 无偏估计
std1=np.std(array1)
std11=np.std(array1,ddof=1)
print("mu1%d=" %555) #%d %s 只适合数字,字符串,不适合变量,变量当参数会报错
print("mu1=" ,mu1) #比较山寨,但是可以
print("var1={0}".format(var1)) #适合变量带入,不灵活,不能用参数名需要标数字对应
print("var11={0}".format(var11))
print(f"std1={std1}") #适合变量带入,带入的是参数名,灵活
print(f"std11={std11}")
print()
print("# 下面是详细的展开公式的求法,求数组的各种统计量----------验证上面内容")
# 下面是展开的求法,求数组的各种统计量------------验证上面内容
sum2=np.sum(array1)
#n=np.len(array1)
n=len(array1) #len()是python的基础方法
mu2=sum2/n
#无法一步数组-数字,然后求和???
#报错 SyntaxError: invalid decimal literal
#ss=np.sum((array1-mu2)**2)
#ss=sum((array1-mu2)**2)
#必须得拆开求SS?
xx=array1-mu2 # 离差数组(数组)
yy=xx**2 # 离差平方数组(数组)
ss=sum(yy) # SS就是离差平方和(数字!)
print("离差数组xx=",xx)
print("离差平方数组yy=",yy)
print("离差平方和ss=",ss)
var2=ss/n
var22=ss/(n-1)
std2=np.sqrt(var2)
std22=np.sqrt(var22)
#结果和上面是相同的
print("mu2=" ,mu2)
print("var2={0}".format(var2))
print("var22={0}".format(var22))
print(f"std2={std2}")
print(f"std22={std22}")
print("")
print("#其他统计内容")
#其他统计内容
print(np.min(array1))
print(np.max(array1))
print(np.mean(array1))
print(np.median(array1))
countList = np.bincount(np.array(array1))
mode = np.argmax(countList)
print(mode)
print("")
print("#四分位数")
#四分位数
print(sp.stats.scoreatpercentile(array1,0))
print(sp.stats.scoreatpercentile(array1,25))
print(sp.stats.scoreatpercentile(array1,50))
print(sp.stats.scoreatpercentile(array1,75))
print(sp.stats.scoreatpercentile(array1,100))
5.2 测试结果
6 如果需要统计 pd.DataFrame的某些列/字段的统计量呢?
6.1 如果是统计某列的整体属性
- 如果是统计某列的整体属性
- 理论上,直接把pd.DataFrame的某个列取出来,
- 变成pd.Series,
- 然后变成 np.array() 数组
- 然后对数据使用 np.mean() ,np.var() np.std() 即可
# 如果需要统计 pd.DataFrame的某个列,有时候可以取出1列来,这样直接分析。这样分析的是某一列的平均属性
series1=dataframe1["length"]
array11=series1.valuesprint(array11)
print()mu1=np.mean(array11)
var1=np.var(array11)
var11=np.var(array11,ddof=1)
std1=np.std(array11)
std11=np.std(array11,ddof=1)
6.2 如果是统计pd.DataFrame的某列的分组属性,需要分组统计呢?
如果需要统计 pd.DataFrame的某个列,如果不是统计某列的平均属性,而是要进行分组统计呢?
利用pd.DataFrame.groupby()方法"
- group1=dataframe1.groupby("species")
- group1.describe()
- group1.mean()
- 等等
6.3 利用pd.DataFrame.groupby()方法,进行统计
- group1=dataframe1.groupby("species")
直接显示全部统计属性,更快,更方便
- group1.describe()
下面可以分别显示属性
- print(group1.mean())
- print(group1.var())
- print(group1.var(ddof=1))
- print(group1.std())
- print(group1.std(ddof=1))
6.4 下面是上述使用pd.DataFrame.groupby()的例子
import numpy as np
import pandas as pd
import scipy as sp
%precision 3
list2=["A","A","A","B","B","B"]
list3=[10,12,14,20,24,28]
array2=np.array(list2)
array3=np.array(list3)
#pd.DataFrame 注意驼峰命名法,2个首字母都要大写
dataframe1=pd.DataFrame({"species":array2,"length":array3})
print(dataframe1)
print()
# 如果需要统计 pd.DataFrame的某个列,有时候可以取出1列来,这样直接分析。这样分析的是某一列的平均属性
series1=dataframe1["length"]
array11=series1.values
print(array11)
print()
mu1=np.mean(array11)
var1=np.var(array11)
var11=np.var(array11,ddof=1)
std1=np.std(array11)
std11=np.std(array11,ddof=1)
print("mu1%d=" %555) #%d %s 只适合数字,字符串,不适合变量,变量当参数会报错
print("mu1=" ,mu1) #比较山寨,但是可以
print("var1={0}".format(var1)) #适合变量带入,不灵活,不能用参数名需要标数字对应
print("var11={0}".format(var11))
print(f"std1={std1}") #适合变量带入,带入的是参数名,灵活
print(f"std11={std11}")
print()
#如果需要统计 pd.DataFrame的某个列,如果不是统计某列的平均属性,而是要进行分组统计呢?
print("利用pd.DataFrame.groupby()方法")
group1=dataframe1.groupby("species")
print(group1.mean())
print(group1.var())
print(group1.var(ddof=1))
print(group1.std())
print(group1.std(ddof=1))
group1.describe()