【Python演算処理】行列演算の基本④大源流における記述統計学との密接な関連性?

私が最初に線形代数を学んだのはこの本でした。
[マンガ　線形代数入門　はじめての人でも楽しく学べる](https://www.amazon.co.jp/%E3%83%9E%E3%83%B3%E3%82%AC-%E7%B7%9A%E5%BD%A2%E4%BB%A3%E6%95%B0%E5%85%A5%E9%96%80-%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AE%E4%BA%BA%E3%81%A7%E3%82%82%E6%A5%BD%E3%81%97%E3%81%8F%E5%AD%A6%E3%81%B9%E3%82%8B-%E3%83%96%E3%83%AB%E3%83%BC%E3%83%90%E3%83%83%E3%82%AF%E3%82%B9-%E9%8D%B5%E6%9C%AC%E8%81%A1-ebook/dp/B00ZR7XVNO/ref=sr_1_3?adgrpid=116154124253&dchild=1&hvadid=492507251464&hvdev=c&hvqmt=e&hvtargid=kwd-465238998446&hydadcr=27705_11588529&jp-ad-ap=0&keywords=%E3%83%9E%E3%83%B3%E3%82%AC%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8B%E7%B7%9A%E5%BD%A2%E4%BB%A3%E6%95%B0&qid=1623163782&sr=8-3)
しばらくはこの本に従って解説を進めていきたいと思います。

#第一章「行列って何？　線形代数って何？」

まずは**直線性**(Linearity=グラフとして表した時に直線となるような数学的関係)とは何か説明する為、以下の中学校で習う公式から出発します。

```math
ax+bx=c
```

>確率の期待値(平均)の場合

```math
E(aX+bY)=aE(X)+bE(Y)
```
>微分の場合

```math
(af(x)+bg(x))'=af'(x)+bg'(x)
```
ax+bx=cの場合、**代数方程式**(Algebraic Formula)の**表現**(Expression)では以下となります。
[【数理考古学】代数方程式について。](https://qiita.com/ochimusha01/items/428954a67eee63d52592)

```math
ax+bx-c=0
```

これを**行列**(Matrix)で表してみましょう。

>行列の行とは横の事、列とは縦の事。合わせると縦と横に数字を綺麗に並べたものといえる。日本では数学用語**Matrix**を和訳する際にこれを「**行と列の組み合わせ**」と捉えたのでかかる表現が採用されたが、英語では窓口に並ぶ行列の事を**Queue**という。

[マトリックス - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%88%E3%83%AA%E3%83%83%E3%82%AF%E3%82%B9)

>本来は「**子宮**」を意味するラテン語（< Mater母+ix）に由来するMatrixの音写で（英語では「メイトリクス」）、そこから何かを生み出すものを意味する。この「**生み出す機能**」に着目して命名されることが多い。また、子宮状の形状・状態に着目して命名される場合もある。
>
>日本語にあえて翻訳する場合は「**基盤**」「**基質**」などの訳語が当てられることがあるが、原語で強く感じられる「**生み出す機能**」や「**形状**」が伝わりにくく、必ずしも評判が良くない。例えば「**母体**」あるいは「**子宮体**」ならばニュアンスも伝わるのだろうが、このような訳語はほとんど採用されていない。結局、カタカナで表記されることが多い。
>
>生物学や医学では「**間質**」という言葉も使われている(例：細胞間質)。
>
>材料学では「**母材**」、鉱物学では「**母岩**」という訳語も使われている(複合材料の母材)。

* SFドラマ「**ドクター・フー**（1963年-）」88話「**Deadly Assassin**（1976年）」に登場する用語。知識が集積された仮想空間のことを「**マトリックス**」と呼んでいる。
* 聖悠紀の漫画作品「**超人ロック**」シリーズ(1967年~)において、超能力者が他人に変身するときに、他人の身体からコピーして自分の体を作り変える遺伝子情報を**遺伝子マトリクス**と呼んでいる。
* ウィリアム・ギブスンのサイバーパンクSF小説「**ニューロマンサー**（1984年）」「**カウント・ゼロ**（1986年）」「**モナリザ・オーバードライブ**（1988年）」「**記憶屋ジョニィ**（1981年）」「**クローム襲撃**（1982年）」、あるいは「**記憶屋ジョニィ**」を基にした映画「**ＪＭ**(Johnny Mnemonic,1995年）での用語。それらの作品において、コンピューター・ネットワーク上のサイバースペース（電脳空間）に築かれた「**仮想現実空間**」、人類の全コンピューター・システムから引き出されたデータの「**視覚的再現**」、「**共感覚幻想**」のことを「**マトリックス**」と呼んでいる。
* 上掲のサイバーパンク文学上の文脈から映画「**マトリックス三部作**(1999年~2003年)」でも「**コンピュータの作り出した仮想現実**」をそう呼んでいる。ちなみに「**MATRIX**」という言葉自体はボードリヤールの著書「**シミュラークルとシミュレーション**(Simulacres et simulation,1981年)」の中にも掲げられており、そこに登場する「**シミュラークル**=<font color=purple>不換紙幣(本位貨幣すなわち正貨たる金貨や銀貨との兌換が保障されない法定紙幣（Fiat Money）で、政府の信用において流通する事から信用紙幣（英: Faith Money）とも呼ばれる)の様に、単に特定の実体と紐付けられたラベルに留まらない記号そのもの</font>」の概念こそが出所となったという見方もある。作中ではハードカバーのボードリヤールの本が映るシーンも見られ、2作目からボードリヤール本人をアドバイザーに迎える計画があったが、断られたという。<br>[【雑想】「自己の専有と疎外の終わり」?](https://ochimusha01.hatenablog.com/entry/2021/01/15/042543?_ga=2.71810516.619039486.1622677144-1062689486.1565299642)<br>[【データベース消費】 穿り返すと案外根深い？](https://ochimusha01.hatenablog.com/entry/2019/04/10/023822?_ga=2.55060715.1182209138.1622926967-1062689486.1565299642)

これが数理的にどういうニュアンスになるかというと…

```python
import sympy as sp
a,b,c,x,y = sp.symbols('a,b,c,x,y')
A = sp.Matrix([[a,b,c]])
X = sp.Matrix([[x],[y],[-1]])
AX=A*X
expr00 =ax[0]
expr01 = sp.solve(expr00,y)
expr02 = sp.solve(expr00,x)
expr03 = sp.solve(expr00,c)
sp.init_printing()
display(A)
display(X) 
display(AX)
print(sp.latex(A)+sp.latex(X)+"="+sp.latex(AX))
display(expr00)
print(sp.latex(expr00)+"=0")
display(expr01)
print("y="+sp.latex(expr01))
display(expr02)
print("x="+sp.latex(expr02))
display(expr03)
print(sp.latex(expr03)+"=c")
```

```math
\left[\begin{matrix}a & b & c\end{matrix}\right]\left[\begin{matrix}x\\y\\-1\end{matrix}\right]=\left[\begin{matrix}a x + b y - c\end{matrix}\right] \\
a x + b y - c=0 \\
y=\left[ \frac{- a x + c}{b}\right] \\
x=\left[ \frac{- b y + c}{a}\right] \\
\left[ a x + b y\right]=c
```
全体像を構築しようとすると行列に「<font color=purple>-1</font>」なる成分を追加する必要が生じますが、これは複式簿記における「**借方**(左側)」と「**貸方**(右側)」の関係の定義に対応します。そう歴史上における**複式簿記の導入**とは実は**経済分野における会計処理の代数計算化**に他ならなかったのです!!
[【数理考古学】三次方程式(cubic equation)から虚数(Imaginary Number)へ。](https://qiita.com/ochimusha01/items/f1f6d436f589d6b5b2fd)

>例えば300円のコーヒーと350円の紅茶しかメニューが存在しない喫茶店において、1日の売り上げを知りたいとすれば、その日のコーヒーの注文回数をx杯、紅茶の注文回数をy杯と置いて「**300x+350y**」の計算が成立します。

```python
import sympy as sp
a,b,c,x,y = sp.symbols('a,b,c,x,y')
A = sp.Matrix([[a,b,c]])
X = sp.Matrix([[x],[y],[-1]])
AX=A*X
expr00 =AX[0]
expr01 = sp.solve(expr00,y)
expr02 = sp.solve(expr00,x)
expr03 = sp.solve(expr00,c)
Aa=A.subs([(a,300),(b,350)])
expr00a = expr00.subs([(a,300),(b,350)])
expr01a = expr01[0].subs([(a,300),(b,350)])
expr02a = expr02[0].subs([(a,300),(b,350)])
expr03a = expr03[0].subs([(a,300),(b,350)])
sp.init_printing()
display(Aa)
display(X) 
display(Aa*X)
print(sp.latex(Aa)+sp.latex(X)+"="+sp.latex(Aa*X))
display(expr00a)
print(sp.latex(expr00a)+"=0")
display(expr01a)
print("y="+sp.latex(expr01a))
display(expr02a)
print("x="+sp.latex(expr02a))
display(expr03a)
print(sp.latex(expr03a)+"=c")
```

```math
\left[\begin{matrix}300 & 350 & c\end{matrix}\right]\left[\begin{matrix}x\\y\\-1\end{matrix}\right]=\left[\begin{matrix}- c + 300 x + 350 y\end{matrix}\right] \\
- c + 300 x + 350 y=0 \\
y=\frac{c}{350} - \frac{6 x}{7} \\
x=\frac{c}{300} - \frac{7 y}{6} \\
300 x + 350 y=c
```

Sympyが自動的に約分を施すせいで元データすなわち「<font color=purple>特定の実体と紐付けられたラベル</font>」のイメージから離れ始めてますね。それではこの喫茶店の1週間の売り上げをランダムに生成してみましょう。とりあえず売り上げ幅は0杯から50杯とします。

```python
import sympy as sp
a,b,x,y = sp.symbols('a,b,x,y')
A = sp.Matrix([[a,b]])
X = sp.Matrix([[x],[y]])
AX=A*X
expr00 =AX[0]
Aa=A.subs([(a,300),(b,350)])
Xr=sp.randMatrix(2,7, min=0, max=50)
sp.init_printing()
display(Aa)
display(X) 
display(Aa*X)
print(sp.latex(Aa)+sp.latex(X)+"="+sp.latex(Aa*X))
display(Xr) 
display(Aa*Xr)
print(sp.latex(Aa)+sp.latex(Xr)+"="+sp.latex(Aa*Xr))
```

```math
\left[\begin{matrix}300 & 350\end{matrix}\right]\left[\begin{matrix}x\\y\end{matrix}\right]=\left[\begin{matrix}300 x + 350 y\end{matrix}\right] \\
\left[\begin{matrix}300 & 350\end{matrix}\right]\left[\begin{matrix}18 & 4 & 41 & 49 & 4 & 41 & 33\\10 & 5 & 6 & 23 & 9 & 6 & 35\end{matrix}\right]=\left[\begin{matrix}8900 & 2950 & 14400 & 22750 & 4350 & 14400 & 22150\end{matrix}\right]
```
ああ、これはもう立派な統計データですね!!
<font color=red>かくしてデータ処理の主体がnumpyを介してpadasに推移する。</font>
[Pythonで改行コードLF「\n」を削除する](https://www.relief.jp/docs/python-remove-line-feed.html)

```python
import sympy as sp
import numpy as np
import pandas as pd
a,b,x,y = sp.symbols('a,b,x,y')
A = sp.Matrix([[300,350]])
X = sp.Matrix([[18,4,41,49,4,41,33],[10,5,6,23,9,6,35]])
X1=X.row_insert(2, A*X)
x=X1.transpose()
df=pd.DataFrame(np.matrix(x),columns=['Coffe', 'Tea', 'Total'])
sp.init_printing()
display(A)
display(X) 
display(A*X)
print(sp.latex(Aa)+sp.latex(X)+"="+sp.latex(Aa*X))
display(x)
org=df.to_html()
print(org.replace('\n', ''))
```

```math
\left[\begin{matrix}18 & 10 & 8900\\4 & 5 & 2950\\41 & 6 & 14400\\49 & 23 & 22750\\4 & 9 & 4350\\41 & 6 & 14400\\33 & 35 & 22150\end{matrix}\right]
```

<table border="1" class="dataframe">  <thead>    <tr style="text-align: right;">      <th></th>      <th>Coffe</th>      <th>Tea</th>      <th>Total</th>    </tr>  </thead>  <tbody>    <tr>      <th>0</th>      <td>18</td>      <td>10</td>      <td>8900</td>    </tr>    <tr>      <th>1</th>      <td>4</td>      <td>5</td>      <td>2950</td>    </tr>    <tr>      <th>2</th>      <td>41</td>      <td>6</td>      <td>14400</td>    </tr>    <tr>      <th>3</th>      <td>49</td>      <td>23</td>      <td>22750</td>    </tr>    <tr>      <th>4</th>      <td>4</td>      <td>9</td>      <td>4350</td>    </tr>    <tr>      <th>5</th>      <td>41</td>      <td>6</td>      <td>14400</td>    </tr>    <tr>      <th>6</th>      <td>33</td>      <td>35</td>      <td>22150</td>    </tr>  </tbody></table>

だから以下の様な記述統計諸元が計算可能となります。

```python
import sympy as sp
import numpy as np
import pandas as pd
X = sp.Matrix([[18,4,41,49,4,41,33],[10,5,6,23,9,6,35]])
df=pd.DataFrame(np.matrix(X.transpose()),columns=['Coffee', 'Tea'])
sp.init_printing()
display(X.transpose())
print(sp.latex(X.transpose()))
org=df.to_html()
print(org.replace('\n', ''))
print(df.astype({'Coffee': int, 'Tea': int}).describe())
```

```math
\left[\begin{matrix}18 & 10\\4 & 5\\41 & 6\\49 & 23\\4 & 9\\41 & 6\\33 & 35\end{matrix}\right]
```

<table border="1" class="dataframe">  <thead>    <tr style="text-align: right;">      <th></th>      <th>Coffee</th>      <th>Tea</th>    </tr>  </thead>  <tbody>    <tr>      <th>0</th>      <td>18</td>      <td>10</td>    </tr>    <tr>      <th>1</th>      <td>4</td>      <td>5</td>    </tr>    <tr>      <th>2</th>      <td>41</td>      <td>6</td>    </tr>    <tr>      <th>3</th>      <td>49</td>      <td>23</td>    </tr>    <tr>      <th>4</th>      <td>4</td>      <td>9</td>    </tr>    <tr>      <th>5</th>      <td>41</td>      <td>6</td>    </tr>    <tr>      <th>6</th>      <td>33</td>      <td>35</td>    </tr>  </tbody></table>

```python
          Coffee        Tea
count   7.000000   7.000000
mean   27.142857  13.428571
std    18.488091  11.326328
min     4.000000   5.000000
25%    11.000000   6.000000
50%    33.000000   9.000000
75%    41.000000  16.500000
max    49.000000  35.000000
```

```python
      Coffee Tea
count      7   7
unique     5   6
top        4   6
freq       2   2
```
このうち`count`は成分の個数(1週間分のデータなので7個)、`unique`はユニークな（一意な）値の要素の個数に対応します。
[【初心者向け】記述統計学と代表値](https://qiita.com/ochimusha01/items/0bdfc971a69a30f0615f)
[要約統計量についてまとめてみた](https://qiita.com/icchy_sh33p/items/82f2bc7d789b74110f7b)

##クォンタイル(<font color=blue>パーセンタイル</font>)/四分位(<font color=blue>Quantile</font>)

以下の要素から構成される**要約統計量**(Summary Statistics)。

* **最小値**(Min)
* **第1四分位**(1st Quartile=25%)
* **中央値**(Median=50%)
* **第3四分位**（3rd Quartile=75%）
* **最大値**(Max)

以下の形で統計的代表値の候補となります。

* 散布度基準の一つである**範囲**(Range)は**最小値**(Min)と**最大値**（Max)から構成される(最大値-最小値)。
* 分布の中心にある**中央値**(Median)は、候補データが複数存在する場合にはその平均を取る。年収リストの様な中央値と平均が異なる分布では、概ね中央値の方が平均値を下回る。**平均値**(Mean)より外れ値の影響に対して**ロバスト**(頑強)とされる。<br>[【初心者向け】平均と標準偏差、中央値と平均偏差](https://qiita.com/ochimusha01/items/971d62ebc5e4cac6a61b)

[人工知能・機械学習のときには過学習 (オーバーフィッティング) に気をつけよう！～過学習とその対処法～](https://datachemeng.com/overfitting/)

>**中央絶対偏差**はすべてのデータから中央値を引き、すべて絶対値を取り、それらの中央値を求めた結果です。標準偏差のかわりに使うときは、中央絶対偏差に1.4826をかけて補正する必要があります。

**中央値**(Median)は**平均値**(Mean)ほど外れ値の影響を受けない事の簡単な検証。

```python
import sympy as sp
import numpy as np
import pandas as pd
df1=pd.DataFrame([300,300,300,300,400,400,400,2000,9000])
df2=pd.DataFrame([300,300,300,300,400,400,400,2000,12000])
print("mean1=" + str(df1.mean()))
print("median1=" + str(df1.median()))
print("mean2=" + str(df2.mean()))
print("median2=" + str(df2.median()))
```

```python
mean1=0    1488.888889
dtype: float64
median1=0    400.0
dtype: float64
mean2=0    1822.222222
dtype: float64
median2=0    400.0
dtype: float64
```

いわゆる「**箱髭図**(Box Plot)」はこのデータから起こされます。

[【プログラマーのための統計学】箱ひげ図](https://qiita.com/Esfahan/items/14811149a047c44956b6)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/17233651-9ef1-9493-2c51-abe4df1bb44b.png)

```python
%matplotlib inline
import matplotlib.pyplot as plt

# 数学の点数
math = [74, 65, 40, 62, 85, 67, 82, 71, 60, 99]
# 国語の点数
literature = [81, 62, 32, 67, 41, 50, 85, 70, 67, 97]
# 点数のタプル
points = (math, literature)

# 箱ひげ図
fig, ax = plt.subplots()

bp = ax.boxplot(points)
ax.set_xticklabels(['math', 'literature'])

plt.title('Box plot')
plt.xlabel('exams')
plt.ylabel('point')
# Y軸のメモリのrange
plt.ylim([0,100])
plt.grid()

# 描画
plt.show()
```
>それぞれの意味はこうなっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/36856fbd-4aae-5ba1-9f1d-cdc1ac2a1335.png)

>箱ひげ図の場合、最大値、最小値が極端であった場合、ヒゲが長くなります。外れ値を考慮する箱ひげ図の場合は、ヒゲの長さは、最大値側、最小値側でそれぞれ、箱の1.5倍以下とし、それを超えるデータは、外れ値とみなします。
>
>pythonのmatplotlibでは、外れ値を自動で検出してくれるようです。以下のコードでは、国語の点数結果に170点、190点を追加してみました。テストは100点満点なので、この2つは外れ値になるはずです。グラフの目盛りは200までに増やしています。これでグラフを作成してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/9416d6b8-dddc-3856-0066-fff120ccf2ae.png)

```python
%matplotlib inline
import matplotlib.pyplot as plt

# 国語の点数
literature = [81, 62, 32, 67, 41, 50, 85, 100, 170, 190]
# 点数のタプル
points = (literature)

# 箱ひげ図
fig, ax = plt.subplots()

bp = ax.boxplot(points)
ax.set_xticklabels(['literature'])

plt.title('Box plot')
plt.xlabel('exams')
plt.ylabel('point')
# Y軸のメモリのrange
plt.ylim([0,200])
plt.grid()

# 描画
plt.show()
```

>グラフの上部の方に、◯が2つできました。この2つは、170点、190点が外れ値としてみなされたものです。pythonのmatplotlibでは、特に外れ値を定義しなくても、このように自動で判別してくれるようなので、非常に便利ですね。

独自に「**外れ値**」を除外する仕組みが備わっていたりもするのですね。ちなみに今回の「**とある架空の喫茶店の7日分の売り上げ**(データランダム生成)」をプロットするとこんな感じに。

```python
%matplotlib inline
import matplotlib.pyplot as plt

# コーヒーの売り上げ
coffee = [18,4,41,49,4,41,33]
# 紅茶の売り上げ
tea = [10,5,6,23,9,6,35]
# 点数のタプル
points = (coffee, tea)

# 箱ひげ図
fig, ax = plt.subplots()

bp = ax.boxplot(points)
ax.set_xticklabels(['coffee', 'tea'])

plt.title('Box plot')
plt.xlabel('exams')
plt.ylabel('point')
# Y軸のメモリのrange
plt.ylim([0,50])
plt.grid()

# 描画
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/ad2e8021-bf1e-ca32-c926-9168dea57119.png)

なんとランダム生成データなのに外れ値が検出されてしまいました?

##範囲(<font color=blue>Range</font>)と最頻値(<font color=blue>Mode</font>)

以下の要素から構成される**要約統計量**(Summary Statistics)。

* **範囲**(Range)…散布度基準の一つだが、あまり普及してない。**最大値**(Max)-**最小値**(Min)。**度数分布**（Frequency Distribution）の表現形態の一つたる**ヒストグラム**（Histogram）では「**階級**(Class)の**最大値**-**階級**(Class)**の最小値**」と計算される。
* **最頻値**(Mode)…日本工業規格の定義では「<font color=purple>離散分布の場合は確率関数が，連続分布の場合は密度関数が最大となる確率変数の値。分布が多峰性の場合は，それぞれの極大値を与える確率変数の値</font>」と定めている。Pandasの`describe`関数では`Top`が最頻値、`freq`がその出現回数を表す。

そう、**連続分布**を**度数分布表**(Histogram)で離散的に表す過程はしばしば、「**データ分布の**(確率密度に対応した)**クラス分けの最適化**」なる分析過程を必要とするのです。
[【初心者向け】度数分布と最頻値](https://qiita.com/ochimusha01/items/0bdfc971a69a30f0615f)

試しに「**とある架空の喫茶店の7日分の売り上げ**(データランダム生成)」をプロットすると…

```python
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt

# コーヒーの売り上げ
coffee = [18,4,41,49,4,41,33]
# 紅茶の売り上げ
tea = [10,5,6,23,9,6,35]

plt.hist([coffee, tea], stacked=False)
# 描画
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/7764a370-7694-bb8f-89b5-b82c0310a565.png)
まぁ当然の帰結として見るからに有意性の感じられない結果を迎えました。これではクラス分けを最適化する意欲も起こりません。

##平均(<font color=blue>Mean</font>)と偏差（<font color=blue>Deviation</font>）と分散（<font color=blue>Dispersion</font>）

ここで共通して使用する**要約統計量**(Summary Statistics)は以下です。

* **平均**(Mean)

とりあえず「**とある架空の喫茶店の7日分の売り上げ**(データランダム生成)」における**偏差**(Deviation)、すなわち「<font color=purple>データの各数値より、その平均を引いた残り</font>」概念から出発します。数理的にいうと「**平均値**(mean)**を原点とする分布への射影結果**」といったイメージですね。

```python
import sympy as sp
import numpy as np
import pandas as pd
x=np.matrix([8900,2950,14400,22750,4350,14400,22150])
y=pd.DataFrame([8900,2950,14400,22750,4350,14400,22150])
org=y.to_html()
print(org.replace('\n', ''))
print("元データ:" + str(x))
print("平均:" + str(np.round(np.mean(x))))
print("偏差:" + str(np.round(x-np.mean(x))))
print("標本分散:" + str(np.round(np.var(x))))
print("不偏分散:" + str(np.round(y.var())))
print("標本偏差:" + str(np.round(np.std(x))))
print("標準偏差:" + str(np.round(y.std())))
print("偏差の絶対値:" + str(np.round(abs(x-np.mean(x)))))
print("平均偏差=偏差の絶対値の平均:" + str(np.round(np.sum(abs(x-np.mean(x))))/len(x)))
```

<table border="1" class="dataframe">  <thead>    <tr style="text-align: right;">      <th></th>      <th>0</th>    </tr>  </thead>  <tbody>    <tr>      <th>0</th>      <td>8900</td>    </tr>    <tr>      <th>1</th>      <td>2950</td>    </tr>    <tr>      <th>2</th>      <td>14400</td>    </tr>    <tr>      <th>3</th>      <td>22750</td>    </tr>    <tr>      <th>4</th>      <td>4350</td>    </tr>    <tr>      <th>5</th>      <td>14400</td>    </tr>    <tr>      <th>6</th>      <td>22150</td>    </tr>  </tbody></table>

```python
元データ:[[ 8900  2950 14400 22750  4350 14400 22150]]
平均:12843.0
偏差:[[-3943. -9893.  1557.  9907. -8493.  1557.  9307.]]
標本分散:53595306.0
不偏分散:0    62527857.0
dtype: float64
標本偏差:7321.0
標準偏差:0    7907.0
dtype: float64
偏差の絶対値:[[3943. 9893. 1557. 9907. 8493. 1557. 9307.]]
平均偏差=偏差の絶対値の平均:44657.0
```
何やらややこしい計算を重ねた末に「**標本分散**(Sample Dispersion)/**標本偏差**(Sample Dispersion)」「**不偏分散**(Unbiased Dispersion)/**標準偏差**(Standard Deviation)」「**平均偏差**(Mean Deviation)」の3組に到達します。どういう事なのでしょうか? 順を追って見ていく事にしましょう。

###偏差(<font color=blue>Deviation</font>)の合計自体は0

[統計学的画像再構成法であるOSEMアルゴリズムの基礎論](http://plaza.umin.ac.jp/~ksnm/osem/1_2.html)

まずは(母平均μ（ミュー）を中心位置、母標準偏差σ（シグマ）をばらつき具合とする未知の分布によって構成される)**母集合**(Parameter=パラメータ)からn個の**標本集合**(Sample Set)$[x_1,…,x_n]$を抽出し、その「標本平均(Sample Mean)」を求めます。

```math
\hat{μ}=\overline{x} = \frac{1}{n}\sum_{ i = 1 }^{ n } x_i
```
この**標本集合**の偏差(Deviation)すなわち各データから平均値を引いた結果の合計は必ず0となります。

```math
\sum_{ i = 1 }^{ n } x_i-\overline{x}=(x_1-\overline{x})+…+(x_n-\overline{x})=0
```

試しに「**とある架空の喫茶店の7日分の売り上げ**(データランダム生成)」で計算すると…

```python
import sympy as sp
import numpy as np
import pandas as pd
from scipy import stats
a=[8900,2950,14400,22750,4350,14400,22150]
print("リスト表現")
print(a)
print("平均")
print(np.round(np.mean(a)))
print("偏差")
print(a-np.round(np.mean(a)))
print("偏差計")
print(sum(a-np.round(np.mean(a))))
```

```python
リスト表現
[8900, 2950, 14400, 22750, 4350, 14400, 22150]
平均
12843.0
偏差
[-3943. -9893.  1557.  9907. -8493.  1557.  9307.]
偏差計
-1.0
```

四捨五入による誤差の結果、中心が「**ちょうど0**」にはなりませんが、イメージ的には大体こんな感じ。群論でいうと「**加法単位元と加法逆元が設定された加法群**」に射影された状態に該当する様です。統計学における**標準化**(Standardization)にはそういうニュアンスもあったのですね。
[【数理考古学】群論概念(Group Theory Concept)①基本定義](https://qiita.com/ochimusha01/items/208dc0e68db64805e4f7)
![image.gif](https://qiita-user-contents.imgix.net/https%3A%2F%2Fstaging-qiita-user-contents.imgix.net%2Fhttps%253A%252F%252Fcdn-ak.f.st-hatena.com%252Fimages%252Ffotolife%252Fo%252Fochimusha01%252F20210411%252F20210411224605.gif%3Fixlib%3Drb-4.0.0%26auto%3Dformat%26gif-q%3D60%26q%3D75%26w%3D1400%26fit%3Dmax%26s%3D2d8b5f86be1b58f0579cd3a0cd058ca9?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&w=1400&fit=max&s=eee42a87b8bd979c7da04d011c35ffc1)

ただし、この考え方ではデータのばらつき具合を把握出来ないので、さらに考え方を発展させなくてはいけません。

###標本分散(<font color=blue>Sample Dispersion</font>)/標本偏差(<font color=blue>Sample Dispersion</font>)

numpyがデフォルトで立拠する**分散**と**偏差**の概念です。

* **標本分散**(Sample Dispersion)…偏差^2の合計/標本数

```math
s^2 = \frac{1}{n}\sum_{i=1}^{n}  (x_i – \bar{x})^2
```

* **標本偏差**(Sample Dispersion)…標本分散の平方根

```math
s = \sqrt{\frac{1}{n}\displaystyle \sum_{ i = 1 }^{ n } (x_i-\overline{x})^2}
```
上掲の「**架空の喫茶店NO枚日の売り上げ**」の例でいうと、その開店が1週間限定だったら全データが列記されている事になり、こちらの計算が採用されます。

###不偏分散(<font color=blue>Sample Dispersion</font>)/標準偏差(<font color=blue>Sample Dispersion</font>)

padasが立拠する**分散**と**偏差**の概念です。何やら出自が胡散臭い「**平均への回帰**」理論を使いますが、確かに計算上はこちらの方が正解に近づくのです。
[平均への回帰 -Wikipedia](https://ja.wikipedia.org/wiki/%E5%B9%B3%E5%9D%87%E3%81%B8%E3%81%AE%E5%9B%9E%E5%B8%B0)
[【初心者向け】標本分散と不偏分散](https://qiita.com/ochimusha01/items/a628caaa607bc3b8157f)

* **不偏分散**(Unbiased Dispersion)…偏差^2の合計/（標本数-1）

```math
s^2 = \frac{1}{n-1}\sum_{i=1}^{n}  (x_i – \bar{x})^2
```
* **標準偏差**(Standard Deviation)…不偏分散の平方根

```math
S = \sqrt{\frac{1}{n-1}\displaystyle \sum_{ i = 1 }^{ n } (x_i-\overline{x})^2}
```
上掲の「**架空の喫茶店NO枚日の売り上げ**」の例でいうと、そのデータは連日の売り上げ集合から7日分だけ抽出した結果なら「**母分散は別に実際する**」と想定せざるを得なくなり、こちらの計算が採用されます。確かにまぁ、普通はそう考えるものなんです?

* ちなみにいわゆる「**正規分布**(Normal Distribution)」が**平均**(中央値0)同様にパラメーターとして使用する**分散**(中央値1)は、この**不偏分散**の方です。<br>[【初心者向け】正規分布とは何か？](https://qiita.com/ochimusha01/items/fe73ddf6e3e8cb08fbee)<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/5ce28946-4a7c-b7a3-039e-d3970c0d205e.png)
<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/bc3b1c8d-8e74-f02c-7af0-add779895692.png)
<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/b2dbfe5c-4044-ac4d-5986-7f36871bcf84.png)

* ちなみにnumpyの`std`関数も引数として`ddof=1`を与える事で**不偏分散**/**標準偏差**を扱う様になります。ddofは**Delta Degrees of Freedom**の略との事。<br>[numpy.varやnumpy.stdの自由度](http://taustation.com/numpy-var-std-ddof/)

```python
import sympy as sp
import numpy as np
import pandas as pd
from scipy import stats
a=[8900,2950,14400,22750,4350,14400,22150]
print("リスト表現")
print(a)
print("np var ddof=0")
print(np.var(a,ddof=0))
print("np std ddof=0")
print(np.std(a,ddof=0))
print("np var ddof=1")
print(np.var(a,ddof=1))
print("np std ddof=1")
print(np.std(a,ddof=1))
x=pd.DataFrame(a,columns=["Daily Total"])
print("Dataframe表現")
print(x)
print("np var ddof=0")
print(np.round(x.var(),decimals=2))
print("np var ddof=1")
print(np.round(x.std(),decimals=2))
```

```python
リスト表現
[8900, 2950, 14400, 22750, 4350, 14400, 22150]
np var ddof=0
53595306.12244898
np std ddof=0
7320.88151266287
np var ddof=1
62527857.14285714
np std ddof=1
7907.455794555993
Dataframe表現
   Daily Total
0         8900
1         2950
2        14400
3        22750
4         4350
5        14400
6        22150
np var ddof=0
Daily Total    62527857.14
dtype: float64
np var ddof=1
Daily Total    7907.46
dtype: float64
```
「**統計学における自由度**」の考え方自体はこちらを参照して下さい。
[自由度 | 統計学の時間 | 統計WEB - BellCurve](https://bellcurve.jp/statistics/course/14989.html)

>**自由度**(Degrees of Freedom)とは、ある変数において自由な値をとることのできるデータの数。例えばn個のデータ$x_1,x_2,…x_n$があるとき、これらはどれも自由な値を取りうるので自由度はnである。
>
>ところが平均値$\bar{x}=a$の時、平均値が変わらないようにする為に$n-1$個の$x_i$は自由な値を取りうるが、n個目の$x_n$は自由な値を取る事が出来ず、この時自由度はn-1となる。一般にn個のデータの間でk個の条件があるとき、自由度はn-kとなる。

あれ、もしかしてこの話、四元数a+bi+cj+dkにおいてijkのうちどれか2つが決まると残りの選択範囲が狭められる件と重なる？
[【Rで球面幾何学】ハミルトンの四元数(Hamilton's Quaternion)は何を表しているのか？](https://qiita.com/ochimusha01/items/aff8d52f20af01d13bed)
ijk=-1
![image.gif](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn-ak.f.st-hatena.com%2Fimages%2Ffotolife%2Fo%2Fochimusha01%2F20210326%2F20210326032718.gif?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&w=1400&fit=max&s=2e7188cbde940f424167c5453a4ea06d)
ji-k=-1(iを戻す場合)
![image.gif](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn-ak.f.st-hatena.com%2Fimages%2Ffotolife%2Fo%2Fochimusha01%2F20210326%2F20210326101827.gif?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&w=1400&fit=max&s=19b706a8da8dd1d360fe0123956d7b9c)
ji-k=-1(jを戻す場合)
![image.gif](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn-ak.f.st-hatena.com%2Fimages%2Ffotolife%2Fo%2Fochimusha01%2F20210326%2F20210326143809.gif?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&w=1400&fit=max&s=6ae8c73eac17e31d262307bd809859f3)
jki=-1
![image.gif](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn-ak.f.st-hatena.com%2Fimages%2Ffotolife%2Fo%2Fochimusha01%2F20210326%2F20210326040026.gif?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&w=1400&fit=max&s=fb6099f5e298151b24d727f05b4b72b4)
kj-i=-1
![image.gif](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn-ak.f.st-hatena.com%2Fimages%2Ffotolife%2Fo%2Fochimusha01%2F20210327%2F20210327040629.gif?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&w=1400&fit=max&s=03e0f9d351e8ec6f0d6f65a23121f5b1)
kij=-1
![image.gif](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn-ak.f.st-hatena.com%2Fimages%2Ffotolife%2Fo%2Fochimusha01%2F20210326%2F20210326052248.gif?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&w=1400&fit=max&s=b8f322f6a50fca36476fc975990ec851)
ik-j=-1
![image.gif](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn-ak.f.st-hatena.com%2Fimages%2Ffotolife%2Fo%2Fochimusha01%2F20210327%2F20210327041839.gif?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&w=1400&fit=max&s=d0be9f51c6e969de7aa7365209953ee9)

ところで「**原点ゼロからの自乗を取る**」とは行列演算の二次形式で表現すると以下となります。
[【Python演算処理】行列演算の基本③パスカルの三角形から二次形式へ](https://qiita.com/ochimusha01/items/97f8354035dc3f824fc3)

```math
\left[\begin{matrix}a & b\end{matrix}\right]\left[\begin{matrix}0 & 0\\0 & 1\end{matrix}\right]\left[\begin{matrix}a\\b\end{matrix}\right]=\left[\begin{matrix}b^{2}\end{matrix}\right]
```
【参考】**二次形式行列**における「**マスキング**」

```python
import sympy as sp
a,b = sp.symbols('a,b')
#Rows
x=sp.Matrix([[a,b]])
#Columns
y=sp.Matrix([[a],[b]])
a00=sp.Matrix([[1,1],[1,1]])
a11=sp.Matrix([[1,0],[0,0]])
a12=sp.Matrix([[0,1],[0,0]])
a21=sp.Matrix([[0,0],[1,0]])
a22=sp.Matrix([[0,0],[0,1]])
sp.init_printing()
display(x) 
display(a00) 
display(a11) 
display(a12) 
display(a21) 
display(a22) 
display(y) 
display(sp.simplify(x*a00*y)) 
print(sp.latex(x)+sp.latex(a00)+sp.latex(y)+"="+sp.latex(sp.simplify(x*a00*y)))
display(sp.simplify(x*a11*y)) 
print(sp.latex(x)+sp.latex(a11)+sp.latex(y)+"="+sp.latex(sp.simplify(x*a11*y)))
display(sp.simplify(x*a12*y)) 
print(sp.latex(x)+sp.latex(a12)+sp.latex(y)+"="+sp.latex(sp.simplify(x*a12*y)))
display(sp.simplify(x*a21*y)) 
print(sp.latex(x)+sp.latex(a21)+sp.latex(y)+"="+sp.latex(sp.simplify(x*a21*y)))
display(sp.simplify(x*a22*y)) 
print(sp.latex(x)+sp.latex(a22)+sp.latex(y)+"="+sp.latex(sp.simplify(x*a22*y)))
```

```math
\left[\begin{matrix}a & b\end{matrix}\right]\left[\begin{matrix}1 & 1\\1 & 1\end{matrix}\right]\left[\begin{matrix}a\\b\end{matrix}\right]=\left[\begin{matrix}\left(a + b\right)^{2}\end{matrix}\right]\\
\left[\begin{matrix}a & b\end{matrix}\right]\left[\begin{matrix}1 & 0\\0 & 0\end{matrix}\right]\left[\begin{matrix}a\\b\end{matrix}\right]=\left[\begin{matrix}a^{2}\end{matrix}\right]\\
\left[\begin{matrix}a & b\end{matrix}\right]\left[\begin{matrix}0 & 1\\0 & 0\end{matrix}\right]\left[\begin{matrix}a\\b\end{matrix}\right]=\left[\begin{matrix}a b\end{matrix}\right]\\
\left[\begin{matrix}a & b\end{matrix}\right]\left[\begin{matrix}0 & 0\\1 & 0\end{matrix}\right]\left[\begin{matrix}a\\b\end{matrix}\right]=\left[\begin{matrix}a b\end{matrix}\right]\\
\left[\begin{matrix}a & b\end{matrix}\right]\left[\begin{matrix}0 & 0\\0 & 1\end{matrix}\right]\left[\begin{matrix}a\\b\end{matrix}\right]=\left[\begin{matrix}b^{2}\end{matrix}\right]
```
$\sqrt{x^2}=x$があまりに**自明の場合**(Trival Case)っぽく見えるので、それがユークリッド距離演算$\sqrt{0+x^2}$によって等長性が保証された空間への射影とも見て取れる事をつい失念してしまいます。そもそも、それら全てがいわゆる**正規分布**のBellCurve自体がこの方法によって(極座標系における)**円状分布**から**平面**に射影された結果である事に対応しているのですね。
[【初心者向け】正規分布(Normal Distribution)とは何か？](https://qiita.com/ochimusha01/items/fe73ddf6e3e8cb08fbee)
![image.gif](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F597772%2F2a47e27f-a365-3565-5a35-d09a5719e5d6.gif?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&w=1400&fit=max&s=48a876525f43606184b72de77dcec4db)

* ただしこの空間自体は(中心を定める為の)**スカラー演算**と(そうして検出された中心からの距離を扱う)**加減算**の概念こそ存在するものの(ベクトル空間ではある)、まだ角度の概念を備えていない（内積が計算可能なベクトル計量空間ではない）。

###平均偏差(<font color=blue>Mean Deviation</font>)

**標準偏差**も**標本偏差**も**平均**(Mean)の概念を代表値に選ぶ点は同じですが、**平均偏差**は**中央値**(Median)を代表値とする**要約統計量**(Summary Statistics)です。
[【初心者向け】平均と標準偏差、中央値と平均偏差](https://qiita.com/ochimusha01/items/971d62ebc5e4cac6a61b)

* **平均偏差**(Mean Deviation)

```math
s = \frac{1}{n}\sum_{i=1}^{n}  |x_i – \bar{x}|
```

試しに「**とある架空の喫茶店の7日分の売り上げ**(データランダム生成)」で計算すると…

```python
import sympy as sp
import numpy as np
import pandas as pd
from scipy import stats
a=[8900,2950,14400,22750,4350,14400,22150]
print("リスト表現")
print(a)
print("平均")
print(np.round(np.mean(a)))
print("偏差")
print(a-np.round(np.mean(a)))
print("偏差の絶対値")
print(abs(a-np.round(np.mean(a))))
print("偏差の絶対値計")
print(sum(abs(a-np.round(np.mean(a)))))
```

```python
リスト表現
[8900, 2950, 14400, 22750, 4350, 14400, 22150]
平均
12843.0
偏差
[-3943. -9893.  1557.  9907. -8493.  1557.  9307.]
偏差の絶対値
[3943. 9893. 1557. 9907. 8493. 1557. 9307.]
偏差の絶対値計
44657.0
```

そういえば**正規化**(Feature Scaling)には「**最小値0、最大値1への正規化**(Min-Max Normalization)」なんて考え方もあるのです。

```math
x'=\frac{x-min(x)}{max(x)-min(x)}
```

```python
import sympy as sp
import numpy as np
import pandas as pd
from scipy import stats
a=[8900,2950,14400,22750,4350,14400,22150]
print("リスト表現")
print(a)
print("Min(0)-Max(1) Normalization")
print((a-np.round(min(a)))/(max(a)-min(a)))
```

```python
リスト表現
[8900, 2950, 14400, 22750, 4350, 14400, 22150]
Min(0)-Max(1) Normalization
[0.30050505 0.         0.57828283 1.         0.07070707 0.57828283
 0.96969697]
```
群論的志向様式に寄せるなら「**最小値-1、最大値1への正規化**(Min-Max Normalization)」なんて考え方も出来るかもしれません。

```math
x'=2\frac{x-min(x)}{max(x)-min(x)}-1
```

```python
import sympy as sp
import numpy as np
import pandas as pd
from scipy import stats
a=[8900,2950,14400,22750,4350,14400,22150]
print("リスト表現")
print(a)
print("Min(-1)-Max(1) Normalization")
print(((a-np.round(min(a)))/(max(a)-min(a)))*2-1)
```

```python
リスト表現
[8900, 2950, 14400, 22750, 4350, 14400, 22150]
Min(-1)-Max(1) Normalization
[-0.3989899  -1.          0.15656566  1.         -0.85858586  0.15656566
  0.93939394]
```
本来ならこれらは状況によって使い分けるのが正しいのでしょうが、結果として一時期(特に20世紀後半)**不偏分散**/**標準偏差**を絶対視するイデオロギーが広まりました。この辺り本当に注意が必要です。

##標準得点（<font color=blue>z得点</font>）への変換と偏差値（<font color=blue>Deviation Value</font>）
[Z値とは](https://support.minitab.com/ja-jp/minitab/19/help-and-how-to/statistics/basic-statistics/supporting-topics/tests-of-means/what-is-a-z-value/)

>Z値とは、標準偏差の単位で観測統計量とその仮説母集団パラメータの差を測定するZ検定の統計量です。
>
>観測値をZ値に変換することを標準化と呼びます。母集団の観測値を標準化するには、対象の観測値から母集団平均を引き、その結果を母集団の標準偏差で除算します。この計算結果が、対象の観測値に関連付けられるZ値です。
>
>Z値を使用して、帰無仮説を棄却するかどうかを判断できます。帰無仮説を棄却するかどうかを判断するには、Z値を棄却値と比較します。これは、ほとんどの統計の教科書の標準正規表に示されています。棄却値は、両側検定の場合はZ1-α/2、片側検定の場合はZ1-αです。Z値の絶対値が棄却値より大きい場合、帰無仮説を棄却します。そうでない場合、帰無仮説を棄却できません。

* **Z得点**(Z Value)…$\frac{偏差}{標準偏差}$
* **偏差値**(Deviation Value)…Z得点*10+50

[【python】pandasでデータを標準得点（z得点）に変換](https://www.haya-programming.com/entry/2018/04/24/223626)

>データの正規化（標準化）とは、データを分散1、平均0に変換する操作である。

[Pythonで正規化・標準化（リスト、NumPy配列、pandas.DataFrame）](https://note.nkmk.me/python-list-ndarray-dataframe-normalize-standardize/)

①z得点と偏差値の計算(デフォルト)

```python
import sympy as sp
import numpy as np
import pandas as pd
from scipy import stats
a=[8900,2950,14400,22750,4350,14400,22150]
A1=stats.zscore(a)
print("z得点")
print(A1)
A2=A1*10+50
print("偏差値")
print(A2)
x=pd.DataFrame(a,columns=["Daily Total"])
X1=x.apply(stats.zscore)
print("z得点")
print(X1)
X2=X1*10+50
print("偏差値")
print( X2)
```

```math
z得点 \\
[-0.53857683 -1.35132048  0.21269882  1.35327185 -1.16008668  0.21269882
  1.27131451] \\
偏差値 \\
[44.61423172 36.48679517 52.1269882  63.53271848 38.39913318 52.1269882
 62.71314505]
```

```python
z得点
   Daily Total
0    -0.538577
1    -1.351320
2     0.212699
3     1.353272
4    -1.160087
5     0.212699
6     1.271315
偏差値
   Daily Total
0    44.614232
1    36.486795
2    52.126988
3    63.532718
4    38.399133
5    52.126988
6    62.713145
```

②z得点と偏差値の計算(ddof=0)=$\frac{偏差}{標本偏差}$(*10+50)

```python
import sympy as sp
import numpy as np
import pandas as pd
from scipy import stats
a=[8900,2950,14400,22750,4350,14400,22150]
A1=stats.zscore(a,ddof=0)
print("z得点")
print(A1)
A2=A1*10+50
print("偏差値")
print(A2)
x=pd.DataFrame(a,columns=["Daily Total"])
X1=x.apply(stats.zscore,ddof=0)
print("z得点")
print(X1)
X2=X1*10+50
print("偏差値")
print( X2)
```

```math
z得点 \\
[-0.53857683 -1.35132048  0.21269882  1.35327185 -1.16008668  0.21269882
  1.27131451] \\
偏差値 \\
[44.61423172 36.48679517 52.1269882  63.53271848 38.39913318 52.1269882
 62.71314505]
```

```python
z得点
   Daily Total
0    -0.538577
1    -1.351320
2     0.212699
3     1.353272
4    -1.160087
5     0.212699
6     1.271315
偏差値
   Daily Total
0    44.614232
1    36.486795
2    52.126988
3    63.532718
4    38.399133
5    52.126988
6    62.713145
```

③z得点と偏差値の計算(ddof=1)=$\frac{偏差}{標準偏差}$(*10+50)

```python
import sympy as sp
import numpy as np
import pandas as pd
from scipy import stats
a=[8900,2950,14400,22750,4350,14400,22150]
A1=stats.zscore(a,ddof=1)
print("z得点")
print(A1)
A2=A1*10+50
print("偏差値")
print(A2)
x=pd.DataFrame(a,columns=["Daily Total"])
X1=x.apply(stats.zscore,ddof=1)
print("z得点")
print(X1)
X2=X1*10+50
print("偏差値")
print( X2)
```

```math
z得点 \\
[-0.49862525 -1.25107966  0.19692084  1.25288628 -1.07403157  0.19692084
  1.17700852] \\
偏差値 \\
[45.01374747 37.48920335 51.96920843 62.52886278 39.25968432 51.96920843
 61.77008522]
```

```python
z得点
   Daily Total
0    -0.498625
1    -1.251080
2     0.196921
3     1.252886
4    -1.074032
5     0.196921
6     1.177009
偏差値
   Daily Total
0    45.013747
1    37.489203
2    51.969208
3    62.528863
4    39.259684
5    51.969208
6    61.770085
```
母集団からのランダムサンプリングの場合は③が使われます。偏差値が**百点満点のテスト**(最低得点0点,最高得点100点)のイメージに立脚する評価空間ながら、大元のZ得点の特徴から0点以下や100点以上も扱える点に注意して下さい。しかしまぁ大抵は例えデータとして現れても**外れ値**(Outliers)として切り捨てられてしまう事でしょう。

* 言葉としての「**偏差値**」が20世紀の受験戦争以降一般にも定着しましたが、その過程でその内容についての誤解も広まりました。この辺りもまた注意が必要です。<br>[【無限遠点を巡る数理】無限遠点としての正規分布と分散概念の歴史](https://qiita.com/ochimusha01/items/15326f0c787a55f174cc)

こうして全体像を俯瞰してみると**統計データにおける標準化**(スカラー倍率を抽出して増減範囲を1にまとめ行列演算的に対角化する)と**行列演算における標準化**(同じくスカラー倍率を抽出して値1の直行行列概念を援用)にある種の相似性が見て取れるのです。<br>[２次形式の標準化](https://ramenhuhu.com/math-quadratic_form)

#正規分布(<font color=blue>Normal Distribution</font>)を母集合分布として想定した展開

正規分布を母集合分布として想定すると何が嬉しいって、以下の様な計算が可能となるのです。

##標準誤差（<font color=blue>SE：Standard Srror</font>）
[標準偏差と標準誤差](https://bellcurve.jp/statistics/course/8616.html)

>推定量の標準偏差であり、標本から得られる推定量そのもののバラつき（＝精度）を表します。一般に「**標本平均の標準偏差**」を意味し、その計算に「**中心極限定理**」を使います。
>
>「**中心極限定理**」は、平均μ、分散σに従う母集団からサンプルサイズnの標本を抽出する時、その平均値の分布はnが大きくなるにつれ**正規分布**$N(μ,\frac{σ^2}{N})$に近づくと考えます。すなわち**標本平均の標準偏差**は以下に近づくのです。

```math
\sqrt{\frac{σ^2}{N}}=\frac{σ}{\sqrt{N}}
```

>ただし、標本の分散は$σ^2$ではなく不偏分散$s^2$を用いることから、標本平均の標準偏差（＝標準誤差SE）は標準偏差sを用いて次の式から計算できます。

```math
SE=\frac{s}{\sqrt{N}}=\frac{\sqrt{\frac{1}{n-1}\displaystyle \sum_{ i = 1 }^{ n } (x_i-\overline{x})^2}}{\sqrt{N}}
```
>標準誤差は、母集団から抽出された標本から標本平均を求める場合、標本平均の値が母平均に対してどの程度ばらついているかを表すものです。サンプルサイズが大きくなると標準誤差は小さくなります。

[「統計備忘録」 標準誤差](https://bellcurve.jp/statistics/blog/14057.html)

>標準誤差はｎの二乗根に反比例することになりますから、サンプルサイズを４倍にすれば標準誤差は半分になります。

```python
import sympy as sp
import numpy as np
import pandas as pd
from scipy import stats
a=[126,224,34,25,199,89,178,14,38,11]
A1=np.std(a,ddof=1)
print("標準偏差")
print(A1)
A2=A1/np.sqrt(len(a))
print("標準誤差")
print(A2)
```

```python
標準偏差
82.202730422346
標準誤差
25.994785801942832
```

##統計的仮説検定(<font color=blue>Testing of Statistical Hypothes</font>)
[Pythonで統計学を学ぶ(4)](http://whitewell.sakura.ne.jp/PythonProbStat/Python-statistics4.html)
頭がこんがらがってしまったので、以下にまとめ直しました。
[【Pyrhon演算処理】確率密度空間と累積分布空間①記述統計との狭間](https://qiita.com/ochimusha01/items/28b68c8783fb3d3a719d)
こういう定義もありますが…

[統計科学事典，清水良一訳](https://www.ism.ac.jp/~ayaka/2017_gairon_1.pdf)(https://www.ism.ac.jp/~ayaka/2017_gairon_1.pdf)
>記述統計学とはデータのもっている主要な特性をより鮮明に表現するために，データを要約したり作表をしたりすること一般を指する。

まぁこの辺りが「<font color=purple>とりあえず手元データ自体を母集合と考える</font>」**記述統計学**(Descriptive Statistics)と「<font color=purple>手元データは母集合から抽出した部分標本に過ぎない</font>」と考える**推計統計学**(Inferential Statistics)の基本的態度の境界線となってくる訳で、そこに「**大数の法則**」概念より発展した正規分布の概念が密接に絡んでくる訳です。
[記述統計学と推計統計学の違い](https://ai-trend.jp/basic-study/basic/inductive-statistics/)

#相関係数(<font color=blue>Correlation Coefficient</font>)から単回帰分析(<font color=blue>Simple Regression Analysis</font>)へ。
[相関係数の意味と求め方 - 公式と計算例](https://sci-pursuit.com/math/statistics/correlation-coefficient.html#2)

```math
\begin{align*} r &= \frac{s_{xy}}{s_xs_y} \\[5pt] &= \frac{\frac{1}{n(-1)}\sum_{i=1}^n(x_i-\overline{x})(y_i-\overline{y})}{\sqrt{\frac{1}{n(-1)}\sum_{i=1}^n(x_i-\overline{x})^2}\sqrt{\frac{1}{n(-1)}\sum_{i=1}^n(y_i-\overline{y})^2}} \end{align*}=\frac{\sum_{i=1}^n(x_i-\overline{x})(y_i-\overline{y})}{\sqrt{\sum_{i=1}^n(x_i-\overline{x})^2}\sqrt{\sum_{i=1}^n(y_i-\overline{y})^2}}
```

>相関係数を求めるには、共分散をそれぞれの変数の標準偏差で割ります。
>具体的には次の6つのステップで求めます。
>
>①それぞれの変数の**平均値**を求める。
>②それぞれの変数の**偏差**（数値－平均値）を求める。
>③それぞれの変数の**分散**（偏差の二乗平均）を求める。
>④それぞれの変数の**標準偏差**（分散の正の平方根）を求める。
>⑤**共分散**（偏差の積の平均）を求める。
>⑥**共分散**を**2つの変数の標準偏差の積**で割って相関係数を得る。

式にもあります様に($\frac{1}{n}$項だろうが$\frac{1}{n-1}$項だろうが最終的に分母と分子で打ち消し合うので)**標本相関係数**(Sample Correlation Coefficient)と**不偏相関係数**(Unbiased Correlation Coefficient)は一致します。

```python
import sympy as sp
import numpy as np
import pandas as pd
from scipy import stats

#元データ
#A~Eさんの英語(x)と数学(y)のテスト結果。
x=[50,60,70,80,90]
y=[40,70,90,60,100]
print("データx")
print(x)
print("データy")
print(y)

#①それぞれの変数の平均値を求める。
x_mean=np.mean(x)
print("x平均")
print(x_mean)
y_mean=np.mean(y)
print("y平均")
print(y_mean)

#②それぞれの変数の偏差（数値－平均値）を求める。
x_deviation=x-x_mean
print("x偏差")
print(x_deviation)
y_deviation=y-y_mean
print("y偏差")
print(y_deviation)

#③それぞれの変数の分散（偏差の二乗平均）を求める。
x_sample_var=np.var(x,ddof=0)
x_unbiased_var=np.var(x,ddof=1)
print("x標本分散")
print(x_sample_var)
print("x不偏分散")
print(x_unbiased_var)
y_sample_var=np.var(y,ddof=0)
y_unbiased_var=np.var(y,ddof=1)
print("y標本分散")
print(y_sample_var)
print("y不偏分散")
print(y_unbiased_var)

#④それぞれの変数の標準偏差（分散の正の平方根）を求める。
x_sample_std=np.std(x,ddof=0)
x_unbiased_std=np.std(x,ddof=1)
print("x標本偏差")
print(x_sample_std)
print("x不偏偏差")
print(x_unbiased_std)
y_sample_std=np.std(y,ddof=0)
y_unbiased_std=np.std(y,ddof=1)
print("y標本偏差")
print(y_sample_std)
print("y不偏偏差")
print(y_unbiased_std)

#⑤**共分散**（偏差の積の平均）を求める。
xy_sample_cov=sum(x_deviation*y_deviation)/len(x)
xy_unbiased_cov=sum(x_deviation*y_deviation)/(len(x)-1)
print("xy標本共分散")
print(xy_sample_cov)
print(np.cov(x,y,bias=True))
print("x不偏共分散")
print(xy_unbiased_cov)
print(np.cov(x,y,bias=False))

#⑥共分散を2つの変数の標準偏差の積で割って相関係数を得る。
xy_sample_cor=sum(x_deviation*y_deviation)/len(x)
xy_unbiased_cor=sum(x_deviation*y_deviation)/len(x)
print("xy共分散")
print(np.corrcoef(x,y))
```

```python
データx
[50, 60, 70, 80, 90]
データy
[40, 70, 90, 60, 100]
x平均
70.0
y平均
72.0
x偏差
[-20. -10.   0.  10.  20.]
y偏差
[-32.  -2.  18. -12.  28.]
x標本分散
200.0
x不偏分散
250.0
y標本分散
456.0
y不偏分散
570.0
x標本偏差
14.142135623730951
x不偏偏差
15.811388300841896
y標本偏差
21.354156504062622
y不偏偏差
23.874672772626646
xy標本共分散
220.0
[[200. 220.]
 [220. 456.]]
x不偏共分散
275.0
[[250. 275.]
 [275. 570.]]
xy共分散
[[1.        0.7284928]
 [0.7284928 1.       ]]
```
`numpy.cov()`は共分散行列、`numpy.corrcoef()`は相関行列を返しますが、これはこう見ます。
[[1つ目のデータと1つ目のデータ,  1つ目のデータと2つ目のデータ],
 [2つ目のデータと1つ目のデータ, 2つ目のデータと2つ目のデータ]]

[NumPyの共分散を求める関数np.cov関数の使い方](https://deepage.net/features/numpy-cov.html)
[Pythonで相関係数を求める方法を現役エンジニアが解説【初心者向け】](https://techacademy.jp/magazine/41266)

相関係数は−1から1までの値をとり、1であれば2つの変数の値は完全に同期している事になります。対象によって相関係数の意味はかなり変わってきますが、一般的見方は以下。

* −1〜−0.7…強い負の相関
* −0.7〜−0.4…かなりの負の相関
* −0.4〜−0.2…やや負の相関
* −0.2〜0.2…ほとんど相関なし
* 0.2〜0.4…やや正の相関
* 0.4〜0.7…かなりの正の相関
* 0.7〜1…強い正の相関

単なる線形関係ではなく、楕円関数を介した結びつきとなります。
[【初心者向け】方形描画関数①三角関数との関係。](https://qiita.com/ochimusha01/items/9183360c0009cfac5b04)
![image.gif](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-user-contents.imgix.net%2Fhttps%253A%252F%252Fcdn-ak.f.st-hatena.com%252Fimages%252Ffotolife%252Fo%252Fochimusha01%252F20201218%252F20201218180039.gif%3Fixlib%3Drb-4.0.0%26auto%3Dformat%26gif-q%3D60%26q%3D75%26w%3D1400%26fit%3Dmax%26s%3D978776231763907e23755df7e2ea2d54?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&w=1400&fit=max&s=524789b60a6419f9c6fd9582ca8d003d)
![image.gif](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-user-contents.imgix.net%2Fhttps%253A%252F%252Fcdn-ak.f.st-hatena.com%252Fimages%252Ffotolife%252Fo%252Fochimusha01%252F20201218%252F20201218063808.gif%3Fixlib%3Drb-4.0.0%26auto%3Dformat%26gif-q%3D60%26q%3D75%26w%3D1400%26fit%3Dmax%26s%3Dbeeb53760f174b66366ac2998043c251?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&w=1400&fit=max&s=6791a885f4d890294fed4b3d3ab9a3e0)
背景に固有値と固有ベクトルの概念が存在する?
[【Python演算処理】行列演算の基本③パスカルの三角形から二次形式へ](https://qiita.com/ochimusha01/items/97f8354035dc3f824fc3)

このデータでは「**強い正の相関**」が検出されたので、さらに**最小二乗法**(Least Squares Method)による**単回帰分析**(Simple Regression Analysis)へと進みます。

[Numpyだけで回帰分析その4。polyfit()について。](https://chayarokurokuro.hatenablog.com/entry/2020/01/22/190133)

```python
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

#元データ
#A~Eさんの英語(x)と数学(y)のテスト結果。
xo=[50,60,70,80,90]
yo=[40,70,90,60,100]
print("データx")
print(xo)
print("データy")
print(yo)

#Z得点化
x=stats.zscore(x,ddof=1)
y=stats.zscore(y,ddof=1)
print("データx(標準化)")
print(np.round(x,decimals=3))
print("データy(標準化)")
print(np.round(y,decimals=3))

# 近似線の係数を算出
k = np.polyfit(x, y, 1)
a,b=k
#適当にx軸の両端の値
x_reg = np.array([-1.5, 1.5])
#直線の式を作って配列xを代入
y_reg = a * x_reg + b

plt.scatter(x,y)
plt.plot(x_reg, y_reg, color="red")
plt.show()
```

```python
データx
[50, 60, 70, 80, 90]
データy
[40, 70, 90, 60, 100]
データx(標準化)
[-1.265 -0.632 -0.     0.632  1.265]
データy(標準化)
[-1.34  -0.084  0.754 -0.503  1.173]
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/981a5e31-7803-cb12-44de-8ddb4f3b29c3.png)

#21世紀は数理モデルの時代?

冒頭に述べた様に「**行列**」の原語たる「**Matrix**」には「<font color=purple>不換紙幣の如く特定の実体の代替物を超えた何か</font>」なる深淵なニュアンスまで存在するものの、かかる考え方を20世紀末に広めたフランスの思想家ボードリヤールなどは、それほどポジティブな意味では捉えていなかった様なのです。この辺り、同時期広まった「**仮想**(Virtual)」概念に通じるものがあります。当時はまだまだ「<font color=purple>人間の知性は数理を超越して実存する</font>」なる信念が健在だったのです。
[仮想とは - IT用語辞典 e-Words](https://e-words.jp/w/%E4%BB%AE%E6%83%B3.html)

実際、当時その「**シニフィエ**(<font color=blue>Signifié=意味されるもの。当時の流行語の一つ</font>)」の領域は随分と被っていました。惜しくも1980年代末から1990年代にかけては著者高齢化に伴う**ハイファンタジー小説**や**TV系サイバーパンク文学**の衰退、AI冬の時代の到来を迎え、これに有名な**ウォシャウスキー姉妹**(当時は兄弟)**監督映画**「**マトリックス**(Matrix)**三部作**(1999年~2003年)」の成功が続いた訳ですが、かかる時代を**Deep Blue**(<font color=blue>IBMが開発したチェス専用スーパーコンピュータ</font>)が乗り越え(<font color=blue>人間の知性の慎ましい模倣ではなく</font>)ただひたすら「<font color=purple>数理モデルの洗練</font>」を目指す第三次AIブームが始まる訳です。
[シニフィアンとシニフィエ - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%8B%E3%83%95%E3%82%A3%E3%82%A2%E3%83%B3%E3%81%A8%E3%82%B7%E3%83%8B%E3%83%95%E3%82%A3%E3%82%A8)
[「TV系サイバーパンク」という不思議なジャンル](https://ochimusha01.hatenablog.com/entry/2016/08/23/183735)
[AI冬の時代とは!？AIの過去と今後について](https://blog.proglearn.com/2019/09/23/ai%E5%86%AC%E3%81%AE%E6%99%82%E4%BB%A3%E3%81%A8%E3%81%AF%EF%BC%9Fai%E3%81%AE%E9%81%8E%E5%8E%BB%E3%81%A8%E4%BB%8A%E5%BE%8C%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/)
[ディープ・ブルー (コンピュータ) - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%BB%E3%83%96%E3%83%AB%E3%83%BC_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF))
[ディープラーニング - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0)

ようやくこうした景色の一端まで辿り着く事ができました。次回以降はさらにこの考え方を広げていきたいと思います。