以下教程基於數據分析;我們將詳細討論方差分析(ANOVA) ,以及用 Python 編程語言實現它的過程。ANOVAs 通常用於心理學研究。
在接下來的教程中,我們將了解如何藉助 SciPy 庫進行方差分析,利用 Pyyttbl 和 Statsmodels 在 Python 中對其進行【手工】評估。
理解方差分析檢驗
我們可以想到一個方差分析檢驗,也稱為方差分析,來概括多組的 T 檢驗。通常,我們使用獨立的 T 檢驗來比較兩組之間的狀態均值。每當我們需要比較兩個以上組之間的狀態平均值時,我們使用方差分析檢驗。
方差分析檢驗模型中某處的平均值是否有差異(檢驗是否有整體效應);然而,這種方法不能告訴我們區別的地方(如果有的話)。通過進行事後檢驗,我們可以發現小組之間的差異點。
然而,為了進行任何檢驗,我們首先必須定義無效假設和替代假設:
- 無效假設:各組之間沒有顯著差異。
- 交替假設:各組之間有一個值得注意的差異。
我們可以通過比較兩種變異來進行方差分析。第一個變化是在樣本裝置和每個樣本中的另一個之間。下面顯示的公式描述了單向方差分析檢驗統計。
方差分析公式的輸出,即 F 統計量(也稱為 F 比),能夠分析多組數據,以確定樣本之間和樣本內部的可變性。
我們可以寫出單向方差分析的公式,如下所示:
哪裡,
y i -樣本均值在 i 第T5】組
n i -第 i 第T5】組觀察次數
y -數據的總平均值
k -組的總數
yij-jthT5【觀察中出 k 組
總樣本量
無論何時繪製方差分析表,我們都可以看到以下格式的所有上述組件:
通常,如果屬於 F 的 p 值小於 0.05,則排除零假設,保持替代假設。在否定零假設的情況下,我們可以說所有集合/組的平均值不相等。
注:如果被測組之間沒有真正的差異,這就是所謂的零假設,方差分析檢驗的 F 比統計將接近 1。
方差分析檢驗假設
在進行方差分析檢驗之前,我們必須做一些假設,如下所示:
- 我們可以從因子水平定義的總體中隨機獨立地獲得觀察值。
- 因子的每個級別的數據通常是分布的。
- 病例獨立:樣本病例必須相互獨立。
- 方差同質性:同質性表示組之間的方差需要大約相等。
我們可以藉助布朗-福賽思檢驗或萊文檢驗來檢驗方差齊性的假設。我們還可以藉助直方圖、峰度或偏度值,或者藉助像科爾莫戈羅夫-斯米爾諾夫、夏皮羅-維爾克或 Q-Q 圖這樣的檢驗來檢驗分數分布的正態性。我們也可以確定獨立於研究設計的假設。
值得注意的是,方差分析檢驗對違反獨立性假設並不穩健。這是為了告訴人們,即使有人試圖違反正態性或同質性的假設,他們也可以進行檢驗並相信結果。
然而,如果獨立性的假設被拒絕,方差分析的結果是不可接受的。通常,如果我們有同等規模的小組,分析以及違反同質性被認為是穩健的。如果我們有大樣本量,恢復方差分析檢驗並違反正態性通常是可以的。
了解方差分析檢驗的類型
方差分析檢驗可以分為三種主要類型。這些類型如下所示:
- 單向方差分析檢驗
- 雙向方差分析檢驗
- n 向方差分析檢驗
單向方差分析檢驗
只有一個自變數的方差分析檢驗被稱為單向方差分析檢驗。
例如,一個國家可以評估冠狀病毒病例的差異,一個國家可以有多個類別進行比較。
雙向方差分析檢驗
有兩個獨立變數的方差分析檢驗被稱為雙向方差分析檢驗。這項檢驗也被稱為因子方差分析檢驗。
例如,擴展上述示例,雙向方差分析可以通過年齡組(第一自變數)和性別(第二自變數)來檢查冠狀病毒(因變數)病例的差異。雙向方差分析可以用來檢驗這兩個獨立變數之間的相互作用。交互作用表示所有類別的自變數之間的差異是不均勻的。
假設老年組與青年組相比,冠狀病毒總體病例可能更高;然而,與亞洲國家相比,這種差異在歐洲國家(T4)和亞洲國家(T7)可能有所不同。
n 向方差分析檢驗
如果研究人員使用兩個以上的獨立變數,方差分析檢驗被認為是一個 n 向方差分析檢驗。這裡 n 代表我們擁有的獨立變數的數量。該檢驗也稱為馬諾娃檢驗。
例如,我們可以同時使用國家、年齡組、性別、種族等獨立變數來檢查冠狀病毒病例的潛在差異。
方差分析檢驗將為我們提供單個(單變數)F 值;然而,一個 MANOVA 檢驗將為我們提供一個多元 F 值。
方差分析中有無複製的理解
一般來說,在方差分析檢驗中,我們中的一些人可能會聽到有複製和沒有複製的聲音。讓我們了解這些是什麼:
複製雙向方差分析檢驗
當兩個組和這些組的成員執行多個任務時,進行帶有複製的雙向方差分析檢驗。
例如,假設冠狀病毒疫苗仍在研發中。醫生正在進行兩種不同的治療,以治癒兩組感染病毒的患者。
無複製的雙向方差分析檢驗
沒有複製的雙向方差分析檢驗是在我們只有一個組時進行的,我們對同一組進行雙重檢驗。
例如,假設疫苗已經研製成功,研究人員在志願者接種疫苗前後檢驗了一組志願者,以觀察疫苗接種是否正常。
理解後方差分析檢驗
在進行方差分析檢驗時,我們試圖確定各組之間的統計學顯著差異(如果有的話)。如果我們找到一個,我們將不得不檢驗群體差異點在哪裡。
因此,研究人員使用事後檢驗來檢查哪些組彼此不同。
我們可以進行事後檢驗,即檢驗各組間平均差異的 t 檢驗。我們可以進行多次比較檢驗來控制第一類錯誤率,包括邦費羅尼、鄧尼特、謝菲和土耳其檢驗。
現在,我們將只理解使用 Python 編程語言的單向方差分析檢驗。
理解 Python 中的單向方差分析檢驗
我們將進行方差分析檢驗的過程分為不同的部分。
導入所需的庫
為了開始進行方差分析檢驗,讓我們為項目導入一些必要的庫和模塊。
語法:
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.formula.api import ols
import seaborn as sns
import numpy as np
import pandas.tseries
plt.style.use('fivethirtyeight')
假設
讓我們考慮這個問題的一個假設:
「每種飲食,人的體重平均值都是一樣的。」
載入數據
在下面的問題中,我們將使用謝菲爾德大學設計的飲食數據集。數據集包含一個作為性別的二進位變數,其中 1 代表男性,0 代表女性。
讓我們考慮以下語法:
語法:
mydata = pd.read_csv('Diet_Dataset.csv')
理解數據集
一旦我們成功導入數據集,讓我們列印一些數據來了解它。
示例-
print(mydata.head())
輸出:
Person gender Age Height pre.weight Diet weight6weeks
0 25 41 171 60 2 60.0
1 26 32 174 103 2 103.0
2 1 0 22 159 58 1 54.2
3 2 0 46 192 60 1 54.0
4 3 0 55 170 64 1 63.3
現在讓我們列印數據集中存在的總行數。
示例-
print('The total number of rows in the dataset:', mydata.size)
輸出:
The total number of rows in the dataset: 546
檢查缺失值
現在,我們必須看看數據集中是否缺少任何值。我們可以使用以下語法來檢查這一點。
示例-
print(mydata.gender.unique())
# displaying the person(s) having missing value in gender column
print(mydata[mydata.gender == ' '])
輸出:
[' ' '0' '1']
Person gender Age Height pre.weight Diet weight6weeks
0 25 41 171 60 2 60.0
1 26 32 174 103 2 103.0
我們可以觀察到兩個條目在「性別」列中包含缺失的值。現在讓我們找出數據集中缺失值的總百分比。
示例-
print('Percentage of missing values in the dataset: {:.2f}%'.format(mydata[mydata.gender == ' '].size / mydata.size * 100))
輸出:
Percentage of missing values in the dataset: 2.56%
我們可以觀察到,數據集中大約有 3%的缺失值。我們可以忽略、刪除或藉助最接近的高度平均值對其性別進行分類。
了解重量的分布
在接下來的步驟中,我們將使用 distplot() 函數繪製圖表,以了解樣本數據中的權重分布。讓我們考慮代碼片段。
示例-
f, ax = plt.subplots( figsize = (11,9) )
plt.title( 'Weight Distributions among Sample' )
plt.ylabel( 'pdf' )
sns.distplot( mydata.weight6weeks )
plt.show()
輸出:
我們還可以繪製數據集中每個性別的分布圖。下面是相同的語法:
示例-
f, ax = plt.subplots( figsize = (11,9) )
sns.distplot( mydata[mydata.gender == '1'].weight6weeks, ax = ax, label = 'Male')
sns.distplot( mydata[mydata.gender == '0'].weight6weeks, ax = ax, label = 'Female')
plt.title( 'Weight Distribution for Each Gender' )
plt.legend()
plt.show()
輸出:
我們也可以使用下面的函數來顯示每個性別的分布圖。
示例:
def infergender(x):
if x == '1':
return 'Male'
if x == '0':
return 'Female'
return 'Other'
def showdistribution(df, gender, column, group):
f, ax = plt.subplots( figsize = (11, 9) )
plt.title( 'Weight Distribution for {} on each {}'.format(gender, column) )
for groupmember in group:
sns.distplot(df[df[column] == groupmember].weight6weeks, label='{}'.format(groupmember))
plt.legend()
plt.show()
uniquediet = mydata.Diet.unique()
uniquegender = mydata.gender.unique()
for gender in uniquegender:
if gender != ' ':
showdistribution(mydata[mydata.gender == gender], infergender(gender), 'Diet', uniquediet)
輸出:
圖 1:
圖 2:
現在,我們將使用下面給出的代碼片段根據「性別」列計算平均值、中位數、非零計數和標準差:
示例-
print(mydata.groupby('gender').agg(
[ np.mean, np.median, np.count_nonzero, np.std ]
).weight6weeks)
輸出:
mean median count_nonzero std
gender
81.500000 81.5 2.0 30.405592
0 63.223256 62.4 43.0 6.150874
1 75.015152 73.9 33.0 4.629398
正如我們所觀察到的,我們已經基於性別估計了所需的統計測量。我們也可以根據性別和飲食對這些統計數據進行分類。
示例-
print(mydata.groupby(['gender', 'Diet']).agg(
[np.mean, np.median, np.count_nonzero, np.std]
).weight6weeks)
輸出:
mean median count_nonzero std
gender Diet
2 81.500000 81.50 2.0 30.405592
0 1 64.878571 64.50 14.0 6.877296
2 62.178571 61.15 14.0 6.274635
3 62.653333 61.80 15.0 5.370537
1 1 76.150000 75.75 10.0 5.439414
2 73.163636 72.70 11.0 3.818448
3 75.766667 76.35 12.0 4.434848
我們可以觀察到,飲食中女性的體重略有差異;然而,它似乎不會影響男性。
進行單向方差分析檢驗
單向方差分析檢驗的零假設是
這個檢驗試圖檢驗這個假設是否成立。
讓我們考慮初步確定 95%的置信水平,這也意味著我們將只接受 5%的誤差率。
示例-
mymod = ols('Height ~ Diet', data = mydata[mydata.gender == '0']).fit()
# performing type 2 anova test
aovtable = sm.stats.anova_lm(mymod, typ = 2)
print('ANOVA table for Female')
print('----------------------')
print(aovtable)
print()
mod = ols('Height ~ Diet', data = mydata[mydata.gender=='1']).fit()
# performing type 2 anova test
aovtable = sm.stats.anova_lm(mymod, typ = 2)
print('ANOVA table for Male')
print('----------------------')
print(aovtable)
輸出:
ANOVA table for Female
----------------------
sum_sq df F PR(>F)
Diet 559.680764 1.0 7.17969 0.010566
Residual 3196.086677 41.0 NaN NaN
ANOVA table for Male
----------------------
sum_sq df F PR(>F)
Diet 559.680764 1.0 7.17969 0.010566
Residual 3196.086677 41.0 NaN NaN
在上面的輸出中,我們可以觀察到兩個 p 值(PR (> F)):男性和女性。
在男性的情況下,我們不能接受低於 95%置信水平的零假設,因為 p 值大於α值,即 0.05 < 0.512784。因此,在提供這三種類型的飲食後,男性的體重沒有發現差異。
就女性而言,由於 p 值 PR (> F)低於誤差率,即 0.05 > 0.010566,我們可以拒絕零假設。這種說法表明,我們對女性在飲食方面的身高差異非常有信心。
所以,現在我們明白了飲食對女性的影響;然而,我們沒有意識到這兩種飲食之間的區別。因此,我們將在 Tukey HSD(誠實顯著差異)檢驗的幫助下進行事後分析。
讓我們考慮下面的代碼片段。
示例-
from statsmodels.stats.multicomp import pairwise_tukeyhsd, MultiComparison
# using the female data only
mydf = mydata[mydata.gender == '0']
# comparing the height between each diet, using 95% confidence interval
multiComp = MultiComparison(mydf['Height'], mydf['Diet'])
tukeyres = multiComp.tukeyhsd(alpha = 0.05)
print(tukeyres)
print('Unique diet groups: ', multiComp.groupsunique)
輸出:
Multiple Comparison of Means - Tukey HSD, FWER=0.05
=====================================================
group1 group2 meandiff p-adj lower upper reject
-----------------------------------------------------
1 2 -3.5714 0.5437 -11.7861 4.6432 False
1 3 -8.7714 0.0307 -16.848 -0.6948 True
2 3 -5.2 0.2719 -13.2766 2.8766 False
-----------------------------------------------------
Unique diet groups: [1 2 3]
從上面的輸出中我們可以觀察到,我們只能拒絕第一種和第三種飲食類型中的無效假設,這意味著飲食 1 和飲食 3 的體重存在統計學上的顯著差異。
原創文章,作者:IHWPK,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/330073.html