Pythonで平均、中央値、最頻値、分散、標準偏差を算出
Pythonの標準ライブラリstatisticsを使うと、リスト(配列)の平均や中央値、最頻値、分散、標準偏差を取得できる。
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
例ではジェネレータ式(リスト内包表記のジェネレータ版)を使っている。
- 関連記事: Pythonリスト内包表記の使い方
中央値: 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