相関係数の範囲と数学的帰納法

# はじめに
相関係数$r$は$-1\le r \le 1$の範囲でしか存在しない。これを高校数学で証明するのは極めて難しい。しかし、イメージとしては簡単で$n$次元空間の2つのベクトルの角度の余弦を考えればよい。そこで、そのイメージをもとにして数学的帰納法を用いて解く。具体的には、$n$次元空間において、2つのベクトルの余弦は-1から1の範囲に収まるということを仮定して$n+1$次元空間でもそれが成り立つということを二次方程式の判別式条件を用いて上手く示す。そしておまけとして、プログラミングを用いて相関係数$r$は$-1\le r \le 1$の範囲でしか存在しないことを感覚的に確かめる。

# ベクトルのイメージ
$n$次元空間に$\vec{x}=[x_1,x_2,\cdot \cdot \cdot x_n],\vec{y}=[y_1,y_2,\cdot \cdot \cdot y_n]$という2つのベクトルが存在すると仮定する。その場合、内積なので以下のことが成立する（はずである。）

```math
-|\vec{x}||\vec{y}|\le\vec{x}\cdot\vec{y}\le|\vec{x}||\vec{y}|
```

これに、ベクトルの成分を代入して整理すると以下の式が成立する。

```math
-1\le\frac{ \sum_{k=1}^{n}x_k y_k}{\sqrt{\sum_{k=1}^{n}(x_k^2)} \sqrt{\sum_{k=1}^{n}(y_k^2)}} \le1
```
これがいわゆる、コーシー・シュワルツの定理であり難関大では頻出の式の１つである。

そこで、$x_k=a_k-\bar{a},b_k=b_k-\bar{b}$すると以下の式が成立する。

```math
-1\le\frac{\frac{1}{n} \sum_{k=1}^{n}(a_k-\bar{a}) (b_k-\bar{b})}{\sqrt{\frac{1}{n}\sum_{k=1}^{n}(a_k-\bar{a})^2} \sqrt{\frac{1}{n}\sum_{k=1}^{n}(b_k-\bar{b})^2}} \le1
```

ただし、

```math
\bar{a}=\frac{1}{n}\sum_{k=1}^{n}{a_k},\bar{b}=\frac{1}{n}\sum_{k=1}^{n}{b_k}
```

とする。

2つのベクトル、つまりデータ$\vec{a}=[a_1,a_2,\cdot \cdot \cdot a_n],\vec{b}=[b_1,b_2,\cdot \cdot \cdot,b_n]$の相関係数は以下の式で表される。


```math
r=\frac{\frac{1}{n} \sum_{k=1}^{n}(a_k-\bar{a}) (b_k-\bar{b})}{\sqrt{\frac{1}{n}\sum_{k=1}^{n}(a_k-\bar{a})^2} \sqrt{\frac{1}{n}\sum_{k=1}^{n}(b_k-\bar{b})^2}}
```

ゆえに、イメージ的には、

```math
-1\le r \le1
```

が成立するはずである。

# 帰納法による証明
相関係数の不等式を証明することは、以下のシュワルツの公式を証明することと同値である。

```math
-1\le\frac{ \sum_{k=1}^{n}x_k y_k}{\sqrt{\sum_{k=1}^{n}(x_k^2)} \sqrt{\sum_{k=1}^{n}(y_k^2)}} \le1
```

そこで、我々は地味でも再現性のある方法を使って証明（勝負）しなければならない！

このとき、ちゃんと受験勉強していれば$n$は自然数であることを利用した数学的帰納法が思いつくはず。

これなら、ひらめきをする頻度は少なくなり我々でも地道に証明していけるはずである。

そこでとりあえず、$k=1$の場合と$k=n$が成立したときに$k=n+1$の場合が成立することを示す。

## k=1のとき

```math
-1\le\frac{ x_1 y_1}{\sqrt{x_1^2} \sqrt{y_1^2} }\le 1
```

を示す。

```math
\frac{ x_1 y_1}{\sqrt{x_1^2} \sqrt{y_1^2} }=\frac{ x_1 y_1}{|x_1||y_1| }=\pm 1
```

となり、成立する。これは、1次元に対応する。

（一応補足だが、変に違和感を感じて2次元で示す必要性はない。）

## k=n のとき

さて問題は、$k=n$のとき題意が成立したと仮定した際に、$k=n+1$の場合の題意を如何にして示すかである。

つまり、
```math
-1\le\frac{ \sum_{k=1}^{n}x_k y_k}{\sqrt{\sum_{k=1}^{n}x_k^2} \sqrt{\sum_{k=1}^{n}y_k^2}} \le1
```

