팬더와 상관 행렬의 계산 및 시각화


35

여러 항목이있는 팬더 데이터 프레임이 있으며 일부 유형의 상점 수입 간의 상관 관계를 계산하려고합니다. 수입 데이터, 활동 영역 분류 (극장, 옷가게, 음식 ...) 및 기타 데이터가있는 여러 상점이 있습니다.

나는 새로운 데이터 프레임을 만들고 같은 카테고리에 속하는 모든 종류의 상점의 수입으로 열을 삽입하려고 시도했으며 반환 데이터 프레임에는 첫 번째 열만 채워졌고 나머지는 NaN으로 가득 찼습니다. 내가 피곤한 코드 :

corr = pd.DataFrame()
for at in activity:
    stores.loc[stores['Activity']==at]['income']

그렇게하고 싶기 때문에 .corr()상점 카테고리 사이에 상관 관계 매트릭스를 제공하는 데 사용할 수 있습니다 .

그런 다음 matplolib로 행렬 값 (Pearson의 상관 관계를 사용하기 때문에 1 대 1)을 플롯하는 방법을 알고 싶습니다.


답변:


24

다음과 같은 게임을 제안합니다.

이 예에서 UCI Abalone 데이터 사용 ...

import matplotlib
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

# Read file into a Pandas dataframe
from pandas import DataFrame, read_csv
f = 'https://archive.ics.uci.edu/ml/machine-learning-databases/abalone/abalone.data'
df = read_csv(f)
df=df[0:10]
df

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

상관 행렬 플로팅 기능 :

# 상관 수학 플로팅 기능

def correlation_matrix(df):
    from matplotlib import pyplot as plt
    from matplotlib import cm as cm

    fig = plt.figure()
    ax1 = fig.add_subplot(111)
    cmap = cm.get_cmap('jet', 30)
    cax = ax1.imshow(df.corr(), interpolation="nearest", cmap=cmap)
    ax1.grid(True)
    plt.title('Abalone Feature Correlation')
    labels=['Sex','Length','Diam','Height','Whole','Shucked','Viscera','Shell','Rings',]
    ax1.set_xticklabels(labels,fontsize=6)
    ax1.set_yticklabels(labels,fontsize=6)
    # Add colorbar, make sure to specify tick locations to match desired ticklabels
    fig.colorbar(cax, ticks=[.75,.8,.85,.90,.95,1])
    plt.show()

correlation_matrix(df)

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

이것이 도움이되기를 바랍니다!


두 번째 부분은 정말 도움이되었지만 여전히 첫 번째 문제가 있으며 두 번째 부분으로 가기 전에 해결해야합니다
gdlm

데이터가 없으면 첫 번째 부분에서 원하는 것을 이해하기가 매우 어렵습니다. 질문이있는 다른 부분을 설명하기 위해 데이터를 추가 할 수 있습니까? 나는 이것이 당신이 언급 한 것에 따라 사소하게 해결되었다고 생각합니다. 당신이 가지고 있고 원하는 것의 앞뒤에 데이터 프레임의 10 행을 작성하십시오.
AN6U5

1
import numpy as np이 필요하지 않습니까?
Martin Thoma

1
을 사용하지 않는 cbar이유는 무엇입니까?
Martin Thoma

1
@Martin Thoma-당신은 numpy가 사용되지 않는 것이 맞습니다. .corr ()이 numpy 함수라고 생각했지만 팬더입니다. 컬러 바를 사용하지만 cbar에 할당 할 필요가없는 것이 맞습니다. 귀하의 의견에 따라 답변을 편집했습니다. 감사!
AN6U5

29

또 다른 대안은 seaborn에서 히트 맵 기능을 사용하여 공분산을 플롯하는 것입니다. 이 예에서는 R의 ISLR 패키지에서 자동 데이터 세트를 사용합니다 (표시 한 예와 동일).

import pandas.rpy.common as com
import seaborn as sns
%matplotlib inline

# load the R package ISLR
infert = com.importr("ISLR")

# load the Auto dataset
auto_df = com.load_data('Auto')

# calculate the correlation matrix
corr = auto_df.corr()

# plot the heatmap
sns.heatmap(corr, 
        xticklabels=corr.columns,
        yticklabels=corr.columns)

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

더 화려하고 싶다면 Pandas Style을 사용할 수 있습니다 .

cmap = cmap=sns.diverging_palette(5, 250, as_cmap=True)

def magnify():
    return [dict(selector="th",
                 props=[("font-size", "7pt")]),
            dict(selector="td",
                 props=[('padding', "0em 0em")]),
            dict(selector="th:hover",
                 props=[("font-size", "12pt")]),
            dict(selector="tr:hover td:hover",
                 props=[('max-width', '200px'),
                        ('font-size', '12pt')])
]

corr.style.background_gradient(cmap, axis=1)\
    .set_properties(**{'max-width': '80px', 'font-size': '10pt'})\
    .set_caption("Hover to magify")\
    .set_precision(2)\
    .set_table_styles(magnify())

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


처음으로 파이썬에서 R 패키지 사용을 참조하십시오. 현재 많은 R 기능을 사용할 수 있습니다. 위대한
Diansheng

0.19보다 큰 Pandas 버전에는 rpy모듈이 포함되어 있지 않습니다 . 독립형 프로젝트를 사용해야합니다 rpy2. 팬더경고를 여기에서 참조 하십시오 .
n1k31t4

7

단순히 이것을하지 않는 이유는 무엇입니까?

import seaborn as sns
import pandas as pd

data = pd.read_csv('Dataset.csv')

plt.figure(figsize=(40,40)) 
# play with the figsize until the plot is big enough to plot all the columns
# of your dataset, or the way you desire it to look like otherwise

sns.heatmap(data.corr())

매개 변수 를 사용하여 색상 팔레트 를 변경할 수 있습니다 cmap.

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