팬더를 사용하여 상관 행렬 플롯


212

수많은 기능을 가진 데이터 세트가 있으므로 상관 관계 매트릭스를 분석하는 것이 매우 어려워졌습니다. dataframe.corr()팬더 라이브러리의 함수를 사용하여 얻은 상관 행렬을 플로팅하고 싶습니다 . 이 행렬을 플롯하기 위해 팬더 라이브러리에서 제공하는 내장 함수가 있습니까?


관련 답변은 여기에서 확인할 수 있습니다. 팬더에서 히트 맵 만들기 DataFrame
joelostblom

답변:


292

다음 pyplot.matshow() 에서 사용할 수 있습니다 matplotlib.

import matplotlib.pyplot as plt

plt.matshow(dataframe.corr())
plt.show()

편집하다:

주석에는 축 눈금 레이블을 변경하는 방법에 대한 요청이있었습니다. 다음은 더 큰 그림 크기로 그려지고 데이터 프레임과 일치하는 축 레이블과 색상 눈금을 해석하는 색상 막대 범례가있는 디럭스 버전입니다.

레이블의 크기와 회전을 조정하는 방법을 포함하고 있으며 색상 막대와 기본 그림의 높이가 같은 그림 비율을 사용하고 있습니다.

f = plt.figure(figsize=(19, 15))
plt.matshow(df.corr(), fignum=f.number)
plt.xticks(range(df.shape[1]), df.columns, fontsize=14, rotation=45)
plt.yticks(range(df.shape[1]), df.columns, fontsize=14)
cb = plt.colorbar()
cb.ax.tick_params(labelsize=14)
plt.title('Correlation Matrix', fontsize=16);

상관도 예


1
나는 무언가를 놓치고 있어야한다 :AttributeError: 'module' object has no attribute 'matshow'
Tom Russell

1
@TomRussell 했습니까 import matplotlib.pyplot as plt?
joelostblom 2016 년

1
내가 한 것 같아요! :-)
Tom Russell

7
플롯에 실제 열 이름을 표시하는 방법을 알고 있습니까?
WebQube

2
@Cecilia 나는 변경하여이 문제를 해결했다 회전 에 매개 변수를 90
ikbel을 benabdessamad

182

주요 목표가 플롯 자체를 생성하는 대신 상관 관계 매트릭스를 시각화하는 것이라면 편리한 pandas 스타일링 옵션 은 실행 가능한 기본 제공 솔루션입니다.

import pandas as pd
import numpy as np

rs = np.random.RandomState(0)
df = pd.DataFrame(rs.rand(10, 10))
corr = df.corr()
corr.style.background_gradient(cmap='coolwarm')
# 'RdBu_r' & 'BrBG' are other good diverging colormaps

여기에 이미지 설명을 입력하십시오

JupyterLab Notebook과 같이 HTML 렌더링을 지원하는 백엔드에 있어야합니다. (어두운 배경의 자동 밝은 텍스트는 기존 PR 버전이며 최신 릴리스 버전 인 pandas0.23이 아닙니다 .)


스타일링

자릿수 정밀도를 쉽게 제한 할 수 있습니다.

corr.style.background_gradient(cmap='coolwarm').set_precision(2)

여기에 이미지 설명을 입력하십시오

또는 주석이없는 행렬을 선호하는 경우 숫자를 모두 제거하십시오.

corr.style.background_gradient(cmap='coolwarm').set_properties(**{'font-size': '0pt'})

여기에 이미지 설명을 입력하십시오

스타일링 문서에는 마우스 포인터가 놓인 셀의 표시를 변경하는 방법과 같은 고급 스타일의 지침도 포함되어 있습니다. 출력을 저장하려면 render()메서드 를 추가하여 HTML을 반환 한 다음 파일에 작성하거나 덜 공식적인 목적으로 스크린 샷을 찍을 수 있습니다.


시간 비교

