次の表はあるスーパーマーケットの売り場面積と売上高の実績値です.ここでは,売り場面積と売上高に関する相関分析をしてみよう.
店名 | 売り場面積 (X) | 売上高 (Y) |
---|---|---|
A | 26 | 65 |
B | 28 | 65 |
C | 25 | 62 |
D | 26 | 59 |
E | 28 | 69 |
F | 33 | 73 |
G | 32 | 79 |
H | 29 | 71 |
I | 30 | 73 |
J | 29 | 71 |
K | 38 | 86 |
L | 40 | 88 |
M | 32 | 71 |
N | 26 | 63 |
O | 34 | 80 |
上のデータを NumPy 配列に格納する必要がありますが,次の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')
データは GitHub のリポジトリで公開しているので,これを Pandas のデータフレームに直接読み込みます.
url = "https://github.com/rinsaka/sample-data-sets/blob/master/store-space-sales.csv?raw=true"
df = pd.read_csv(url)
df
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 ファイルを設置した場合もほぼ同様です.
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]]
上のいずれかの方法で 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()
売り場面積 (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変数での例はこちらを参照).さらに,相関係数の大きさと散布図の関係はこのページが参考になるでしょう.