常用數據分析方法:方差分析及實現!

2021-01-14 Datawhale

↑↑↑關注後"星標"Datawhale

作者:吳忠強,Datawhale優秀學習者,東北大學

一個複雜的事物,其中往往有許多因素互相制約又互相依存。方差分析是一種常用的數據分析方法,其目的是通過數據分析找出對該事物有顯著影響的因素、各因素之間的交互作用及顯著影響因素的最佳水平等。

本文介紹了方差分析的基礎概念,詳細講解了單因素方差分析、雙因素方差分析的原理,並且給出了它們的python實踐代碼。

本文大綱:

關於方差分析的基礎概念

單因素方差分析原理及python實現

雙因素方差分析原理及python實現

一、關於方差分析的基礎概念在科學試驗和生產實踐中,影響某一事物的因素往往很多,比如化工生產中,像原料成分,劑量,反應溫度,壓力等等很多因素都會影響產品的質量,有些因素影響較大,有些影響較小, 為了使生產過程穩定, 保證優質高產, 就有必要找出對產品質量有顯著影響的因素。如何找到影響因素呢?就需要試驗, 方差分析就是根據試驗的結果進行分析, 鑑別各個有關因素對試驗結果影響程度的有效方法。而根據涉及到的因素個數的不同, 又可以把方差分析分為單因素方差分析、多因素方差分析等。

下面我們先重點研究單因素方差分析, 通過一個例子,引出方差分析中的幾個概念:

某保險公司想了解一下某險種在不同的地區是否有不同的索賠額。於是他們就搜集了四個不同地區一年的索賠額情況的記錄如下表:

嘗試判斷一下, 地區這個因素是否對與索賠額產生了顯著的影響?

這個問題就是單因素方差分析的問題, 具體解決方法後面會說, 首先先由這個例子弄清楚幾個概念:

試驗指標:方差分析中, 把考察的試驗結果稱為試驗指標, 上面例子裡面的「索賠額」。

因素:對試驗指標產生影響的原因稱為因素, 如上面的「地區」

水平:因素中各個不同狀態, 比如上面我們有A1, A2, A3, A4四個狀態, 四個水平。

這個類比的話, 就類似於y就是試驗指標, 某個類別特徵x就是因素, 類別特徵x的不同取值就是水平。那麼通過方差分析, 就可以得到某個類別特徵對於y的一個影響程度了吧, 這會幫助分析某個類別特徵的重要性!

二、單因素方差分析原理及python實現所謂單因素方差分析, 就是僅考慮有一個因素
注意這裡的

基於上面的分析, 我們就可以把方差分析也看成一個檢驗假設的問題, 並有了原假設和備擇假設:

那麼這個假設檢驗的問題怎麼驗證呢?我們得先分析一下, 為啥各個

這個叫做總偏差平方和,如果這個越大, 就表示
關於

綜合所有的水平, 就可以得到誤差平方和的公式如下:

由於

通過上面的分析,我們會得到以下三點結論:

後面這部分的加和如果除以
我們上面說
這時候構造出了F統計量。在原假設成立的時候,

基於上面的分析,會得到一個單因素試驗方差分析表:

這個表就把上面所有的分析都給總結好了。但實際使用中,我們肯定是不會手算的,並且一般也不看F的值,我們是看p值的。

下面就用python實現一下上面的那個索賠額的例子, 看看單因素方差分析是怎麼做的:

import pandas as pdimport numpy as np
from scipy import statsfrom statsmodels.formula.api import olsfrom statsmodels.stats.anova import anova_lm
# 這是那四個水平的索賠額的觀測值A1 = [1.6, 1.61, 1.65, 1.68, 1.7, 1.7, 1.78]A2 = [1.5, 1.64, 1.4, 1.7, 1.75]A3 = [1.6, 1.55, 1.6, 1.62, 1.64, 1.60, 1.74, 1.8]A4 = [1.51, 1.52, 1.53, 1.57, 1.64, 1.6]
data = [A1, A2, A3, A4]# 方差的齊性檢驗w, p = stats.levene(*data)if p < 0.05: print('方差齊性假設不成立')
# 成立之後, 就可以進行單因素方差分析f, p = stats.f_oneway(*data)print(f, p) # 2.06507381767795 0.13406910483160134