내 테스트에서 10x10 매트릭스 보다 style.background_gradient()4x 빠르고 plt.matshow()120x 빠릅니다 sns.heatmap(). 불행히도 그것은 잘 확장되지 않습니다 plt.matshow(): 두 개는 100x100 행렬의 경우 거의 같은 시간이 걸리고 plt.matshow()1000x1000 행렬의 경우 10 배 빠릅니다.


절약

양식화 된 데이터 프레임을 저장하는 몇 가지 방법이 있습니다.

  • 메소드를 추가하여 HTML을 리턴 한 render()후 출력을 파일에 작성하십시오.
  • 메소드 .xslx를 추가하여 조건부 서식이 있는 파일로 저장하십시오 to_excel().
  • 비트 맵을 저장하기 위해 imgkit과 결합
  • 덜 공식적인 목적으로 스크린 샷을 만듭니다.

팬더 업데이트> = 0.24

을 설정 axis=None하면 열 또는 행당이 아니라 전체 행렬을 기반으로 색상을 계산할 수 있습니다.

corr.style.background_gradient(cmap='coolwarm', axis=None)

여기에 이미지 설명을 입력하십시오


2
이미지로 내보내는 방법이 있다면 좋을 것입니다!
Kristada673

1
감사! 당신은 확실히 발산 팔레트 필요import seaborn as sns corr = df.corr() cm = sns.light_palette("green", as_cmap=True) cm = sns.diverging_palette(220, 20, sep=20, as_cmap=True) corr.style.background_gradient(cmap=cm).set_precision(2)
stallingOne

1
@stallingOne 좋은 점은 예제에 음수 값을 포함해서는 안되며 나중에 변경할 수 있습니다. 이 글을 읽는 사람들을 위해 참고로, seaborn으로 사용자 정의 발산 cmap을 만들 필요는 없지만 (위의 주석에서 매끄러운 매끄럽게 보이지만) matplotlib의 내장 발산 cmap을 사용할 수도 있습니다 (예 :) corr.style.background_gradient(cmap='coolwarm'). 현재 cmap을 특정 값에 집중시킬 수있는 방법은 없습니다. 이는 cmaps가 다양 할 경우 좋은 아이디어입니다.
joelostblom

1
@rovyko 팬더> = 0.24.0에 있습니까?
joelostblom

2
이 음모는 시각적으로 훌륭하지만 @ Kristada673 질문은 매우 관련이 있습니다. 어떻게 내보내겠습니까?
Erfan

89

이 함수를 사용하면 상관 행렬의 변수 이름도 표시됩니다.

def plot_corr(df,size=10):
    '''Function plots a graphical correlation matrix for each pair of columns in the dataframe.

    Input:
        df: pandas DataFrame
        size: vertical and horizontal size of the plot'''

    corr = df.corr()
    fig, ax = plt.subplots(figsize=(size, size))
    ax.matshow(corr)
    plt.xticks(range(len(corr.columns)), corr.columns);
    plt.yticks(range(len(corr.columns)), corr.columns);

6
plt.xticks(range(len(corr.columns)), corr.columns, rotation='vertical')x 축에서 열 이름의 세로 방향을 원할 경우
nishant

또 다른 그래픽 기능이지만 a를 추가하면 plt.tight_layout()긴 열 이름에 유용 할 수 있습니다.
user3017048

86

시본의 히트 맵 버전 :

import seaborn as sns
corr = dataframe.corr()
sns.heatmap(corr, 
            xticklabels=corr.columns.values,
            yticklabels=corr.columns.values)

9
Seaborn 히트 맵은 훌륭하지만 대형 매트릭스에서는 성능이 떨어집니다. matplotlib의 matshow 방법이 훨씬 빠릅니다.
anilbey

3
Seaborn은 열 이름에서 눈금 레이블을 자동으로 유추 할 수 있습니다.
Tulio Casagrande

80

seaborn에서 열지도를 그리거나 pandas에서 산란 행렬을 그려서 피처 간의 관계를 관찰 할 수 있습니다.

분산 매트릭스 :

