kakakakakku blog

Weekly Tech Blog: Keep on Learning!

Pandas で相関件数を計算して Seaborn で可視化する

Pandascorr() 関数を使うと DataFrame Series「相関係数 (correlation coefficient)」を計算できる.今回は DataFramecorr() 関数と Seaborn を使った可視化を試す.

相関係数 (correlation coefficient) 📊

まず「相関係数」とは「2種類のデータ (x, y) の線形的な関係性を表現する指標」で,値は -1 ~ 1 の範囲となる.大きく3種類あり「正の相関(x が増えると y が増える)」「負の相関(x が増えると y が減る)」「無相関」がある.相関係数が 1 に近いほど「正の相関」で,-1 に近いほど「負の相関」になる.例えば「勉強時間 x が長いと学力 y が高い」など💡

データセット 📊

今回の検証では,GitHub リポジトリ chendaniely/pandas_for_everyone に含まれているデータセット housing.csv を使う.これは「住宅情報をまとめたデータセット(コンドミニアム🏢)」となり,今回は以下の「3カラム」に限定して関係性を見ていく.

  • Total.Units : 部屋数
  • Year.Built : 建設年
  • Full.Market.Value : 市場価値
housing = pd.read_csv('./housing.csv').loc[:, ['Total.Units', 'Year.Built', 'Full.Market.Value']]
housing

f:id:kakku22:20210423235309p:plain

よって,今回は以下の組み合わせで「相関係数」を計算する.

  • Total.UnitsYear.Built(部屋数と建設年には相関はある?)
  • Total.UnitsFull.Market.Value(部屋数と市場価値には相関はある?)
  • Year.BuiltFull.Market.Value(建設年と市場価値には相関はある?)

ペアプロット図(散布図行列)📊

まず DataFrame の関係性を「ペアプロット図(散布図行列)」で可視化する.Seabornpairplot() 関数を使えば簡単に描画できる.散布図をザッと見ると Total.UnitsFull.Market.Value には緩やかな「正の相関」があるように見える.そして Total.UnitsYear.BuiltYear.BuiltFull.Market.Value「無相関」のように見える.

figure = sns.pairplot(housing, plot_kws = {'alpha': 0.5})
figure.fig.set_figheight(10)
figure.fig.set_figwidth(10)

f:id:kakku22:20210423222703p:plain

なお「散布図」PandasDataFrame.plot.scatter() 関数や plotting.scatter_matrix() 関数を使って描画することもできるけど,今回は「Pandas ライブラリ活用入門」にも載っていた Seaborn を試したくて使った.

相関係数 : corr() 関数 📊

次に Pandascorr() 関数を使って相関係数を計算する.散布図を見て判断した通り,Total.UnitsFull.Market.Value の相関係数は 0.661639 となり,ある程度「正の相関」があると確認できる.

corr = housing.corr()
corr

f:id:kakku22:20210423224136p:plain

相関係数とヒートマップ 📊

最後は corr() 関数を使って計算した相関係数をヒートマップで可視化する.Seabornheatmap() 関数を使えば簡単に描画できる.色は設定で変えられるけど,今回の設定だと「正の相関」だと赤くなり「無相関」だと黒くなる.もっとカラム(特徴量)が多くても関係性を見極めることができそう.

sns.heatmap(corr, vmax=1, vmin=-1, center=0)

f:id:kakku22:20210423224233p:plain

まとめ 📊

Pandascorr() 関数を使って「相関係数 (correlation coefficient)」を計算して,Seabornheatmap() 関数を使って可視化した.「相関係数」に関しては,最近並行して読んでいる「Python によるあたらしいデータ分析の教科書」にも載っていた.正確には「ピアソンの積率相関係数」「スピアマンの順位相関係数」「ケンドールの順位相関係数」という指標があり,corr() 関数は method パラメータでそれぞれの指標をサポートしていることも確認できた.

df.corr(method='pearson')
df.corr(method='kendall')
df.corr(method='spearman')