一、数据的描述性统计
对数据的描述性统计主要是指对结构化数据的描述分析,可从三个维度进行分析:数据的集中趋势、数据的离散程度和数据的分布形态。
描述数据集中趋势的指标有:众数、中位数、平均数(包含算数平均数、加权平均数、集合平均数)和分位数。
描述数据的离散程度的指标有:方差、标准差、极差和平均差(数值型数据);四分位差(顺序数据);异众比率(分类数据);离散系数 (相对离散程度)
描述数据分布形态的指标:偏态系数和峰态系数。
1.数据的集中趋势描述指标
算术平均数
简单算数平均数:即所有数值相加除以数值个数,
加权算数平均数:当每个数值的重要程度不同时,为了测算平均水平就要给不同数值赋予不同的权重。所有数据的权重都为1的加权算数平均数就是简单算术平均数。
公式:
算术平均数的优点:受样本数据波动的影响较小,具有一定的稳定性;缺点是易受极大值或极小值的影响。
用python3实现的代码:
对于Numpy包里的多维数组ndarray,利用data.mean()或者np.mean(data)
#创建一个服从正态分布的多维数组
import numpy as np
data=np.random.randn(5,4)
#求平均值
data.mean()
np.mean(data)
#求加权算数平均数
import numpy as np
a=[6,7,8]
np.average(a,weights=[1,2,3])
对于常用的Pandas包,常用的数据结构是Series(一组数据+索引)和DdtaFrame(表格型数据结构,行索引+列索引)
求均值可以用mean()或者describe()
import pandas as pd
import numpy as np
df=np.DataFrame(np.random.randn(4,3),index=['a','b','c','d'],columns=['one','two','three'])
df.describe()
df.mean()
df.mean(axis=0)#跨行即每列的平均值, 与df.mean()结果一致
df.mean(axis=1)#跨列即每行的平均值
几何平均数
当数据之间的关系是乘除关系时,用几何平均数来表示数据集合的集中趋势。
公式:
众数
即数据集合中出现次数最多的数值(众数可以是0/1或多个)
用python3求众数:利用scipy下的stats模块
from scipy import stats
a=[0,1,1,2,2,2,3,4,5,6]
stata.mode(a)[0][0]
中位数
将集合中所有的数值按照从低到高进行排序,处于最中间的一个数就是中位数,若中间有两个数则中位数为这两个数的算术平均值。
中位数跟算术平均数相比较的话,中位数不受极端值的影响。
python3中可用describe()来查看第二四分位数即中位数。
分位数
四分位数,即把所有数值按由小到大排序分成四等份,处于三个分割点位置的得分就是四分位数。
也可以利用describe()来查看三个四分位数。
2.数据的离散程度描述指标
用离散程度指标来衡量数据集合的波动情况
数值型数据:方差、标准差、极差、平均差
极差
数据集合中最大值与最小值的差,亦成为全距。极差易受极值的影响,对离散程度的描述不精确。
平均偏差
描述了所有数值与平均值的平均偏差距离
公式:
方差和标准差
一般情况下会用样本方差来估计总体方差
总体方差为:
样本方差为:
标准差就是方差的正值平方根;方差/标准差越大,数据的离中趋势越大。
离散系数(变异系数)
离散系数是一种相对离散程度的衡量,当两个数据集合的算数平均值不同,但方差和标准差相等时,可以用离散系数来衡量数据集合的离散程度。
样本的离散系数:
顺序数据:四分位差
第三四分位数与第一四分位数的差值,第二四分位数就是中位数,(要对数据按照从低到高进行排序,排在四分之一位置的数值就是第一四分位数,排在四分之二位置即第二四分位数,排在四分之三位置就是第三四分位数),这个差值区间包含了整个数据集合50%的数据。
分类数据:异众比率
指的是总体中非众数次数与总体全部次数之比,也即非众数组的频数占总频数的比例。主要用于测度分类数据的离散程度。
3.数据分布形态
偏态系数
偏态系数用来判断数据集合的分布形态是否对称,当偏态系数等于0时,对称分布;偏态系数小于0时,左偏分布,长尾拖在左边;偏态系数大于0时,右偏分布,长尾拖在右边。
峰态系数
用来描述单峰分布曲线的峰度高低和陡峭程度的指标,峰态系数和单峰分布形态之间的关系为:
当峰态系数等于3时,代表分布曲线是偏平程度适中的常峰态(正态分布的峰形就是常峰态);
当峰态系数小于3时,分布曲线是低峰态;
当峰态系数大于3时,分布曲线是尖峰态。
二、用Python实现
python代码:
import numpy as np
from scipy import stats
import pandas as pd
df=pd.DataFrame(np.random.randn(5,6),index=[1,2,3,4,5],columns=["a","b","c","d","e","f"])
print("最大值:",np.max(df))
print("最小值:",np.min(df))
#集中趋势相关指标
print("平均值:",np.mean(df))
print("中位数:",np.median(df))
print("众数:",stats.mode(df))
print("第一四分位数:",np.percentile(df,25))
print("第二四分位数:",np.percentile(df,50))
print("第三四分位数:",np.percentile(df,75))
#离散趋势相关指标
print("极差:",np.max(df)-np.min(df))
print("四分位差:",np.percentile(df,75)-np.percentile(df,25))
print("标准差:",np.std(df))
print("方差:",np.var(df))
print("离散系数:",np.std(df)/np.mean(df))
#偏度系数和峰度系数
print("偏度:",stats.skew(df))
print("峰度:",stats.kurtosis(df))
输出结果:
最大值: a 1.008610
b 1.403977
c 1.522318
d 1.166711
e 1.457904
f 0.759712
dtype: float64
最小值: a -1.913085
b -0.670699
c -0.654299
d -0.422364
e -0.603877
f -1.253978
dtype: float64
平均值: a -0.581842
b 0.453606
c 0.336790
d 0.277502
e 0.406543
f -0.004802
dtype: float64
中位数: 0.28145864621006794
众数: ModeResult(mode=array([[-1.91308493, -0.67069949, -0.65429917, -0.42236372, -0.60387668,
-1.25397788]]), count=array([[1, 1, 1, 1, 1, 1]]))
第一四分位数: -0.544228564511219
第二四分位数: 0.28145864621006794
第三四分位数: 0.6735451709693376
极差: a 2.921695
b 2.074677
c 2.176617
d 1.589075
e 2.061781
f 2.013690
dtype: float64
四分位差: 1.2177737354805567
标准差: a 0.935274
b 0.674448
c 0.704124
d 0.566993
e 0.683516
f 0.785069
dtype: float64
方差: a 0.874738
b 0.454880
c 0.495790
d 0.321481
e 0.467194
f 0.616333
dtype: float64
离散系数: a -1.607436
b 1.486858
c 2.090692
d 2.043199
e 1.681287
f -163.483815
dtype: float64
偏度: [ 0.40350174 -0.36215989 0.38550357 0.38138045 0.05402061 -0.51669572]
峰度: [-0.5057994 -0.66284249 -0.60277754 -1.23851834 -0.9033273 -1.33226797]
```