이번 포스팅에서는 다수 그룹 별 다수의 변수 간 쌍을 이룬 상관계수 분석(paired correlation coefficients with multiple columns by multiple groups) 을 하는 방법을 소개하겠습니다. 


보통 다수의 변수간의 상관계수를 구할 때는 상관계수 행렬 (correlation matrix)를 하면 되는데요, 이때 '다수의 그룹별 (by multiple groups)'로 나누어서 다수의 변수 간 상관계수를 구하려면 머리가 좀 복잡해집니다. 


간단한 예제 데이터셋을 만들어서 예를 들어보겠습니다. 



(1) 3개의 그룹 변수, 4개의 연속형 변수를 가진 예제 DataFrame 만들기



import numpy as np

import pandas as pd

 



'group_1' 변수 내 ('A', 'B' 그룹), 'group_2' 변수 내 ('C', 'D', 'E', 'F' 그룹), 'group_3' 변수 내 ('G', 'H', 'I', 'J', 'K', 'L', 'M', 'N' 그룹) 별로 나누어서 상관계수를 구해보겠습니다.  



# making groups

group_1 = ['A', 'B']*20

group_2 = ['C', 'D', 'E', 'F']*10

group_3 = ['G', 'H', 'I', 'J', 'K', 'L', 'M', 'N']*5;

 



상관계수를 구할 연속형 변수는 'col_1', 'col_2', 'col_3', 'col_4' 라는 4개의 변수를 사용하겠습니다. 



df = pd.DataFrame({'group_1': group_1, 

                   'group_2': group_2,

                   'group_3': group_3,

                   'col_1': np.random.randn(40), 

                   'col_2': np.random.randn(40), 

                   'col_3': np.random.randn(40), 

                   'col_4': np.random.randn(40)})

 



df.sort_values(by=['group_1', 'group_2', 'group_3'], axis=0)

col_1col_2col_3col_4group_1group_2group_3
0-0.3519690.026318-1.0379100.849338ACG
8-0.163435-0.175277-1.3492510.645246ACG
160.7286521.7317620.691091-0.189488ACG
24-1.4909560.083991-0.5037271.690979ACG
320.0763800.634184-0.424101-0.608869ACG
40.9020271.454501-1.4678170.448042ACK
120.8997920.8332890.829877-0.062950ACK
20-0.5599710.5399670.0053970.362061ACK
28-1.0525390.558581-0.7993140.979169ACK
360.919377-1.430321-1.8183650.061561ACK
2-0.030675-0.168537-1.341236-1.149740AEI
100.112267-0.4767360.967436-0.222528AEI
18-0.774158-0.0812310.4385141.611915AEI
26-0.173712-1.3584140.6533920.053665AEI
341.1100801.175692-0.8678431.042837AEI
6-0.083481-0.200750-0.702476-1.072645AEM
140.223843-1.3453150.8996681.126941AEM
220.5296800.0627431.035399-0.729469AEM
301.456441-0.403748-0.4460940.408010AEM
38-1.3085480.367232-0.9631090.918776AEM
10.579627-1.720893-0.798200-0.107270BDH
92.101038-0.581516-0.7962300.324806BDH
17-0.168765-1.176664-0.024593-0.348601BDH
250.166594-1.4183070.916661-0.912822BDH
330.8896150.014690-0.7114580.649833BDH
51.1998020.968027-0.7804340.884857BDL
13-0.0386370.6947500.219160-0.693826BDL
21-1.054844-0.559508-0.890659-0.321867BDL
29-0.5748880.812719-0.823804-0.382432BDL
370.6705480.1789110.497704-0.402953BDL
30.477194-0.355853-1.4418981.418857BFJ
110.9651870.5630260.964660-0.249644BFJ
19-2.3186850.079057-0.107432-1.358502BFJ
27-0.951459-0.4669331.141424-2.860606BFJ
35-0.462823-0.3970810.373452-1.303045BFJ
70.398693-0.086113-0.0814450.871010BFN
150.1219700.2581300.654156-0.497327BFN
231.228697-0.625133-1.761145-0.577502BFN
311.0748550.7841400.5291900.479893BFN
390.3417670.170529-0.2878840.329371BFN

 




  (2) 그룹별 두 개 변수 간 상관계수를 구하는 사용자 정의 함수


