Python如何實現(xiàn)單因素方差分析
1.背景
正念越來越受到人們關(guān)注,正念是一種有意的、不加評判的對當(dāng)下的注意覺察。可以通過可以通過觀呼吸、身體掃描、正念飲食等多種方式培養(yǎng)。
為了驗證正念對記憶力的影響,選取三組被試分別進行正念訓(xùn)練,運動訓(xùn)練和無訓(xùn)練,以測量他們的短時記憶是否改善。
在各種條件嚴(yán)格控制下,三個月后測量各組的短時記憶回憶容量,結(jié)果如下:
為了驗證各組是否存在差異,采用單因素方差分析進行分析,并同時使用SPSS對每一步代碼進行說明。
PS:此處為隨機數(shù)生成,且為了方便展示使用了寬數(shù)據(jù),導(dǎo)入SPSS時可使用“數(shù)據(jù)”-“重構(gòu)”轉(zhuǎn)換為SPSS常用的長數(shù)據(jù)。
2.Python代碼
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from statsmodels.stats.multicomp import pairwise_tukeyhsd # 事后比較 from statsmodels.formula.api import ols from statsmodels.stats.anova import anova_lm independent = "處理" # 自變量 dependent = '短時記憶回憶成績' # 因變量 # 設(shè)置畫圖參數(shù) def define_plt(): plt.rcParams['font.sans-serif'] = ['SimHei', ] # 設(shè)置漢字字體 plt.rcParams['font.size'] = 12 # 字體大小 plt.rcParams['axes.unicode_minus'] = False # 正常顯示負號 # 處理數(shù)據(jù) def general_data(): # 使用melt()函數(shù)將讀取數(shù)據(jù)進行結(jié)構(gòu)轉(zhuǎn)換,以滿足ols()函數(shù)對數(shù)據(jù)格式的要求, # melt()函數(shù)能將列標(biāo)簽轉(zhuǎn)換為列數(shù)據(jù) excel_data = pd.read_excel('不同正念處理下的短時記憶成績.xlsx', index_col=0) melt_data = excel_data.melt(var_name=independent, value_name=dependent) print("\n=================melt_data========================") print(melt_data) return melt_data # 顯示箱型線,檢查是否有極端數(shù)值 def show_boxplot(melt_data): sns.boxplot(x=independent, y=dependent, data=melt_data) plt.show() # 需要放最后運行,否則會阻擋后面程序的運行 # 方差分析 def anova(melt_data): # ols()創(chuàng)建一線性回歸分析模型 model_ols = ols('%s~C(%s)' % (dependent, independent), melt_data).fit() # anova_lm()函數(shù)創(chuàng)建模型生成方差分析表 anova_table = anova_lm(model_ols, typ=2) print("\n=================以下為方差分析表====================") print(anova_table) # 事后比較 def multiple_comparisons(melt_data): # 進行事后比較分析 print("\n=================事后比較分析結(jié)果====================") print(pairwise_tukeyhsd(melt_data[dependent], melt_data[independent])) define_plt() # 定義plt參數(shù) memory_result = general_data() # 生成數(shù)據(jù) anova(memory_result) # 方差分析 multiple_comparisons(memory_result) # 事后比較 show_boxplot(memory_result) # 顯示箱型線
3.結(jié)果
3.1 運行以上代碼,會出現(xiàn)如下結(jié)果
- 3.3.1 方差分析輸出結(jié)果
對比一下SPSS的輸出結(jié)果:
- 英文版
- 中文版
可以看出,Python的輸出結(jié)果比較簡潔,不過其實組別和誤差兩項也夠用了。
- 3.3.2 事后比較分析結(jié)果
和SPSS中的結(jié)果進行比較:
- 英文版:
- 中文版:
可以看出,Python也是只輸出了三個組的對比,不過和SPSS相比,也只是反過來用負數(shù)表示而已,重點關(guān)注畫框的地方,大于0.05說明不能拒絕零假設(shè),Python輸出結(jié)果則是用False表示。
- 3.3.3 箱型圖
SPSS的輸出結(jié)果:
PS:部分字的內(nèi)容不一樣是我在不同地方輸入變量的問題,這個無關(guān)緊要。
可以看到正念組是明顯高于其他兩個組的。
箱型圖怎么看?
箱型圖的基本組成部分包括:
- 1.上邊緣:數(shù)據(jù)點的最右側(cè)界限,通常是最大值。
- 2.下邊緣:數(shù)據(jù)點的最左側(cè)界限,通常是最小值。
- 3.中位數(shù):所有數(shù)據(jù)點按照大小順序排列后位于中間位置的數(shù)值。
- 4.四分位距:IQR(Interquartile Range,四分位間距)定義為中位數(shù)與第一四分位數(shù)之間的距離的一半。
- 5.異常值:那些明顯偏離數(shù)據(jù)集整體趨勢的數(shù)據(jù)點,通常用圓點表示。
箱型圖一般不包括均值。
4.逐個部分講解
4.1 寬數(shù)據(jù)轉(zhuǎn)換為長數(shù)據(jù)
當(dāng)我們把這張Excel表導(dǎo)入SPSS時,
會顯示如下
而我們要將其轉(zhuǎn)換為長數(shù)據(jù),即每個列為一個變量的類型
- 4.1.1 Python代碼
在Python代碼中,使用melt()函數(shù)實現(xiàn)
# 處理數(shù)據(jù) def general_data(): # 使用melt()函數(shù)將讀取數(shù)據(jù)進行結(jié)構(gòu)轉(zhuǎn)換,以滿足ols()函數(shù)對數(shù)據(jù)格式的要求, # melt()函數(shù)能將列標(biāo)簽轉(zhuǎn)換為列數(shù)據(jù) excel_data = pd.read_excel('不同正念處理下的短時記憶成績.xlsx', index_col=0) melt_data = excel_data.melt(var_name=independent, value_name=dependent) print("\n=================melt_data========================") print(melt_data) return melt_data
我們將輸出結(jié)果打印出來,如下
=================melt_data========================
處理 短時記憶回憶成績
0 正念組 11.3
1 正念組 10.8
2 正念組 8.4
3 正念組 8.5
4 正念組 8.9
5 正念組 10.7
6 正念組 8.4
7 正念組 11.1
8 正念組 8.3
9 正念組 11.9
10 運動組 7.0
11 運動組 6.4
12 運動組 7.6
13 運動組 6.2
14 運動組 6.6
15 運動組 8.2
16 運動組 5.7
17 運動組 8.9
18 運動組 8.7
19 運動組 6.7
20 控制組 6.3
21 控制組 5.2
22 控制組 9.0
23 控制組 5.0
24 控制組 7.5
25 控制組 6.3
26 控制組 6.0
27 控制組 5.2
28 控制組 7.1
29 控制組 7.4
- 4.1.2 對應(yīng)的SPSS操作
為了適應(yīng)使用不同語言的場景,我將同時呈現(xiàn)中文版和英文版
1.數(shù)據(jù)-重構(gòu)
2.將選定變量重構(gòu)為個案(C)
3.重構(gòu)一個變量組
4.把數(shù)據(jù)列都放入目標(biāo)變量中,個案組標(biāo)識和固定變量可以先不管
5.這一步將各組名作為索引變量
6.選擇使用變量名作為索引
7.之前那個序號沒什么用,可以直接刪除
8.完成即可
9.確定
10.可以看到新生成名為索引1的一列
11.點一下下面的變量視圖,將索引1改成組別
12.再將組別排序,即可獲得長數(shù)據(jù)
其實這樣操作還不如直接在Excel里面操作,可能還方便一些,這里只是做個展示。
而且在SPSS中,如果使用“分析”-“比較平均值”下面的“單因素 ANOVA 檢驗…”,則不能使用字符串,如“正念組”這樣,而是要轉(zhuǎn)換成數(shù)字123之類的,變成組1組2組3,但是這樣看起來不方便,輸出結(jié)果也不好看。我們還可以使用“分析”-“一般線性模型”下的單變量,來達到方差分析的目的。
4.2 方差分析
- 4.2.1 Python代碼
# 方差分析 def anova(melt_data): # ols()創(chuàng)建一線性回歸分析模型 model_ols = ols('%s~C(%s)' % (dependent, independent), melt_data).fit() # anova_lm()函數(shù)創(chuàng)建模型生成方差分析表 anova_table = anova_lm(model_ols, typ=2) print("\n=================以下為方差分析表====================") print(anova_table)
Python輸出結(jié)果:
- 4.2.2 SPSS操作
一般這里我們會按需要點擊“圖”、“事后比較”、“選項”這些來輸出一些內(nèi)容,比如描述統(tǒng)計、齊性檢驗,交互圖什么的,不過這里暫時不需要,為了讓輸出純粹一點,選好因變量和固定因子直接點確定即可。
SPSS輸出結(jié)果:
- 中文版
- 英文版
4.3 事后比較
- 4.3.1 Python代碼
# 事后比較 def multiple_comparisons(melt_data): # 進行事后比較分析 print("\n=================事后比較分析結(jié)果====================") print(pairwise_tukeyhsd(melt_data[dependent], melt_data[independent]))
Python輸出結(jié)果:
- 4.3.2 SPSS操作
選擇事后比較
選擇“圖基(Tukey)”即可
然后點確定
SPSS輸出結(jié)果:
這一步同時還會輸出主體間因子 Between-Subjects Factors,齊性子集 Homogeneous Subsets和前面的主體間效應(yīng)檢驗 Tests of Between-Subjects Effects,不過這不是重點,我們主要關(guān)注和代碼對應(yīng)的部分即可。
4.4 箱型圖
- 4.4.1 Python代碼
# 設(shè)置畫圖參數(shù) def define_plt(): plt.rcParams['font.sans-serif'] = ['SimHei', ] # 設(shè)置漢字字體 plt.rcParams['font.size'] = 12 # 字體大小 plt.rcParams['axes.unicode_minus'] = False # 正常顯示負號 # 顯示箱型線,檢查是否有極端數(shù)值 def show_boxplot(melt_data): sns.boxplot(x=independent, y=dependent, data=melt_data) plt.show() # 需要放最后運行,否則會阻擋后面程序的運行
Python輸出結(jié)果:
- 4.4.2 SPSS操作
由于這里我們只是想看一下箱型圖,不想輸出太多內(nèi)容,所以左下角點擊只顯示圖即可,如果還想輸出正態(tài)性檢驗,Q-Q圖之類的,可以按需要點擊右側(cè)的按鈕設(shè)置選取。
SPSS輸出結(jié)果:
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python答題卡識別并給出分數(shù)的實現(xiàn)代碼
本文帶領(lǐng)大家學(xué)習(xí)Python答題卡識別并給出分數(shù)的實現(xiàn)代碼,代碼實現(xiàn)思路清晰,簡單易懂,Python識別答題卡相關(guān)知識感興趣的朋友一起看看吧2021-06-06如何查看Django ORM執(zhí)行的SQL語句的實現(xiàn)
這篇文章主要介紹了如何查看Django ORM執(zhí)行的SQL語句的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04Python?BeautifulSoup4實現(xiàn)數(shù)據(jù)解析與提取
Beautiful?Soup是一個Python的庫,用于解析HTML和XML文檔,提供了方便的數(shù)據(jù)提取和操作功能,下面小編就來和大家詳細聊聊如何利用BeautifulSoup4實現(xiàn)數(shù)據(jù)解析與提取吧2023-10-10pytorch如何自定義forward和backward函數(shù)
PyTorch自動求導(dǎo)功能強大,但在特定情況下需要用戶自行定義backward函數(shù),通過實例解釋了保存變量、計算梯度、鏈?zhǔn)椒▌t等核心概念,并展示了如何通過自定義函數(shù)集成到網(wǎng)絡(luò)中以及如何正確返回梯度,此外,還討論了多輸出情況下的梯度傳遞2024-10-10Django {{ MEDIA_URL }}無法顯示圖片的解決方式
這篇文章主要介紹了Django {{ MEDIA_URL }}無法顯示圖片的解決方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04