Pandas의 큰 상관 행렬에서 가장 높은 상관 쌍을 나열 하시겠습니까?
Pandas와의 상관 관계 행렬에서 상위 상관 관계를 어떻게 찾습니까? R이 작업을 수행하는 방법에 대한 많은 답변 (있다 정렬 된 목록으로, 아니 큰 행렬로 표시 상관 관계 또는 효율적인 방법으로 높은 상관 관계를 얻을 수 파이썬 또는 R에서 대규모 데이터 세트에서 쌍 ,하지만 내가 그것을 수행하는 방법 궁금는) 판다 랑? 제 경우에는 행렬이 4460x4460이므로 시각적으로 할 수 없습니다.
을 사용 DataFrame.values
하여 데이터의 numpy 배열을 얻은 다음 NumPy 함수를 사용 argsort()
하여 가장 상관 관계가있는 쌍을 얻을 수 있습니다.
하지만 팬더에서이 작업을 수행하려는 경우, 당신이 할 수있는 unstack
및 order
DataFrame :
import pandas as pd
import numpy as np
shape = (50, 4460)
data = np.random.normal(size=shape)
data[:, 1000] += data[:, 2000]
df = pd.DataFrame(data)
c = df.corr().abs()
s = c.unstack()
so = s.sort_values(kind="quicksort")
print so[-4470:-4460]
다음은 출력입니다.
2192 1522 0.636198
1522 2192 0.636198
3677 2027 0.641817
2027 3677 0.641817
242 130 0.646760
130 242 0.646760
1171 2733 0.670048
2733 1171 0.670048
1000 2000 0.742340
2000 1000 0.742340
dtype: float64
@HYRY의 대답은 완벽합니다. 중복 및 자체 상관 관계와 적절한 정렬을 피하기 위해 약간 더 많은 논리를 추가하여 해당 답변을 구축하십시오.
import pandas as pd
d = {'x1': [1, 4, 4, 5, 6],
'x2': [0, 0, 8, 2, 4],
'x3': [2, 8, 8, 10, 12],
'x4': [-1, -4, -4, -4, -5]}
df = pd.DataFrame(data = d)
print("Data Frame")
print(df)
print()
print("Correlation Matrix")
print(df.corr())
print()
def get_redundant_pairs(df):
'''Get diagonal and lower triangular pairs of correlation matrix'''
pairs_to_drop = set()
cols = df.columns
for i in range(0, df.shape[1]):
for j in range(0, i+1):
pairs_to_drop.add((cols[i], cols[j]))
return pairs_to_drop
def get_top_abs_correlations(df, n=5):
au_corr = df.corr().abs().unstack()
labels_to_drop = get_redundant_pairs(df)
au_corr = au_corr.drop(labels=labels_to_drop).sort_values(ascending=False)
return au_corr[0:n]
print("Top Absolute Correlations")
print(get_top_abs_correlations(df, 3))
그러면 다음과 같은 출력이 제공됩니다.
Data Frame
x1 x2 x3 x4
0 1 0 2 -1
1 4 0 8 -4
2 4 8 8 -4
3 5 2 10 -4
4 6 4 12 -5
Correlation Matrix
x1 x2 x3 x4
x1 1.000000 0.399298 1.000000 -0.969248
x2 0.399298 1.000000 0.399298 -0.472866
x3 1.000000 0.399298 1.000000 -0.969248
x4 -0.969248 -0.472866 -0.969248 1.000000
Top Absolute Correlations
x1 x3 1.000000
x3 x4 0.969248
x1 x4 0.969248
dtype: float64
중복 변수 쌍이없는 몇 줄 솔루션 :
corr_matrix = df.corr().abs()
#the matrix is symmetric so we need to extract upper triangle matrix without diagonal (k = 1)
sol = (corr_matrix.where(np.triu(np.ones(corr_matrix.shape), k=1).astype(np.bool))
.stack()
.sort_values(ascending=False))
#first element of sol series is the pair with the bigest correlation
@HYRY와 @arun의 답변의 일부 기능을 결합하면 df
다음을 사용하여 데이터 프레임 에 대한 상위 상관 관계를 한 줄로 인쇄 할 수 있습니다 .
df.corr().unstack().sort_values().drop_duplicates()
참고 : 한 가지 단점은 하나의 변수 가 아닌 1.0 상관 관계가있는 경우 drop_duplicates()
추가하면 제거 된다는 것입니다.
사용은 itertools.combinations
팬더의 모든 고유의 상관 관계를 자신의 상관 행렬을 얻기 위해 .corr()
, 목록의 목록을 생성하고 사용하기 위해서는 다시 DataFrame에 '.sort_values을'을 공급. ascending = True
가장 낮은 상관 관계를 맨 위에 표시하도록 설정
corrank
takes a DataFrame as argument because it requires .corr()
.
def corrank(X):
import itertools
df = pd.DataFrame([[(i,j),X.corr().loc[i,j]] for i,j in list(itertools.combinations(X.corr(), 2))],columns=['pairs','corr'])
print(df.sort_values(by='corr',ascending=False))
corrank(X) # prints a descending list of correlation pair (Max on top)
Use the code below to view the correlations in the descending order.
# See the correlations in descending order
corr = df.corr() # df is the pandas dataframe
c1 = corr.abs().unstack()
c1.sort_values(ascending = False)
Lot's of good answers here. The easiest way I found was a combination of some of the answers above.
corr = corr.where(np.triu(np.ones(corr.shape), k=1).astype(np.bool))
corr = corr.unstack().transpose()\
.sort_values(by='column', ascending=False)\
.dropna()
I didn't want to unstack
or over-complicate this issue, since I just wanted to drop some highly correlated features as part of a feature selection phase.
So I ended up with the following simplified solution:
# map features to their absolute correlation values
corr = features.corr().abs()
# set equality (self correlation) as zero
corr[corr == 1] = 0
# of each feature, find the max correlation
# and sort the resulting array in ascending order
corr_cols = corr.max().sort_values(ascending=False)
# display the highly correlated features
display(corr_cols[corr_cols > 0.8])
In this case, if you want to drop correlated features, you may map through the filtered corr_cols
array and remove the odd-indexed (or even-indexed) ones.
'IT TIP' 카테고리의 다른 글
IDEA에서 재구성하지 않고 코드를 붙여 넣는 방법 (0) | 2020.12.03 |
---|---|
Genymotion에서 다운로드 한 가상 장치를 다른 컴퓨터에 복사하는 방법은 무엇입니까? (0) | 2020.12.03 |
UINavigationController를 사용하여 UIPageViewController에서 푸시 다운 된 콘텐츠 (0) | 2020.12.03 |
메인 스레드의 Okhttp 응답 콜백 (0) | 2020.12.03 |
모든 자식 요소 가져 오기 (0) | 2020.12.03 |