在采集到大量的样本数据以后,常常需要用一些统计量来描述数据的集中程度和离散程度,并通过这些指标对数据的总体特征进行归纳。[大谦Excel,dqexcel点com]
描述集中趋势
描述样本数据集中趋势的统计量有算术平均值、中值、几何均值、调和均值、截尾均值、众数和分位数等。
1.算术平均值
样本数据的算术平均值可用下式定义:
2.中值
中值是将样本数据从小到大排序后处于中间位置的那个值。
3.几何均值
样本数据的几何均值m可以根据下式求得:
4.调和均值
样本数据的调和平均值定义为
5.截尾均值
对样本数据进行排序以后,去掉两端的部分极值,然后对剩下的数据求算术平均值,就可以得到截尾均值。
4. 众数
众数是样本数据中出现次数最多的数。如果样本数据中没有重复值,众数为0。
7. 分位数
将样本数据从小到大排序后指定位置p%处的数称为p%分位数。中值是50%分位数。
有一大袋糖果,现从中随机取16袋,称得重量如图4-1工作表中A列所示。求数据的算术平均值、几何均值、调和均值、截尾均值、中值、众数和25%分位数。
Excel中现在至少有两种方式计算这些统计量,即使用Excel函数计算和使用内置Python计算。先介绍用Excel函数进行计算。
如图4-1所示,在D2单元格输入公式:
=AVERAGE($A$1:$A$16)
在D3单元格输入公式:
=GEOMEAN($A$1:$A$16)
在D4单元格输入公式:
=HARMEAN($A$1:$A$16)
在D5单元格输入公式:
=TRIMMEAN($A$1:$A$16)
在D6单元格输入公式:
=MEDIAN($A$1:$A$16)
在D7单元格输入公式:
=MODE($A$1:$A$16)
在D8单元格输入公式:
=PERCENTILE($A$1:$A$16,0.25)
在D9单元格输入公式:
=QUARTILE($A$1:$A$16,1) 1,2,3,4
计算结果如图4-1所示。
图4-1 用Excel函数计算集中趋势统计量
下面用Excel内置Python进行计算。
如图4-2所示,在D2单元格中首先输入“=PY(”进入Python模式,然后在公式栏中输入下面的代码:
data=xl("$A$1:$A$16").values
np.mean(data)
单击Ctrl+Enter键,返回一个标量值,表示算术平均值。
类似操作,D3单元格中在Python模式下在公式栏中输入下面的代码:
from scipy import stats as st
data=xl("$A$1:$A$16").values
gm=st.gmean(data)
gm[0]
单击Ctrl+Enter键,返回一个标量值,表示几何均值。
D4单元格中在Python模式下在公式栏中输入下面的代码:
from scipy import stats as st
data=xl("$A$1:$A$16").values
hm=st.hmean(data)
hm[0]
单击Ctrl+Enter键,返回一个标量值,表示调和均值。
D5单元格中在Python模式下在公式栏中输入下面的代码:
from scipy import stats as st
data=xl("$A$1:$A$16").values
tm=st.tmean(data)
单击Ctrl+Enter键,返回一个标量值,表示截尾均值。
D6单元格中在Python模式下在公式栏中输入下面的代码:
data=xl("$A$1:$A$16").values
np.median(data)
单击Ctrl+Enter键,返回一个标量值,表示中值。
D7单元格中在Python模式下在公式栏中输入下面的代码:
from scipy import stats as st
data=xl("$A$1:$A$16").values
md=st.mode(data)
md[0][0][0]
单击Ctrl+Enter键,返回一个标量值,表示众数。
D8单元格中在Python模式下在公式栏中输入下面的代码:
from scipy import stats as st
data=xl("$A$1:$A$16").values
st.scoreatpercentile(data,25)
单击Ctrl+Enter键,返回一个标量值,表示分位数。
图4-2 用Excel内置Python计算集中趋势统计量
描述离中趋势
描述样本数据离散趋势的统计量包括极差、方差、标准差、均值绝对差、内四分极差和变异系数等。
1.极差
极差指的是样本数据中最大值与最小值的差值。
2.方差
样本数据的方差可以定义为
式中
表示样本均值。
3.标准差
样本数据的标准差可以定义为
式中为样本数据的方差。
4.均值绝对差
均值绝对差(MAD)指的是将每个样本数据减去样本数据的均值得到的结果取绝对值,然后对所有绝对值求均值。
5. 内四分极差
内四分极差指的是样本数据从小到大排序后75%与25%位置处的值之差。
6 变异系数
变异系数指的是样本数据的标准差与均值之比,通常用百分比表示。
仍然使用计算集中趋势统计量的数据,计算极差、方差、标准差、均值绝对差、内四分极差和变异系数。首先用Excel函数进行计算。
如图4-3所示,在D2单元格输入公式:
=MAX($A$1:$A$16)-MIN($A$1:$A$16)
在D3单元格输入公式:
=VAR($A$1:$A$16)
在D4单元格输入公式:
=STDEV($A$1:$A$16)
在D5单元格输入公式:
=AVERAGE(ABS($A$1:$A$16-AVERAGE($A$1:$A$16)))
在D6单元格输入公式:
=QUARTILE($A$1:$A$16,3)-QUARTILE($A$1:$A$16,1)
在D7单元格输入公式:
=STDEV($A$1:$A$16)/AVERAGE($A$1:$A$16)
计算结果及其对应的意义如图4-3工作表中所示。
图4-3 用Excel函数计算描述离中趋势的统计量
下面用Excel内置Python进行计算。
如图4-4所示,D2单元格中在Python模式下在公式栏中输入下面的代码:
data=xl(‘$A$1:$A$16’).values
np.ptp(data)
单击Ctrl+Enter键,返回一个标量值,表示极差。
D3单元格中在Python模式下在公式栏中输入下面的代码:
from scipy import stats as st
data=xl(‘$A$1:$A$16’).values
st.tvar(data,ddof=1)
单击Ctrl+Enter键,返回一个标量值,表示方差。
D4单元格中在Python模式下在公式栏中输入下面的代码:
from scipy import stats as st
data=xl(‘$A$1:$A$16’).values
st.tstd(data,ddof=1)
单击Ctrl+Enter键,返回一个标量值,表示标准差。
D5单元格中在Python模式下在公式栏中输入下面的代码:
data=xl(‘$A$1:$A$16’).values
np.mean(np.abs(data-np.mean(data)))
单击Ctrl+Enter键,返回一个标量值,表示均值绝对差。
D6单元格中在Python模式下在公式栏中输入下面的代码:
from scipy import stats as st
data=xl(‘$A$1:$A$16’).values
st.iqr(data)
单击Ctrl+Enter键,返回一个标量值,表示内四分极差。
D7单元格中在Python模式下在公式栏中输入下面的代码:
from scipy import stats as st
data=xl(‘$A$1:$A$16’).values
st.tstd(data)/st.tmean(data)
单击Ctrl+Enter键,返回一个标量值,表示变异系数。
图4-4 用Excel内置Python计算描述离中趋势的统计量
描述形状
对于给定的一维数组数据,可以用峰度和偏度描述数据的形状,即可以用它们描述数据在高度和宽度两个方向上的度量,是瘦高型、矮胖型?或是左偏、右偏等。
仍然使用计算集中趋势统计量的数据,计算峰度和偏度。首先用Excel函数进行计算。
如图4-5所示,在D2单元格输入公式:
=SKEW($A$1:$A$16)
在D3单元格输入公式:
=KURT($A$1:$A$16)
计算结果及其对应的意义如图4-5工作表中所示。
图4-5 用Excel函数计算峰度和偏度
下面用Excel内置Python进行计算。
如图4-6所示,D2单元格中在Python模式下在公式栏中输入下面的代码:
from scipy import stats as st
data=xl(‘$A$1:$A$16’).values
st.kurtosis(data,bias=False)
单击Ctrl+Enter键,返回一个标量值,表示峰度。代码中bias=True表示总体偏度,bias=False表示样本偏度。
D3单元格中在Python模式下在公式栏中输入下面的代码:
from scipy import stats as st
data=xl(‘$A$1:$A$16’).values
st.skew(data,bias=False)
单击Ctrl+Enter键,返回一个标量值,表示偏度。
图4-6 用Excel函数计算峰度和偏度
分组统计
工作中常常需要将数据根据指定变量的值进行分组,然后计算每个分组的统计量。Python中可以使用DataFrame对象的groupby方法对数据进行分组,然后用统计函数对每个分组进行统计分析。
图4-7工作表中单元格区域A1:E10中为不同科室员工的工资情况,要求计算各个科室员工的平均工资。
图4-7 分组统计
G2单元格中在Python模式下在公式栏中输入下面的代码:
df=xl("A1:E10",headers=True)
r=df.groupby('科室')['工资'].agg('mean')
单击Ctrl+Enter键,返回一个Series对象,其中的元素为不同科室的平均工资。代码中agg方法指定’mean’参数值,表示对不同科室的工资计算平均值,得到平均工资。
频数分析
频数分析先将给定的数据从小到大进行排序,然后根据最小值和最大值对数据序列进行分箱,即等间隔地分成多个等份,得到每个等份的起始值和终止值,最后计算原数据落在每个分箱内的个数。通过频数分析可以探查数据的分布情况。
某次学习班的人员分布情况如图4-8工作表A-C列数据所示,考察的指标包括单位(是否本院)、性别和年龄等,试进行频数分析。
图4-8 用Excel函数进行频数分析
先用Excel函数实现频数分析,在E列输入分箱后各分界点的年龄,为了跟Python实现的结果相对应,将分界点的年龄如图4-8中E列进行设置。用4个分界点进行分割后得到5个区间。
在单元格F1中输入公式:
=FREQUENCY(C2:C31,E2:E5)
回车后得到单元格区域F1:F5中的结果,在G列对前面的每个数据作了说明。比如,单元格F1中的6表示年龄小于或等于第1个分界点年龄25.6岁的人数是6个。
下面用Excel内置Python实现频数分析。
如图4-9所示,E2单元格中在Python模式下在公式栏中输入下面的代码:
df=xl("A1:C31",headers=True)
ser=df['年龄'].sort_values()
cut=pd.qcut(ser,5)
freq=cut.value_counts(sort=False)
单击Ctrl+Enter键,返回一个Series对象,对象中的每个元素表示原始数据落在每个区间内的频数,与图4-8中结果相同。
E9单元格中在Python模式下在公式栏中输入下面的代码:
cut.unique()[0].left
单击Ctrl+Enter键,返回第1个区间下界的值。
F9单元格中在Python模式下在公式栏中输入下面的代码:
cut.unique()[0].right
单击Ctrl+Enter键,返回第1个区间上界的值。
如图4-9中所示,在E10至E13各单元格中类似操作,得到其他区间的下界;在F10至F13各单元格中类似操作,得到其他区间的上界。
图4-9 用Excel内置Python进行频数分析
数据透视表
使用数据透视表可以很方便地对数据进行汇总。图4-10工作表中A-D列为给定数据,是不同部门员工的基本工资和实发工资。现在要求对数据进行汇总,先用数据透视表汇总出每个部门的平均实发工资,再用数据透视表汇总出每个部门总的实发工资以及各部门实发工资的累加和。Python中用pandas包的pivot_table函数创建数据透视表。
图4-10 数据透视表
F1单元格中在Python模式下在公式栏中输入下面的代码:
df=xl("A1:D23",headers=True)
pt=pd.pivot_table(df,values='实发工资',index=['部门'])
单击Ctrl+Enter键,返回一个DataFrame对象。查看该对象的值,如图4-10工作表中G1:H5所示,各部门的平均实发工资计算出来了。代码中指定数据透视表的值为实发工资,行索引为部门。默认时聚合函数为求均值。
接着汇总出每个部门总的实发工资以及各部门实发工资的累加和。F7单元格中在Python模式下在公式栏中输入下面的代码:
pt=pd.pivot_table(df,values='实发工资',index=['部门'],aggfunc=sum,margins=True,margins_name='总计')
单击Ctrl+Enter键,返回一个DataFrame对象。查看该对象的值,如图4-10工作表中G7:H12所示,各部门的总实发工资和全部实发工资累加和计算出来了。代码中指定聚合函数为sum,即求和;margins参数的值为True,表示显示列总计项;用margins_name参数指定总计项的行索引标签。