>開発>python>[Pythonで数学]相加平均と標準偏差

相加平均

相加平均は、普段よく耳にする”平均”のことで算術平均とも言います。例えば、国語のテストで、生徒の点数の総和を取り、それを生徒の数で割ると平均が出ます。これを少し、かっこよく数学的な感じで式にまとめてみます。

標本

標本は、統計の対象となるデータの集まりから取り出した一部のデータのことです。国語のテストの例で言えば、生徒個人個人の点数が標本となります。

\(\displaystyle x =  \{ {x_{1}}, {x_{1}},  \cdots , {x_{n}} \} \)

相加平均

相加平均は、標本の総和を標本数で除算することで求められます。

\(\displaystyle \mu =  \frac{{x_{1}} + {x_{1}} + \cdots + {x_{n}}}{n} \)

上記の式は\(\displaystyle \sum\)で、綺麗にまとめることができる。\(\displaystyle \sum\)の部分は、\(\displaystyle {x} \)の\(\displaystyle {i} \)が\(\displaystyle {1} \)から\(\displaystyle {n} \)まであり、その総和を求めるということ。そこに、\(\displaystyle \frac{1}{n} \)を掛ける、つまり\(\displaystyle {n} \)で除算する。

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

Pythonで相加平均を求める

今回は、10人分の生徒の点数の相加平均を求めてみる。

# 標本 : 点数を配列に入れるだけ
x = [95, 56, 74, 80, 67, 66, 59, 89, 75, 48]

# 標本の数 : 配列の要素の数が標本の数
n = len(x)

# 相加平均
avg = 0

# 総和を算出 : for文で標本を展開しsumに足していく
for i in range(n):
    avg += x[i]

# 相加平均 : 標本数で割って相加平均を算出
avg /= n

print(avg)

numpyを使うと1行で平均を求めることができる。

import numpy as np

# 標本
x = [95, 56, 74, 80, 67, 66, 59, 89, 75, 48]
avg = np.array(x).mean()

print(avg)

分散

分散は、データのばらつき具合を表す指標です。標本のそれぞれのデータと相加平均との差の2乗を取り、その平均を求める。相加平均から離れたデータが多ければ多いほど、分散の値は大きくなる。標本のそれぞれのデータと相加平均との差を2乗する理由は、差を取った時に値が負数になる可能性があり、これを含めて総和すると正数と負数で打ち消し合ってしまうため、ばらつき具合がわからなくなってしまうからです。

\(\displaystyle \sum\)の部分は、\(\displaystyle {x} \)の\(\displaystyle {i} \)が\(\displaystyle {1} \)から\(\displaystyle {n} \)まであり、括弧内のでは標本の値(\(\displaystyle x_i \))と相加平均(\(\displaystyle \mu \))との差の2乗を求め、その総和を求めている。そこに、\(\displaystyle \frac{1}{n} \)を掛ける、つまり\(\displaystyle {n} \)で除算する。

\(\displaystyle s^2 =  \frac{1}{n} \sum_{i=1}^{n} (x_i – \mu)^2 \)

標準偏差

標準偏差は、データがどのくらい散らばっているかを表す指標です。一般的には、データの9割が標準偏差の約2倍の範囲に収まります。標準偏差は、分散の平方根を取った値です。

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

Pythonで標準偏差を求める

相加平均を求めた時のデータの標準偏差を求める。

import numpy as np

# 標本
x = [95, 56, 74, 80, 67, 66, 59, 89, 75, 48]

# 相加平均
avg = np.array(x).mean()

# 分散
v = 0.0

# 標本数
n = len(x)

# 相加平均と標本の値の差を取り2乗し足していく
for i in range(n):
  v += (x[i] -avg) ** 2

# 標本数で除算
v /= n

# 平方根を取る
s = np.sqrt(v)

print(s)

これもnumpyを使うと1行で標準偏差を求めることができる。

import numpy as np

# 標本
x = [95, 56, 74, 80, 67, 66, 59, 89, 75, 48]

# 標準偏差
s = np.std(x)

print(s)

因みにpandasでも標準偏差を求めることができる。ddof(Delta Degrees of Freedom : デルタ自由度)は、0とする。

import pandas as pd

# 標本
x = pd.DataFrame([95, 56, 74, 80, 67, 66, 59, 89, 75, 48])

# 標準偏差
s = x.std(ddof=0)

print(s)

標本標準偏差

標準標本偏差もデータのばらつきを表す指標だが、これまでと違うのは全てのデータを使わず、一部をサンプル(標本)として分析するということ。一般に、母集団から一部のデータだけを抽出すると、標準偏差は母集団より小さくなる。

\(\displaystyle {\sigma \geq s} \)

分数は分母が小さくなると数として大きくなる傾向がある。そのため、標準偏差のように標本数\(\displaystyle {n} \)で除算せず、\(\displaystyle {n – 1} \)を除算する。

標本平均

これまでは\(\displaystyle {\mu} \)で表していたが、母集団ではなく一部の標本であることを明示的に表現するために\(\displaystyle {\bar{x}} \)とする。

\(\displaystyle \bar{x} =  \frac{1}{n} \sum_{i=1}^{n}x_i\)

標本標準偏差

これまでは\(\displaystyle {\sigma} \)で表していたが、標本標準偏差であることを明示的に表現するために\(\displaystyle {s^2} \)とする。標準偏差のように標本数\(\displaystyle {n} \)で除算せず、\(\displaystyle {n – 1} \)を除算する。

\(\displaystyle s^2 =  \sqrt{ \frac{1}{n-1} \sum_{i=1}^{n} (x_i – \bar{x})^2} \)

Pythonで標本標準偏差を求める

相加平均を求めた時のデータの標本標準偏差を求める。

import numpy as np

# 標本
x = [95, 56, 74, 80, 67, 66, 59, 89, 75, 48]

# 相加平均
avg = np.array(x).mean()

# 分散
v = 0.0

# 標本数
n = len(x)

# 相加平均と標本の値の差を取り2乗し足していく
for i in range(n):
  v += (x[i] -avg) ** 2

# 標本数で除算
v /= n - 1

# 平方根を取る
s = np.sqrt(v)

print(s)

numpyで標本標準偏差を求める際は、”ddof”を使う。”ddof”が0の場合は\(\displaystyle {n} \)となり、1の場合は\(\displaystyle {n-1} \)となる。また、母集団からランダムの一部のデータを抽出する。

import numpy as np

# 標本
x = [95, 56, 74, 80, 67, 66, 59, 89, 75, 48]

# 抽出する標本数
n = 8

# 標本データからnの数だけランダムに抽出する。
x2 = np.random.choice(x, n)

# 標本標準偏差
s = np.std(x, ddof=1)

print(s)

pandasの場合も、”ddof”を1とする。

import pandas as pd

# 標本
x = pd.DataFrame([95, 56, 74, 80, 67, 66, 59, 89, 75, 48])

# 標本
x = [95, 56, 74, 80, 67, 66, 59, 89, 75, 48]

# 抽出する標本数
n = 8

# 標本データからnの数だけランダムに抽出する。
x2 = np.random.choice(x, n)

# 標準偏差
s = x2.std(ddof=1)

print(s)

数学

記事を読んでいただきありがとうございました。

Page Top