note.nkmk.me

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

Date: 2018-05-03 / tags: Python, 算数・数学

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

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

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
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事