天天看點

統計學第七周 python驗證正态分布/卡方分布/T

統計學第七周

一.知識回顧

上周已經學習過正态分布/卡方分布/T分布等知識,但是如何選擇那?

🛰正态分布

🛰卡方分布

🛰T分布

二.實踐

1.場景:泰坦尼克号資料,主要是age年齡,Fare價格即船票價格,Embark登船的港口,需要驗證資料是否服從正态分布,T分布,卡方分布?

具體資料如下:

ID Age Fare Embarked
1 22 7.25 S
2 38 71.2833 C
3 26 7.925 S
4 35 53.1 S
5 35 8.05 S
6 54 51.8625 S
7 2 21.075 S

#coding=utf-8

import  pandas  as  pd
import numpy  as  np
import  matplotlib.pyplot  as plt
import  seaborn as  sbn

plt.rcParams['font.sans-serif'] = ['SimHei']

df  =  pd.read_excel('d:\\excel\\tj-week7_data.xlsx')
print(df.head())

embark = df.groupby(['Embarked'])
#print(embark)

embark_basic = df.groupby(['Embarked']).agg(['count','min','max','median','mean','var','std'])
print(embark_basic)
age_basic = embark_basic['Age']
fare_basic = embark_basic['Fare']
#print(age_basic)
#print(fare_basic)

sbn.set_palette('hls')
sbn.distplot(df['Age'],color='r',bins=10,kde=True)
plt.title('Age')
plt.xlim(-10,80)
plt.grid(True)
plt.show()
           
統計學第七周 python驗證正态分布/卡方分布/T

根據年齡的圖像,可以認為和正态分布比較接近。

  1. 驗證是否符合正态分布

驗證分布系數:

#####
ks_test = stats.kstest(df['Age'],'norm')
shapiron_test = stats.shapiro(df['Age'])
normaltest_test = stats.normaltest(df['Age'],axis=0)
print('ks_test: ',ks_test)
print('shapiro_test: ',shapiron_test)
print('normaltest_test: ',normaltest_test)
           
ks_test:  KstestResult(statistic=0.9649422367998306, pvalue=0.0)
shapiro_test:  (0.9815102219581604, 7.906476895414016e-08)
normaltest_test:  NormaltestResult(statistic=18.12938011101228, pvalue=0.00011567916063448067)
           

根據檢驗pvalue<0.05 ,是以可以将我們憑主觀圖表分析的與正态分布較接近的假設進行推翻,認為不服從正态分布。

附:kstest shapiro normaltest

#####驗證是否服從正态分布 ,分别用scipy中kstest   shapiro  normaltest

ks_test = stats.kstest(df['Age'],'norm')

#kstest(rvs, cdf, args=(), N=20, alternative=’two_sided’, mode=’approx’, **kwds)
#kstest 是一個很強大的檢驗子產品,除了正态性檢驗,還能檢驗其他資料分布類型
#rvs待檢驗資料
#cdf 設定檢驗方法,設定 'norm' 正态性檢驗
#輸出結果中第一個數為統計數,第二個為P值

shapiron_test = stats.shapiro(df['Age'])

#scipy.stats.shapiro是專門用來做正态性檢驗的子產品
#shapiro不适合做樣本數>5000的正态性檢驗,檢驗結果的P值可能不準确
#scipy.stats.shapiro(x,a=None,reta=False) ,是需要傳進去資料x即可
#輸出結果,第一個為統計數,第二個為P值

normaltest_test = stats.normaltest(df['Age'],axis=0)

#scipy.stats.normaltest(a,axis=0,nan_policy='propagate')
#a待檢驗資料,axis=0 ,表示在0軸上檢驗,即對資料的每一行做正态性檢驗,
#axis=None來對整個資料做檢驗
#nan_policy 當輸入資料中有空值時的處理辦法
#輸出結果,第一個為統計數,第二個為P值

print('ks_test: ',ks_test)
print('shapiro_test: ',shapiron_test)
print('normaltest_test: ',normaltest_test)

#scipy.stats.anderson   時修改版的kstest
# scipy.stats.anderson(x, dist=’norm’)
#anderson 有三個輸出值,第一個為統計數,第二個為評判值,第三個為顯著性水準,
#  評判值與顯著性水準對應
#對于正态性檢驗,顯著性水準為:15%, 10%, 5%, 2.5%, 1%
           
#繪制拟合正态分布曲線
age = df['Age']
plt.figure()
age.plot(kind='kde') 

#原始資料的正态分布
M_S = stats.norm.fit(age)  

#正态分布拟合的平均值loc,标準差scale
normalDistribution = stats.norm(M_S[0],M_S[1]) 
 
#繪制拟合的正态分布圖
x= np.linspace(normalDistribution.ppf(0.01),normalDistribution.ppf(0.99),100)
plt.plot(x,normalDistribution.pdf(x),c='orange')
plt.xlabel('Age about Titanic')
plt.title('Age on NormalDistribution', size = 20)
plt.legend(['age','NormDistribution'])
plt.show()
           
統計學第七周 python驗證正态分布/卡方分布/T
  1. 驗證是否符合T分布
    #coding=utf-8
    
    import  pandas  as  pd
    import numpy  as  np
    import  matplotlib.pyplot  as plt
    import  seaborn as  sbn
    from scipy  import  stats
    
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus']=False #解決負數坐标顯示
    
    df  =  pd.read_excel('d:\\excel\\tj-week7_data.xlsx')
    print(df.head())
    
    embark = df.groupby(['Embarked'])
    #print(embark)
    
    embark_basic = df.groupby(['Embarked']).agg(['count','min','max','median','mean','var','std'])
    print(embark_basic)
    age_basic = embark_basic['Age']
    fare_basic = embark_basic['Fare']
    
    age = df['Age']
    
    np.random.seed(1)
    ks = stats.t.fit(age)
    
    df1 = ks[0]
    loc = ks[1]
    scale = ks[2]
    ks2 = stats.t.rvs(df = df1 ,loc = loc ,scale = scale , size = len(age) )
    result = stats.ks_2samp(age,ks2)
    
    print(result)
               
    Ks_2sampResult(statistic=0.08286516853932585, pvalue=0.014103597072570409)
               
    P< 0.05 ,是以這裡也可以拒絕T分布的假設,拟合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'])
    plt.show()
               
統計學第七周 python驗證正态分布/卡方分布/T

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))
result_x = stats.ks_2samp(age,chi2)
print(result_x)
           
#結果如下,P>0.05,可以認為時符合卡方分布

Ks_2sampResult(statistic=0.058988764044943826, pvalue=0.16233843312998728)
           

此使可以通過拟合在看一下兩者資料結果:

#對資料進行卡方拟合
   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'])
   plt.show()
           
統計學第七周 python驗證正态分布/卡方分布/T

注:

https://blog.csdn.net/QimaoRyan/article/details/72861387 正态性檢驗 驗證參考

https://blog.csdn.net/qq_43315928/article/details/103449796 程式即文章内容參考

這裡有個疑問,為什麼三種分布拟合後的曲線都是類似正态分布?,是不是在分析中存在相關問題?

另外在幾種檢驗驗證的使用上需要進一步進行學習。