예제 데이터셋이 준비가 되었으니 이제 '그룹별로 두 개 변수 간 상관계수를 구하는 사용자 정의 함수 (a user-defined function of correlation coefficients with paired variables by groups)' 를 정의해보겠습니다. 



# a user-defined function of correlation coefficients with paired variables by groups

def corr_group(df, var_1, var_2, group_list):

    # correlaiton fuction with 2 variables

    corr_func = lambda g: g[var_1].corr(g[var_2])

    

    # GroupBy operator

    grouped = df.groupby(group_list)

    

    # calculate correlation coefficient by Group

    corr_coef_df = pd.DataFrame(grouped.apply(corr_func), columns=['corr_coef'])

    

    # add var_1, var_2 column names

    corr_coef_df['var1'] = var_1

    corr_coef_df['var2'] = var_2

    

    return corr_coef_df

 




  (3) 다수 그룹별 다수 변수 간 두개 씩 쌍을 이루어 상관계수 구하기


'group_1', 'group_2', 'group_3' 의 3개의 그룹 변수로 만들어진 모든 경우의 수의 그룹 조합에 대해서, 'col_1', 'col_2', 'col_3', 'col_4'의 4개 연속형 변수로 2개씩 쌍(pair)을 이루어 만들어진 모든 경우의 수의 조합, 즉, ('col_1', 'col_2'), ('col_1', 'col_3'), ('col_1', 'col_4'), ('col_2', 'col_3'), ('col_2', 'col_4'), ('col_3', 'col_4') 의 4C2=6개의 조합별 상관계수를 구해보겠습니다. 


이때 위의 (2)번에서 만들었던 '두 개 쌍의 변수간 상관계수 구하는 사용자 정의함수'인 corr_group() 함수를 사용하여 for loop 문으로 6개의 연속형 변수의 조합별로 상관계수를 구한 후에, corr_coef_df_all 데이터 프레임에 append 해나가는 방식을 사용하였습니다. 



# blank DataFrame

corr_coef_df_all = pd.DataFrame()

 

# group by list

group_list = ['group_1', 'group_2', 'group_3']


# column lists for correlation matrix

col_list = ['col_1', 'col_2', 'col_3', 'col_4']


# get all cominations of col_list with length 2

from itertools import combinations

comb = combinations(col_list, 2)


# calculate correlation coefficients pair-wise

for var in list(comb):

    corr_tmp = corr_group(df, var[0], var[1], group_list)

    corr_coef_df_all = corr_coef_df_all.append(corr_tmp)


# result

corr_coef_df_all[['var1', 'var2', 'corr_coef']]

var1var2corr_coef
group_1group_2group_3
ACGcol_1col_20.703392
Kcol_1col_2-0.139566
EIcol_1col_20.642818
Mcol_1col_2-0.410050
BDHcol_1col_20.511432
Lcol_1col_20.569900
FJcol_1col_20.247295
Ncol_1col_2-0.186798
ACGcol_1col_30.466368
Kcol_1col_3-0.167176
EIcol_1col_3-0.455445
Mcol_1col_30.385438
BDHcol_1col_3-0.615976
Lcol_1col_30.362789
FJcol_1col_3-0.063979
Ncol_1col_3-0.556404
ACGcol_1col_4-0.867131
Kcol_1col_4-0.790912
EIcol_1col_4-0.052166
Mcol_1col_4-0.191858
BDHcol_1col_40.656101
Lcol_1col_40.631548
FJcol_1col_40.604571
Ncol_1col_4-0.144041
ACGcol_2col_30.956775
Kcol_2col_30.423775
EIcol_2col_3-0.597295
Mcol_2col_3-0.506746
BDHcol_2col_3-0.399239
Lcol_2col_30.036270
FJcol_2col_30.262685
Ncol_2col_30.875746
ACGcol_2col_4-0.631931
Kcol_2col_40.315081
EIcol_2col_40.395802
Mcol_2col_4-0.381141
BDHcol_2col_40.789146
Lcol_2col_40.363601
FJcol_2col_40.216682
Ncol_2col_40.406150
ACGcol_3col_4-0.434402
Kcol_3col_4-0.250838
EIcol_3col_40.274027
Mcol_3col_4-0.008633
BDHcol_3col_4-0.874220
Lcol_3col_4-0.472953
FJcol_3col_4-0.775485
Ncol_3col_40.366142




많은 도움이 되었기를 바랍니다. 


이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾹 눌러주세요. :-)


728x90
반응형
Posted by Rfriend
,