【Multivariate Data】 Scatter Plots and Correlation Coefficients

確率・統計学

This article is available in: 日本語

Introduction

In the previous issue, we discussed how to handle the most basic univariate data.

This article discusses scatter plots and scatter matrix as basic ways to handle multivariate data, and correlation coefficient, rank correlation coefficient, and variance-covariance matrix as summarization methods.

The program used is described in python and it can be tried in Google Colab below.

Google Colaboratory

\begin{align*}
\newcommand{\mat}[1]{\begin{pmatrix} #1 \end{pmatrix}}
\newcommand{\f}[2]{\frac{#1}{#2}}
\newcommand{\pd}[2]{\frac{\partial #1}{\partial #2}}
\newcommand{\d}[2]{\frac{{\rm d}#1}{{\rm d}#2}}
\newcommand{\T}{\mathsf{T}}
\newcommand{\(}{\left(}
\newcommand{\)}{\right)}
\newcommand{\{}{\left\{}
\newcommand{\}}{\right\}}
\newcommand{\[}{\left[}
\newcommand{\]}{\right]}
\newcommand{\dis}{\displaystyle}
\newcommand{\eq}[1]{{\rm Eq}(\ref{#1})}
\newcommand{\n}{\notag\\}
\newcommand{\t}{\ \ \ \ }
\newcommand{\tt}{\t\t\t\t}
\newcommand{\argmax}{\mathop{\rm arg\, max}\limits}
\newcommand{\argmin}{\mathop{\rm arg\, min}\limits}
\def\l<#1>{\left\langle #1 \right\rangle}
\def\us#1_#2{\underset{#2}{#1}}
\def\os#1^#2{\overset{#2}{#1}}
\newcommand{\case}[1]{\{ \begin{array}{ll} #1 \end{array} \right.}
\newcommand{\s}[1]{{\scriptstyle #1}}
\definecolor{myblack}{rgb}{0.27,0.27,0.27}
\definecolor{myred}{rgb}{0.78,0.24,0.18}
\definecolor{myblue}{rgb}{0.0,0.443,0.737}
\definecolor{myyellow}{rgb}{1.0,0.82,0.165}
\definecolor{mygreen}{rgb}{0.24,0.47,0.44}
\newcommand{\c}[2]{\textcolor{#1}{#2}}
\newcommand{\ub}[2]{\underbrace{#1}_{#2}}
\end{align*}

How to draw a scatter plot

We will again use the iris dataset as the data. Iris dataset consists of petal and sepal lengths of three varieties: Versicolour, Virginica, and Setosa.

First, as bivariate data, we will restrict the variety to Setosa and deal only with sepal_length and sepal_width.

Now we will import the iris dataset in python.

import numpy as np
import pandas as pd
import seaborn as sns
import scipy.stats as st
import matplotlib.pyplot as plt

df_iris = sns.load_dataset('iris')

sepal_length = df_iris[df_iris['species']=='setosa']['sepal_length']
sepal_width = df_iris[df_iris['species']=='setosa']['sepal_width']

The most basic way to visually see the relationship between sepal_length and sepal_width is to draw a scatter plot.

To draw a scatterplot, use the scatterplot function in the seaborn library.

sns.scatterplot(x=sepal_length, y=sepal_width)
plt.show()

The scatterplot in the above figure shows that the points are aligned rightward. This means that flowers with larger sepal_length tend to have larger sepal_width.

The seaborn library also has a jointplot function that depicts a histogram along with a scatterplot.

sns.jointplot(x=sepal_length, y=sepal_width)
plt.show()

Correlation coefficient

Correlation coefficients (Pearson’s product-moment correlation coefficient) are often used to identify “rightward” or “downward” trends between data, and the correlation coefficient between two variables $x$ and $y$ takes values ranging from $-1$ to $1$, with positive values when $x$ tends to increase and negative values when $y$ tends to decrease. It takes a positive value when $y$ tends to decrease as $x$ increases, and a negative value when $y$ tends to decrease as $x$ increases.

There is a positive correlation between $x$ and $y$ when the correlation coefficient is close to $1$, a negative correlation when close to $-1$, and no correlation when close to $0$.

▲Image of correlation coefficients and scatter plots. See also: wikipedia

The correlation coefficient $r_{xy}$ is defined as

\begin{align*}
r_{xy} = \f{\sum_{i=1}^n (x^{(i)} – \bar{x}) (y^{(i)} – \bar{y}) }{\sqrt{\sum_{i=1}^n (x^{(i)} – \bar{x})^2} \sqrt{\sum_{i=1}^n (y^{(i)} – \bar{y})^2}}.
\end{align*}

where as the mean deviation vector

\begin{align*}
\bm{x} &= (x^{(1)} – \bar{x}, x^{(2)} – \bar{x}, \dots, x^{(n)} – \bar{x})^\T, \n
\bm{y} &= (y^{(1)} – \bar{y}, y^{(2)} – \bar{y}, \dots, y^{(n)} – \bar{y})^\T
\end{align*}

The correlation coefficient $R_{xy}$ coincides with the cosine $\cos \theta$ of the angle $\bm{x}, \bm{y}$ formed by the vectors $\bm{x}, \bm{y}$.
\begin{align*}
r_{xy} = \cos \theta = \f{\bm{x}^\T \bm{y}}{\|\bm{x}\| \|\bm{y}\|}.
\end{align*}

From this we see that $-1 \leq r_{xy} \leq 1$.

Also, if there is a positive correlation, $\bm{x}, \bm{y}$ point in the same direction, and if there is no correlation, $\bm{x}, \bm{y}$ can be interpreted as pointing in orthogonal directions.

The numerator of the defining formula for the correlation coefficient divided by the number of samples $n$ is called the covariance of $x, y$.

\begin{align*}
\sigma_{xy} = \f{1}{n} \sum_{i=1}^n (x^{(i)} – \bar{x}) (y^{(i)} – \bar{y})
\end{align*}

Using this value and the standard deviation $\sigma_x, \sigma_y$ of $x, y$, the correlation coefficient can be expressed as

\begin{align*}
r_{xy} = \f{\sigma_{xy}}{\sigma_x \sigma_y}.
\end{align*}

When the correlation coefficient is $r_{xy} = \pm 1 $, there is a linear relationship between $x, y$. The proof is given below.

Proof

以下、 $x, y$ の分散 $\sigma_x^2, \sigma_y^2$ は $0$ でないとする。

$r_{xy}$ が $1$ か $-1$ である場合、平均偏差ベクトル $\bm{x}, \bm{y}$ のなす角 $\theta$ の余弦 $\cos \theta$ は $1$ か $-1$ である。よって、

\begin{align*}
\bm{y} = \gamma \bm{x}
\end{align*}

を満たす定数 $\gamma \neq 0$ が存在する($r_{xy}=1$ なら $\gamma$ は正、$r_{xy}=-1$ なら $\gamma$ は負の値をとる)。このことから、$(y^{(i)} – \bar{y}) = \gamma (x^{(i)} – \bar{x}), \ (i = 1, \dots, n)$ が成立する。つまり、$x, y$ には直線関係がある。

また、上式にて両辺の2乗の平均をとると、

\begin{align*}
\f{1}{n}\sum_{i=1}^n (y^{(i)} – \bar{y})^2 &= \gamma^2 \f{1}{n}\sum_{i=1}^n (x^{(i)} – \bar{x})^2 \n
\therefore \sigma_y^2 &= \gamma^2 \sigma_x^2.
\end{align*}

したがって、$\gamma = \pm \sqrt{\sigma_y^2 / \sigma_x^2}$ となり、 $x, y$ には次の直線関係が成り立つ。

\begin{align*}
y = \pm \sqrt{\f{\sigma_y^2}{\sigma_x^2}} (x – \bar{x}) + \bar{y}.
\end{align*}

傾きの符号は $r_{xy}$ の符号と同じである。

pythonでは相関係数は次のように計算できます。

# 相関係数を計算
corr = np.corrcoef(sepal_length, sepal_width)[0, 1]
print(f'相関係数: {corr}')
# 出力
相関係数: 0.7425466856651597

  相関係数の注意点として、2つの変数が直線的な関係にあるときこれは有効ですが、そうで無い場合(非線形の関係の場合)には有効ではありません。実際、下図のように直線関係以外の関係性が存在するデータに対して、相関係数からは「相関がない」と判断され、有効に働きません。

▲下段のようにデータ間に非直線関係があっても、相関係数はそれを捉えることができない。参照: wikipedia

このように、相関係数は直線的な関係にどれだけ近いかを定量的に表現したもので、「相関がある」ことと、「データ間に関係がある」ことは異なります。

また、もう一方の注意点としてデータを切断した時に元のデータと比べて相関係数が $0$ に近づく現象があります。例としては、入学前の成績と入学後の成績は、本来正の相関を示しますが、入学後の成績を観測できるのは合格者のみであり、入学しなかった者のデータがないため,相関係数が低くなります。

このような現象を切断効果、または選抜効果とよびます。

順位相関係数

  先ほどの相関係数(ピアソンの積率相関係数)以外にも様々な相関係数が知られています。ここでは、スピアマンの順位相関係数について述べます。

順位相関係数は、データの順位しかわかっていない場合有効です。例えば、次のような学力テストの順位しかわかってない場合です。

数学テストの順位物理学テストの順位
11
34
22
45
53
66

このようなデータの順序だけを用いて相関を捉えるものが順序相関係数となります。

観測対象の値 $x, y$ の順位をそれぞれ、次の表のように $\tilde{x}, \tilde{y}$ と表記すると、

$x$ の順位$y$ の順位
$\tilde{x}^{(1)}$$\tilde{y}^{(1)}$
$\tilde{x}^{(2)}$$\tilde{y}^{(2)}$
$\vdots$$\vdots$
$\tilde{x}^{(n)}$$\tilde{y}^{(n)}$

スピアマンの順位相関係数 $\rho_{xy}$ は次式で計算されます。

\begin{align*}
\rho_{xy} = 1\ – \f{6}{n(n^2-1)} \sum_{i=1}^n (\tilde{x}^{(i)}\ – \tilde{y}^{(i)})^2.
\end{align*}

なぜこのような式になるかは▼次の記事をご覧ください。

pythonでは、次のようにして計算できます。

# スピアマンの順位相関係数を計算
math = [1, 3, 2, 4, 5, 6]
phys = [1, 4, 2, 5, 3, 6]

corr, pvalue = st.spearmanr(math, phys)
print(corr)
# 出力
0.8285714285714287

3変量以上のデータの記述 散布図行列と分散共分散行列

  3変量以上のデータとなると、全ての変数を用いて散布図を描写するのは難しくなります。そこで、各変数の2組のペアの散布図をパネル上に並べて表示する散布図行列を用いましょう。

irisデータセットの4つの変数を用いて散布図行列を描写してみます。pythonではseabornライブラリのpairplot関数を用います。

# 散布図行列を描写 
df_setosa = df_iris[df_iris['species']=='setosa']  # 品種はSetosaに限定する
sns.pairplot(data=df_setosa)
plt.show()

このように散布図行列をみることで、それぞれの変数間の関係を一度に捉えることができます。


相関係数も行列形式でまとめて表記されます。一般的な議論として、サンプル数が $n$で、 $m$ 変数のデータを考えます。この時、行列 $\tilde{X}$ を以下で定めます。

\begin{align*}
\tilde{X} = \mat{
x_1^{(1)} – \bar{x}_1 & x_2^{(1)} – \bar{x}_2 & \cdots & x_m^{(1)} – \bar{x}_m \\
x_1^{(2)} – \bar{x}_1 & x_2^{(2)} – \bar{x}_2 & \cdots & x_m^{(2)} – \bar{x}_m \\
\vdots & \vdots & \ddots & \vdots \\
x_1^{(n)} – \bar{x}_1 & x_2^{(n)} – \bar{x}_2 & \cdots & x_m^{(n)} – \bar{x}_m
}.
\end{align*}

すると、分散共分散行列とよばれる行列 $\Sigma$ は次式で表されます。

\begin{align*}
\Sigma = \f{1}{n} \tilde{X}^\T \tilde{X}.
\end{align*}

ここで、分散共分散行列の、第$(i, j)$成分 $\sigma_{ij}$ はその定義から、

\begin{align*}
\sigma_{ij} = \f{1}{n} \sum_{k=1}^n (x^{(k)}_i – \bar{x}_i) (x^{(k)}_j – \bar{x}_j)
\end{align*}

となるので、$\sigma_{ij}$ は第 $i$ 変数と第 $j$ 変数の共分散となります。特に対角成分は第 $i$ 変数の分散となります。

同様にして、第 $i$ 変数と第 $j$ 変数の相関係数(ピアソンの積率相関係数)$r_{ij}$ を第$(i, j)$成分とする対象行列 $R$ を相関行列とよびます。

\begin{align*}
R = \mat{
1 & r_{11} & \cdots & r_{1m} \\
r_{11} & 1 & \cdots & r_{2m} \\
\vdots & \vdots & \ddots & \vdots \\
r_{m1} & r_{m2} & \cdots & 1
}.
\end{align*}

pythonでは相関行列は次のように計算できます。

# 相関行列を計算する
corr_mat = df_setosa.corr()
corr_mat

相関行列はヒートマップを使用すると、わかりやすいです。

# ヒートマップで相関行列を描写
cmap = sns.diverging_palette(255, 0, as_cmap=True)  # カラーパレットの定義
sns.heatmap(corr_mat, annot=True, fmt='1.2f', cmap=cmap, square=True, linewidths=0.5, vmin=-1.0, vmax=1.0)
plt.show()

次回: ▼事象、確率と確率変数


参考書籍

タイトルとURLをコピーしました