比較多組獨立樣本中位數檢定 (Kruskal-Wallis H-test,non-parametric)


套路 16: 比較多組獨立樣本中位數檢定
(Kruskal-Wallis H-testnon-parametric)

什麼是比較多組相同變異數獨立樣本平均值檢定? 說白了就是多組分別獨立取樣的資料做比較的假設檢定。**注意** ”比較變異數” (comparing variances)變異數分析” (analysis of variance)不同。變異數分析是多組資料比較平均值或中位數。統計假設檢定檢定什麼?H0。例如多組獨立樣本假設檢定H0 : k組樣本中位數相同,HA : 至少有一組中位數不同是檢定多組資料的中位數是否相同。假設相等時為雙尾 (two-tailed test) 檢定。

1. 使用時機: 用於比較多組樣本中位數(median)
2. 分析類型: 無母數(non-parametric)分析。直接使用資料數值算統計叫parametric方法,把資料排序之後用排序的名次算統計叫non-parametric方法。
3. 前提假設:
4. 範例資料: 咪路調查餵食不同飼料的肉雞體重(g) 不同飼料是否效果不同?資料如下:
飼料1
飼料2
飼料3
飼料4
61.8
78.8
70.5
60.3
65.1
79.5
72.6
63.8
61.7
76.0
71.7
64.1
63.3
73.4
72.0
61.4

77.3
71.1
60.9
H0: 餵食不同飼料的肉雞體重相同。HA: 餵食不同飼料的肉雞體重不完全相同。

5. 畫圖看資料分布:
wt = [61.8,65.1,61.7,63.3,78.8,79.5,76.0,73.4,77.3,70.5,72.6,71.7,72.0,71.1,60.3,63.8,64.1,61.4,60.9]
cl = ["F1","F1","F1","F1","F2","F2","F2","F2","F2","F3","F3","F3","F3","F3","F4","F4","F4","F4","F4"]
dat = {'Weight':wt,'Feed':cl}
import pandas as pd
df = pd.DataFrame(dat)
import seaborn as sns
sns.set(style="whitegrid")
ax = sns.boxplot(x = "Feed", y = "Weight", data = df, width=0.2, palette="Set3")
ax = sns.swarmplot(x = "Feed", y = "Weight", data = df, color = "red")

結果: 


6. 無母數(non-parametric)分析不需檢查資料是否為常態分布

7. 無母數(non-parametric)分析不需檢查資料是否為相同變異數

8. 使用Python計算比較多組獨立樣本中位數檢定 (Kruskal-Wallis H-test):
方法: 使用SciPy (scipy.stats.kruskal)
dat1 = [61.8,65.1,61.7,63.3]
dat2 = [78.8,79.5,76.0,73.4,77.3]
dat3 = [70.5,72.6,71.7,72.0,71.1]
dat4 = [60.3,63.8,64.1,61.4,60.9]
import scipy.stats
scipy.stats.kruskal (dat1, dat2, dat3, dat4)
結果: KruskalResult(statistic=15.701052631578946, pvalue=0.001305767297303032)
p = 1.305e-3 < 0.05,不接受H0: 餵食不同飼料的肉雞體重相同飼料效果不同。

飼料效果不同是誰跟誰有差呢?要進一步做multiple comparison (Conover's test):
pip install scikit-posthocs   # 安裝scikit-posthocs
# 安裝成功後執行下列程式
wt = [61.8,65.1,61.7,63.3,78.8,79.5,76.0,73.4,77.3,70.5,72.6,71.7,72.0,71.1,60.3,63.8,64.1,61.4,60.9]
cl = ["F1","F1","F1","F1","F2","F2","F2","F2","F2","F3","F3","F3","F3","F3","F4","F4","F4","F4","F4"]
dat = {'Weight':wt,'Feed':cl}
import pandas as pd
df = pd.DataFrame(dat)

import scikit_posthocs as sp
sp.posthoc_conover(df, val_col = 'Weight', group_col = 'Feed', p_adjust = 'holm')
結果如下表: 打紅*有差
          F1            F2        F3            F4
F1 -1.000000  1.034486e-05*  0.003079*  2.420379e-01
F2  0.000010 -1.000000e+00  0.005376*  9.043285e-07*
F3  0.003079  5.376005e-03 -1.000000  2.033145e-04*
F4  0.242038  9.043285e-07  0.000203 -1.000000e+00

留言

這個網誌中的熱門文章

三因子變異數分析 (Three-Way ANOVA)

兩組獨立樣本變異數相同 t 檢定 (Two-Sample t test with equal variances,parametric)

雙因子變異數分析 (Two-Way ANOVA)