スプレッドシート(エクセルなど)とPythonで統計分析(1) 相関係数の求め方

AI

Pythonで統計分析の勉強をするには、一度スプレッドシート (エクセルなど)で試してみると理解が早いと思います。
今回は無料で使えるGoogleスプレッドシートで説明します。

スポンサーリンク

相関分析

データの準備

用意したデータはある店舗のある月の20代男性の来店人数とA社ミントタブレット購入数です。

(注)データは架空の数字です。

 データの開閉はここをclick

人数 販売数
1日 74 16
2日 67 11
3日 78 16
4日 58 18
5日 91 13
6日 48 7
7日 55 10
8日 71 14
9日 96 16
10日 81 19
11日 88 21
12日 112 28
13日 79 12
14日 62 14
15日 78 16
16日 87 20
17日 125 24
18日 99 19
19日 87 17
20日 78 14
21日 89 12
22日 71 15
23日 76 18
24日 97 24
25日 132 28
26日 105 24
27日 94 22
28日 78 12
29日 98 21
30日 135 31

散布図の作成

2種類のデータの相関関係をみるには、散布図を作ります。
Googleスプレッドシートでの散布図の作り方の手順は次の通りです。

  1. 2種類のデータの項目を含めて全て選択します。
  2. メニューの「挿入」から「グラフ」を選択、またはツールバーのグラフのアイコンをクリック
  3. グラフエディッタで散布図を選択
  4. グラフのサイズが正方形になるように調整する
  5. トレンド線を引くにはグラフエディッタのカスタムタブを選択して、系列の中のトレンドラインにチェックを入れる

相関関係と因果関係

相関関係

相関は2つの量の直線的な関係であり、その関係の原因については考慮されていません。
2種類の観測値について、一方の値が大きくなるともう一方の値も大きくなる傾向があるとき、つまり散布図で右上がりの傾向があるとき、正の相関があるといいます。
また一方の値が大きくなるとともに、もう一方の値が小さくなる傾向があるとき、つまり散布図で右下がりの傾向があるとき負の相関があるといいます。
相関関係の具体例

  • 交番の数が多い地域ほど、犯罪件数も多い
  • 猫が顔を洗うと雨が降る
  • 趣味が盆栽という人ほど、お金持ちである
  • ネットが普及するにつれ、地球温暖化が進む
因果関係

ある事象Aが原因となり、その結果として事象Bが発生するとき事象Aと事象Bが因果関係にあるといいます。
因果関係があれば相関関係があるが、相関関係があっても因果関係があるとは限らないことに注意する必要があります。

  • インフルエンザの予防接種をすると、インフルエンザにかかる確率が減る
  • 道路に水をまくと周辺の気温が下がる
  • 人口が増えると商店数が増える

相関係数の求め方

相関係数とはある2つのデータの関連性の強さを図る指標です。
そ値は-1〜1の間の値となります。

スプレッドシートで相関係数を求めるにはCORREL関数を使います。
CORREL関数はデータセットに対するピアソンの積率相関係数 r を計算するものです。

CORREL(データ_y, データ_x)
データ_y – 依存データの配列または行列を表す範囲
データ_x – 独立データの配列または行列を表す範囲

スプレッドシートでCORREL関数を使う方法

ツールバーのシグマのアイコンから統計を選択してCORREL関数を選択します。
データyとデータxに適当なデータ範囲を選択します。

相関係数の目安

相関係数 目安
〜0.3未満 ほぼ無相関
03〜0.5未満 非常に弱い相関
05〜0.7未満 相関がある
07〜0.9未満 強い相関
09以上 非常に強い相関

相関係数の数学的求め方

相関係数は-1〜+1の間の値をとり±1に近くほど、二つの値の間に関連が見られます。
ただし、相関関係は因果関係を証明するものではないので注意してください。
相関係数の数学公式は次の通りです。シグマ記号が出てくると難しく感じますが、プログラム的には単なるループ文です。
分散を求めるには、それぞれの数値と平均値の差の二乗平均で求められます。

相関係数の公式
$$ \displaystyle
r = \frac{S_{xy}}{S_x \times S_y} = \frac{\frac{1}{n}\displaystyle \sum_{i=1}^n (x_i – \overline{x})(y_i – \overline{y})}{ \sqrt{\frac{1}{n}\displaystyle \sum_{i=1}^n (y_i – \overline{y})^2} \times \sqrt{\frac{1}{n}\displaystyle \sum_{i=1}^n (x_i – \overline{x})^2}}
$$
各記号の意味
記号 意味
$$ r $$ x,yの相関係数
$$S_{xy}$$ x, yの共分散
$$ S_x $$ xの標準偏差
$$ S_y $$ yの標準偏差
$$ n $$ データの総数
$$ (x_i,y_i) $$ i番目のデータ値
$$ \overline{x} $$ xの平均
$$ \overline{y} $$ yの平均
標準偏差について

標準偏差とは、データのばらつきの大きさを表わす指標です。
標準偏差を求めるには、分散(それぞれの数値と平均値の差の二乗平均)の正の平方根を取ります。 データが平均値の周りに集中していれば標準偏差は小さくなり、逆に平均値から広がっていれば標準偏差は大きくなります。

標準偏差の公式
$$ \displaystyle
S = \sqrt{\frac{1}{n}\displaystyle \sum_{i=1}^n (y_i – \overline{y})^2}
$$

Pythonで相関係数を求める

Pythonで相関係数を求めるには、「numpy」,「pandas」のライブラリが必要になります。また、散布図を描くには「matplotlib」が必要です。
プログラムを書く時には、まずこの3つのライブラリをインポートしておきます。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

データの読み込みはpandasを使うと簡単な1文で済みます。

# CSVファイル読み込み
df = pd.read_csv('pos1.csv')

読み込んだデータの記述を確認するには以下のように5件だけ確認をしてみます。

# 5件だけ表示
df.head(5)

結果

必要なデータの抽出は次のようにします。

# データの抽出
x = df['20代男性人数']
y = df['ミントタブレット購入数']

散布図の描画は次のとおりです。

# 散布図作成 横軸x,縦軸y
plt.scatter(x,y)
plt.show()

結果

相関係数は次の関数で算出します。

# 相関係数
correlation = np.corrcoef(x, y)
print(correlation[0,1])

結果
0.8474945433388763

スプレッドシートで求めた値と同じです。

要約統計量

「describe()」を使うと、各列ごとに平均や標準偏差、最大値、最小値、最頻値などの要約統計量を取得できます。
基本統計データーをサクッと確認できる優れものです。

# describe出力
df.describe()

結果

項目名 意味
count そのカラムの件数
mean 平均
std 標準偏差
min 最小値
25% 第一四分位数
50% 第二四分位数
75% 第三四分位数
max 最大値
タイトルとURLをコピーしました