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(result[0,1].round(3))
0.954

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