- 目次
- 理解
- 表計算
- コード
【理解】データの関連の数学的解説
データの相関について
相関の定義
定義(相関)
2変量のデータについて, 散布図を描いたとき直線的な傾向があるときに相関があるという.
散布図において, 直線的な傾向がみられないとき無相関(相関がない)という.
定義(相関の正負)
散布図で右上がりの直線的な傾向がみられるとき正の相関といい, 右下がりの直線的な傾向がみられるとき負の相関という.
たとえば, 下の図において, 左側にある程, 正の相関が強く, 右にあるほど負の相関が強い.

$\displaystyle s_{xy}= \frac{(x_1 - \bar{x})(y_1-\bar{y})+\cdots + (x_n - \bar{x})(y_n-\bar{y})}{n}$(共分散)
定義(共分散)
2変量のデータ $x=[x_1, \ldots , x_n]$ と $y=[y_1, \ldots, y_n]$ について,
$s_{xy}$ $\displaystyle = \frac{(x_1 - \bar{x})(y_1-\bar{y})+\cdots + (x_n - \bar{x})(y_n-\bar{y})}{n}$
$\displaystyle = \frac{1}{n} \sum_{k=1}^n (x_k - \bar{x})(y_k-\bar{y})$
を共分散という. ここで, $\bar{x}$ は $\bar{y}$ はそれぞれ $x$ と $y$ の平均値である.
たとえば,
$x=[1, 2, 3]$,
$y=[2,4,6]$
のとき, 共分散は $\frac{4}{3}$ です。
$z=[-2,-4,-6]$ のとき, $x$ と $z$ の共分散は $-\frac{4}{3}$ です。
$\displaystyle r = \frac{s_{xy}}{s_x s_y}$(相関係数)
定義(相関係数)
2変量のデータ $x=[x_1, \ldots , x_n]$ と $y=[y_1, \ldots, y_n]$ について,
$\displaystyle r = \frac{s_{xy}}{s_x s_y}$
を相関係数という. ここで, $s_{xy}$ は $x$ と $y$ の共分散, $s_x$ と $s_y$ はそれぞれの標準偏差である.
たとえば,
$x=[1, 2, 3]$,
$y=[2,4,6]$
のとき, 相関係数は $1$ です。
$z=[-2,-4,-6]$ のとき, $x$ と $z$ の相関係数は $-1$ です。
$\displaystyle s_{x'y'} = acs_{xy}$
※ $x'=ax+b$ と $y'=cy+d$ による共分散の変化
データ $x$ と $y$ のそれぞれの各値を $x'=ax+b$, $y'=cy+d$ によって変換したあとのデータの共分散 $s_{x'y'}$ が $acs_{xy}$ であることを示してみよう。
性質
データ $x=[x_1, x_2, \cdots, x_n]$ と $y=[y_1, y_2, \cdots, y_n]$ について, 共分散を $s_{xy}$ とする.
データ $x$ の各値 $x_k$ $(1 \leq k \leq n)$ を $x_k'=ax_k + b$ と変換したあとのデータを $x'$ とする. また, データ $y$ の各値 $y_k$ $(1 \leq k \leq n)$ を $y_k'=cy_k + d$ と変換したあとのデータを $y'$ とする.
データ $x'$ と $y'$ の共分散を $s_{x'y'}$ とする.
このとき, $s_{x'y'}=acs_{xy}$ が成り立つ.
証明.
$x$ と $y$ の平均値を $\bar{x}$ と $\bar{y}$ とする.
$\bar{x'} = a\bar{x} + b$
$\bar{y'} = c\bar{y} + d$
データ $x$ と $y$ の共分散の定義式を計算するために $x_k'$ と $y_k'$ の偏差を求めると,
$x_k'-\bar{x'}$ $=(ax_k+b)-(a\bar{x}+b)$ $=a(x_k-\bar{x})$
$y_k'-\bar{y'}$ $=(cy_k+d)-(c\bar{y}+d)$ $=c(y_k-\bar{y})$
である.
$s_{x'y'}$
$\displaystyle =\frac{(x_1'-\bar{x'})(y_1'-\bar{y'}) + \cdots + (x_n'-\bar{x'})(y_n'-\bar{y'})}{n}$
$\displaystyle =\frac{ac(x_1-\bar{x})(y_1-\bar{y}) + \cdots + ac(x_n-\bar{x})(y_n-\bar{y})}{n}$
$\displaystyle =ac\frac{(x_1-\bar{x})(y_1-\bar{y}) + \cdots + (x_n-\bar{x})(y_n-\bar{y})}{n}$
$=acs_{xy}$.
ゆえに, $s_{x'y'}=acs_{xy}$ が得られた.
たとえば,
$x=[1, 2, 3]$
のとき, $y=2x+1$ と変形すると,
$x'=[3, 5, 7]$
になります。
$y=[2, 4, 6]$
のとき, $y'=-x+2$ と変形すると,
$y'=[0, -2, -4]$
になります。
$\displaystyle s_{xy}=\frac{4}{3}$,
$\displaystyle s_{x'y'}=-\frac{8}{3}$
なので,
$s_{x'y'}=2 \cdot (-1) \cdot s_{xy}$
が成り立っています。
$\displaystyle r_{x'y'} = \frac{acs_{xy}}{|ac|s_x s_y}$
※ $x'=ax+b$ と $y'=cy+d$ による相関係数の変化
データ $x$ と $y$ のそれぞれの各値を $x'=ax+b$, $y'=cy+d$ によって変換したあとのデータの相関係数 $r_{x'y'}$ が $\displaystyle \frac{ac}{|ac|}r_{xy}$ であることを示してみよう。
性質
データ $x=[x_1, x_2, \cdots, x_n]$ と $y=[y_1, y_2, \cdots, y_n]$ について, 相関係数を $r_{xy}$ とする.
データ $x$ の各値 $x_k$ $(1 \leq k \leq n)$ を $x_k'=ax_k + b$ と変換したあとのデータを $x'$ とする. また, データ $y$ の各値 $y_k$ $(1 \leq k \leq n)$ を $y_k'=cy_k + d$ と変換したあとのデータを $y'$ とする.
データ $x'$ と $y'$ の相関係数を $r_{x'y'}$ とする.
このとき, $r_{x'y'}=\displaystyle \frac{ac}{|ac|}r_{xy}$ が成り立つ.
証明.
データ $x$ と $y$ について, $x'=ax+b$ と $y'=cx'+d$ による標準偏差 $s_x$ と $s_y$, 共分散 $s_{xy}$ の変換は
$s_{x'} = |a|s_x$
$s_{y'} = |c|s_y$
$s_{x'y'} = acs_{xy}$
であった. 相関係数 $r_{x'y'}$ の定義式を計算すると,
$r_{x'y'}$
$=\displaystyle \frac{s_{x'y'}}{s_{x'}s_{y'}}$
$=\displaystyle \frac{acs_{xy}}{|a|s_{x} \times |c|s_{y}}$
$\displaystyle =\frac{ac}{|ac|}r_{xy}$
となる.
ゆえに, $r_{x'y'}=\displaystyle \frac{ac}{|ac|}r_{xy}$ が成り立つ.
たとえば,
$x=[1, 2, 3]$
のとき, $y=2x+1$ と変形すると,
$x'=[3, 5, 7]$
になります。
$y=[2, 4, 6]$
のとき, $y'=-x+2$ と変形すると,
$y'=[0, -2, -4]$
になります。
$\displaystyle r_{x'y'}=-1$,
$\displaystyle r_{xy}=1$
なので,
$\displaystyle r_{x'y'}=\frac{2 \cdot (-1)}{|2| \cdot |-1|} r_{xy}$
が成り立っています。
相関係数から統計的結果を導く基準(目安例)
相関係数 $r$ から統計的結果を導く一つの目安として,
- $|r| \leqq 0.2$ $\leftrightarrow$ 相関なし
- $0.2 \leqq |r| \leqq 0.4$ $\leftrightarrow$ 弱い相関
- $0.4 \leqq |r| \leqq 0.7$ $\leftrightarrow$ (中程度の)相関
- $0.7 \leqq |r|$ $\leftrightarrow$ 強い相関
- $|r|=1$ $\leftrightarrow$ 完全な比例関係(強い相関)
がある。ただし, あくまでも一つの目安であり決まっている訳ではない。
散布図上に直線的な傾向があることが相関の前提である。
アンスコムの数値例 $r=0.816$
ヒストグラムの形状と特徴

| 観測値/統計量 | I_x | I_y | II_x | II_y | III_x | III_y | IV_x | IV_y |
|---|---|---|---|---|---|---|---|---|
| 1 | 10 | 8.04 | 10 | 9.14 | 10 | 7.46 | 8 | 6.58 |
| 2 | 8 | 6.95 | 8 | 8.14 | 8 | 6.77 | 8 | 5.76 |
| 3 | 13 | 7.58 | 13 | 8.74 | 13 | 12.74 | 8 | 7.71 |
| 4 | 9 | 8.81 | 9 | 8.77 | 9 | 7.11 | 8 | 8.84 |
| 5 | 11 | 8.33 | 11 | 9.26 | 11 | 7.81 | 8 | 8.47 |
| 6 | 14 | 9.96 | 14 | 8.10 | 14 | 8.84 | 8 | 7.04 |
| 7 | 6 | 7.24 | 6 | 6.13 | 6 | 6.08 | 8 | 5.25 |
| 8 | 4 | 4.26 | 4 | 3.10 | 4 | 5.39 | 19 | 12.50 |
| 9 | 12 | 10.84 | 12 | 9.13 | 12 | 8.15 | 8 | 5.56 |
| 10 | 7 | 4.82 | 7 | 7.26 | 7 | 6.42 | 8 | 7.91 |
| 11 | 5 | 5.68 | 5 | 4.74 | 5 | 5.73 | 8 | 6.89 |
| 平均 | 9.0 | 7.50 | 9.0 | 7.50 | 9.0 | 7.50 | 9.0 | 7.50 |
| 分散 | 11.0 | 4.12 | 11.0 | 4.12 | 11.0 | 4.12 | 11.0 | 4.12 |
| 相関係数 | 0.816 | 0.816 | 0.816 | 0.816 | 0.816 | 0.816 | 0.816 | 0.816 |
$r=\cos \theta$
相関係数 $r$ が, データから定義される2つのベクトルのなす角 $\theta$ に関する $\cos \theta$ であることを理解してみよう。
命題
2つの変量
$x=[x_1, \ldots, x_n]$
$y=[y_1, \ldots, y_n]$
について, $\bar{x}$ と $\bar{y}$ をそれぞれの平均値とし, また $x$ と $y$ の相関係数を $r$ とする.
2本のベクトル
$\vec{x}=(x_1 - \bar{x}, \ldots, x_n - \bar{x})$
$\vec{y}=(y_1 - \bar{y}, \ldots, y_n - \bar{y})$
を定義し, $\vec{x}$ と $\vec{y}$ のなす角度を $\theta$ とする.
このとき,
$r = \cos \theta$
が成り立つ.
※ $n$ 次元ベクトル $\vec{a}$ と $\vec{b}$ の内積を $\vec{a} \cdot \vec{b}=|\vec{a}| |\vec{b}|\cos \theta$ と定める.
証明.
内積の定義より
$\displaystyle \cos \theta =\frac{\vec{x} \cdot \vec{y}}{|\vec{x}| |\vec{y}|} =\frac{\displaystyle \frac{1}{n} \vec{x} \cdot \vec{y}}{\displaystyle \frac{1}{\sqrt{n}}|\vec{x}| \times \frac{1}{\sqrt{n}}|\vec{y}|}$
である.
この式の分子はデータ $x$ と $y$ の共分散を表す.
$\displaystyle \displaystyle \frac{1}{n} \vec{x} \cdot \vec{y}$ $\displaystyle =\frac{(x_1-\bar{x})(y_1-\bar{y})+\cdots + (x_n-\bar{x})(y_n-\bar{y})}{n}$
この式の分母はデータ $x$ と $y$ のそれぞれの標準偏差を表す.
$\displaystyle \frac{1}{\sqrt{n}} |\vec{x}|$ $\displaystyle =\sqrt{\frac{(x_1-\bar{x})^2+\cdots + (x_n-\bar{x})^2}{n}}$
$\displaystyle \frac{1}{\sqrt{n}} |\vec{y}|$ $\displaystyle =\sqrt{\frac{(y_1-\bar{y})^2+\cdots + (y_n-\bar{y})^2}{n}}$
共分散をそれぞれの標準偏差で割ったものが相関係数であった.
ゆえに, データ $x$ と $y$ について,
$r =\cos \theta$
が成立する.
例えば,
$x$ $=[1,3,2]$
$y$ $=[1,2,3]$
ならば,
$\vec{x}$ $=(-1,1,0)$
$\vec{y}$ $=(-1,0,1)$
です。
これらのベクトルの成す角度は $\displaystyle \frac{\pi}{3}$ で, 実際に相関係数は
$\displaystyle r = \cos \frac{\pi}{3}$ $= 0.5$
です。
データの連関について
単純集計とクロス集計
1つの変数について, データを集計する方法を単純集計という。
| 賛成者 | |
| A案 | $10$ |
| B案 | $5$ |
| C案 | $3$ |
| 計 | $18$ |
2つ以上の変数の関係をふまえ, データを同時に集計する方法をクロス集計表という。
| 賛成 | 反対 | 計 | |
| A案 | $5$ | $6$ | $11$ |
| B案 | $3$ | $4$ | $7$ |
| 計 | $8$ | $10$ | $18$ |
$\displaystyle Q = \frac{ad-bc}{ad+bc}$(YuleのQ)
| ア | イ | 計 | |
| A | $a$ | $b$ | $W=a+b$ |
| B | $c$ | $d$ | $X=c+d$ |
| 計 | $Y=a+c$ | $Z=b+d$ | $a+b+c+d$ |
2×2のクロス集計表ではYuleのQは,
$\displaystyle Q = \frac{ad-bc}{ad+bc}$
と定義する。
$-1 \leq Q \leq 1$ である。
オッズ比(準備中)
$\displaystyle \phi=\frac{ad-bc}{\sqrt{W\cdot X \cdot Y \cdot Z}}$(Φ係数)
| ア | イ | 計 | |
| A | $a$ | $b$ | $W=a+b$ |
| B | $c$ | $d$ | $X=c+d$ |
| 計 | $Y=a+c$ | $Z=b+d$ | $a+b+c+d$ |
2×2のクロス集計表ではΦ係数の $\phi$ は,
$\displaystyle \phi = \frac{ad-bc}{\sqrt{W\cdot X \cdot Y \cdot Z}}$
と定義する。
$-1 \leq \phi \leq 1$ である。
YuleのQやΦ係数から統計的結果を導く基準(目安例)
YuleのQやΦ係数 $\phi$ から統計的結果を導く一つの目安として,
- $Q, \phi =0$ $\leftrightarrow$ 独立
- $0< Q, \phi \leqq 0.5$ $\leftrightarrow$ 連関なし
- $0.5 \leqq Q, \phi \leqq 0.75$ $\leftrightarrow$ (中程度の)連関
- $0.75 \leqq |r|$ $\leftrightarrow$ 強い連関
- $Q, \phi=1$ $\leftrightarrow$ 完全に偏ったクロス集計表(強い相関)
がある。ただし, あくまでも一つの目安であり決まっている訳ではない。
因果関係について
因果関係との関係
【表計算】Excel・スプレッドシートでデータの関連を計算
散布図の作成
表計算ソフト(Excelなど)で散布図を作ってみよう。
※作業環境はGoogleスプレッドシートです。
作業手順
次のステップでレーダーチャートを作成する。
(1) データの範囲を指定する。
(2)【挿入】から【グラフ】を選択する。
(3)【設定】の【散布図】を選択する。
(4)【カスタマイズ】でグラフを調整する。
★完成イメージ

手順.
(1) 次のデータを利用します。このデータの範囲を指定します。今回は、B列とC列のみを指定しました。

(2) 【挿入】から【グラフ】を選択します。

(3) 【設定】の【散布図】を選択します。

(4) 必要に応じて【カスタマイズ】でグラフを調整すると「★完成イメージ」の散布図ができます。
相関係数CORREL()
CORREL関数
データの相関係数を表計算で計算する場合、CORREL(データ範囲1, データ範囲2)
を利用する。
・データ範囲1, 2…データのセル範囲を指定。
例えば、[A1]:1, [A2] :2, [A3]:3, [B1]:2, [A2] :4, [A3]:6の場合、「=CORREL(A1:A3, B1:B3)」と入力すると1.0が出力されます。
クロス集計表の作成【ピボットテーブル】
表計算ソフト(Excelなど)でピボットテーブルを利用してクロス集計表を作ってみよう。
※作業環境はGoogleスプレッドシートです。
作業手順
次のステップでクロス集計表を作成する。
(1) データの範囲を指定する。
(2)【挿入】から【ピボットテーブル】を選択する。
(3)【ピボットテーブルの作成】で「新しいシート」か「既存のシート」のいずれかに作成するかを選択する。
(4)【ピボットテーブルエディタ】で【行】 【列】 【値】 【フィルタ】に集計する項目を入れる。
★完成イメージ

手順.
(1) 次のデータを利用します。このデータの範囲を指定します。今回は、A1~E10全体を指定しました。

(2) 【挿入】から【ピボットテーブル】を選択します。

(3) 【ピボットテーブルの作成】で「新しいシート」か「既存のシート」のいずれかに作成するかを選択します。

今回は、「既存のシート」を選択して、A12にピボットテーブルを作成します。

(4) 【ピボットテーブルエディタ】で【行】 【列】 【値】 【フィルタ】に集計する項目を入れます。

今回は右にある「商品名」を【行】にドラッグ、「店舗名」を【列】にドラッグ、「売上金額(円)」を【値】にドラッグしました。

【値】の【集計】の項目をSUMにすれば合計値を出力できます。また、AVERAGE等ほかのものにすれば他の値を出力できます。
【フィルタ】に項目をドラッグすれば、フィルタに入力した項目別に集計をすることができます。
【コード】Pythonでデータの関連を計算
散布図の作成scatter()
2変量のデータから散布図をPythonで出力してみよう。
Pythonコード
matplotlib.pyplotのscatter()関数を利用して, 散布図を出力する。
scatter()の引数には, 散布図にする2つのデータを入力する。
入力例. heightとweight のデータから散布図を表示する。
import matplotlib.pyplot as plt
import japanize_matplotlib
# データ
height = [150, 152, 155, 157, 158, 160, 161, 162, 163, 164,
165, 166, 167, 168, 169, 170, 171, 172, 173, 174,
175, 176, 177, 178, 179, 180, 181, 182, 183, 185]
weight = [45, 47, 48, 50, 51, 53, 54, 55, 55, 56,
57, 58, 59, 60, 61, 62, 63, 64, 64, 65,
66, 67, 68, 69, 70, 71, 72, 73, 74, 75]
# 散布図の描画
plt.scatter(height, weight, color="skyblue")
plt.title("身長と体重の関係")
plt.xlabel("身長 (cm)")
plt.ylabel("体重 (kg)")
plt.grid(True)
plt.show()
※matplotlibで日本語を利用する場合japanize_matplotlibを使う。必要であれば、次を行い事前にインストールしておく。
pip install japanize-matplotlib相関係数(行列)corrcoef()
Pythonコード
numpyモジュールのcorrcoef()関数を利用し, 相関係数(行列)を出力する。
corrcoef(x,y)として, xとyにデータを指定する。xとx, xとy, yとx, yとyの相関係数を並べた行列が出力される。
相関係数のみ出力する場合, corrcoef(x,y)[1,0]などと表記し, 行列の $(1, 0)$ 成分のみを出力する。
3変量以上の相関係数行列を出力する場合は, 各リスト(データ)をnumpy.array()でndarray型に変換しcorrcoef()を利用する。
入力例①. [1, 2, 3, 4, 5]と[4, 4, 7, 10, 12]のデータの相関係数行列と相関係数を出力する。
import numpy as np
x = [1, 2, 3, 4, 5]
y = [4, 4, 7, 10, 12]
print(np.corrcoef(x, y))
print(np.corrcoef(x, y)[1,0])
入力例②. [1, 2, 3, 4, 5]と[4, 4, 7, 10, 12], [-3, 0, -3, -4, -4]のデータの相関係数行列を出力する。
import numpy as np
x = [1, 2, 3, 4, 5]
y = [4, 4, 7, 10, 12]
z = [-3, 0, -3, -4, -4]
data = np.array([x, y, z])
corr_matrix = np.corrcoef(data)
print(corr_matrix)


