パンダとの相関行列の計算と可視化


35

いくつかのエントリを持つパンダデータフレームがあり、あるタイプの店舗の収入間の相関関係を計算したいと思います。収入データ、活動エリアの分類(劇場、衣料品店、食品など)およびその他のデータを備えた店舗が多数あります。

新しいデータフレームを作成し、同じカテゴリに属する​​すべての種類の店舗の収入を含む列を挿入しようとしましたが、返されるデータフレームには最初の列のみが入力され、残りはNaNでいっぱいです。私が疲れたコード:

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

そうしたいので、.corr()店舗のカテゴリ間の相関行列を与えるために使用できます。

その後、matplolibでマトリックス値(ピアソンの相関を使用するため、-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は不要ですよね?
マーティントーマ

1
を使用しないcbarので、なぜ割り当てるのですか?
マーティントーマ

1
@Martin Thoma-numpyが使用されていないことは正しいです。.corr()はnumpy関数だと思っていましたが、それはパンダです。私はカラーバーを使用しますが、あなたはそれをcbarに割り当てる必要がないことは正しいです。コメントに基づいて回答を編集しました。ありがとう!
-AN6U5

29

もう1つの方法は、seabornのヒートマップ関数を使用して共分散をプロットすることです。この例では、RのISLRパッケージのAutoデータセットを使用します(前の例と同じです)。

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

ここに画像の説明を入力してください


初めてPythonでRパッケージを使用する方法を参照してください。現在、多くのR関数を使用できます。素晴らしい
ians盛

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.