上面這段程序應該很容易懂, 首先前面是把數據構造出來, 然後進行一個方差的齊性檢驗, 這個用stats.levene函數, 這個的作用是要保證方差在每個水平上某種程度上(顯著水平)是一致的, 這時候才能進行後面的均值分析, 因為方差分析的實質是檢驗多個水平的均值是否有顯著差異,如果各個水平的觀察值方差差異太大,只檢驗均值之間的差異就沒有意義了,所以要進行方差齊性檢驗。

後面通過stats.f_oneway函數就可以直接算出檢驗假設的

所以單因素方差這塊一般是懂了原理之後,用軟體去分析,能看懂就算入門了。當然這個如果手算的話,思路就是需要先求
values = A1.copy()groups = []for i in range(1, len(data)):    values.extend(data[i])
for i, j in zip(range(4), data): groups.extend(np.repeat('A'+str(i+1), len(j)).tolist())
df = pd.DataFrame({'values': values, 'groups': groups})df

數據長這個樣子了,也是我們一般見到的pandas的形式:

通過下面的方式做單因素方差分析:

anova_res = anova_lm(ols('values~C(groups)', df).fit())anova_res.columns = ['自由度', '平方和', '均方', 'F值', 'P值']anova_res.index = ['因素A', '誤差']anova_res        # 這種情況下看p值  >0.05 所以接受H0

結果如下:

這樣就會得到單因素方差分析表的格式。當然, 為了考慮的全面些, 我們應該評估檢驗的假設條件, 就是看看每個數據是不是真的服從正態。這裡就使用上一篇文章中學習到的判斷數據是不是服從正態的方法了Shapiro-Wilk test(小樣本情況下, 常用的正態檢驗方法):
A1 = [1.6, 1.61, 1.65, 1.68, 1.7, 1.7, 1.78]A2 = [1.5, 1.64, 1.4, 1.7, 1.75]A3 = [1.6, 1.55, 1.6, 1.62, 1.64, 1.60, 1.74, 1.8]A4 = [1.51, 1.52, 1.53, 1.57, 1.64, 1.6]
data = [A1, A2, A3, A4]
from scipy.stats import shapiro
def normal_judge(data): stat, p = shapiro(data) if p > 0.05: return 'stat={:.3f}, p = {:.3f}, probably gaussian'.format(stat,p) else: return 'stat={:.3f}, p = {:.3f}, probably not gaussian'.format(stat,p)
for d in data: print(normal_judge(d))

結果如下:

stat=0.942, p = 0.660, probably gaussianstat=0.938, p = 0.655, probably gaussianstat=0.850, p = 0.096, probably gaussianstat=0.918, p = 0.489, probably gaussian

三、雙因素方差分析及python實現在很多情況下, 只考慮一個指標對觀察值的影響顯然是不夠的, 這時就會用到多因素方差分析。雙因素方差分析和多因素方差分析原理上一致, 下面給出一種兩個因素之間有交互的一種形式寫法作為補充。所謂雙因素方差分析, 就是有兩個因素

這裡的

那麼就開始引入一些新的公式, 因為既然每個格子裡面有平均, 那麼每一行的格子和每一列的格子也會有平均, 整體上也會有平均, 所以下面就定義三個公式:


我們稱

這個就是雙因素試驗方差分析的數學模型。對於這個模型, 我們就會有三個假設檢驗的問題了:

因素A對於試驗結果是否帶來了顯著影響

因素B對於試驗結果是否帶來了顯著影響

兩者的組合對於試驗結果是否帶來了顯著影響

與單因素的情況類似, 我們依然是採用平方和分解的方式進行驗證。首先我們得先計算四個平均值:

因素A的

因素A的

因素B的

總平均值:

有了上面的平均值, 我們就可以得到偏差平方和了, 總偏差平方和如下:

就得到了

其中

這裡也給出每個平方和的自由度,


和單因素方差分析那裡的思路是一樣的, 碰到具體問題的時候, 我們一般不會採用手算的形式, 如果手算的話, 思路和上面一樣, 就是先根據公式求四個平均值, 然後根據平均值求那四個平方和的東西, 求完了之後算三個

