第10章和第11章介绍了数据的导入和清洗,导入的数据完成清洗后即可进行统计分析。本节介绍比较基础的统计分析方法,包括描述性统计、频数分析等。[大谦MATLAB,dqmatlab点com]
描述性统计
在采集到大量的样本数据以后,常常需要用一些统计量来描述数据的集中程度和离散程度,并通过这些指标对数据的总体特征进行归纳。
描述集中趋势
描述样本数据集中趋势的统计量有算术平均值、几何均值、调和均值、截尾均值、中值、众数和分位数等。下面给定一组数据,用MATLAB和Python计算这些统计量。
【MATLAB】
在命令窗口键入下面的命令行:
>> x=[1 9 5 3 12 8 20 4 5];
>> mean(x) %均值
ans =
7.4444
>> geomean(x) %几何均值
ans =
5.5728
>> harmmean(x) %调和均值
ans =
3.8253
>> trimmean(x,10) %10%截尾均值
ans =
7.4444
>> median(xodd) %中值
ans =
5
>> mode(xodd) %众数
ans =
5
>> prctile(x,25) %25%分位数
ans =
3.7500
【Python】
在Python IDLE Shell窗口键入下面的命令行:
>>> import numpy as np
>>> from scipy import stats as st
>>> x=[1,9,5,3,12,8,20,4,5]
>>> np.mean(x) #均值
7.444444444444445
>>> st.gmean(x) #几何均值
5.572805530293332
>>> st.hmean(x) #调和均值
3.8252656434474614
>>> st.tmean(x) #截尾均值
7.444444444444445
>>> np.median(x) #中值
5.0
>>> md=st.mode(x) #众数
>>> md[0][0]
5
>>> st.scoreatpercentile(x,25) #25%分位数
4.0
对比后不难发现,MATLAB和Python计算分位数的结果有所不同,这是因为二者算法上有区别。
2. 描述离中趋势
描述样本数据离散趋势的统计量包括极差、方差、标准差、均值绝对差、内四分极差和变异系数等。下面给定一组数据,用MATLAB和Python计算这些统计量。
【MATLAB】
在命令窗口键入下面的命令行:
>> x=[1 9 5 3 12 8 20 4 5];
>> range(rv) %极差
ans =
19
>> var(x) %方差
ans =
33.2778
>> std(x) %标准差
ans =
5.7687
>> mad(x) %均值绝对差
ans =
4.2716
>> iqr(x) %内四分极差
ans =
6
>> std(x)/mean(x) %变异系数
ans =
0.7749
【Python】
在Python IDLE Shell窗口键入下面的命令行:
>>> import numpy as np
>>> from scipy import stats as st
>>> x=[1,9,5,3,12,8,20,4,5]
>>> np.ptp(x) #极差
19
>>> st.tvar(x,ddof=1) #方差
33.27777777777777
>>> st.tstd(x,ddof=1) #标准差
5.76868943329226
>>> np.mean(np.abs(x-np.mean(x))) #均值绝对差
4.271604938271604
>>> st.iqr(x) #内四分极差
5.0
>>> st.tstd(x)/st.tmean(x) #变异系数
0.7748985805914976
因为MATLAB和Python算得的分位数不同,所以内四分极差也有所区别。
描述形状
对于给定的一维数组数据,可以用峰度和偏度描述数据的形状,即可以用它们描述数据在高度和宽度两个方向上的度量,是瘦高型、矮胖型?或是左偏、右偏等。
【MATLAB】
在命令窗口键入下面的命令行:
>> x=[1 9 5 3 12 8 20 4 5];
>> kurtosis(x) %峰度
ans =
3.5067
>> skewness(x) %偏度
ans =
1.1411
【Python】
在Python IDLE Shell窗口键入下面的命令行:
>>> import numpy as np
>>> from scipy import stats as st
>>> x=[1,9,5,3,12,8,20,4,5]
>>> st.kurtosis(x) #峰度
0.5066770995621539
>>> st.skew(x) #偏度
1.1411158758919633
注意,Python的计算得到的峰度减去了3。
频数分析
频数分析先将给定的数据从小到大进行排序,然后根据最小值和最大值对数据序列进行分箱,即等间隔地分成多个等份,得到每个等份的起始值和终止值,最后计算原数据落在每个分箱内的个数。通过频数分析可以探查数据的分布情况。
【MATLAB】
MATLAB中用hist函数进行频数分析。下面给定一组数据,将数据极差分为20个区间进行频数分析。在命令窗口键入下面的命令行:
>> x=[1 9 5 3 12 8 20 4 5];
>> counts=hist(x,20)
counts =
列 1 至 15
1 0 1 1 2 0 0 1 1 0 0 1 0 0 0
列 16 至 20
0 0 0 0 1
counts表示给定数据中落在对应区间的数据个数。
【Python】
Python中用pandas包的qcut函数进行数据分箱。在Python IDLE Shell窗口键入下面的命令行:
>>> import pandas as pd
>>> x=[1,9,5,3,12,8,20,4,5]
>>> x
[1, 9, 5, 3, 12, 8, 20, 4, 5]
>>> st=set(x) #列表转换为集合,去重,排序
>>> st
{1, 3, 4, 5, 8, 9, 12, 20}
>>> ser=pd.Series(list(st)) #创建Series
>>> cut=pd.qcut(ser,20) #用qcut函数进行分箱
>>> freq=cut.value_counts(sort=False) #计算落在各分箱的数据个数
>>> freq
(0.999, 1.7] 1
(1.7, 2.4] 0
……
(14.4, 17.2] 0
(17.2, 20.0] 1
dtype: int64