天天看點

常用統計檢驗的Python實作

前言

今天給大家整理了一些使用python進行常用統計檢驗的指令與說明,請注意,本文僅介紹如何使用python進行不同的統計檢驗,對于文中涉及的假設檢驗、統計量、p值、非參數檢驗、iid等統計學相關的專業名詞以及檢驗背後的統計學意義不做講解,是以讀者應該具有一定統計學基礎。

正态性檢驗

正态性檢驗是檢驗資料是否符合正态分布,也是很多統計模組化的必要步驟,在Python中實作正态性檢驗可以使用W檢驗(SHAPIRO-WILK TEST)

檢驗原假設:樣本服從正态分布

Python指令 stat, p = shapiro(data)

結果解釋:當p值小于某個顯著性水準α(如0.05)時,則認為樣本不是來自正态分布的總體,否則承認樣本來自正态分布的總體。

##########示例代碼
from scipy.stats import shapiro
data = [0.86, 0.78, 0.83, 0.84, 0.77, 0.84, 0.81, 0.84, 0.81, 0.81, 0.80, 0.81,
       0.79, 0.74, 0.82, 0.78, 0.82, 0.78, 0.81, 0.80, 0.81, 0.74, 0.87, 0.78]
stat, p = shapiro(data)
print("stat為:%f" %stat,"p值為:%f" %p)
#stat為:0.966175 p值為:0.574134           

複制

相關性檢驗:皮爾遜相關系數

皮爾遜相關系數(Pearson Correlation Coefficient)用于衡量兩個變量之間的線性相關相關關系,相關系數的取值在-1與1之間,大于0為正相關,小于0為負相關。

基本假定:

  • 每個樣本中的觀察是獨立同分布的
  • 每個樣本的觀察都是正态分布的
  • 每個樣本的觀察具有相同的方差
  • 所有變量都是連續型變量

檢驗原假設:兩個變量不相關

Python指令:corr,p = pearsonr(x,y)

結果解釋:當p值小于某個顯著性水準α(比如0.05)時,則拒絕原假設,認為兩個變量是相關的。否則認為是不相關的。

注意:這裡的相關僅為統計學意義上的相關性,并不能了解為實際因果關系!!

#########示例代碼
from scipy.stats import pearsonr
data1 = [23,20,18,29,43,35,32,40,29,26,24,26]
data2 = [1000,1000,500,500,500,100,100,100,100,100,100,100]
corr,p = pearsonr(data1,data2)
print("corr為:%f" %corr,"p值為:%f" %p)
#corr為:-0.392250 p值為:0.207253           

複制

相關性檢驗:斯皮爾曼相關系數

斯皮爾曼相關系數(SPEARMAN’S RANK CORRELATION)又稱為斯皮爾曼等級相關系數。是一種非參數方法,衡量兩個變量的依賴性的非參數名額。

基本假定:

  • 每個樣本中的觀察是獨立同分布的
  • 每個樣本的觀察具有相同的方差
  • 所有變量可以是連續型變量或可排序的分類變量

檢驗原假設:兩個變量不相關

Python指令:corr,p =spearmanr(x,y)

結果解釋:當p值小于某個顯著性水準α(比如0.05)時,則則拒絕原假設,認為兩個變量是相關的。否則認為是不相關的。

#######示例代碼
from scipy.stats import spearmanr
data1 = [23,20,18,29,43,35,32,40,29,26,24,26]
data2 = [1000,1000,500,500,500,100,100,100,100,100,100,100]
corr, p= spearmanr(data1, data2)
print("corr為:%f" %corr,"p值為:%f" %p)
#corr為:-0.435153 p值為:0.157414           

複制

卡方檢驗

卡方檢驗是一種用途很廣的計數資料的假設檢驗方法。它屬于非參數檢驗的範疇,卡方檢驗就是統計樣本的實際觀測值與理論推斷值之間的偏離程度,實際觀測值與理論推斷值之間的偏離程度就決定卡方值的大小,如果卡方值越大,二者偏差程度越大;反之,二者偏差越小;若兩個值完全相等時,卡方值就為0,表明理論值完全符合。

注意:

  • 卡方檢驗僅針對分類變量
  • 用于計算列聯表的觀察是獨立的。
  • 列聯表的每個單元格中有25個或更多個執行個體。

檢驗原假設:觀察頻數與期望頻數無顯著差異

Python指令:chi2_contingency(data)

結果解釋:當p值小于某個顯著性水準α(比如0.05)時,則拒絕原假設,認為兩個樣本有顯著差異。