導入這次用到的包(依然是單因素分析時的ols和anova_lm)

import pandas as pdimport numpy as np
from scipy import statsfrom statsmodels.formula.api import olsfrom statsmodels.stats.anova import anova_lm
# 這三個交互效果的可視化畫圖from statsmodels.graphics.api import interaction_plotimport matplotlib.pyplot as pltfrom pylab import mpl # 顯示中文
# 這個看某個因素各個水平之間的差異from statsmodels.stats.multicomp import pairwise_tukeyhsd

3.1、無交互作用的情況

由於不考慮交互作用的影響,對每一個因素組合 數據:考慮三種不同形式的廣告和五種不同的價格對某種商品銷量的影響。選取某市15家大超市,每家超市選用其中的一個組合,統計出一個月的銷量如下(設顯著性水平為0.05):

下面進行雙因素方差分析,簡要流程是,先用pandas庫的DataFrame數據結構來構造輸入數據格式。然後用statsmodels庫中的ols函數得到最小二乘線性回歸模型。最後用statsmodels庫中的anova_lm函數進行方差分析。

dic_t2=[{'廣告':'A1','價格':'B1','銷量':276},{'廣告':'A1','價格':'B2','銷量':352},       {'廣告':'A1','價格':'B3','銷量':178},{'廣告':'A1','價格':'B4','銷量':295},       {'廣告':'A1','價格':'B5','銷量':273},{'廣告':'A2','價格':'B1','銷量':114},       {'廣告':'A2','價格':'B2','銷量':176},{'廣告':'A2','價格':'B3','銷量':102},       {'廣告':'A2','價格':'B4','銷量':155},{'廣告':'A2','價格':'B5','銷量':128},       {'廣告':'A3','價格':'B1','銷量':364},{'廣告':'A3','價格':'B2','銷量':547},       {'廣告':'A3','價格':'B3','銷量':288},{'廣告':'A3','價格':'B4','銷量':392},       {'廣告':'A3','價格':'B5','銷量':378}]df_t2=pd.DataFrame(dic_t2,columns=['廣告','價格','銷量'])df_t2

數據長這樣:

# 方差分析price_lm = ols('銷量~C(廣告)+C(價格)', data=df_t2).fit()table = sm.stats.anova_lm(price_lm, typ=2)table

結果如下:

可以發現這裡的p值都是小於0.05的, 所以我們要拒絕掉原假設, 即可認為不同的廣告形式, 不同的價格均造成商品銷量的顯著差異。
fig = interaction_plot(df_t2['廣告'],df_t2['價格'], df_t2['銷量'],                        ylabel='銷量', xlabel='廣告')

結果如下:

再來分析一下單因素各個水平之間的顯著差異:

# 廣告與銷量的影響  注意這個的顯著水平是0.01print(pairwise_tukeyhsd(df_t2['銷量'], df_t2['廣告'], alpha=0.01)) # 第一個必須是銷量, 也就是我們的指標

結果如下:

這個可以得到的結論是在顯著水平0.01的時候, A2和A3的p值小於0.01, reject=True, 即認為A2和A3有顯著性差異。

3.2、有交互作用的情況

由於因素有交互作用,需要對每一個因素組合

數據:概率論課本上的那個例子, 火箭的射程與燃料的種類和推進器的型號有關,現對四種不同的燃料與三種不同型號的推進器進行試驗,每種組合各發射火箭兩次,測得火箭的射程結果如下(設顯著性水平為0.01):

