Python入門トップページ


相関分析をしてみよう

目次

  1. データの設定
  2. Python で相関分析

データの設定

次の表はあるスーパーマーケットの売り場面積と売上高の実績値です.ここでは,売り場面積と売上高に関する相関分析をしてみよう.

店名
売り場面積 (X)
売上高 (Y)
A2665
B2865
C2562
D2659
E2869
F3373
G3279
H2971
I3073
J2971
K3886
L4088
M3271
N2663
O3480

上のデータを NumPy 配列に格納する必要がありますが,次の3通りのどの方法でも良いでしょう.

  1. GitHub のリポジトリから直接 Pandas のデータフレームに読み込んだあと,NumPy 配列に変換します.
  2. GitHub のリポジトリからCSVファイルをダウンロードする(あるいは自身でCSVファイルを作成する).
  3. プログラムの中にデータを入力します.

まずは必要なモジュールをインポートします.

モジュールのインポート
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 高解像度ディスプレイ用
from IPython.display import set_matplotlib_formats
# from matplotlib_inline.backend_inline import set_matplotlib_formats # バージョンによってはこちらを有効に
set_matplotlib_formats('retina')

Web から直接読み込む

データは GitHub のリポジトリで公開しているので,これを Pandas のデータフレームに直接読み込みます.


url = "https://github.com/rinsaka/sample-data-sets/blob/master/store-space-sales.csv?raw=true"
df = pd.read_csv(url)
df
store-space-sales

Pandas のデータフレーム df から「space」列と「sales」列だけを取り出して NumPy 配列に変換します.

Pandas データフレームを NumPy 配列に変換
xy = df.loc[:, ['space','sales'] ].values
print(xy)
[[26 65]
 [28 65]
 [25 62]
 [26 59]
 [28 69]
 [33 73]
 [32 79]
 [29 71]
 [30 73]
 [29 71]
 [38 86]
 [40 88]
 [32 71]
 [26 63]
 [34 80]]

カレントディレクトリの CSV ファイルを読み込む

カレントディレクトリに CSV ファイルを設置した場合もほぼ同様です.


fname = "store-space-sales.csv"  # カレントディレクトリから読み込む場合
df = pd.read_csv(fname)
xy = df[['space', 'sales']].values
print(xy)
[[26 65]
 [28 65]
 [25 62]
 [26 59]
 [28 69]
 [33 73]
 [32 79]
 [29 71]
 [30 73]
 [29 71]
 [38 86]
 [40 88]
 [32 71]
 [26 63]
 [34 80]]

プログラム中にデータを入力する

小さなデータの場合は,プログラム中にデータを直接入力しても良いでしょう.


xy = np.array([[26, 65], [28, 65], [25, 62], [26, 59],
          [28, 69], [33, 73], [32, 79], [29, 71],
          [30, 73], [29, 71], [38, 86], [40, 88],
          [32, 71],[26, 63],[34, 80]])
print(xy)
[[26 65]
 [28 65]
 [25 62]
 [26 59]
 [28 69]
 [33 73]
 [32 79]
 [29 71]
 [30 73]
 [29 71]
 [38 86]
 [40 88]
 [32 71]
 [26 63]
 [34 80]]

Python で相関分析

上のいずれかの方法で xy にデータを読み込むことができたら,相関分析の前に散布図を描いてみよう.

散布図
fig, ax = plt.subplots(1, 1, figsize=(6, 4))
ax.scatter(xy[:,0], xy[:,1])
ax.set_xlabel('space')
ax.set_ylabel('sales')
ax.set_xlim(20,45)
ax.set_ylim(40,100)
plt.show()
ols-1

売り場面積 (space) と売上高 (sales) には正の相関がありそうです.相関分析は NumPy の corrcoef() 関数を用いれば良いでしょう.このとき,データ行列 xy を転置して与える必要があることに注意します.また,相関分析の結果は相関行列として得られます.

相関分析
result = np.corrcoef(xy.T)
print(result)
[[1. 0.95405962]
[0.95405962 1. ]]

あるいは,データ行列を転置せずに,rowvar = False を指定する方法もあります.


result = np.corrcoef(xy, rowvar = False)
print(result)
[[1.         0.95405962]
 [0.95405962 1.        ]]

相関係数を表示します.強い正の相関があることが確認できました.

相関係数の表示
print(f'{result[0,1]:.4f}')
0.9541

なお,3つ以上の変数間でも相関係数を求められます(4変数での例はこちらを参照).さらに,相関係数の大きさと散布図の関係はこのページが参考になるでしょう.