Edited at

[python]算数・数学⑨~統計~


前回まで

前回はこちら


改めて

機械学習を始めるにも、算数や数学がわからないと、入門書すら読めない。ただそこまで、ちゃんと解説してあるものもない。ということで最低限必要な数学基礎をこの記事で書けたらいいなと思っています。


環境

ほぼ影響ないですが、python3系を利用。


前提

四則演算や累乗(2乗とか3乗とか)がわかっていること


統計の変数の扱い


数値の扱い

・整数しかとらない離散型

・小数点以下をとる連続型

という。


数値以外

・順序のない場合は名義尺度

・大中小などの順序がる順序尺度

という。


変数による確率

離散型のサンプルであれば確率質量関数(ppf)で計算することができるが、連続型の変数は確率質量関数(ppf)で計算することができません。連続型の変数は1.00というも数値もあれば、1.01もあり、1.0000001などもあるからぴったり同じ値として計算することができないから。なので連続型のものは積分を使った確率密度関数(pdf)を使います。

例えば身長が174.0cmから176.0cmまでになる確率だったら

\int_{174}^{176} f(x) dx

みたいな感じになります。


統計量の基礎


合計

sum=\sum_{i=1}^nx_𝑖

import scipy as sp

sp.sum(data)
data.sum() #標準ライブラリ

標準のsum関数も使えるが、同じ分析内で行う場合はどちらかで統一する


サンプル数調べる

len(data) #N数を調べる作業は標準ライブラリのlen関数を使う


平均値

\mu=\frac{1}{N}\sum_{i=1}^nx_i

N = len(data)

sum = sp.sum(data)
mu = sum/N

mu = sp.mean(data)#標準ライブラリ


期待値

確率×確率変数 の総和です。

\mu = \sum_{i=1}^n P(x_i)x_i


標本分散

偏差平方和(平均との差の2乗の総和)をサンプル数Nで割る

\sigma^2 = \frac{1}{N}\sum_{i=1}^n(x_i−\mu)^2

sigma2 = sp.sum((data-mu)**2/N) 

sp.var(data,ddof=0) #ddof=0で標本分散
data.var(ddof=0)#標準ライブラリ


不偏分散(母分散推定量)

標本分散は標本のみなので、偏りが出てしまう(=分散を過少にする)ので、不偏分散で割る数を小さくしている(分散を大きくしている)

\sigma^2= \frac{1}{N−1}\sum_{i=1}^n(x_i-\mu)^2

sigma_2 = sp.sum((sample_data-mu)**2/(N-1))

sp.var(data,ddof=1) #ddof=1で不偏分散
sample_data1.var(ddof=1)#標準ライブラリ


標準偏差

\sigma =\sqrt{\sigma^2}= \sqrt{\frac{1}{N−1}\sum_{i=1}^n(x_i−\mu)^2}

sigma = sp.sqrt(sigma_2)

sp.std(data,ddof=1)
data1.std(ddof=1)#標準ライブラリ

#標準ライブラリのデフォルトは、不偏分散ではなく標本分散である


標準化

標準化をすることで、平均0で標準偏差1に変換することができる。単位などが違うものを比較することができる。

\frac{x-\mu}{\sigma}

standard_data = (data-mu)/sigma #標準化 各偏差を標準偏差で割る 


標準誤差

標本平均の標準偏差のことです。言葉が難しいですが。

毎日サイコロを10回振る人の行動を100日間チェックして、

1日目の10回の平均,2日目の10回の平均,3日目,4,・・・100日目の10回の平均を取得します。これらがどれくらいバラついているかが標準誤差です。

母分散(不偏分散)をサンプルサイズで割る。サンプルサイズで割っているので、サンプルサイズが大きくなればなるほど、割る数は大きなり標本平均に近くなります。

stderr = \sqrt{\frac{\sigma^2}{N}}


その他

最大値$argmax$

sp.amax(data)

data.max()

最大値$argmin$

sp.amin(data1)

data1.min()

中央値$argmin$

sp.median(data)

np.median(data)
sample_data1.median() #arrayだとできない?


四分位点

from scipy import stats

stats.scoreatpercentile(data,75) #75パーセンタイル点


基本統計量をまとめて

まとめて上記の基本統計量を出力できます。

dataframe.describe()


共分散

xが大きくなっているときに、yも大きくなるという相関をみるもの。もしくはその逆。

・共分散が0よりも大きい場合は正の相関

・共分散が0よりも小さい場合は負の相関

普通の分散の式とほぼ同じ、xの偏差とyの偏差の掛け算の平均(偏差を2乗してやるイメージ)

Cov(x,y)=\frac{1}{N−1}\sum_{i=1}^n(x_i−\mu_x)(y_i−\mu_y)\\ Cov(𝑥,𝑦)=\frac{1}{N−1}\sum_{i=1}^n(𝑥の偏差)(𝑦の偏差)


分散共分散行列

Cov(x,y)=\left( \begin{array}{cc}\sigma^2_x &Cov(x,y)\\ Cov(x,y)&\sigma^2_y \\ \end{array} \right)\\

sp.cov(x,y,ddof=1)


