摘要:数理统计概念、描述性统计の学习笔记
涉及概念:总体,个体,样本,容量,样本均值,样本方差,k阶样本原点矩,k阶样本中心矩,数据集中趋势的度量(均值、中位数、众数、百分位数),数据离散趋势的度量(方差,标准差,极差,变异系数,四分位差),离散和连续变量分布特征,偏度,峰度
一、数理统计概念
1. 基本概念:
i. 总体:研究对象的全体,对总体的研究就是对一个随机变量的研究。
数理统计学中总体是指与总体相联系的某个或某几个数量指标
取值的全体。
ii. 个体:组成总体的每个基本单元。
iii. 容量:总体中所包含的个体的个数。(分为有限总体和无限总体)
iv. 样本:从总体中抽取的一部分个体,以获得对总体分布的判断。
样本的概率分布取决于总体和样本的性质。
v. 统计量:根据样本计算出的一些量,是样本的某种函数。
设是总体的一个简单随机样本,
为一个 元连续函数,且中不包含
任何关于总体的未知参数,则称是一个
统计量,称统计量的分布为抽样分布。
2. 常用统计量
i. 样本均值()
ii. 样本方差 ()
此处除以是因为:当样本中的值较小时,样本方差会
远小于总体方差,除以后与总体方差数值更接近
iii. 阶样本原点矩()
原点矩:随机变量到原点(零点)的矩离,此处矩离是由k次方
(k阶)构建出来的。(可以想象成是空间中的距离)
时, = 样本均值
iv. 阶样本中心矩(moment)
中心矩类似于方差,二阶中心矩也叫做方差,表示一个随机变量在
它均值附近波动的大小,方差越大波动越大。三阶中心矩表示一个
随机密度函数向左或向右偏斜的程度。
此处使用因为当样本足够大时,与近似相等
v. 顺序统计量
将样本观测值()从小到大排序,定义
取值,则
为样本观测值的顺序统计量。
其中,,
二、 描述性统计
1. 数据集中趋势的度量(measuring central tendency)
i. 平均数(mean)
表示一组数据集中趋势的量数。
均值充分利用所有数据,但是容易受异常值影响导致偏态分布。
ii. 中位数(median)
一组数按顺序排列后位于中间位置的数。
中位数不受异常值的影响,但缺乏敏感性。
一组数据中出现的次数。
iv. 众数(mode)
一组数据中出现次数最多的一个或几个数。
适用于当数据有两个或者多个集中趋势,或者数据的类型是
类别数据(categorical data)时,不过缺点是缺乏唯一性。
v. 百分位数(percentile / quartiles)
将数据一分为百的数值,对划分名次、排行比较有用。
分位点定义:
2. 数据离散趋势的度量(Measuring variability and spread)
i. 方差(variance)
计算每一个变量与总体平均数之间的差异。
样本方差公式:
得分情况挑选得分起伏最小的球员,就可以计算出每个球员得分的
方差以及下面介绍的标准差。
ii. 标准差(standard deviation)
方差开平方就成为标准差,是描述典型值与均值距离的一种方法。
相比于方差这里已经开方,所以单位就是距离而不是距离的平方。
iii. 极差(range)
R = x(n) – x(1) = max(X) – min(X)
iv. 变异系数(标准离差率 / 单位风险 / coefficient of variation)
原始数据标准差与原始数据平均数的比(一般平均值要大于零)
测量尺度和量纲的影响
v. 四分位差(interquartile range)
IQR = Q3 – Q1 (中间50%的数据,排除了异常的干扰)
bb这么多,开始写点代码啦,顺便复习下上面提到的度量指标:
# 导入两个库,numpy处理大型矩阵,scipy可以操控Numpy数组进行科学计算
import numpy as np
from scipy import stats
import pandas as pd
# 创建一组数据
lst = [1,2,4,5,3,12,12,23,43,52,11,22,22,22]
# 计算均值
lst_mean = np.mean(lst) # 用numpy库计算, scipy.stats中mean()方法不用了
print('数据的均值为:', lst_mean)
# 中位数
lst_median = np.median(lst)
print('数据的中位数为:', lst_median)
# 众数
lst_mode = stats.mode(lst)[0][0]
# stats.mode()返回的是 ModeResult(mode=array([22]), count=array([3]))
print('数据的众数为:', lst_mode)
counts = np.bincount(lst)
# bincount()会计算从0到52每个数字出现的个数,lst的数必须要是非负整数
lst_mode_np = np.argmax(counts)
lst_s = pd.Series(lst)
lst_mode_pd = lst_s.mode()[0] # 把list转换成series,mode()函数返回的也是一个series
print('三种方法计算结果一致吗:', lst_mode_pd == lst_mode_np == lst_mode)
print('-----------------------------')
# n阶中心矩
lst_moment_1 = stats.moment(lst, moment=1) # moment()函数用来计算中心矩
print('数据的一阶中心矩为:', lst_moment_1)
lst_moment_2 = stats.moment(lst, moment=2)
print('数据的二阶中心矩为:', lst_moment_2)
print('-----------------------------')
# 方差
lst_var = np.var(lst)
print('数据的方差为:', lst_var)
print('二阶中心矩等于方差吗:', lst_var == lst_moment_2)
# 标准差
lst_sd = np.std(lst)
lst_sd2 = np.sqrt(lst_var)
print('数据的标准差为:', lst_sd)
print('标准差是方差开方吗:', lst_sd == lst_sd2)
# 极差
lst_range = max(lst) - min(lst)
print('数据的极差为:', lst_range)
# 分位数和四分位差
lst_Q1 = np.percentile(lst, 25)
lst_Q2 = np.percentile(lst, 50)
print('二分位数等于中位数吗:', lst_Q2 == lst_median)
lst_Q3 = np.percentile(lst, 75)
lst_IQR = lst_Q3 - lst_Q1
print('数据的四分位差为:', lst_IQR)
# 变异系数
lst_cv = lst_sd / lst_mean # 变异系数是标准差与平均数的比
print('数据的变异系数为', lst_cv)
输出结果如下:
3. 分布特征
i. 离散变量(discrete)
1. 离散型随机变量:只能用整数或自然数为单位计算,一般数值用计数
得来。(比如班级人数,电脑数量,年龄等)
2. 概率函数:用函数的方式表达概率:
大量试验中可以用事件出现频数/试验次数来估计概率。
3. 分布函数:概率累积函数
1. 连续型随机变量:在一定区间内可以任意取值,数值连续不断。
(比如人的身高,体重等)
2. 概率密度函数:连续型随机变量的概率函数就叫概率密度函数
某点的概率密度函数可以理解为概率在该点的
变化率(或导数)
1. 正态分布中,平均值=众数=中位数
2. 三西格玛准则(empirical rule):
大约68%的数值位于距离均值1个标准差的范围内;
大约95%的数值位于距离均值2个标准差范围内;
大约99.7%的数值位于距离均值3个标准差范围内。
3. 如果,是相互独立的随机变量,满足
则正态分布符合:
4. 偏度(skewness)
i. 正态分布:偏度为,两侧尾部长度对称
ii. 左偏:偏度,数据左边有长尾巴,异常值集中在左侧而向左偏斜
iii. 右偏:偏度,数据右边有长尾巴,异常值集中在右侧而向右偏斜
5. 峰度(peakedness / kurtosis)
说明的是分布曲线在平均值处峰值高低的特征数,反映峰部的尖度。
正态分布的峰度为3,所以如果峰度大于3,分布比正态分布要陡峭,
反之亦然。峰度高意味着方差增大,是由低频度的大于或小于平均值
的极端差值引起的。
最后贴一个分布特征的代码实现,此处我随机生成了一组正态分布的数和
一组左偏分布的数:
import numpy as np
from scipy.stats import skewnorm
# 生成标准正态分布的10000个随机数
data = list(np.random.randn(10000))
#再生成一个偏态分布的10000个随机数
data2 = skewnorm.rvs(-20, size=10000)
# 直方图展示正态分布
plt.hist(data, bins=1000, facecolor='g', alpha=0.7)
plt.hist(data2, bins=1000, facecolor='r', alpha=0.5)
plt.show()
# 计算峰度和偏度 (正态分布情况下)
data_series = pd.Series(data)
data_skew = data_series.skew()
data_kurtosis = data_series.kurt()
print('正态分布偏度系数为:', data_skew)
# 此处因为是正态分布,偏度很接近0
print('正态分布峰度系数为:', data_kurtosis)
# 官方文档里已经调整过使正态分布的峰度系数也为0,所以此处结果也接近0
print('-------------------------------')
# 偏态分布下的峰度和偏度
data2_series = pd.Series(data2)
data2_skew = data2_series.skew()
data2_kurtosis = data2_series.kurt()
print('偏态分布偏度系数为:', data2_skew)
print('偏态分布峰度系数为:', data2_kurtosis)
结果输出:
Credit:
笔记整理自:Datawhale 概率统计组队学习
文中图片来源:知乎,《深入浅出统计学》(美)格里菲思(Griffiths, D.) 著