比較多組獨立樣本變異數檢定 (Comparing Multi-Sample variances,parametric and non-parametric)


套路 20: 比較多組獨立樣本變異數檢定
(Comparing Multi-Sample variancesparametric and non-parametric)

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

1. 使用時機: 用於比較多組變異數相同獨立樣本變異數(variances)
2. 分析類型: 母數(parametric)分析及無母數(non-parametric)分析。直接使用資料數值算統計叫parametric方法,把資料排序之後用排序的名次算統計叫non-parametric方法。
3. 前提假設: 使用母數(parametric)分析時資料須為常態分布(normal distribution)
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
不同飼料是否效果不同? s12 = s22 = s32  = s42HA: 餵食不同飼料的肉雞體重變異數不完全相同。

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. 檢查資料是否為常態分布 (H0:資料為常態分佈):
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.shapiro(dat1)
結果: (0.8768853545188904, 0.32550376653671265)
p = 0.3255 > 0.05,接受H0:資料為常態分佈。
scipy.stats.shapiro(dat2)
結果: (0.9504634737968445, 0.7404994964599609)
p = 0.7405 > 0.05,接受H0:資料為常態分佈。
scipy.stats.shapiro(dat3)
結果: (0.9899775981903076, 0.9796159863471985)
p = 0.9796 > 0.05,接受H0:資料為常態分佈。
scipy.stats.shapiro(dat4)
結果: (0.8627133369445801, 0.23815500736236572)
p = 0.2381 > 0.05,接受H0:資料為常態分佈。

7. Python比較資料是否為相同變異數 (H0: s12 = s22 = s32  = s42):
方法一: Levene test for equal variances (parametric test)
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.levene(dat1, dat2, dat3, dat4, center = 'mean')
結果: LeveneResult(statistic=1.9584062218957583, pvalue=0.16363937651728697)
p = 0.1636 > 0.05,接受H0: s12 = s22 = s32  = s42
# 相同變異數表示樣本來自相同母體(population),不同變異數表示樣本取樣自不同母體。

方法二: Bartlett's test for equal variances (robust parametric test)
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.bartlett(dat1, dat2, dat3, dat4)
結果: BartlettResult(statistic=3.7184430669361825, pvalue=0.29351615275831405)
p = 0.2935 > 0.05,接受H0: s12 = s22 = s32  = s42
# 相同變異數表示樣本來自相同母體(population),不同變異數表示樣本取樣自不同母體。

方法三: Fligner-Killeen test for equality of variance (non-parametric test)
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.fligner(dat1, dat2, dat3, dat4, center = 'median')
結果: FlignerResult(statistic=3.03649960271518, pvalue=0.38603181915628293)
p = 0.386 > 0.05,接受H0: s12 = s22 = s32  = s42
# 相同變異數表示樣本來自相同母體(population),不同變異數表示樣本取樣自不同母體。



留言

這個網誌中的熱門文章

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

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

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