统计分析

第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窗口键入下面的命令行:

code.python
>>> 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】

在命令窗口键入下面的命令行:

code.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窗口键入下面的命令行:

code.python
>>> 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】

在命令窗口键入下面的命令行:

code.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窗口键入下面的命令行:

code.python
>>> 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个区间进行频数分析。在命令窗口键入下面的命令行:

code.matlab
>> x=[1 9 5 3 12 8 20 4 5];
>> counts=hist(x,20)
counts =
  列 115
     1     0     1     1     2     0     0     1     1     0     0     1     0     0     01620
     0     0     0     0     1

counts表示给定数据中落在对应区间的数据个数。

【Python】

Python中用pandas包的qcut函数进行数据分箱。在Python IDLE Shell窗口键入下面的命令行:

code.python
>>> 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