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

Pythonの標準ライブラリstatisticsを使うと、リスト(配列)の平均や中央値、最頻値、分散、標準偏差を取得できます。

statistics --- 数理統計関数 — Python 3.7.1rc1 ドキュメント

statisticsをimportします。標準ライブラリなので追加でインストールする必要はない。ここでは検算で平方根を計算するためmathもimportしています。

import statistics
import math

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

平均(算術平均、相加平均): statistics.mean() 調和平均: statistics.harmonic_mean() 中央値: statistics.median() データの個数が偶数の場合 最頻値: statistics.mode() 母分散: statistics.pvariance() 母集団の標準偏差: statistics.pstdev() 不偏分散: statistics.variance() 標本標準偏差: statistics.stdev()

サードパーティライブラリNumPyを使うとより高速な処理が可能(別途インストールが必要)。二次元配列の行・列ごとの演算などもできます。

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

statistics.mean()で平均(算術平均、相加平均)を取得できます。

mean = statistics.mean(l)
print(mean)
# 4.4

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

my_mean = sum(l) / len(l)
print(my_mean)
# 4.4

調和平均: statistics.harmonic_mean()

statistics.harmonic_mean()で調和平均を取得できます。

harmonic_mean = statistics.harmonic_mean(l)
print(harmonic_mean)
# 1.9408502772643252

調和平均は逆数の算術平均の逆数。

my_harmonic_mean = len(l) / sum(1 / x for x in l)
print(my_harmonic_mean)
# 1.9408502772643255

例ではジェネレータ式(リスト内包表記のジェネレータ版)を使っています。

中央値: statistics.median()

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

median = statistics.median(l)
print(median)
# 3

データの個数が偶数の場合

データの個数が偶数の場合、statistics.median()では中央2個の値の算術平均が返されます。

l_even = [10, 1, 3, 7, 1, 6]

median = statistics.median(l_even)
print(median)
# 4.5

statistics.median_low()は小さい方の値、statistics.median_high()は大きい方の値を返します。

median_low = statistics.median_low(l_even)
print(median_low)
# 3

median_high = statistics.median_high(l_even)
print(median_high)
# 6


statistics.median_low()もstatistics.median_high()も、奇数個のデータの場合はstatistics.median()と同じく中央の値を返します。
print(statistics.median_high(l) == statistics.median_low(l) == statistics.median(l))
# True

最頻値: statistics.mode()

statistics.mode()で最頻値を取得できます。

mode = statistics.mode(l)
print(mode)
# 1

最頻値が一つでない場合はエラーStatisticsErrorとなるので気をつけてください。

l_mode_error = [1, 2, 3, 4, 5]

# mode = statistics.mode(l_mode_error)
# StatisticsError: no unique mode; found 5 equally common values

l_mode_error = [1, 1, 1, 2, 2, 2, 3]

# mode = statistics.mode(l_mode_error)
# StatisticsError: no unique mode; found 2 equally common values

Python標準ライブラリcollectionsのCounterクラスを使うと、最頻値だけでなく各要素の出現回数をカウントしたり、出現回数順に要素を取得したりできます。

母分散: statistics.pvariance()

statistics.pvariance()で母分散を取得できます。

pvariance = statistics.pvariance(l)
print(pvariance)
# 12.64

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

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

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

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

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

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

pstdev = statistics.pstdev(l)
print(pstdev)
# 3.5552777669262356

母集団の標準偏差は母分散の平方根であります。

print(math.sqrt(pvariance))
# 3.5552777669262356

不偏分散: statistics.variance()

statistics.variance()で不偏分散を取得できます。標本分散と呼ばれることもあります。

variance = statistics.variance(l)
print(variance)
# 15.8

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

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

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

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

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

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

stdev = statistics.stdev(l)
print(stdev)
# 3.9749213828703582

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

print(math.sqrt(variance))
# 3.9749213828703582
Last Updated: 6/26/2019, 10:34:03 PM