本次选取泰坦尼克号的数据,利用python进行抽样分布描述,主要是提供实现代码,具体的理论知识不会过多涉及。(注:是否服从T分布不是进行t检验~)
字段说明:
Age:年龄,指登船者的年龄。
Fare:价格,指船票价格。
Embark:登船的港口。

需要验证的是:
1、验证数据是否服从正态分布?
2、验证数据是否服从T分布?
3、验证数据是否服从卡方分布?

我们选取年龄作为栗子进行数据验证。

  1. import pandas as pd
  2. import numpy as np
  3. path = 'D:\\数据\\data\\data.xlsx'
  4. data = pd.read_excel(path)
  5. # 按照港口分类,计算数据的统计量
  6. embark = data.groupby(['Embarked'])
  7. embark_basic = data.groupby(['Embarked']).agg(['count','min','max','median','mean','var','std'])
  8. age_basic = embark_basic['Age']
  9. fare_basic = embark_basic['Fare']
  10. age_basic
  11. fare_basic

1、 先验证价格年龄是否服从正态分布。

画出年龄的图像

  1. import seaborn as sns
  2. sns.set_palette("hls") #设置所有图的颜色,使用hls色彩空间
  3. sns.distplot(data['Age'],color="r",bins=10,kde=True)
  4. plt.title('Age')
  5. plt.xlim(-10,80)
  6. plt.grid(True)
  7. plt.show()

2、验证是否服从正态分布?

  1. #分别用kstest、shapiro、normaltest来验证分布系数
  2. from scipy import stats
  3. ks_test = stats.kstest(data['Age'], 'norm')
  4. shapiro_test = stats.shapiro(data['Age']
  5. normaltest_test = stats.normaltest(data['Age'],axis=0)
  6. print('ks_test:',ks_test)
  7. print('shapiro_test:',shapiro_test)
  8. print('normaltest_test:',normaltest_test)

由检验结果知,p <0.05,所以拒绝原假设,认为数据不服从正态分布

  1. # 由于p <0.05, 拒绝原假设,认为数据不服从正态分布
  2. # 绘制拟合正态分布曲线
  3. age = data['Age']
  4. plt.figure()
  5. age.plot(kind = 'kde') #原始数据的正态分布
  6. M_S = stats.norm.fit(age) #正态分布拟合的平均值loc,标准差 scale
  7. normalDistribution = stats.norm(M_S[0], M_S[1]) # 绘制拟合的正态分布图
  8. x = np.linspace(normalDistribution.ppf(0.01), normalDistribution.ppf(0.99), 100)
  9. plt.plot(x, normalDistribution.pdf(x), c='orange')
  10. plt.xlabel('Age about Titanic')
  11. plt.title('Age on NormalDistribution', size=20)
  12. plt.legend(['age', 'NormDistribution'])

3、 验证是否服从T分布?

  1. np.random.seed(1)
  2. ks = stats.t.fit(age)
  3. df = ks[0]
  4. loc = ks[1]
  5. scale = ks[2]
  6. ks2 = stats.t.rvs(df=df, loc=loc, scale=scale, size=len(age))
  7. stats.ks_2samp(age, ks2)

由检验结果知,p <0.05,所以拒绝原假设,认为数据不服从T分布

绘制拟合的T分布图

plt.figure()

age.plot(kind = 'kde')

TDistribution = stats.t(ks[0], ks[1],ks[2]) 

x = np.linspace(TDistribution.ppf(0.01), TDistribution.ppf(0.99), 100)

plt.plot(x, TDistribution.pdf(x), c='orange')

plt.xlabel('age about Titanic')

plt.title('age on TDistribution', size=20)

plt.legend(['age', 'TDistribution'])

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)

对数据进行卡方拟合

plt.figure()

age.plot(kind = 'kde')

chiDistribution = stats.chi2(chi_S[0], chi_S[1],chi_S[2])  # 绘制拟合的正态分布图

x = np.linspace(chiDistribution.ppf(0.01), chiDistribution.ppf(0.99), 100)

plt.plot(x, chiDistribution.pdf(x), c='orange')

plt.xlabel('age about Titanic')

plt.title('age on chi-square_Distribution', size=20)

plt.legend(['age', 'chi-square_Distribution'])