本文首发于“生信补给站”公众号 小数据| 描述性统计(Python/R 实现)
描述性统计
描述性统计是借助图表或者总结性的数值来描述数据的统计手段。数据挖掘工作的数据分析阶段,可以借助描述性统计来描述或总结数据的基本情况。
理论部分
一 数据的集中趋势描述:
数据的集中趋势描述是寻找反映事物特征的数据集合的代表值或中心值, 这个代表值或中心值可以很好地反映事物目前所处的位置和发展水平, 通过对事物集中趋势指标的多次测量和比较, 还能够说明事物的发展和变化趋势。
1.1算术平均值
简单算术平均值是最典型、 最常用、 最具代表性的集中趋势指标。将数据集合的所有数据值相加的和除以数据值个数就得到简单算术平均值。假设有一组包含n个数值的数据集合, 它们的数值分别为x1 , x2 ,…, xn , 该数据集合的简单算术平均值的计算公式为:
注意当数据集合中有极大值或极小值存在时, 会对算术平均值产生很大的影响, 其计算结果会掩盖数据集合的真实特征, 这时算术平均值就失去了代表性。人均收入?拖没拖后腿
1.2 众数
数据集合中出现次数最多的数值被称为众数。如果在一个数据集合中, 只有一个数值出现的次数最多, 那么这个数值就是该数据集合的众数;如果有两个或多个数值的出现次数并列最多, 那么这两个或多个数值都是该数据集合的众数。
1.3 中位数
对于数据集合(x1, x2, …, xn) , 将所有的数值按照它们的大小, 从高到低或从低到高进行排序, 如果数据集合包含的数值个数是基数, 那么排在最中间的数值就是该数据集合的中位数;如果数据集合的数值个数是偶数, 那么取最中间两个数值的算术平均值作为中位数。
二 数据的离散程度
集中趋势指标在表示数据集合的特征时会有不同的缺陷, 例如算术平均数会受到极端值的影响, 不能完全展现数据集合的特征, 离散程度指标可以在一定程度上弥补集中趋势指标的这个缺陷, 展示出数据集合的离散情况。
在同类离散指标的比较中, 离散指标的数值越小, 说明数据集合的波动(变异) 程度越小;离散指标的数值越大, 说明数据集合的波动(变异) 程度越大。
2.1 极差
极差是指数据集合中最大值与最小值的差值, 表示整个数据集合能够覆盖的数值距离。现有数据集合(xmin, x2, …,xmax) , 计算公式为:
2.2 方差和标准差
1)总体的方差和标准差
如果数据集合(x1, x2, …, xn) 就是数据总体, 并且数据集合有N个数值(个案) , 假设数据总体的均值为μ,那么
总体方差σ2的计算公式为:
总体标准差是方差的正值平方根, 其计算公式为:
2)样本的方差和标准差
从数据总体中随机抽取一定数量的样本数值, 然后用样本数值的方差和标准差来估计总体的方差和标准差。为了区分, 样本的均值用x-表示, 样本方差用s2表示, 样本标准差用s表示。假设样本容量为n, 那么样本方差的计算公式为:
2.3 变异系数
变异系数实质上是标准差相对于算术平均值的大小 .
总体的变异系数计算公式为:
样本的变异系数计算公式为 :
因此, 如果比较算术平均值不同的两个数据集合的相对离散程度时, 使用变异系数要比使用标准差更具有说服力。此外, 变异系数是无单位指标, 这是它与其他离散程度指标最大的区别。
2.4 四分位极差
排在四分之一位置的数值即为第一四分位数Q1;排在四分之二位置的数值为第二四分位数Q2 , 也就是中位数;排在四分之三位置的数值为第三四分位数Q3。这三个四分位数将整个数据集合分成四等分。四分位极差等于第一四分位数与第三四分位数的差值(Q3-Q1) , 这个差值区间包含了整个数据集合50%的数据值。
实现部分
介绍完了基本概念,下面使用Python 和 R 分别实现上述计算过程:
Python实现
from numpy import mean,median,ptp,var,std import numpy as np import pandas as pd #算术平均值 data = [1,2,3,4,5,5,5,6,7,8,8,9] data_mean = mean(data) print("算术平均数 = ") print(data_mean) #中位数 data_median = median(data) print("中位数 = ") print (data_median) #众数 data_mode = mode(data) print("众数 = ") print (data_mode) #极差 data_range = max(data)-min(data) print("极差 = ") print (data_range) #方差和标准差 data_var = var (data) print ("方差 = ") print (data_var) #标准差 data_sd = std(data) print ("标准差 = " ) print (data_sd) #变异系数 data_cv = mean(data) / std(data) print ("变异系数 = " ) print (data_cv) #四分卫极差 dt = pd.Series(np.array([1,2,3,4,5,5,5,6,7,8,8,9])) print('Q1:', dt.quantile(.25)) print('Q3:', dt.quantile(.75)) print('Q3 - Q1 :', dt.quantile(.75) - dt.quantile(.25) )
R实现
#整理成描述性统计的函数 my_describe <- function(x){ options(digits = 3) N = length(x); Min = min(x, na.rm = TRUE); Q1 = quantile(x, probs = 0.25, na.rm = TRUE); Median = median(x, na.rm = TRUE); Q3 = quantile(x, probs = 0.75, na.rm = TRUE); Max = max(x, na.rm = TRUE); Mean = mean(x, na.rm = TRUE); Var = var(x, na.rm = TRUE); Sd = sd(x, na.rm = TRUE); Range = abs(diff(range(x))); #返回结果 return(data.frame(N = N, Min = Min, Q1 = Q1, Median = Median, Q3 = Q3, Max = Max, Mean = Mean, Var = Var, Sd = Sd, Range = Range)) } #可对data数据集批量使用 sapply(data, my_describe)
参考资料:
人人都会数据分析