ピアソンの積率相関係数(共分散を−1~1に補正したようなもの)

P_{xy} = \frac{Cov(x,y)}{\sqrt{\sigma^2_x\sigma^2_y}}

sigma_2_x = sp.var(x,ddof=1)

sigma_2_y = sp.var(y,ddof=1)
rho = cov/sp.sqrt(sigma_2_x*sigma_2_y)
#共分散を、xの分散*yの分散の平方根で、割ったもの
#ddof=1を使っても、ddof=0を使っても結果は一緒

これも同様に一瞬で相関行列が作れる

sp.corrcoef(x,y)


最尤推定

例えばコインを投げた時に「表がでる確率が1/2」だったり、サイコロを振った時に「1がでるか確率が1/6」だったちと、このような最ももっともらしい値を推定することを最尤推定(Likelihood) と言います。

言い換えると、尤度関数$L(\theta)$が最大化するパラメタ$\theta$を考える。

最大化や最小化は微分の考え方を持って、傾きが0になる点を見つけることができます。

\frac{dL(\theta)}{d\theta} = 0

ただしこの$\theta$を考える際に確率の積の計算が多くなり、微分するのがかなり大変なので、対数をかけたものを利用します。これが対数尤度関数です。AICとかの計算でも出てきます。

\frac{d}{d\theta} log_eL(\theta)= 0

例えば、サイコロを100回振って16回1が出た時に最尤推定をしてみます。以下が尤度関数です。

L(\theta) = _{100}C_{16}・\theta^{16}・(1-\theta)^{84}

これの対数を0にします。対数取っているので微分が楽そうですね。

log_eL(\theta) = log_e(_{100}C_{16}・\theta^{16}・(1-\theta)^{84})=0

対数の性質を使って足し算にします。

log_eL(\theta) = log_e{_{100}C_{16}}+log_e\theta^{16}+log_e(1-\theta)^{84}=0

logeXが$\frac{1}{x}$になる性質と、合成関数の微分がわかれば計算が楽です。一応記載します。この際$u=(1-\theta)$と置き換えて計算します。

log_eL(\theta) = 0 +\frac{16}{\theta}+\bigg(\frac{d}{du}84log_eu・\frac{du}{d\theta}\bigg)= 0\\

0 = 0 +\frac{16}{\theta}+\bigg(84\frac{1}{u}・-1\bigg)\\

0 = 0 +\frac{16}{\theta}+\bigg(-\frac{84}{u}\bigg)\\

0 = 0 +\frac{16}{\theta}-\frac{84}{u}\\

0 = 0 +\frac{16}{\theta}-\frac{84}{(1-\theta)}\\

0 = \frac{16}{\theta}-\frac{84}{(1-\theta)}\\

0 = \frac{16(1-\theta)}{\theta(1-\theta)}-\frac{84\theta
}{\theta(1-\theta)}\\

0 = \frac{16(1-\theta)-84\theta}{\theta(1-\theta)}\\

0 = \frac{16-16\theta-84\theta}{\theta-\theta^2}\\

0 = 16-100\theta\\

\theta = 0.16 \\

超絶丁寧に分解して計算しましたが、最尤推定量$\theta$は0.16と求めることができました。今回は一つの推定量でしたが、当然複数で計算することもできます。

このような最尤推定はモデルのパラメタを推定する時に利用をします。


正規分布

平均値に密度が集中しており、左右にいくほど密度が小さくなる、左右対称の分布のことを正規分布と言います。正規分布のパラメタは、平均と分散のみになります。

𝑁(𝑥|𝜇,𝜎2)

正規分布の確率密度は以下のようになります。

N(x|\mu,\sigma^2) = \frac{1}{\sqrt{2\pi\sigma^2}} e^{-\frac{(x-u)^2}{2\sigma^2}}

例えば正規分布に従う時の174.0cmから176.0cmの確率

P(174≤X≤176)\\

=\int_{-\infty}^{176} N(x|\mu,\sigma^2) dx - \int_{-\infty}^{174} N(x|\mu,\sigma^2) dx\\
=\int_{-\infty}^{176} \frac{1}{\sqrt{2\pi\sigma^2}} e^{-\frac{(x-u)^2}{2\sigma^2}} dx - \int_{-\infty}^{174} \frac{1}{\sqrt{2\pi\sigma^2}} e^{-\frac{(x-u)^2}{2\sigma^2}} dx

という感じになります。

#平均168.0,分散100.0の正規分布に置ける確率変数174.0の時の確率密度

import pandas as pd
import numpy as np
import scipy as sp

N174|168.0,10.0^2
x = 174.0
mu = 168.0
sigma = 10.0
1/(sp.sqrt(2*sp.pi*sigma**2))*sp.exp(-((x-mu)**2)/(2*sigma**2))

#stats.norm.pdf(loc=mu,scale=sigma,x=x) #stats.norm.pdf関数で一発

ちなみに累積密度(つまり174.0以下の確率)は

stats.norm.cdf(loc=mu,scale=sigma,x=x)

で簡単にでます。


ここまで

算数・数学の中に統計って分野があるわけではないので、どこまで書くか迷いましたが、ここで終わりにします。