dic_t3=[{'燃料':'A1','推進器':'B1','射程':58.2},{'燃料':'A1','推進器':'B1','射程':52.6},       {'燃料':'A1','推進器':'B2','射程':56.2},{'燃料':'A1','推進器':'B2','射程':41.2},       {'燃料':'A1','推進器':'B3','射程':65.3},{'燃料':'A1','推進器':'B3','射程':60.8},       {'燃料':'A2','推進器':'B1','射程':49.1},{'燃料':'A2','推進器':'B1','射程':42.8},       {'燃料':'A2','推進器':'B2','射程':54.1},{'燃料':'A2','推進器':'B2','射程':50.5},       {'燃料':'A2','推進器':'B3','射程':51.6},{'燃料':'A2','推進器':'B3','射程':48.4},       {'燃料':'A3','推進器':'B1','射程':60.1},{'燃料':'A3','推進器':'B1','射程':58.3},       {'燃料':'A3','推進器':'B2','射程':70.9},{'燃料':'A3','推進器':'B2','射程':73.2},       {'燃料':'A3','推進器':'B3','射程':39.2},{'燃料':'A3','推進器':'B3','射程':40.7},       {'燃料':'A4','推進器':'B1','射程':75.8},{'燃料':'A4','推進器':'B1','射程':71.5},       {'燃料':'A4','推進器':'B2','射程':58.2},{'燃料':'A4','推進器':'B2','射程':51.0},       {'燃料':'A4','推進器':'B3','射程':48.7},{'燃料':'A4','推進器':'B3','射程':41.4},]df_t3=pd.DataFrame(dic_t3,columns=['燃料','推進器','射程'])df_t3.head()

結果這樣:

下面是方差分析:

moore_lm = ols('射程~燃料+推進器+燃料:推進器', data=df_t3).fit()table = sm.stats.anova_lm(moore_lm, typ=1)table

這裡得到的結論就是燃料的P值是大於0.01的, 而推進器和兩者組合的p值都小於0.01, 並且兩者的組合非常小, 這就說明燃料對於火箭的射程沒有顯著影響, 而後兩者都有顯著影響,兩者的交互作用更是高度顯著。
fig = interaction_plot(df_t3['燃料'],df_t3['推進器'], df_t3['射程'],                        ylabel='射程', xlabel='燃料')

結果如下:

從這個圖裡面可以看出, (A4, B1)和(A3, B2)組合的進程最好。黃金搭檔。單因素差異性分析:

print(pairwise_tukeyhsd(df_t3['射程'], df_t3['燃料']))

結果:

都是False, 說明A因素各個水平之間無顯著差異。

兩個實驗到這裡就結束了, 這裡再補充兩點別的知識:

'射程~C(燃料)+C(推進器)+C(燃料):C(推進器)' :相當於射程是y(指標), 燃料和推進器是x(影響因素), 三項加和的前兩項表示兩個主效應, 第三項表示考慮兩者的交互效應, 不加C也可。

'射程~C(燃料, Sum)*C(推進器, Sum)'和上面效果是一致的, 星號在這裡表示既考慮主效應也考慮交互效應*'銷量~C(廣告)+C(價格)':這個表示不考慮交互相應

但是要注意, 考慮交互相應和不考慮交互相應導致的Se(殘差項)會不同, 所以會影響最終的結果。

stats.anova_lm(moore_lm, typ=1)這裡面的typ參數, 這個參數我嘗試還沒有完全搞明白到底是什麼意思, 這個參數有1,2,3 三個可選項, 分別代表著不同的偏差平方和的計算方法, 我在第二個實驗中嘗試過改這個參數,改成1的時候發現就加了一列mean_sq, 然後其他的沒變。

改成3的時候發現加一行Intercept, 並且此時燃料和推進器的數據都發生了變化。

四、寫到最後

方差分析這塊到這裡就結束了, 隨著這篇文章的結束也意味著概率統計的知識串聯也到了尾聲, 簡單的回顧一下本篇的內容, 這篇文章主要是在實踐的角度進行的分析, 方差分析在統計中還是很常用的, 比較適合類別因素對於數值指標的影響程度:

實際應用中, 或許可以通過這種方法去分析類別特徵的重要性或者關聯性,以及類別和類別特徵之間的交互作用等。

本文電子版 後臺回復 概率統計 獲取

「感謝你的分享,點讚,在看三

