Python 中的方差分析檢驗

以下教程基於數據分析;我們將詳細討論方差分析(ANOVA) ,以及用 Python 編程語言實現它的過程。ANOVAs 通常用於心理學研究。

在接下來的教程中,我們將了解如何藉助 SciPy 庫進行方差分析,利用 Pyyttbl 和 Statsmodels 在 Python 中對其進行【手工】評估。

理解方差分析檢驗

我們可以想到一個方差分析檢驗,也稱為方差分析,來概括多組的 T 檢驗。通常,我們使用獨立的 T 檢驗來比較兩組之間的狀態均值。每當我們需要比較兩個以上組之間的狀態平均值時,我們使用方差分析檢驗。

方差分析檢驗模型中某處的平均值是否有差異(檢驗是否有整體效應);然而,這種方法不能告訴我們區別的地方(如果有的話)。通過進行事後檢驗,我們可以發現小組之間的差異點。

然而,為了進行任何檢驗,我們首先必須定義無效假設和替代假設:

  1. 無效假設:各組之間沒有顯著差異。
  2. 交替假設:各組之間有一個值得注意的差異。

我們可以通過比較兩種變異來進行方差分析。第一個變化是在樣本裝置和每個樣本中的另一個之間。下面顯示的公式描述了單向方差分析檢驗統計。

方差分析公式的輸出,即 F 統計量(也稱為 F 比),能夠分析多組數據,以確定樣本之間和樣本內部的可變性。

我們可以寫出單向方差分析的公式,如下所示:

哪裡,

y i -樣本均值在 i 第T5】組

n i -第 i 第T5】組觀察次數

y -數據的總平均值

k -組的總數

yij-jthT5【觀察中出 k 組

總樣本量

無論何時繪製方差分析表,我們都可以看到以下格式的所有上述組件:

通常,如果屬於 F 的 p 值小於 0.05,則排除零假設,保持替代假設。在否定零假設的情況下,我們可以說所有集合/組的平均值不相等。

注:如果被測組之間沒有真正的差異,這就是所謂的零假設,方差分析檢驗的 F 比統計將接近 1。

方差分析檢驗假設

在進行方差分析檢驗之前,我們必須做一些假設,如下所示:

  1. 我們可以從因子水平定義的總體中隨機獨立地獲得觀察值。
  2. 因子的每個級別的數據通常是分布的。
  3. 病例獨立:樣本病例必須相互獨立。
  4. 方差同質性:同質性表示組之間的方差需要大約相等。

我們可以藉助布朗-福賽思檢驗或萊文檢驗來檢驗方差齊性的假設。我們還可以藉助直方圖、峰度或偏度值,或者藉助像科爾莫戈羅夫-斯米爾諾夫、夏皮羅-維爾克或 Q-Q 圖這樣的檢驗來檢驗分數分布的正態性。我們也可以確定獨立於研究設計的假設。

值得注意的是,方差分析檢驗對違反獨立性假設並不穩健。這是為了告訴人們,即使有人試圖違反正態性或同質性的假設,他們也可以進行檢驗並相信結果。

然而,如果獨立性的假設被拒絕,方差分析的結果是不可接受的。通常,如果我們有同等規模的小組,分析以及違反同質性被認為是穩健的。如果我們有大樣本量,恢復方差分析檢驗並違反正態性通常是可以的。

了解方差分析檢驗的類型

方差分析檢驗可以分為三種主要類型。這些類型如下所示:

  1. 單向方差分析檢驗
  2. 雙向方差分析檢驗
  3. 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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
IHWPK的頭像IHWPK
上一篇 2025-01-14 18:56
下一篇 2025-01-14 18:56

相關推薦

  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智慧、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • 蝴蝶優化演算法Python版

    蝴蝶優化演算法是一種基於仿生學的優化演算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化演算法Python版…

    編程 2025-04-29

發表回復

登錄後才能評論