今天的重點(diǎn)是用Python來制作相關(guān)性矩陣以及顯著性p value矩陣,,如果僅僅得出了相關(guān)系數(shù)矩陣的話還是缺乏說服力,,所以顯著性測試是有必要的 相關(guān)性分析可能是使用頻率較高的一種統(tǒng)計(jì)方法,。對(duì)于不同數(shù)據(jù)集的分布特征往往會(huì)選擇使用相對(duì)應(yīng)的方法,例如如果數(shù)據(jù)是正態(tài)分布的話,,那就選擇皮爾遜相關(guān)系數(shù),,否則的話就去用斯皮爾曼,另外還有kendall相關(guān)系數(shù),。So,,在具體選擇哪一種方法之前可能需要對(duì)數(shù)據(jù)的分布特征進(jìn)行檢驗(yàn),,如可以使用Kolmogorov-Smirnov方法來檢驗(yàn)數(shù)據(jù)的分布形態(tài),詳細(xì)的方法使用可以查看scipy的官網(wǎng)介紹,。由于這不是今天的重點(diǎn),,所以skip 今天的重點(diǎn)是用Python來制作相關(guān)性矩陣以及顯著性p value矩陣,如果僅僅得出了相關(guān)系數(shù)矩陣的話還是缺乏說服力,,所以顯著性測試是有必要的,。 放一張平時(shí)常見的相關(guān)系數(shù)矩陣圖,也可以叫cross-corr plot吧,。這個(gè)是沒有對(duì)應(yīng)的p value的,,那么可能的情況就是第一個(gè)變量和第二個(gè)變量即使相關(guān)系數(shù)在0.5,但是它的p value可能大于0.05或者0.01了,,但是一般情況下相關(guān)系數(shù)高的變量,,其p value一般也是比較小的,一般也就是通過顯著性測試的,,所以可能出于這個(gè)假設(shè),,較多的相關(guān)矩陣圖就沒有對(duì)應(yīng)的p value。 為了更加科學(xué),,我這里先繪制了相關(guān)系數(shù)矩陣,,然后再繪制p value值的分布情況。 import matplotlib.pyplot as plt import seaborn as sns plt.rcParams['font.family'] = 'Times New Roman' # method='spearman' def correlation_heatmap(train): correlations = train.corr(method='spearman') cmap = sns.diverging_palette(220,20, center='light',as_cmap=True)
fig, ax = plt.subplots(figsize=(20,20),dpi=300) mask = np.zeros_like(correlations, dtype=np.bool) # 將mask右上三角(列號(hào)》=行號(hào))設(shè)置為True mask[np.triu_indices_from(mask)] = False sns.heatmap(correlations, mask=mask, cmap=cmap, fmt='.2f', square=True, linewidths=.2, annot=True, vmax=0.99,cbar_kws={'shrink': .50,'extend':'both','pad':0.02} ) plt.savefig('./spearmancorr.png') plt.show(); # correlation_heatmap(X_train[X_train.columns[sorted_idx]]) correlation_heatmap(df) 得出相關(guān)系數(shù)矩陣,,圖形有點(diǎn)大 繼續(xù)獲取p value并繪制出來
從上面可以看到,,相關(guān)系數(shù)來自于DataFrame.corr,,顯著性測試來自于scipy。 繪制出來看看,這樣的話就算完全達(dá)到目的了,,既繪制了變量之間的相關(guān)系數(shù)矩陣,又繪制了對(duì)應(yīng)的p value的矩陣,。變量之間可能還會(huì)有共線性的情況,,那么可以自己動(dòng)手測試一下方差膨脹。 OK,,任務(wù)達(dá)成,! |
|