数学的基礎
$n$ 個のデーター $x_1$, $x_2$, …, $x_n$ に対し、この平均を $\bar{x}$ と書くとき、 \[ \bar{x} = \frac{1}{n}\sum_{i = 1}^n x_i \] であり、分散 $\sigma^2$ は、 \[ \begin{align*} \sigma^2 & = \frac{1}{n} \sum_{i=1}^n \left(x_i - \bar{x} \right)^2 \\ & = \frac{1}{n} \sum_{i=1}^n x_i^2 - \left(\frac{1}{n} \sum_{i=1}^n x_i\right)^2 \\ & = \overline{x^2} - \bar{x}^2 \end{align*} \] である。
平均を求める関数
概ね以下のようになるであろう。
プログラム例 1
def average(array):
ave = 0 # 初期化を忘れないこと
for data in array:
ave += data
# 以下はまとめて return ave / len(array) とも書ける
ave /= len(array)
return ave
プログラム例 2
次も間違いではない。
def average(array):
ave = 0
for i in range(len(array)):
ave += array[i]
# 以下はまとめて return ave / len(array) とも書ける
ave /= len(array)
return ave
注意点
-
変数の初期化を忘れないこと
-
配列の要素数は
len()
で取得できる -
最後の二行はまとめて
return ave / len(array)
と書くこともできる。 ただしこの場合、ave
が実際の意味と異なる (実際には最終的なave
には平均をn
倍したものが入っている) ので、変数名をave
からn_ave
(平均の $n$ 倍、の意) などに変えた方がよい
二つ目のプログラムの場合は、次の点にも注意のこと
-
配列の添字は 0 から始まる点に注意せよ
-
for ではループ条件に細心の注意を払うこと
分散を求める関数
どの式を使うかによって多少違いは出るが、概ね以下のような感じであろう。
def variance(array):
var = 0
ave = average(array)
for data in array:
var += (data - ave) * (data - ave)
var /= len(array)
return var
注意点
-
二乗の部分は
(data - ave) ** 2
と書いてもよい
検算
問題に指示されたデーターを使って、平均、分散を表示するには、例えば以下のように書ける。
data = [71, 80, 89]
print(average(data), variance(data))
このとき、
80.0 54.0
のように表示されるはずである。