相關性分析是指對兩個或多個具備相關性的變量元素進行分析,從而衡量兩個變量的相關密切程度。
相關性的元素之間需要存在一定的聯系或者概率才可以進行相關性分析。
相關系數在[-1,1]之間。
一、圖示初判
通過pandas做散點矩陣圖進行初步判斷
df1 = pd.DataFrame(np.random.randn(200,4)*100,columns=['A','B','C','D']) pd.plotting.scatter_matrix(df1,figsize=(12,12),diagonal='kde',marker='o',range_padding=0.1)
二、Pearson相關系數(皮爾森相關系數)
前提條件:數據滿足正太分布
皮爾森相關系數,也稱皮爾森積矩相關系數,是一種線性相關關系。
衡量向量相似度的一種方法,輸出范圍為-1到1,0,0代表無相關性,負值為負相關,正值為正相關。
公式意義:分子為,(x-x的均值) 乘以 (y-y的均值)的累計和;分母為,(x-x的均值)的累計和的平方根 乘以 (y-y的均值)的累計和的平方根
|r| <= 0.3 → 不存在線性相關
0.3 < |r| <= 0.5 → 低度線性相關
0.5 < |r| <= 0.8 → 顯著線性相關
|r| > 0.8 → 高度線性相關
1.皮爾森相關系數的推導
from scipy import stats s1 = pd.Series(np.random.rand(100)*100).sort_values() s2 = pd.Series(np.random.rand(100)*50).sort_values() df = pd.DataFrame({'value1':s1.values,'value2':s2.values}) u1,u2 = df['value1'].mean(),df['value2'].mean() std1,std2 = df['value1'].std(),df['value2'].std() print('value1正太性檢驗結果:',stats.kstest(df['value1'],'norm',(u1,std1))) #需要先驗證滿足正太分布 print('value2正太性檢驗結果:',stats.kstest(df['value2'],'norm',(u2,std2))) df['(x-u1)*(y-u2)'] = (df['value1'] - u1) * (df['value2'] - u2) df['(x-u1)**2'] = (df['value1'] - u1) ** 2 df['(y-u2)**2'] = (df['value2'] - u2) ** 2 print(df.head(3)) r = df['(x-u1)*(y-u2)'].sum()/(np.sqrt(df['(x-u1)**2'].sum()) * np.sqrt(df['(y-u2)**2'].sum())) print('皮爾森相關系數為%.4f'%r)

value1正太性檢驗結果: KstestResult(statistic=0.09073501372253845, pvalue=0.36300244109659735) value2正太性檢驗結果: KstestResult(statistic=0.11608587123064174, pvalue=0.12471026010748129) value1 value2 (x-u1)*(y-u2) (x-u1)**2 (y-u2)**2 0 2.727329 0.101045 1163.135987 1864.420003 725.633345 1 4.566353 0.296802 1105.504546 1708.987866 715.125206 2 6.132681 0.308134 1063.167351 1581.937521 714.519254 皮爾森相關系數為0.9699
2.pandas的corr()方法
上述方法為計算過程,可使用pandas的corr()方法直接生成相關系數矩陣
s1 = pd.Series(np.random.rand(100)*100).sort_values() s2 = pd.Series(np.random.rand(100)*50).sort_values() df = pd.DataFrame({'value1':s1.values,'value2':s2.values}) r = df.corr() #參數默認為pearson print(r) # value1 value2 # value1 1.000000 0.988596 # value2 0.988596 1.000000
三、Sperman秩相關系數(斯皮爾曼相關系數)
皮爾森相關系數只能用於分析服從正態分布的連續變量的相關性,對於不服從正態分布的變量,可采用Sperman秩相關系數進行相關性分析。
Sperman秩相關系數,也稱等級相關系數。如果數據中沒有重復值, 並且當兩個變量完全單調相關時,斯皮爾曼相關系數則為+1或−1。
計算邏輯:對兩個變量的取值按照從小到大順序編秩,如果兩個值大小相等,則秩次為(index1+index2)/2,
1.spearman相關系數的推導
df = pd.DataFrame({'智商':[106,86,100,101,99,103,97,113,112,110],'每周看電視小數':[7,0,27,50,28,29,20,12,6,17]}) n = len(df) df.sort_values('智商',inplace = True) df['range1'] = np.arange(1,n+1) df.sort_values('每周看電視小數',inplace = True) df['range2'] = np.arange(1,n+1) df['d'] = df['range1'] - df['range2'] df['d**2'] = df['d'] ** 2 rs = 1 - 6 * (df['d**2'].sum())/(n*(n**2-1)) print('斯皮爾曼相關系數為%.4f'%rs) # 斯皮爾曼相關系數為-0.1758
2.pandas的corr()方法
corr()默認為pearson相關系數,添加參數method='spearman'轉化為spearman相關系數。
df = pd.DataFrame({'智商':[106,86,100,101,99,103,97,113,112,110],'每周看電視小數':[7,0,27,50,28,29,20,12,6,17]}) rs = df.corr(method='spearman') print(rs) # 智商 每周看電視小數 # 智商 1.000000 -0.175758 # 每周看電視小數 -0.175758 1.000000