二值變量間的相關性分析


二值類別變量相關性分析

目前,在相關性分析領域,主要使用的技術指標有pearson相關系數、spearman相關系數、kendall相關系數。三者有一個共同的特點,它們都是通過兩組數據的元素大小來刻畫相關性,也即同增同減的性質。在分類、聚類領域中,為了彌補上述相關性的不足,科學家將距離、方向引入相關性的刻畫中,常用的指標有歐式距離、夾角余弦等。雖然這些方法在分類和聚類過程中表現良好,但是它們任然有局限性,這種局限性表現為它們能區分類別變量卻不能計算類別變量數據間的相關性。即距離、方向刻畫的是總體級的相關性質而不能刻畫樣本級的相關性。

為了研究類別變量與數值變量間的相關性,研究人員大量使用列聯表分析,如用eta系數來刻畫。對於類別變量與類別變量之間的相關性,借助於列聯表,我們可以計算斯皮爾曼等級相關系數與G系數、Gamma相關系數、d系數來刻畫。

    對於0、1型數據序列集,求解其相關性,我們可以從類別的聚集程度度量。兩組序列間的區分度越極端,序列間的相關性就越大。如:將兩個序列聚集到一起,組成數對,如果0全來自序列1,1全來自序列2,那么兩個序列的區分度最大,此時序列之間是強相關的,我們可以認為部件2處於狀態1時,部件1處於狀態0,相關性為-1;反之,聚集之后數據全是1或全是0,那么序列間沒有區分度,同理,此時序列間是強相關的,相關性為1。為了研究這種區分度,我們引入示性函數進行表示。若令X表示部件1,Y表示部件2,則用  I(Xi=Yi) 表示序列間相等的個數,用表示 I(XiYi) 系列間不同的個數。當數據最混亂的時候有 I(Xi=Yi) = I(XiYi) ,若有n組數據,則有 I(Xi=Yi) =n/2。我們用下式來度量這種區分度:

    

這種區分度取值是0到1,這里並不能表示負相關這種情況,為了讓它可以用於相關系數的度量(相關系數一般取值(-1,1)),我們在d的前面在乘一個示性因子,如下式所示:

    

其中dc為兩個序列間的相關系數。

    下面我們通過一個案例和python代碼,實際展示效果。

1、數據准備

    我們在csv文件里先准備好幾列0、1型的數據,如下圖所示:

    

這里我用的是csv文件,當然也可以使用其他數據格式,為了方便,請使用pandas可以直接調用的.

2、python代碼實例

 1 mport pandas as pd
 2 import numpy as np
 3 
 4 
 5 class DC:
 6 
 7     def __init__(self, pd_data):
 8         self.data = pd_data
 9         self.n = pd_data.shape[0]
10         self.columns = pd_data.columns
11         # self.columns = (pd_data.columns.shape[0], )*2
12 
13     def out_matrix_initialization(self):
14         data_frame = pd.DataFrame(columns=self.columns, index=self.columns)
15         return data_frame
16 
17     def _get_col(self, index1, index2):
18         return [self.columns[index1], self.columns[index2]]
19 
20     def get_class_correlation(self, index1, index2):
21         i, j = self._get_col(index1, index2)
22         equality = np.sum(self.data[i] == self.data[j])
23 
24         # sign_value = 1.001**(-equality * (self.n - equality) / self.n ** 2) - 1.001**(-1 / 4)
25         # res = sign_value / (1 - 1.001**(-1 / 4))
26         across = equality * (self.n - equality)
27         # print("index1:{}, index2:{}, across:{}".format(index1, index2, across))
28         res = 1 - 4*across / self.n**2
29         res = res*np.sign(equality / self.n - 0.5)
30         return round(res, 4)
31 
32     def get_matrix(self):
33         result = self.out_matrix_initialization()
34         raw, col = result.shape
35         for i in range(raw):
36             for j in range(col):
37                 result.loc[i:i+1, j:j+1] = self.get_class_correlation(i, j)
38         return result
39 
40 
41 if __name__ == '__main__':
42     data = pd.read_csv("test.csv")
43     dc = DC(data)
44     s = dc.get_matrix()
45     print(data.corr())
46     print(s)

3、調用結果截圖

  

方框內是我們自己定義的dc相關系數,而上面的是Pearson相關系數,明顯在這里變量為類別變量時,Pearson相關系數不能很好地描述相關性,由於其在理論是是描述變量的大小的,而類別變量沒有大小之分,只有類別之分,所以在這里使用它有理論上的錯誤;並且在數據類別全部相反的時候,Pearson直接為NaN,無法計算,而dc系數可以很好地描述出這種完全負相關的情況。

4、總結

    這里的dc系數適用於二值變量,如果是多類別變量,它同樣會失效,關於dc系數如何推廣到多類別變量間的相關性度量,還有待討論。

 

 

  有什么問題歡迎留言指正!

轉載、調用請注明出處!

 


免責聲明!

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



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