- 目次
- 理解
- 表計算
- コード
【理解】データの関連の数学的解説
データの相関について
相関の定義
定義(相関)
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)
