本周是统计学学习小组-第二期的第六周,我们这周的学习内容是【抽样分布】,涉及到的二级知识点有两个,分别是:
-
1、常用统计量:样本均值、样本方差、样本变异系数、样本K阶矩、样本k阶中心距、样本偏度、样本峰度、次序统计量、充分统计量
-
2、常用抽样分布:卡方分布、T分布、F分布、中心极限定理(其他重要抽样分布)、样本比例的抽样分布、两个样本平均值之差的分布、样本方差的分布、两个样本方差比的分布
-
3、Python实现抽样分布的验证(正态分布、卡方分布、T分布、几何分布、等) https://pan.baidu.com/s/1leWEwmJA0mBtZX0RAK-dUQ 练手数据下载
-
参考书籍:统计学(贾俊平第七版)第六章
常用的统计量
设X1,X2,……Xn 是从某总体X中抽取的一个样本
样本均值:
样本方差:
样本变异系数:
样本K阶矩:
样本k阶中心距:
样本偏度:
样本峰度:
次序统计量:
充分统计量:
常用抽样分布
正态分布:
# -*- coding: utf-8 -*-
"""
Created on Wed Dec 11 14:16:40 2019
@author: sen
"""
import pandas as pd
import numpy as np
import os
os.chdir('F://Desktop//统计学第二期//第六周,第七周')
data = pd.read_excel('data.xlsx')
验证数据是否服从三大分布
# 按照港口分类,计算数据的统计量
embark = data.groupby(['Embarked'])
embark_basic = data.groupby(['Embarked']).agg(['count','min','max','median','mean','var','std'])
age_basic = embark_basic['Age']
fare_basic = embark_basic['Fare']
count min max median mean var std
Embarked
C 130 0.42 71.0 29.0 30.814769 238.234892 15.434860
Q 28 2.00 70.5 27.0 28.089286 286.130622 16.915396
S 554 0.67 80.0 28.0 29.445397 200.029876 14.143192
# 1、 先验证价格年龄是否服从正态分布。
# 画出年龄的图像
import seaborn as sns
#https://www.cntofu.com/book/172/docs/24.md 中文解释文档
from matplotlib import pyplot as plt
sns.set_style("white") #设置所有图的颜色,使用hls色彩空间
''' 1.darkgrid(灰色网格)
2.whitegrid(白色网格)
3.dark(黑色)
4.white(白色)
5.ticks(十字叉)'''
sns.distplot(data['Age'],color="r",bins=10) # 年龄区间bins=10,
plt.title('Age')
plt.xlim(-10,80)
plt.grid(True)
plt.show()
# 2、验证是否服从正态分布?
#分别用kstest、shapiro、normaltest来验证分布系数
from scipy import stats
ks_test = stats.kstest(data['Age'], 'norm')
'''scipy.stats.kstest(K-S检验)
原假设:数据符合正态分布
输入数据,检验方法norm 正态分布
输出结果中第一个为统计量,
第二个为P值(注:统计量越接近0就越表明数据和标准正态分布拟合的越好,
如果P值大于显著性水平,通常是0.05,接受原假设,则判断样本的总体服从正态分布)
'''
shapiro_test = stats.shapiro(data['Age'])
'''
scipy.stats.shapiro(W检验) 与 kstest 不同,shapiro 是专门用来做正态性检验的模块
原假设:样本数据符合正态分布
注意:shapiro是用来检验小样本数据
scipy.stats.shapiro(x, a=None, reta=False)
输出结果中第一个为统计量,第二个为P值(统计量越接近1越表明数据和正态分布拟合的好,
P值大于指定的显著性水平,接受原假设,认为样本来自服从正态分布的总体)
'''
normaltest_test = stats.normaltest(data['Age'],axis=0)
'''
normaltest 也是专门做正态性检验的模块,原理是基于数据的skewness和kurtosis
scipy.stats.normaltest(a, axis=0, nan_policy='propagate')
a:待检验的数据
axis:默认为0,表示在0轴上检验,即对数据的每一行做正态性检验,我们可以设置为 axis=None 来对整个数据做检验
nan_policy:当输入的数据中有空值时的处理办法。默认为 'propagate',返回空值;设置为 'raise' 时,抛出错误;设置为 'omit' 时,在计算中忽略空值
输出结果中第一个为统计量,第二个为P值(注:p值大于显著性水平0.05,认为样本数据符合正态分布)
'''
print('ks_test:',ks_test)
print('shapiro_test:',shapiro_test)
print('normaltest_test:',normaltest_test)
stats.skew(data['Age']) #偏度
stats.kurtosis(data['Age']) #峰度
'''
偏度检验:
正态分布的偏度为0
H0 : 样本数据的偏度=0 H1 :样本数据的偏度≠0
拒绝原假设则认为样本数据不是来自正态总体,
但不拒绝原假设不能说明样本数据来自正态总体,
只能说明数据对称,只有在确定对称性是影响分布的形态的唯一因素时,偏度检验才适用。
峰度检验:
正态分布的峰度为3,
H0 : 样本数据的峰度=3 H1 :样本数据的峰度≠3
拒绝原假设则认为样本数据不是来自正态总体,
但不拒绝原假设不能说明样本数据来自正态总体,
容易出错不推荐使用
'''
卡方分布:
卡方分布:
chi_S = stats.chi2.fit(age)
df_chi = chi_S[0]
loc_chi = chi_S[1]
scale_chi = chi_S[2]
chi2 = stats.chi2.rvs(df=df_chi, loc=loc_chi, scale=scale_chi, size=len(age))
stats.ks_2samp(age, chi2)
T分布:
T分布:
np.random.seed(1)
'''seed( ) 用于指定随机数生成时所用算法开始的整数值,
如果使用相同的seed( )值,则每次生成的随即数都相同
'''
ks = stats.t.fit(age)
df = ks[0]
loc = ks[1]
scale = ks[2]
ks2 = stats.t.rvs(df=df, loc=loc, scale=scale, size=len(age))
stats.ks_2samp(age, ks2)
中心极限定理:
大数定律揭示了大量随机变量的平均结果,但没有涉及到随机变量的分布的问题。而中心极限定理说明的是在一定条件下,大量独立随机变量的平均数是以正态分布为极限的。
中心极限定理是概率论中最著名的结果之一。它提出,大量的独立随机变量之和具有近似于正态的分布。因此,它不仅提供了计算独立随机变量之和的近似概率的简单方法,而且有助于解释为什么有很多自然群体的经验频率呈现出钟形(即正态)曲线这一事实,因此中心极限定理这个结论使正态分布在数理统计中具有很重要的地位,也使正态分布有了广泛的应用。
注意两点:
-
总体本身的分布不要求正态分布
上面的例子中,人的体重是正态分布的。但如果我们的例子是掷一个骰子(平均分布),最后每组的平均值也会组成一个正态分布。(神奇!) -
样本每组要足够大,但也不需要太大
取样本的时候,一般认为,每组大于等于30个,即可让中心极限定理发挥作用。
中心极限定理:
骰子例子
import numpy as np
import seaborn as sns
#https://www.cntofu.com/book/172/docs/24.md 中文解释文档
from matplotlib import pyplot as plt
sns.set_style("white") #设置所有图的颜色,使用hls色彩空间
''' 1.darkgrid(灰色网格)
2.whitegrid(白色网格)
3.dark(黑色)
4.white(白色)
5.ticks(十字叉)'''
'''我们让中心极限定理发挥作用。现在我们抽取1000组,每组50个。
我们把每组的平均值都算出来
'''
random_data = np.random.randint(1, 7, 10000)
random_data.mean() # 打印平均值
random_data.std() # 打印标准差
samples = []
samples_mean = []
samples_std = []
for i in range(0, 1000):
sample = []
for j in range(0, 50):
sample.append(random_data[int(np.random.random() * len(random_data))])
sample_np = np.array(sample)
samples_mean.append(sample_np.mean())
samples_std.append(sample_np.std())
samples.append(sample_np)
samples_mean_np = np.array(samples_mean)
samples_std_np = np.array(samples_std)
print (samples_mean_np)
sns.distplot(samples_std_np,color="r",bins=10) # 区间bins=10,
plt.title('data')
plt.grid(True)
plt.show()
来源:CSDN
作者:time_boy666
链接:https://blog.csdn.net/time_boy666/article/details/103473096