假设检验_python 重点
在統計學中,存在著數百種假設檢驗。而在數據分析、機器學習項目中,只有一小部分較常使用。本文介紹了17種常用的假設檢驗,包括適用場景及使用Python API的例子。讓我們一起來學習吧!
- 正態分布檢驗
1.1 Shapiro-Wilk Test(W 檢驗)
用于檢驗樣本數據是否來自服從正態分布的總體。
在實際應用中,W 檢驗被認為是一個可靠的正態性檢驗,但是也有人認為該檢驗更適用于較小的數據樣本(數千個觀測值以內)。
使用前提:
各樣本觀察值為獨立同分布的
原假設:樣本數據服從正態分布
Python實現代碼:
# Shapiro-Wilk Normality Test
from scipy.stats import shapiro
data = [0.873, 2.817, 0.121, -0.945, -0.055, -1.436, 0.360, -1.478, -1.637, -1.869]
stat, p = shapiro(data)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:print('不能拒絕原假設,樣本數據服從正態分布')
else:print('不服從正態分布')
1.2 D’Agostino’s K^2 Test
用于檢驗樣本數據是否來自服從正態分布的總體。
D’Agostino’s K^2 Test是通過計算樣本數據的峰度和偏度,來判斷其分布是否偏離正態分布。
偏度是對數據分布對稱性的測度,衡量數據分布是否左偏或右偏。
峰度是對數據分布平峰或尖峰程度的測度,它是一種簡單而常用的正態性統計檢驗量。
使用前提:
各樣本觀察值為獨立同分布的
原假設:樣本數據服從正態分布
Python實現代碼:
# D'Agostino's K^2 Normality Test
from scipy.stats import normaltest
data = [0.873, 2.817, 0.121, -0.945, -0.055, -1.436, 0.360, -1.478, -1.637, -1.869]
stat, p = normaltest(data)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:print('不能拒絕原假設,樣本數據服從正態分布')
else:print('不服從正態分布')
1.3 Anderson-Darling Test
用于檢驗樣本數據是否服從某一已知分布。
該檢驗修改自一種更復雜的非參數的擬合良好的檢驗統計(Kolmogorov-Smirnov Test)。SciPy中的anderson()函數實現了Anderson-Darling檢驗,函數參數為樣本數據及要檢驗的分布名稱,默認情況下,為’norm’正態分布,還支持對’expon’指數分布,'logistic’分布,以及’gumbel’耿貝爾分布的檢驗,它會返回一個包含不同顯著性水平下的p值的列表,而不是一個單一的p值,因此這可以更全面地解釋結果。
使用前提:
各樣本觀察值為獨立同分布的
原假設:樣本數據服從某一已知分布
Python實現代碼:
# Anderson-Darling Normality Test
from scipy.stats import anderson
data = [0.873, 2.817, 0.121, -0.945, -0.055, -1.436, 0.360, -1.478, -1.637, -1.869]
result = anderson(data)
print('stat=%.3f' % (result.statistic))
for i in range(len(result.critical_values)):sl, cv = result.significance_level[i], result.critical_values[i]if result.statistic < result.critical_values[i]:print('顯著性水平為%.2f時,P值為%.1f,不能拒絕原假設,樣本數據服從正態分布' % (sl/100, cv))else:print('顯著性水平為%.2f時,P值為%.1f, 拒絕原假設,樣本數據不服從正態分布' % (sl/100, cv))# stat=0.424
# 顯著性水平為0.15時,P值為0.5,不能拒絕原假設,樣本數據服從正態分布
# 顯著性水平為0.10時,P值為0.6,不能拒絕原假設,樣本數據服從正態分布
# 顯著性水平為0.05時,P值為0.7,不能拒絕原假設,樣本數據服從正態分布
# 顯著性水平為0.03時,P值為0.8,不能拒絕原假設,樣本數據服從正態分布
# 顯著性水平為0.01時,P值為0.9,不能拒絕原假設,樣本數據服從正態分布
- 相關性檢驗
2.1 Pearson相關系數
用于檢驗兩樣本數據之間線性關系的強度。
該檢驗將兩個變量之間的協方差進行歸一化處理以給出可解釋的分數,為一個介于-1到1之間的值,-1表示完全負相關,1表示完全正相關,0表示沒有相關性。
使用前提:
各樣本觀察值為獨立同分布的
樣本數據服從正態分布
每個樣本觀測值的方差相等
原假設:兩變量相互獨立
Python實現代碼:
# Pearson's Correlation test
from scipy.stats import pearsonr
data1 = [0.873, 2.817, 0.121, -0.945, -0.055, -1.436, 0.360, -1.478, -1.637, -1.869]
data2 = [0.353, 3.517, 0.125, -7.545, -0.555, -1.536, 3.350, -1.578, -3.537, -1.579]
stat, p = pearsonr(data1, data2)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:print('兩變量相互獨立')
else:print('兩變量可能存在線性相關關系')
2.2 Spearman等級相關
用于檢驗兩變量是否具有單調關系。
當兩變量因非線性關系相關,或者不服從正態分布時,Spearman相關系數可以用來反映變量間的相關性強度。如果存在線性關系,也可以使用這種方法來檢驗,但是可能導致計算出的相關系數較低。
Spearman不是使用樣本數據本身的協方差和標準差來計算相關系數的,而是根據樣本值的相對秩次來計算統計量,這是非參數統計中常用的方法。
使用前提:
各樣本觀察值為獨立同分布的
各樣本數據可定序
原假設:兩變量相互獨立
Python實現代碼:
# Spearman's Rank Correlation Test
from scipy.stats import spearmanr
data1 = [0.873, 2.817, 0.121, -0.945, -0.055, -1.436, 0.360, -1.478, -1.637, -1.869]
data2 = [0.353, 3.517, 0.125, -7.545, -0.555, -1.536, 3.350, -1.578, -3.537, -1.579]
stat, p = spearmanr(data1, data2)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:print('兩變量相互獨立')
else:print('兩變量可能存在相關關系')
2.3 Kendall等級相關
用于檢驗兩變量是否具有單調關系。
使用前提:
各樣本觀察值為獨立同分布的
各樣本數據可定序
原假設:兩變量相互獨立
Python實現代碼:
# Kendall's Rank Correlation Test
from scipy.stats import kendalltau
data1 = [0.873, 2.817, 0.121, -0.945, -0.055, -1.436, 0.360, -1.478, -1.637, -1.869]
data2 = [0.353, 3.517, 0.125, -7.545, -0.555, -1.536, 3.350, -1.578, -3.537, -1.579]
stat, p = kendalltau(data1, data2)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:print('兩變量相互獨立')
else:print('兩變量可能存在相關關系')
2.4 Chi-Squared Test卡方檢驗
用于檢驗兩分類變量是否相關。
卡方檢驗的零假設是一個分類變量的觀測頻數與該分類變量的期望頻數相吻合。檢驗統計量服從卡方分布。
使用前提:
用于計算兩變量的列聯表的觀測值是獨立的
列聯表的每個單元格的期望計數不小于5
原假設:兩變量相互獨立
Python實現代碼:
# Chi-squared test with similar proportions
from scipy.stats import chi2_contingency
from scipy.stats import chi2# 列聯表
table = [[10, 20, 30],[6, 9, 17]]
print('列聯表')
print(table)stat, p, dof, expected = chi2_contingency(table)
print('自由度dof=%d' % dof)
print('期望分布')
print(expected)# [[10.43478261 18.91304348 30.65217391]
# [ 5.56521739 10.08695652 16.34782609]]# 采用統計量推斷
prob = 0.95
critical = chi2.ppf(prob, dof)
print('probability=%.3f, critical=%.3f, stat=%.3f' % (prob, critical, stat))
if abs(stat) >= critical:print('拒絕原假設,兩變量存在相關關系')
else:print('不能拒絕原假設,兩變量相互獨立')# 采用p值推斷
alpha = 1.0 - prob
print('significance=%.3f, p=%.3f' % (alpha, p))
if p <= alpha:print('拒絕原假設,兩變量存在相關關系')
else:print('不能拒絕原假設,兩變量相互獨立')
3. 參數檢驗
- 參數檢驗
3.1 學生t檢驗
用于檢驗兩獨立樣本數據的均值是否存在顯著差異。
使用前提:
各樣本觀察值為獨立同分布的
樣本數據服從正態分布
每個樣本觀測值的方差相等
原假設:兩樣本集的均值相同
Python實現代碼:
# Student's t-test
from scipy.stats import ttest_ind
data1 = [0.873, 2.817, 0.121, -0.945, -0.055, -1.436, 0.360, -1.478, -1.637, -1.869]
data2 = [1.142, -0.432, -0.938, -0.729, -0.846, -0.157, 0.500, 1.183, -1.075, -0.169]
stat, p = ttest_ind(data1, data2)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:print('不能拒絕原假設,兩樣本集分布相同')
else:print('拒絕原假設,樣本集分布可能不同')
3.2 配對樣本的t檢驗
用于檢驗兩配對樣本的均值是否存在顯著差異。
使用前提:
各樣本觀察值為獨立同分布的
樣本數據服從正態分布
每個樣本觀測值的方差相等
樣本的數據是一一對應的關系
原假設:各樣本集的均值相同
Python實現代碼:
# Paired Student's t-test
from scipy.stats import ttest_rel
data1 = [0.873, 2.817, 0.121, -0.945, -0.055, -1.436, 0.360, -1.478, -1.637, -1.869]
data2 = [1.142, -0.432, -0.938, -0.729, -0.846, -0.157, 0.500, 1.183, -1.075, -0.169]
stat, p = ttest_rel(data1, data2)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:print('不能拒絕原假設,兩樣本集分布相同')
else:print('拒絕原假設,兩樣本集分布可能不同')
3.3 方差分析ANOVA
用于檢驗兩個及以上獨立樣本數據的均值是否存在顯著差異。
使用前提:
各樣本觀察值為獨立同分布的
樣本數據服從正態分布
每個樣本觀測值的方差相等
原假設:各樣本集均值相同
Python實現代碼:
# Analysis of Variance Test
from scipy.stats import f_oneway
data1 = [0.873, 2.817, 0.121, -0.945, -0.055, -1.436, 0.360, -1.478, -1.637, -1.869]
data2 = [1.142, -0.432, -0.938, -0.729, -0.846, -0.157, 0.500, 1.183, -1.075, -0.169]
data3 = [-0.208, 0.696, 0.928, -1.148, -0.213, 0.229, 0.137, 0.269, -0.870, -1.204]
stat, p = f_oneway(data1, data2, data3)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:print('不能拒絕原假設,樣本集分布相同')
else:print('拒絕原假設,樣本集分布可能不同')
3.4 重復觀測的方差分析
用于檢驗兩或多配對樣本的均值是否存在顯著差異。
使用前提:
各樣本觀察值為獨立同分布的
樣本數據服從正態分布
每個樣本觀測值的方差相等
樣本的數據是一一對應的關系
Python中Scipy暫不支持該檢驗
4. 非參數檢驗
4.1 Mann-Whitney U Test
用于檢驗兩獨立樣本分布是否相同。該檢驗的原理是,將兩樣本集合并起來,一起排序,然后計算兩樣本的值是隨機混合排序的,還是聚集的。秩序隨機則代表兩樣本集分布無差異,而出現樣本值聚集情況則表明有差異。為了使檢驗有效,要求每個樣本數據至少有20個觀測值。使用前提:各樣本觀察值為獨立同分布的
各樣本集中數據可定序
原假設:兩樣本集分布相同Python實現代碼:
# Mann-Whitney U Test
from scipy.stats import mannwhitneyu
data1 = [0.873, 2.817, 0.121, -0.945, -0.055, -1.436, 0.360, -1.478, -1.637, -1.869]
data2 = [1.142, -0.432, -0.938, -0.729, -0.846, -0.157, 0.500, 1.183, -1.075, -0.169]
stat, p = mannwhitneyu(data1, data2)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:print('不能拒絕原假設,兩樣本集分布相同')
else:print('拒絕原假設,樣本集分布可能不同')
4.2 Wilcoxon Signed-Rank Test
用于檢驗兩配對樣本分布是否相同。
樣本不獨立,因此不能使用Mann-Whitney U檢驗,而是使用Wilcoxon符號秩檢驗。這相當于配對樣本的學生t檢驗,但是適用于定序數據,而不是服從正態分布的實測數據。
使用前提:
各樣本觀察值為獨立同分布的
各樣本集中數據可定序
樣本的數據是一一對應的關系
原假設:兩樣本集分布相同
Python實現代碼:
# Wilcoxon Signed-Rank Test
from scipy.stats import wilcoxon
data1 = [0.873, 2.817, 0.121, -0.945, -0.055, -1.436, 0.360, -1.478, -1.637, -1.869]
data2 = [1.142, -0.432, -0.938, -0.729, -0.846, -0.157, 0.500, 1.183, -1.075, -0.169]
stat, p = wilcoxon(data1, data2)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:print('不能拒絕原假設,兩樣本集分布相同')
else:print('拒絕原假設,樣本集分布可能不同')
4.3 Kruskal-Wallis H Test
用于檢驗兩個及以上獨立樣本的分布是否相同。
Kruskal-Wallis 檢驗是單因素方差分析檢驗的非參數版本,可以用來確定兩個以上的獨立樣本是否有不同的分布,可以被認為是Mann-Whitney U檢驗的一般化。該檢驗的零假設是“所有樣本數據從同一個分布中抽取的”,若拒絕原假設,則表明有足夠證據證明至少有一個樣本與其他樣本不同,但是該假設并不能確定具體是哪幾個不同。因此,如果需要確定,可再使用Mann-Whitney檢驗進行兩兩對比。
使用前提:
各樣本觀察值為獨立同分布的
各樣本集中數據可定序
原假設:各樣本集的分布相同
備擇假設:至少有一個樣本集與其他樣本不同
Python實現代碼:
# Kruskal-Wallis H Test
from scipy.stats import kruskal
data1 = [0.873, 2.817, 0.121, -0.945, -0.055, -1.436, 0.360, -1.478, -1.637, -1.869]
data2 = [1.142, -0.432, -0.938, -0.729, -0.846, -0.157, 0.500, 1.183, -1.075, -0.169]
data3 = [-0.208, 0.696, 0.928, -1.148, -0.213, 0.229, 0.137, 0.269, -0.870, -1.204]
stat, p = kruskal(data1, data2, data3)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:print('不能拒絕原假設,樣本集分布相同')
else:print('拒絕原假設,樣本集分布可能不同')
4.4 Friedman Test
用于檢驗兩個及以上配對樣本的分布是否相同。Friedman Test是重復測量方差分析的非參數版本,需要每組至少有10個樣本,當得出顯著性結果,表明至少有一個樣本與其他樣本存在差異。
使用前提:
各樣本觀察值為獨立同分布的
各樣本集中數據可定序
樣本的數據是一一對應的關系
原假設:各樣本集的分布相同
Python實現代碼:
# Friedman Test
from scipy.stats import friedmanchisquare
data1 = [0.873, 2.817, 0.121, -0.945, -0.055, -1.436, 0.360, -1.478, -1.637, -1.869]
data2 = [1.142, -0.432, -0.938, -0.729, -0.846, -0.157, 0.500, 1.183, -1.075, -0.169]
data3 = [-0.208, 0.696, 0.928, -1.148, -0.213, 0.229, 0.137, 0.269, -0.870, -1.204]
stat, p = friedmanchisquare(data1, data2, data3)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:print('不能拒絕原假設,樣本集分布相同')
else:print('拒絕原假設,樣本集分布可能不同')
- 時間序列的平穩性檢驗
下面是針對時間序列數據的平穩性檢驗。當數據沒有呈現明顯的模式特征的話(趨勢性、季節性),可認為它是平穩的。平穩序列中各觀察值在某個固定水平上波動,雖然在不同時間段波動程度不同,但是并不存在某種規律,可認為是隨機的。
5.1 Augmented Dickey-Fuller Unit Root Test
用于檢驗時間序列是否具有單位根,例如是否具有趨勢或者更普遍的自回歸。單位根是時間序列的一種特性,使時間序列具有非平穩性。單位根的存在意味著時間序列是非平穩的。
使用前提:
觀察值在時間上是有序的
原假設:存在一個單位根,序列是非平穩的
備擇假設:不存在單位根,序列平穩
(注意:該檢驗的原假設與下一個檢驗的假設是不同的;如果p值小于顯著性水平,認為該時間序列平穩)
Python實現代碼:
# Augmented Dickey-Fuller unit root test
from statsmodels.tsa.stattools import adfuller
data = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
stat, p, lags, obs, crit, t = adfuller(data)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:print('時間序列是不平穩的')
else:print('時間序列平穩')
5.2 Kwiatkowski-Phillips-Schmidt-Shin
用于檢驗時間序列在確定性趨勢上的平穩性。
使用前提:
觀察值在時間上是有序的
Python實現代碼:
注意,在默認情況下,該函數參數regression=‘c’,代表 原假設:時間序列是平穩的。(圍繞一個常數)備擇假設:時間序列是不平穩的。
# Kwiatkowski-Phillips-Schmidt-Shin test
# The data is stationary around a constant (default).
from statsmodels.tsa.stattools import kpss
data = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
stat, p, lags, crit = kpss(data, regression='c')
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:print('時間序列是平穩的')
else:print('時間序列是不平穩的')# stat=0.410, p=0.073
# 時間序列是平穩的
而使參數regression=‘ct’,可檢驗時間序列在確定趨勢上的平穩性。
# Kwiatkowski-Phillips-Schmidt-Shin test
# The data is stationary around a trend
from statsmodels.tsa.stattools import kpss
data = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
stat, p, lags, crit = kpss(data, regression='ct')
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:print('時間序列是趨勢穩定的')
else:print('時間序列是趨勢不穩定的')# stat=0.433, p=0.010
# 時間序列是趨勢不穩定的
參考資料:https://machinelearningmastery.com/statistical-hypothesis-tests-in-python-cheat-sheet/
總結
以上是生活随笔為你收集整理的假设检验_python 重点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux各种模式切换
- 下一篇: 机器学习常用术语词汇表