Loading [Contrib]/a11y/accessibility-menu.js

Pythonで平均、中央値、最頻値、分散、標準偏差を算出

Modified: | Tags: Python, 算数・数学

Pythonの標準ライブラリstatisticsを使うと、リストの平均や中央値、最頻値、分散、標準偏差などを取得できる。

本記事で紹介するもの以外にも、調和平均(harmonic mean)や幾何平均(geometric mean)などを算出する関数も提供されている。詳細は上記の公式ドキュメントを参照。

NumPyを使うとより高速な処理が可能(別途インストールが必要)。二次元配列の行・列ごとの演算などもできる。

SciPyを使うとトリム平均(調整平均)の算出も可能。

本記事のサンプルコードではstatisticsをインポートして使う。標準ライブラリなので追加のインストールは不要。検算で平方根を計算するためmathもインポートしている。

import statistics
import math

平均(算術平均、相加平均): statistics.mean()

statistics.mean()で平均(算術平均、相加平均)、すなわち、総和を要素数で割った値を取得できる。

l = [1, 3, 8, 15]

print(statistics.mean(l))
# 6.75

組み込み関数sum()len()を使って平均を算出することも可能。sum()は合計、len()は要素数を返す。

print(sum(l) / len(l))
# 6.75

中央値: statistics.median(), median_low(), median_high()

statistics.median(), median_low(), median_high()で中央値、すなわち、データを昇順または降順に並べたときに中央に位置する値を取得できる。

データの個数が奇数の場合は、いずれも中央の値をそのまま返す。

l = [3, 1, 8]

print(statistics.median(l))
# 3

print(statistics.median_low(l))
# 3

print(statistics.median_high(l))
# 3

データの個数が偶数の場合、statistics.median()は中央2個の値の算術平均、statistics.median_low()は小さい方の値、statistics.median_high()は大きい方の値を返す。

l = [3, 1, 8, 15]

print(statistics.median(l))
# 5.5

print(statistics.median_low(l))
# 3

print(statistics.median_high(l))
# 8

データを昇順・降順にソートしたい場合は組み込み関数sorted()sort()メソッドを使う。

最頻値: statistics.mode(), multimode()

statistics.mode(), multimode()で最頻値、すなわち、出現頻度が最も高い値を取得できる。

statistics.multimode()は最頻値をリストで返す。最頻値が一つだけの場合も要素数が一個のリストなので注意。

l = [3, 2, 3, 2, 1, 2]

print(statistics.mode(l))
# 2

print(statistics.multimode(l))
# [2]

最頻値が複数ある場合、statistics.mode()は先に登場した値を返す。

l = [3, 2, 3, 2, 1, 2, 3]

print(statistics.mode(l))
# 3

print(statistics.multimode(l))
# [3, 2]

collectionsモジュールのCounterクラスを使うと、最頻値だけでなく各要素の出現回数をカウントしたり、出現回数順に要素を取得したりできる。

分散

母分散: statistics.pvariance()

statistics.pvariance()で母分散を取得できる。データが母集団全体のときに使う。

l = [10, 1, 3, 7, 1]

print(statistics.pvariance(l))
# 12.64

$n$個のデータからなる母集団の平均を$\mu$としたとき、母分散$\sigma^2$は以下のように表される。

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

デフォルトでは平均は自動的に算出されるが、第二引数muに平均値を指定することも可能。例えば、データの平均値をすでに算出している場合に無駄な再計算を避けられる。

mu = statistics.mean(l)

print(statistics.pvariance(l, mu))
# 12.64

組み込み関数sum()len()を使って算出することもできる。

print(sum((x - sum(l) / len(l)) ** 2 for x in l) / len(l))
# 12.64

sum()の引数にジェネレータ式(リスト内包表記のジェネレータ版)を使っている。

不偏分散(標本分散): statistics.variance()

statistics.variance()で不偏分散(標本分散)を取得できる。データが母集団の標本であるときに使う。

l = [10, 1, 3, 7, 1]

print(statistics.variance(l))
# 15.8

母集団から$n$個のデータを抽出した標本の平均を$\overline{x}$としたとき、不偏分散$s^2$は以下のように表される。

$$ s^2=\frac{1}{n-1} \sum_{i=1}^{n} (x_i-\overline{x})^2 $$

文献によって不偏分散と呼ばれたり標本分散と呼ばれたりするが、statistics.variance()は分母を$n - 1$として算出している。

デフォルトでは平均は自動的に算出されるが、第二引数xbarに平均値を指定することも可能。例えば、データの平均値をすでに算出している場合に無駄な再計算を避けられる。

xbar = statistics.mean(l)

print(statistics.variance(l, xbar))
# 15.8

組み込み関数sum()len()を使って算出することもできる。

print(sum((x - sum(l) / len(l)) ** 2 for x in l) / (len(l) - 1))
# 15.8

標準偏差

母集団の標準偏差(母標準偏差): statistics.pstdev()

statistics.pstdev()で母集団の標準偏差(母標準偏差)を取得できる。

l = [10, 1, 3, 7, 1]

print(statistics.pstdev(l))
# 3.5552777669262356

母集団の標準偏差は上述の母分散の平方根である。

print(math.sqrt(statistics.pvariance(l)))
# 3.5552777669262356

標本標準偏差: statistics.stdev()

statistics.stdev()で標本標準偏差を取得できる。

l = [10, 1, 3, 7, 1]

print(statistics.stdev(l))
# 3.9749213828703582

標本標準偏差と呼ばれたり不偏標準偏差と呼ばれたりするが、statistics.stdev()で取得できるのは上述の不偏分散(分母が$n - 1$)の平方根。

print(math.sqrt(statistics.variance(l)))
# 3.9749213828703582

関連カテゴリー

関連記事