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

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



답변

다음 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);

상관도 예


답변

주요 목표가 플롯 자체를 생성하는 대신 상관 관계 매트릭스를 시각화하는 것이라면 편리한 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을 반환 한 다음 파일에 작성하거나 덜 공식적인 목적으로 스크린 샷을 찍을 수 있습니다.


시간 비교

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


절약

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

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

팬더 업데이트> = 0.24

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

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

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


답변

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

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);


답변

시본의 히트 맵 버전 :

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


답변

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에서 동일한 관계 집합을 관찰 할 수 있습니다. 그러나 이것들로부터 우리는 데이터가 정상적으로 분포되어 있는지 아닌지를 말할 수 있습니다.

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

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


답변

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()


답변

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

import matplotlib.pyplot as plt
import seaborn as sns

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