1. 程式人生 > >Python資料科學:方差分析!

Python資料科學:方差分析!

之前已經介紹的變數分析:

  • ①相關分析:一個連續變數與一個連續變數間的關係。
  • ②雙樣本t檢驗:一個二分分類變數與一個連續變數間的關係。

本次介紹:

  • 方差分析:一個多分類分類變數與一個連續變數間的關係。

其中分類個數大於兩個,分類變數也可以有多個。

當分類變數為多個時,對分類個數不做要求,即可以為二分分類變數。

一、數理統計技術

數理統計分為頻率和貝葉斯兩大學派。

描述性統計分析,描述性分析就是從總體資料中提煉變數的主要資訊,即統計量。

描述性分析的難點在於對業務的瞭解和對資料的尋找。

統計推斷和統計建模,建立解釋變數與被解釋變數之間可解釋的、穩定的、最好是具有因果關係的表示式。

在模型運用時,將解釋變數(自變數)帶入表示式中,用於預測被解釋變數(因變數)的值。

現階段,我學習的就是統計推斷與建模的知識...

二、方差分析

方差分析用於檢驗多個樣本的均值是否有顯著差異。

探索多於兩個分類的分類變數與連續變數的關係。

比如說「淺談資料分析崗」中薪水與教育程度之間的關係,教育程度為一個多分類的分類變數。

01 單因素方差分析

單因素方差分析的前提條件:

  • ①變數服從正態分佈(薪水符合)。
  • ②觀測之間獨立(教育程度符合)。
  • ③需驗證組間的方差是否相同,即方差齊性檢驗。

組間誤差與組內誤差、組間變異與組內變異、組間均方與組內均方都是方差分析中的衡量標準。

如果組間均方明顯大於組內均方,則說明教育程度對薪水的影響顯著。

那麼需要大多少才能確定結論呢?

這裡組間均方與組內均方的比值是服從F分佈,下面貼出F分佈曲線圖。

Python資料科學:方差分析!

 

其中橫座標為F值,即組間均方與組內均方的比值。

當F值越大時,即組間均方越大、組內均方越小,說明組間的變異大。

並且對應的P值也越小(縱軸),便可以拒絕原假設(原假設為無差異)。

下面以「淺談資料分析崗」中薪水與教育程度為例。

Python資料科學:方差分析!

 

這裡我們只是直觀的看出薪水隨學歷的增長而增長,並沒有實實在在的東西。

接下來就用數字來說話!!!

程式碼如下,需要清洗資料。

from scipy import stats 
import pandas as pd 
import pymysql 
# 獲取資料庫資料 
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) 
# 清洗資料,生成薪水列 
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 
# 去除無效列 
data = df[df.job_education != '不限'] 
# 生成不同教育程度的薪水列表 
edu = [] 
for i in ['大專', '本科', '碩士']: 
 edu.append(data[data['job_education'] == i]['salary']) 
# 單因素方差分析 
print(stats.f_oneway(*edu)) 
# 得到的結果 
F_onewayResult(statistic=15.558365658927576, pvalue=3.0547055604132536e-07) 

得出結果,F值為15.5,P值接近於0,所以拒絕原假設,即教育程度會顯著影響薪水。

02 多因素方差分析

多因素方差分析檢驗多個分類變數與一個連續變數的關係。

除了考慮分類變數對連續變數的影響,還需要考慮分類變數間的互動效應。

這裡由於我的資料滿足不了本次操作,所以選擇書中的資料。

即探討信用卡消費與性別、教育程度的關係。

首先考慮無互動效應,程式碼如下。

import statsmodels.formula.api as smf 
import statsmodels.api as sm 
import pandas as pd 
# 讀取資料,skipinitialspace:忽略分隔符後的空白,dropna:對缺失的資料進行刪除 
df = pd.read_csv('creditcard_exp.csv', skipinitialspace=True) 
df = df.dropna(how='any') 
# smf:最小二乘法,構建線性迴歸模型, 
ana = smf.ols('avg_exp ~ C(edu_class) + C(gender)', data=df).fit() 
# anova_lm:多因素方差分析 
print(sm.stats.anova_lm(ana)) 

輸出結果。

Python資料科學:方差分析!

 

可以看到教育程度的F值為31.57,P值趨近於0,拒絕原假設,即教育程度與平均支出有顯著差異。

性別的F值為0.48,P值為0.48,無法拒絕原假設,即性別與平均支出無顯著差異。

接下來考慮有互動效應,程式碼如下。

# 消除pandas輸出省略號情況 
pd.set_option('display.max_columns', 5) 
# smf:最小二乘法,構建線性迴歸模型 
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)) 

輸出結果。

Python資料科學:方差分析!

 

這裡可以看出,考慮互動效應後,與教育程度及性別對應的F值和P值都發生了微小的改變。

其中教育程度和性別的互動項對平均支出的影響也是顯著的,F值為2.22,P值為0.09。

上面這個結論是書中所說的,那麼顯著性水平取的是0.1嗎???

這算是我理解不了的一部分。

下面是帶互動項的多元方差分析的迴歸係數,表格中所有資料都是以男性及研究生學歷作為基準去比對。

# 生成資料總覽 
print(anal.summary()) 

輸出結果。

Python資料科學:方差分析!

 

可以看出第一種教育程度的女性較男性研究生,信用卡消費的影響較顯著,P值為0.05。

原假設為無差異,拒絕原假設。

進群:960410445  即可獲取數十套PDF!

那麼這裡的顯著性水平取的也是0.1嗎???

第二種教育程度的女性較男性研究生,信用卡消費的影響顯著,P值為0.001。

第三種缺失,沒有引數估計。

三、總結

這裡總結一下各個檢驗的原假設。

  • 單樣本t檢驗原假設:總體均值與假設的檢驗值不存在顯著差異(無差異)。
  • 雙樣本t檢驗原假設:兩個樣本均值(二分變數下的均值)不存在顯著差異(無差異)。
  • 方差分析原假設:多個樣本均值(多分變數下的均值)不存在顯著差異(無差異)。

說明原假設都是假設變數關係無顯著差異。