二值類別變量相關性分析python
目前,在相關性分析領域,主要使用的技術指標有pearson相關係數、spearman相關係數、kendall相關係數。三者有一個共同的特色,它們都是經過兩組數據的元素大小來刻畫相關性,也即同增同減的性質。在分類、聚類領域中,爲了彌補上述相關性的不足,科學家將距離、方向引入相關性的刻畫中,經常使用的指標有歐式距離、夾角餘弦等。雖然這些方法在分類和聚類過程當中表現良好,可是它們任然有侷限性,這種侷限性表現爲它們能區分類別變量卻不能計算類別變量數據間的相關性。即距離、方向刻畫的是整體級的相關性質而不能刻畫樣本級的相關性。函數
爲了研究類別變量與數值變量間的相關性,研究人員大量使用列聯表分析,如用eta係數來刻畫。對於類別變量與類別變量之間的相關性,藉助於列聯表,咱們能夠計算斯皮爾曼等級相關係數與G係數、Gamma相關係數、d係數來刻畫。spa
對於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(Xi
Yi) ,如有n組數據,則有 I(Xi=Yi) =n/2。咱們用下式來度量這種區分度:code
這種區分度取值是0到1,這裏並不能表示負相關這種狀況,爲了讓它能夠用於相關係數的度量(相關係數通常取值(-1,1)),咱們在d的前面在乘一個示性因子,以下式所示:orm
其中dc爲兩個序列間的相關係數。blog
下面咱們經過一個案例和python代碼,實際展現效果。get
一、數據準備pandas
咱們在csv文件裏先準備好幾列0、1型的數據,以下圖所示:it
這裏我用的是csv文件,固然也可使用其餘數據格式,爲了方便,請使用pandas能夠直接調用的.io
二、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)
三、調用結果截圖
方框內是咱們本身定義的dc相關係數,而上面的是Pearson相關係數,明顯在這裏變量爲類別變量時,Pearson相關係數不能很好地描述相關性,因爲其在理論是是描述變量的大小的,而類別變量沒有大小之分,只有類別之分,因此在這裏使用它有理論上的錯誤;而且在數據類別所有相反的時候,Pearson直接爲NaN,沒法計算,而dc係數能夠很好地描述出這種徹底負相關的狀況。
四、總結
這裏的dc係數適用於二值變量,若是是多類別變量,它一樣會失效,關於dc係數如何推廣到多類別變量間的相關性度量,還有待討論。
有什麼問題歡迎留言指正!
轉載、調用請註明出處!