卡方檢驗可以用於判斷兩個類別變量的相關性是否顯著。在分類的應用場景中可以用卡方檢驗選擇特徵,特徵與目標變量的相關性越顯著說明特徵越重要,預測力越強。
一、先簡單介紹一下卡方檢驗的步驟。假設y為目標變量,取值為好和壞,x為特徵變量取值為高、中、低。
1、先計算y和x的實際值列聯表,如下圖:
2、假設y和x不相關,總體y中壞佔比=254/1831=13.87%。根據原假設,計算出假設值列聯表:
3、計算卡方統計量:
其中,A是實際值,T是假設值,卡方分布的自由度=(x屬性個數-1)*(y屬性個數-1)=(3-1)*(2-1)=2。
上面計算的卡方值=45.41,查卡方分布表可知P(卡方值>45.41)<<0.05,所以有理由拒絕y和x不相關的原假設,即y和x有較強的相關性。
4、對於同一分布,卡方值越大,P就越小,但是不同特徵的屬性個數可能不一樣,從而導致每個特徵得到的卡方分布的自由度不同,因此在用卡方檢驗選擇特徵時,使用P值可能更準確,P值越小,特徵越重要。但總體而言,P值和卡方值選擇的特徵差別不是很大,下面會用實例說明。
二、上面簡單的介紹了卡方檢驗的原理,下面看如何實現卡方檢驗選擇特徵。
1、先用python展示如何進行卡方檢驗,用上面所舉的例子。
# python3.6
import numpy as np
from scipy.stats import chi2_contingency
contingency_table = np.array([[631,364,582], [154,55,45]])
Chi2, P, degree_of_freedom, contingency_table0 = chi2_contingency(contingency_table)
其中,contingency_table是y和x實際值列聯表,得到以下結果。
卡方值Chi2
Chi2
45.40836170235667
P值
P
1.37942959775444e-10
自由度degree_of_freedom
degree_of_freedom
2
假設值列聯表contingency_table0
contingency_table0
array([[676.10322228, 360.87547788, 540.02129984],
[108.89677772, 58.12452212, 86.97870016]])
2、python實現卡方檢驗的特徵選擇。
(1)加載模塊
import pandas as pdfrom scipy.stats import chi2_contingency
(2)單變量卡方檢驗,y為目標變量,x為特徵變量
def chi2Test(y, x): contingency_table = pd.crosstab(y, x) Chi2, P, degree_of_freedom, _ = chi2_contingency(contingency_table) return Chi2, P, degree_of_freedom
(3)批量卡方檢驗,其中df是分箱後數據框,即連續型變量要分段處理(Python實現變量分箱及應用);Kvar是主鍵,比如客戶編號等;Yvar是目標變量。輸出的chi2Test_df包含卡方值、P值、自由度。
def chi2TestBatch(df, Kvar, Yvar): df_Xvar = df.drop([Kvar, Yvar], axis=1) chi2list = [] Plist = [] degree_of_freedomlist = [] for col in df_Xvar.columns: Chi2, P, degree_of_freedom = chi2Test(df[Yvar], df[col]) chi2list.append(Chi2) Plist.append(P) degree_of_freedomlist.append(degree_of_freedom) names = list(df_Xvar.columns) chi2Test_df = pd.DataFrame({'Var': names, 'Chi2': chi2list, 'P': Plist, 'degree_of_freedom': degree_of_freedomlist}, columns=['Var', 'Chi2', 'P', 'degree_of_freedom']) return chi2Test_df
用分箱後的數據運行上述代碼,看看輸出結果,train_bin是分箱後的數據框,user_id是客戶編號,y是目標變量。
chi2Test_df = chi2TestBatch(train_bin, 'user_id', 'y')
查看chi2Test_df,按P值從小到大排序,如下圖。可以看出,一般來說卡方值越大,P值越小,但不絕對,如x_075的卡方值比x_141的大,但P值也大,這是因為x_141得到的卡方分布的自由度更小。但總體而言,根據卡方值和P值選擇的特徵區別很小。
最後,將卡方檢驗得到的變量重要性排序與IV值(Python計算IV值)得到的變量重要性排序進行比較,看有什麼不同。從下圖可以看出,兩種方法得到的排序有些差異,但差異不算太大,所以在實際應用中可以選擇多種方法從不同角度對變量的重要性進行評估。
更多內容:
R語言實現變量分箱及應用
R語言計算IV值
R 語言計算 woe 及應用