Python數(shù)據(jù)科學(xué):方差分析
之前已經(jīng)介紹的變量分析:
- ①相關(guān)分析:一個(gè)連續(xù)變量與一個(gè)連續(xù)變量間的關(guān)系。
- ②雙樣本t檢驗(yàn):一個(gè)二分分類變量與一個(gè)連續(xù)變量間的關(guān)系。
本次介紹:
- 方差分析:一個(gè)多分類分類變量與一個(gè)連續(xù)變量間的關(guān)系。
其中分類個(gè)數(shù)大于兩個(gè),分類變量也可以有多個(gè)。
當(dāng)分類變量為多個(gè)時(shí),對(duì)分類個(gè)數(shù)不做要求,即可以為二分分類變量。
一、數(shù)理統(tǒng)計(jì)技術(shù)
數(shù)理統(tǒng)計(jì)分為頻率和貝葉斯兩大學(xué)派。
描述性統(tǒng)計(jì)分析,描述性分析就是從總體數(shù)據(jù)中提煉變量的主要信息,即統(tǒng)計(jì)量。
描述性分析的難點(diǎn)在于對(duì)業(yè)務(wù)的了解和對(duì)數(shù)據(jù)的尋找。
統(tǒng)計(jì)推斷和統(tǒng)計(jì)建模,建立解釋變量與被解釋變量之間可解釋的、穩(wěn)定的、最好是具有因果關(guān)系的表達(dá)式。
在模型運(yùn)用時(shí),將解釋變量(自變量)帶入表達(dá)式中,用于預(yù)測(cè)被解釋變量(因變量)的值。
現(xiàn)階段,我學(xué)習(xí)的就是統(tǒng)計(jì)推斷與建模的知識(shí)...
二、方差分析
方差分析用于檢驗(yàn)多個(gè)樣本的均值是否有顯著差異。
探索多于兩個(gè)分類的分類變量與連續(xù)變量的關(guān)系。
比如說「淺談數(shù)據(jù)分析崗」中薪水與教育程度之間的關(guān)系,教育程度為一個(gè)多分類的分類變量。
01 單因素方差分析
單因素方差分析的前提條件:
- ①變量服從正態(tài)分布(薪水符合)。
- ②觀測(cè)之間獨(dú)立(教育程度符合)。
- ③需驗(yàn)證組間的方差是否相同,即方差齊性檢驗(yàn)。
組間誤差與組內(nèi)誤差、組間變異與組內(nèi)變異、組間均方與組內(nèi)均方都是方差分析中的衡量標(biāo)準(zhǔn)。
如果組間均方明顯大于組內(nèi)均方,則說明教育程度對(duì)薪水的影響顯著。
那么需要大多少才能確定結(jié)論呢?
這里組間均方與組內(nèi)均方的比值是服從F分布,下面貼出F分布曲線圖。
其中橫坐標(biāo)為F值,即組間均方與組內(nèi)均方的比值。
當(dāng)F值越大時(shí),即組間均方越大、組內(nèi)均方越小,說明組間的變異大。
并且對(duì)應(yīng)的P值也越小(縱軸),便可以拒絕原假設(shè)(原假設(shè)為無(wú)差異)。
下面以「淺談數(shù)據(jù)分析崗」中薪水與教育程度為例。
這里我們只是直觀的看出薪水隨學(xué)歷的增長(zhǎng)而增長(zhǎng),并沒有實(shí)實(shí)在在的東西。
接下來就用數(shù)字來說話!!!
代碼如下,需要清洗數(shù)據(jù)。
- from scipy import stats
- import pandas as pd
- import pymysql
- # 獲取數(shù)據(jù)庫(kù)數(shù)據(jù)
- conn = pymysql.connect(host='localhost', user='root', password='774110919', port=3306, db='lagou_job', charset='utf8mb4')
- cursor = conn.cursor()
- sql = "select * from job"
- df = pd.read_sql(sql, conn)
- # 清洗數(shù)據(jù),生成薪水列
- dom = []
- for i in df['job_salary']:
- i = ((float(i.split('-')[0].replace('k', '').replace('K', '')) + float(i.split('-')[1].replace('k', '').replace('K', ''))) / 2) * 1000
- dom.append(i)
- df['salary'] = dom
- # 去除無(wú)效列
- data = df[df.job_education != '不限']
- # 生成不同教育程度的薪水列表
- edu = []
- for i in ['大專', '本科', '碩士']:
- edu.append(data[data['job_education'] == i]['salary'])
- # 單因素方差分析
- print(stats.f_oneway(*edu))
- # 得到的結(jié)果
- F_onewayResult(statistic=15.558365658927576, pvalue=3.0547055604132536e-07)
得出結(jié)果,F(xiàn)值為15.5,P值接近于0,所以拒絕原假設(shè),即教育程度會(huì)顯著影響薪水。
02 多因素方差分析
多因素方差分析檢驗(yàn)多個(gè)分類變量與一個(gè)連續(xù)變量的關(guān)系。
除了考慮分類變量對(duì)連續(xù)變量的影響,還需要考慮分類變量間的交互效應(yīng)。
這里由于我的數(shù)據(jù)滿足不了本次操作,所以選擇書中的數(shù)據(jù)。
即探討信用卡消費(fèi)與性別、教育程度的關(guān)系。
首先考慮無(wú)交互效應(yīng),代碼如下。
- import statsmodels.formula.api as smf
- import statsmodels.api as sm
- import pandas as pd
- # 讀取數(shù)據(jù),skipinitialspace:忽略分隔符后的空白,dropna:對(duì)缺失的數(shù)據(jù)進(jìn)行刪除
- df = pd.read_csv('creditcard_exp.csv', skipinitialspace=True)
- df = df.dropna(how='any')
- # smf:最小二乘法,構(gòu)建線性回歸模型,
- ana = smf.ols('avg_exp ~ C(edu_class) + C(gender)', data=df).fit()
- # anova_lm:多因素方差分析
- print(sm.stats.anova_lm(ana))
輸出結(jié)果。
可以看到教育程度的F值為31.57,P值趨近于0,拒絕原假設(shè),即教育程度與平均支出有顯著差異。
性別的F值為0.48,P值為0.48,無(wú)法拒絕原假設(shè),即性別與平均支出無(wú)顯著差異。
接下來考慮有交互效應(yīng),代碼如下。
- # 消除pandas輸出省略號(hào)情況
- pd.set_option('display.max_columns', 5)
- # smf:最小二乘法,構(gòu)建線性回歸模型
- anal = smf.ols('avg_exp ~ C(edu_class) + C(gender) + C(edu_class)*C(gender)', data=df).fit()
- # anova_lm:多因素方差分析
- print(sm.stats.anova_lm(anal))
輸出結(jié)果。
這里可以看出,考慮交互效應(yīng)后,與教育程度及性別對(duì)應(yīng)的F值和P值都發(fā)生了微小的改變。
其中教育程度和性別的交互項(xiàng)對(duì)平均支出的影響也是顯著的,F(xiàn)值為2.22,P值為0.09。
上面這個(gè)結(jié)論是書中所說的,那么顯著性水平取的是0.1嗎???
這算是我理解不了的一部分。
下面是帶交互項(xiàng)的多元方差分析的回歸系數(shù),表格中所有數(shù)據(jù)都是以男性及研究生學(xué)歷作為基準(zhǔn)去比對(duì)。
- # 生成數(shù)據(jù)總覽
- print(anal.summary())
輸出結(jié)果。
可以看出第一種教育程度的女性較男性研究生,信用卡消費(fèi)的影響較顯著,P值為0.05。
原假設(shè)為無(wú)差異,拒絕原假設(shè)。
那么這里的顯著性水平取的也是0.1嗎???
第二種教育程度的女性較男性研究生,信用卡消費(fèi)的影響顯著,P值為0.001。
第三種缺失,沒有參數(shù)估計(jì)。
三、總結(jié)
這里總結(jié)一下各個(gè)檢驗(yàn)的原假設(shè)。
- 單樣本t檢驗(yàn)原假設(shè):總體均值與假設(shè)的檢驗(yàn)值不存在顯著差異(無(wú)差異)。
- 雙樣本t檢驗(yàn)原假設(shè):兩個(gè)樣本均值(二分變量下的均值)不存在顯著差異(無(wú)差異)。
- 方差分析原假設(shè):多個(gè)樣本均值(多分變量下的均值)不存在顯著差異(無(wú)差異)。
說明原假設(shè)都是假設(shè)變量關(guān)系無(wú)顯著差異。