比較多組獨立樣本中位數檢定 (Kruskal-Wallis H-test,non-parametric)
套路 16: 比較多組獨立樣本中位數檢定
(Kruskal-Wallis H-test,non-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
留言
張貼留言