pd.scatter_matrix(dataframe, alpha = 0.3, figsize = (14,8), diagonal = 'kde');

각 기능의 왜도를 시각화하려면 seaborn 쌍 그림을 사용하십시오.

sns.pairplot(dataframe)

Sns 히트 맵 :

import seaborn as sns

f, ax = pl.subplots(figsize=(10, 8))
corr = dataframe.corr()
sns.heatmap(corr, mask=np.zeros_like(corr, dtype=np.bool), cmap=sns.diverging_palette(220, 10, as_cmap=True),
            square=True, ax=ax)

출력은 기능의 상관 맵이됩니다. 즉 아래 예를 참조하십시오.

여기에 이미지 설명을 입력하십시오

식료품과 세제의 상관 관계가 높습니다. 비슷하게:

높은 상관 관계를 가진 Pdoducts :
  1. 식료품 및 세제.
중간 상관 관계가있는 제품 :
  1. 우유와 식료품
  2. 우유와 세제 _ 종이
상관 관계가 낮은 제품 :
  1. 우유와 델리
  2. 냉동 및 신선한.
  3. 냉동 및 델리.

Pairplots에서 : pairplots 또는 scatter matrix에서 동일한 관계 집합을 관찰 할 수 있습니다. 그러나 이것들로부터 우리는 데이터가 정상적으로 분포되어 있는지 아닌지를 말할 수 있습니다.

여기에 이미지 설명을 입력하십시오

참고 : 위의 데이터는 히트 맵을 그리는 데 사용되는 데이터에서 가져온 것과 동일한 그래프입니다.


3
나는 그것이 .plt .pl이 아니라고 생각합니다 (이것이 matplotlib를 참조하는 경우)
ghukill

2
@ghukill 필요하지 않습니다. 그는 이것을 다음과 같이 언급 할 수있었습니다from matplotlib import pyplot as pl
Jeru Luke

상관 관계 플롯에서 항상 -1에서 +1 사이의 상관 경계를 설정하는 방법
debaonline4u

7

matplotlib에서 imshow () 메소드를 사용할 수 있습니다

import pandas as pd
import matplotlib.pyplot as plt
plt.style.use('ggplot')

plt.imshow(X.corr(), cmap=plt.cm.Reds, interpolation='nearest')
plt.colorbar()
tick_marks = [i for i in range(len(X.columns))]
plt.xticks(tick_marks, X.columns, rotation='vertical')
plt.yticks(tick_marks, X.columns)
plt.show()

5

데이터 프레임 인 경우 df간단하게 사용할 수 있습니다.

import matplotlib.pyplot as plt
import seaborn as sns

plt.figure(figsize=(15, 10))
sns.heatmap(df.corr(), annot=True)

3

statmodels 그래픽은 상관 행렬을 잘 보여줍니다.

import statsmodels.api as sm
import matplotlib.pyplot as plt

corr = dataframe.corr()
sm.graphics.plot_corr(corr, xnames=list(corr.columns))
plt.show()


1

다른 방법과 함께 모든 경우에 대해 산점도를 제공하는 쌍 그림을 갖는 것이 좋습니다.

import pandas as pd
import numpy as np
import seaborn as sns
rs = np.random.RandomState(0)
df = pd.DataFrame(rs.rand(10, 10))
sns.pairplot(df)

0

양식 상관 행렬, 제 경우 zdf는 상관 행렬을 수행 해야하는 데이터 프레임입니다.

corrMatrix =zdf.corr()
corrMatrix.to_csv('sm_zscaled_correlation_matrix.csv');
html = corrMatrix.style.background_gradient(cmap='RdBu').set_precision(2).render()

# Writing the output to a html file.
with open('test.html', 'w') as f:
   print('<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-widthinitial-scale=1.0"><title>Document</title></head><style>table{word-break: break-all;}</style><body>' + html+'</body></html>', file=f)

그런 다음 스크린 샷을 찍을 수 있습니다. 또는 html을 이미지 파일로 변환하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.