########示例代碼
from scipy.stats import chi2_contingency
import numpy as np
kf_data = np.array([[20,21], [22,24]])
kf = chi2_contingency(kf_data)
print('chisq-statistic=%.4f, p-value=%.4f, df=%i expected_frep=%s'%kf)
chisq-statistic=0.0159, p-value=0.8997, df=1 expected_frep=[[19.79310345 21.20689655]
 [22.20689655 23.79310345]]           

複制

T檢驗:單樣本T檢驗

單樣本t檢驗是樣本均值與總體均值的比較問題。其中總體服從正态分布,從正态總體中抽樣得到n個個體組成抽樣樣本,計算抽樣樣本均值和标準差,判斷總體均值與抽樣樣本均值是否相同。

基本假定:

  • 樣本資料服從正态或近似正态分布
  • 每個樣本中的觀察是獨立同分布的
  • T檢驗屬于參數檢驗,用于檢驗定量資料,若資料均為定類資料則應使用卡方檢驗

檢驗原假設:樣本均值無差異(μ=μ0)

Python指令.ttest_1samp(data,1)

結果解釋:當p值小于某個顯著性水準α(比如0.05)時,則認為樣本均值存在顯著差異,具體的分析要看所選擇的是雙邊假設還是單邊假設(又分小于和大于)注意ttest_1samp進行雙側檢驗。

#示例代碼,檢驗樣本均值與1是否有差異
from scipy import stats
data = [23,20,18,29,43,35,32,40,29,26,24,26]
stats.ttest_1samp(data,1)
#Ttest_1sampResult(statistic=-29.095366280269644, pvalue=1.2015599001111872e-19)           

複制

T檢驗:兩樣本T檢驗

兩樣本t檢驗是比較兩個樣本所代表的兩個總體均值是否存在顯著差異。除了要求樣本來自正态分布,還要求兩個樣本的總體方差相等也就是“方差齊性”。

檢驗原假設:樣本均值無差異(μ=μ0)

Python指令stats.ttest_ind(data1,data2)

當不确定兩總體方差是否相等時,應先利用levene檢驗檢驗兩總體是否具有方差齊性stats.levene(data1,data2)如果傳回結果的p值遠大于0.05,那麼我們認為兩總體具有方差齊性。如果兩總體不具有方差齊性,需要加上參數equal_val并設定為False,如下。

stats.ttest_ind(data1,data2,equal_var=False)           

複制

結果解釋:當p值小于某個顯著性水準α(比如0.05)時,則認為樣本均值存在顯著差異,具體的分析要看所選擇的是雙邊假設還是單邊假設(又分小于和大于)注意stats.ttest_ind進行雙側檢驗。

#示例代碼,檢驗兩組樣本均值是否相等
from scipy import stats
data1 = [23,20,18,29,43,35,32,40,29,26,24,26]
data2 = [1000,1000,500,500,500,100,100,100,100,100,100,100]
stats.ttest_ind(data1,data2)
#Ttest_indResult(statistic=-3.1758496679296524, pvalue=0.004373771039397662)           

複制

T檢驗:配對T檢驗

配對樣本均數T檢驗簡稱配對T檢驗(paired t test), 又稱非獨立兩樣本均數t檢驗,适用于配對設計計量資料均數的比較,其比較目的是檢驗兩相關樣本均數所代表的未知總體均數是否有差别。

與獨立樣本T檢驗相比,配對樣本T檢驗要求樣本是配對的。兩個樣本的樣本量要相同;樣本先後的順序是一一對應的。

基本假定:

  • 每個樣本中的觀察是獨立同分布的
  • 每個樣本的觀察都是正态分布的
  • 每個樣本中的觀察具有相同的方差
  • 每個樣本的觀察結果是成對的

檢驗原假設:樣本均值無差異(μ=μ0)

Python指令stats.ttest_rel(data1,data2)

結果解釋:當p值小于某個顯著性水準α(比如0.05)時,則認為樣本均值存在顯著差異,具體的分析要看所選擇的是雙邊假設還是單邊假設(又分小于和大于)注意stats.ttest_rel進行雙側檢驗。

####示例代碼,配對樣本T檢驗
from scipy import stats
data1 = [23,20,18,29,43,35,32,40,29,26,24,26]
data2 = [1000,1000,500,500,500,100,100,100,100,100,100,100]
stats.ttest_rel(data1,data2)
#Ttest_relResult(statistic=-3.149034903041314, pvalue=0.009258094005021552)           

複制