次の表はあるスーパーマーケットの売り場面積と売上高の実績値である.ここでは,売り場面積と売上高に関する相関分析をしてみよう.
店名 | 売り場面積 (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(result[0,1].round(3))
0.954
なお,3 つ以上の変数間でも相関係数を求められる(4変数での例はこちらを参照).さらに,相関係数の大きさと散布図の関係はこのページが参考になるでしょう.