が成立したと仮定する。このままだと扱いにくいので置き換えをする。
```math
A_n=\sum_{k=1}^{n}x_k y_k,B_n=\sum_{k=1}^{n}x_k^2,C_n=\sum_{k=1}^{n}y_k^2
```

この場合、

```math
-1\le\frac{A_n}{\sqrt{B_n C_n}} \le1
```

と書き換えられる。

ここで、$k=n+1$のときを攻める。

```math
A_{n+1}=A_n+x_{n+1}y_{n+1},B_{n+1}=B_n+x^2_{n+1},C_{n+1}=C_n+y^2_{n+1}
```
となるので、$A_{n+1},B_{n+1},C_{n+1}\ge 0$から

```math
A^2_{n+1}\le B_{n+1} C_{n+1}
```

を示せばよいことがわかる。
つまり、
```math
 B_{n+1} C_{n+1}-A^2_{n+1}=(B_n+x^2_{n+1})(C_n+y^2_{n+1})-(A_n+x_{n+1}y_{n+1})^2=(C_n x^2_{n+1}+2 A_ny_{n+1}x_{n+1}+B_n y^2_{n+1})+(B_n C_n-A^2_n)
```
が0以上を示す。

ここで、まず仮定より、
```math
B_n C_n-A^2_n\ge0

```

次に、$x_{n+1}$に関する二次方程式である
``` math
C_n x^2_{n+1}+2 A_ny_{n+1}x_{n+1}+B_n y^2_{n+1}=0
```
を考えたときに判別式$D/4$は以下のようになる。

``` math
D/4=(A_n y_{n+1})^2-B_n C_n y^2_{n+1}=y^2_{n+1}(A_n^2-B_n C_n)\le0 
```

したがって、


``` math
C_n x^2_{n+1}+2 A_ny_{n+1}x_{n+1}+B_n y^2_{n+1}\ge0
```

以上をまとめると、

```math
 B_{n+1} C_{n+1}-A^2_{n+1}\ge 0
```

となる。

以上より題意は示された。

# 数値計算
## アルゴリズム

$\vec{a},\vec{b}$の相関係数を求めるプログラムを作成する。
ただし、$\vec{a},\vec{b}$は以下の要件を満たすものとする。
``` math
\vec{b} =  \alpha \vec{a}+ \beta p \vec{1}
```

という関係を考える。

ただし、$\vec{1}=[1,1,\cdot \cdot \cdot,1]$の単位ベクトルとして、$p$は$0\le p \le 1$を動くランダムな実数とする。

これで、$|\alpha|$が$\beta$よりも十分に大きければ、相関係数は1もしくは-1に漸近し、$|\alpha|$が$\beta$よりも十分に小さければ、相関係数は0に漸近するはずである。

## プログラム
以下のようなプログラムを作成した。
``` python r_alpha_beta.py
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
import math

num=10
x=np.linspace(-1,1,num)



# plt.scatter(x,y)
# plt.show()


#plt.scatter(x,y)
#a,bベクトルの共分散を求める関数
def S(a,b):
  sum = 0
  A=0
  B=0
  for i in range(len(a)):
    #a,bベクトルの要素の平均値A,B
    A += a[i]/len(a)
    B += b[i]/len(a)
    c= a[i]*b[i]/len(a)
    sum += c
  return (sum)-A*B


# a=-1
# b=2
Alpha,Beta=np.meshgrid(x,x)
R=np.zeros((num,num))
for i in range(num):
  for k in range(num):
    #x,yデータの作成
    y=Alpha[i][k]*x+Beta[i][k]*np.random.normal(0,1,num)
    #相関係数の計算
    R[i][k]=S(x,y)/(math.sqrt(S(x,x)*S(y,y)))
  
plt.contourf(Alpha,Beta,R)
plt.colorbar(label="相関係数")
plt.xlabel("線形の依存具合")
plt.ylabel("ノイズの大きさ")
plt.savefig("相関係数.png")
plt.show()
```
これを実行すると以下のようなグラフが出力される。
![相関係数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/4057ba17-e748-7e1f-2ff5-ab8e743d56f4.png)

このように、$\vec{a},\vec{b}$の依存関係が大きいほど$|r|$は1に漸近して、無関係に近くなると0に漸近する。

したがって、$-1\le r\le 1$ということが図示できた。

# まとめ
今回は、相関係数$r$の不等式つまり、$-1\le r\le 1$を数学的帰納法を用いて証明した。具体的には、自然数$n$を用いて$n$次元における2つのベクトルの内積をイメージして証明を行った。また、おまけとして数値解析も行った。

# 参考文献

https://manabitimes.jp/math/854