目錄
一元方差分析
一元單因素方差分析
場景:5種不同像素的數碼相機(單因素)對銷量(研究的因變量)是否有顯著差異
G = dc_sales['pixel'].unique()
args = []
for I in list(G):
args.append(dc_sales[dc_sales['pixel']==I]['sales'])
# 將pixel變量轉化爲分類變量併爲其值掛標籤
dc_sales['pixel']=dc_sales['pixel'].astype('category')
dc_sales['pixel'].cat.categories=['500像素以下','500-600萬像素','600-800萬像素','800-1000萬像素','1000萬像素以上']
dc_sales['pixel'].cat.set_categories=['500像素以下','500-600萬像素','600-800萬像素','800-1000萬像素','1000萬像素以上']
若方差齊性檢驗不滿足
1、檢查某些特殊表現的觀測值,剔除
2、使用無方差齊性的多重比較方法
3、數據變換(log/正態)
4、非參數檢驗
#1.方差齊性檢驗
stats.levene(*args)【p越大越滿足方差齊性】
#2.f檢驗
stats.f_oneway(*args)
#2.2 更詳細的結果
from statsmodels.formula.api import ols
dc_sales_anova=sm.stats.anova_lm(ols('sales ~ C(pixel)',dc_sales).fit())
print dc_sales_anova
>> df sum_sq mean_sq F pr(>F)
>>C(pixcel) 4 10472 2618 19 1.5e-08
>>Residual 35 4682 133 NaN NaN
組間離差平方和(SSA)=10472,組內離差平方和(SSE)=4682
組間方差=10472/4,組內方差=4682/35
多重比較檢驗
F檢驗只能回答多組之間的均值不同,但不不能說是哪幾組不同
通過2組配對比較,可以看哪幾組均值存在差異
from statsmodels.stats.multicomp import pairwise_tukeyhsd
ds_sales_anova_post=pairwise_tukeyhsd(dc_sales['sales'],dc_sales['pixel'].alpha=0.5)
dc_sales_anova_post.summary()
# 對5種不同像素兩兩對比,10個結果,看meandiff和P值即可
# 當然多重檢驗會有問題,這裏有多重檢驗校正之類的
一元多因素方差分析
因素單獨對因變量產生的影響爲主效應,因素之間共同對因變量產生的影響稱爲交互作用
多因素方差分析假定因素和因變量之間的關係是線性關係
# 只考慮主效應
formula = 'space ~ C(education)+C(unit)+C(income)+C(type)'
house_anova = sm.stats.anova_lm(ols(formula,data=house).fit(),typ=3)
#typ=3代表作方差分析type3型檢驗
print house_anova
>> sum_sq df F PR(>F)
Intercept 28663 1 89 1.5e-19
C(eudcation) 1519 3 1.58 1.9e-01
C(unit) 886 5 0.55 7.3e-01
C(income) 10545 4 8.25 1.99e-06
C(type) 9604 10 3 1.09e-03
Residual 143477 449 NaN NaN
這個結果與直接ols很像,但是不一樣哦,比如income有四個類型,ols的結果會把這四個類型的每個p值等等也會顯現出來~
# 有交互效應
formula = 'space ~ C(income)*C(type)'
house_anova_inter=sm.stats.anova_lm(ols(formula,data=house).fit())
協方差分析
將方差分析與迴歸分析結合【個人覺得協方差分析=廣義線性迴歸】
方差分析:一個或幾個因子(分類變量) 對Y(連續變量)的影響
迴歸分析:一個或幾個變量(連續變量) 對Y(連續變量)的影響
將那些難以控制的因素當作協變量,在排除協變量影響的條件下,分析可控因素對因變量的影響
注意:協變量往往是連續型變量
因變量=因素主效應+因素交互效應+協變量+隨機誤差
例子:排除協變量(即返點【因銷售人員表現】指定)作用後,分析賣場因素和售後服務因素對銷售量的影響,爲企業後面選址和指定服務條款提供參考意見
formula='sales~points+C(market)*C(warranty)'
sale_points_anova_cov=sm.stats.anova_lm(ols(formula,data=sale_points).fit())
注意理解這裏排除points,其實在ols中的結果每一條都是固定其他不變,這一條的單獨影響,所以協方差分析和ols如出一轍