相關焦點

  • 數據分析的6種常用方法
    原標題:數據分析的6種常用方法 醫學工作者做完醫學實驗後,少不了要對收集的實驗數據進行數據分析。通常來說,常用的數據分析方法有以下六種:聚類分析、因子分析、相關分析、對應分析、回歸分析、方差分析。
  • 數據分析的幾種常用方法概覽
    數據分析常用方法概覽(之一) 對數據進行分析的方法很多,常用的有對比分析法、分組分析法、結構分析法、交叉分析法、漏鬥圖分析法、矩陣分析法、綜合評價分析法、5W1H分析法、相關分析法、回歸分析法、 聚類分析法、判別分析法、主成分分析法、因子分析法、時間序列、方差分析等等。
  • 論文常用數據分析方法分類總結-3
    論文常用數據分析方法分類總結-211.數據分布數據分布-SPSSAU判斷數據分布是選擇正確分析方法的重要前提。正態性:很多分析方法的使用前提都是要求數據服從正態性,比如線性回歸分析、相關分析、方差分析等,可通過正態圖、P-P/Q-Q圖、正態性檢驗查看數據正態性。隨機性:遊程檢驗是一種非參數性統計假設的檢驗方法,可用於分析數據是否為隨機。
  • 方差分析分類及SAS實現代碼
    方差分析為多樣本檢驗,其核心為假設檢驗,此外,方差分析還可以做多重比較。方差分析本身是一種假設檢驗,同時也是一種模型,是回歸模型的特例,回歸模型為線性模型,方差分析為一般線性模型。實際應用中方差分析單獨出現的可能性很小,一般在實驗設計場景用的較多,項目中用方差分析去支撐項目的情景基本不會出現。方差分析分類單因素方差分析單因素方差分析用來研究一個因素的不同水平對觀測所產生的影響,例如不同澆水量對家裡綠蘿生長的影響、不同的省的日照差異對人的壽命的影響、不同工作時長對人情緒的影響等等,以上皆可以使用單因素方差分析的方法進行探索分析。
  • 「spss數據分析系列」方差分析
    上一課我們講的是t檢驗,t檢驗是用於2個類別的均值對比,如果是3分類以及以上的分類的均值對比,則採用方差分析。t檢驗是用的t分布來檢驗時候接受假設,方差分析則用的F分布,如下圖。方差分析的適用條件:1、個樣本的獨立性(指每個單元格內的數據相互獨立):這樣才能保證數據變異的可加性。2、正態性:單元格內的所有總體都是從一個正太總體來面抽出來,這個時候一般由於單元格數量比較少,所以沒法直接分析和觀察,這時候一般採用殘差分析來看。
  • 論文常用數據分析方法分類總結-2
    上篇文章我們總結了基本描述統計、信度分析、效度分析、差異關係、影響關係五種常見分析方法,下面繼續我們的總結。6. 相關分析匯總相關分析用於研究X和Y的關係情況,X、Y都為定量數據。如果兩個變量是配對數據,比如對一個群體用同一個工具前後測量了兩次,可用配對T檢驗。10. 方差分析匯總方差分析用於分析定類數據與定量數據之間的關係情況,可分析兩組或兩組以上的變量差異。
  • 數據分析的方法(一)
    至今,數據分析師的行業依然很火熱,但是大部分人還是不清楚數據分析的目的是什麼,分析的步驟、方法都有哪一些。數據分析主要就是為了從海量的數據中提取有用的信息和形成結論,從而對數據加以詳細的研究和概括總結。
  • 單因素方差分析超完整分析流程
    當我們想了解不同年級的學習態度是否有區別,進而提供有針對性的教學方案,又或者分析不同職業對某產品的購買意願是否有差異,進而根據分析結果精準投放廣告。以上這些分析兩個及兩個數據之間的差異情況都可以使用同一種分析方法——方差分析。01.
  • 數據分析的幾種常用方法概覽(之二)
    數據分析常用方法概覽(之二)上一篇,我們了解了數據分析時常用的對比分析法、分組分析法、結構分析法、交叉分析法、漏鬥圖分析法、矩陣分析法、綜合評價分析法等八種分析方法,今天我們繼續了解下上文提到的另外八種常見數據分析方法。
  • 快速處理數據分析之協方差分析
    前兩篇文章,我們對雙因素方差分析以及事後比較做了較為詳細的說明。與一般的單因素方差分析相比,雙因素甚至多因素方差分析,更多的被用在實驗研究中。前提條件(1) 協方差分析中,X是定類數據,Y是定量數據;協變量通常為定量數據;如果協變量是定類數據,可考慮將其納入X即自變量中,或者將協變量做虛擬變量處理。(2) 平行性檢驗:協方差分析有一個重要的假設即「平行性檢驗」。
  • SPSS方差分析方法與實例演練
    在數據分析過程中,為了進行兩組以上均數的比較,往往可以使用方差分析方法。那麼我們一起了解一下方差分析基本概念、 單因素方差分析、 多因素方差分析及協方差分析;同時在spss中的操作演練。方差分析的前提條件,即不同水平下,各總體均值服從方差相同的正態分布,因此方差分析問題就轉換成研究不同水平下各個總體的均值是否有顯著差異的問題。
  • SPSS——單因素方差分析
    單因素方差分析(one way anova),是一種較為常用的方差分析手段,主要目的是為了尋找多組數據總變異的真實來源,判斷總變異是來自於組內變異(Vin),還是來自於組間變異(Vbetween)。單因素方差分析的檢驗統計量F=Vbetween/Vin,表示組間變異與組內變異的比值。
  • 統計基礎概念及數據分析方法
    描述性統計:分析數據集中度和分散度推斷統計:通過樣本對整體情況作出推斷數據分析方法:聚類、回歸、分類及組件差異。描述數據的兩個關鍵點:數據的中心度,數據集中在哪個區域。常用均值,中位數和眾數來反映均值:也稱為平均數,所有數據除以數據條數,缺點,容易被極大極小值幹擾,難以反饋真實的數據情況。中位數:將數據按照大小排序處於中間位置的數字,比均值更好的反應數據的中心。眾數:數據種出現最多的數字。
  • 全流程總結方差分析,就靠它了!
    方差分析流程圖Step1:數據類型方差分析用於分析定類數據與定量數據之間的關係情況,可以比較2組或多組數據的差異。分析前首先應根據數據類型判斷使用的方法是否正確。單因素方差分析可以比較一個自變量(比如品牌);而雙因素方差可以比較兩個自變量(品牌和銷售地區);多因素方差可比較三個及以上的自變量,以及可以研究多個自變量對因變量Y的交互影響。單因素方差分析在問卷研究中常用於分析個人背景信息對核心研究變量的影響(比如不同性別,滿意度是否有顯著差異)。同時也可用於對聚類分析效果的判斷。
  • T檢驗、方差分析、卡方分析傻傻分不清?
    1、聯繫和區別T檢驗、方差分析、卡方檢驗都是差異分析的方法,比較不同組數據的均值差異
  • 統計與數據科學方差分析簡介(以疫情為例)
    基本上,ANOVA是通過比較兩種類型的變異,即樣本均值之間的變化以及每個樣本內部的變化來實現的。下面的公式表示單向Anova測試統計數據.方差分析公式F統計量(也稱為F比)的結果允許對多組數據進行分析,以確定樣本之間和樣本內部的差異。
  • 單因素方差分析(one-way ANOVA)
    4、給定顯著性水平,並作出決策 (五)單因素方差分析的進一步分析 在完成上述單因素方差分析的基本分析後,可得到關於控制變量是否對觀測變量造成顯著影響的結論,接下來還應做其他幾個重要分析,主要包括方差齊性檢驗、多重比較檢驗。
  • 從協方差分析看回歸與方差分析的聯繫
    納入協變量的方差分析,即稱協方差分析。一般而言,進行協方差分析的協變量為「定量變量」,比如本例中的「人均月收入」,它一般不是研究者重點研究的變量(本例中重點研究的是教育程度和性別),但因為它會對分析結果造成幹擾,因此在分析過程中必須要將其納入。
  • 方差分析(ANOVA)全總結
    用人話重新解釋一下就是,ANOVA分析是用來比較幾個組別之間的數值大小差別。以ANOVA的概念為基礎, 根據自變量或因變量的個數,以及是否存在協變量,可以將ANOVA的概念擴展為下圖。本文將對最常用的幾種方法進行講解說明。圖1.
  • 常用的四種大數據分析方法
    本文主要講述數據挖掘分析領域中,最常用的四種數據分析方法:描述型分析、診斷型分析、預測型分析和指令型分析。簡單地來說,分析可被劃分為4種關鍵方法。下面會詳細介紹這四種方法。1. 描述型分析:發生了什麼?