pandas.DataFrameの各列間の相関係数を算出、ヒートマップで可視化

pandas.DataFrameの各列の間の相関係数を算出するにはcorr()メソッドを使います。

pandas.DataFrame.corr — pandas 0.22.0 documentation

ここでは、以下の内容について説明します。

pandas.DataFrame.corr()の基本的な使い方 データ型が数値型・ブール型の列が計算対象 欠損値NaNは除外されて算出

相関係数の算出方法の指定: 引数method 相関係数をヒートマップで可視化: seaborn

以下のpandas.DataFrameを例とします。

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

df = pd.DataFrame({'A': range(5),
                   'B': [x**2 for x in range(5)],
                   'C': [x**3 for x in range(5)]})

print(df)
#    A   B   C
# 0  0   0   0
# 1  1   1   1
# 2  2   4   8
# 3  3   9  27
# 4  4  16  64

pandas.DataFrame.corr()の基本的な使い方

pandas.DataFrameオブジェクトからcorr()メソッドを呼ぶと、各列の間の相関係数が算出される。 結果はpandas.DataFrameで返る。

df_corr = df.corr()
print(df_corr)
print(type(df_corr))
#           A         B         C
# A  1.000000  0.958927  0.905882
# B  0.958927  1.000000  0.987130
# C  0.905882  0.987130  1.000000
# <class 'pandas.core.frame.DataFrame'>

データ型が数値型・ブール型の列が計算対象

説明のため文字列とブールの列を追加します。

df['D'] = list('abcde')
df['E'] = [True, False, True, True, False]
print(df)
#    A   B   C  D      E
# 0  0   0   0  a   True
# 1  1   1   1  b  False
# 2  2   4   8  c   True
# 3  3   9  27  d   True
# 4  4  16  64  e  False

print(df.dtypes)
# A     int64
# B     int64
# C     int64
# D    object
# E      bool
# dtype: object

corr()メソッドではデータ型がobject(文字列)の列は除外され、数値(int, float)型およびbool型の列の間の相関係数が算出される。 bool型はTrueが1、Falseが0とみなされる。

df_corr = df.corr()
print(df_corr)
#           A         B         C         E
# A  1.000000  0.958927  0.905882 -0.288675
# B  0.958927  1.000000  0.987130 -0.346023
# C  0.905882  0.987130  1.000000 -0.424522
# E -0.288675 -0.346023 -0.424522  1.000000

欠損値NaNは除外されて算出

説明のため欠損値Nanを含むpandas.DataFrameオブジェクトを用意します。

df_nan = df.copy()
df_nan.iloc[[2, 3, 4], 1] = np.nan
print(df_nan)
#    A    B   C  D      E
# 0  0  0.0   0  a   True
# 1  1  1.0   1  b  False
# 2  2  NaN   8  c   True
# 3  3  NaN  27  d   True
# 4  4  NaN  64  e  False

corr()メソッドでは欠損値NaNは除外されて相関係数が算出される。

df_nan_corr = df_nan.corr()
print(df_nan_corr)
#           A    B         C         E
# A  1.000000  1.0  0.905882 -0.288675
# B  1.000000  1.0  1.000000 -1.000000
# C  0.905882  1.0  1.000000 -0.424522
# E -0.288675 -1.0 -0.424522  1.000000

相関係数の算出方法の指定: 引数method

corr()メソッドでは引数methodで相関係数の算出方法を指定できます。 以下の3種類から選択します。

'pearson': ピアソンの積率相関係数(デフォルト) 'kendall': ケンドールの順位相関係数 'spearman': スピアマンの順位相関係数

相関係数をヒートマップで可視化: seaborn

Pythonのビジュアライゼーションライブラリseabornを使うと、corr()で得られるようなpandas.DataFrameをヒートマップとして簡単に可視化できます。 seaborn.heatmap()関数を使います。引数などの詳細は以下の記事を参照。

sns.heatmap(df_corr, vmax=1, vmin=-1, center=0) plt.savefig('data/dst/seaborn_heatmap_corr_example.png')

具体的な例として、Kaggleの住宅価格を推定する問題のトレーニングデータから相関係数を算出しヒートマップで可視化してみます。

House Prices: Advanced Regression Techniques | Kaggle

データのcsvファイルはこちらにも置いてあります。

house_prices_train.csv

元のデータは多数の列(特徴量)を持っているが、上述のように、corr()メソッドではデータ型dtypeがobjectの列は除外される。

df_house = pd.read_csv('data/src/house_prices_train.csv', index_col=0)

print(df_house.shape)
# (1460, 80)

print(df_house.dtypes.value_counts())
# object     43
# int64      34
# float64     3
# dtype: int64

df_house_corr = df_house.corr()

print(df_house_corr.shape)
# (37, 37)

seaborn.heatmap()関数で可視化。

fig, ax = plt.subplots(figsize=(12, 9))
sns.heatmap(df_house_corr, square=True, vmax=1, vmin=-1, center=0)
plt.savefig('data/dst/seaborn_heatmap_house_price.png')

本来は欠損値NaNの補完や文字列(object型)のカテゴリー変数の数値化などの処理を行う必要があり、データをそのまま読み込んで使うのは乱暴ではあるが、機械学習の前処理段階などで各変数の関係性をとりあえずざっくり確認するのに非常に便利。

シェア

関連カテゴリー

Python pandas seaborn 機械学習

Python, pandas, seabornでヒートマップを作成 pandasでカテゴリ変数をダミー変数に変換(get_dummies) Python, pandas, seabornでペアプロット図(散布図行列)を作成 pandasのplotメソッドでグラフを作成しデータを可視化 『Python Data Science Handbook』(英語の無料オンライン版あり) pandasの行・列をランダムサンプリング(抽出)するsample pandas.DataFrameをGroupByでグルーピングし統計量を算出 pandasのバージョンを確認(pd.show_versions) pandasで時系列データの曜日や月、四半期、年ごとの合計や平均を算出 KerasでMNISTを分類(ソフトマックス編) pandasでデータを行・列(縦・横)方向にずらすshift pandasのcut, qcut関数でビニング処理(ビン分割) pandasでstack, unstack, pivotを使ってデータを整形 TensorFlowの定数、変数、プレースホルダーの使い方 pandasのMultiindexの指定・追加・解除・ソート・レベル変更

Last Updated: 6/26/2019, 10:34:03 PM