數據特征分析-相關性分析


相關性分析是指對兩個或多個具備相關性的變量元素進行分析,從而衡量兩個變量的相關密切程度。

相關性的元素之間需要存在一定的聯系或者概率才可以進行相關性分析。

相關系數在[-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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM