Pythonには、標準で統計計算のためのstatisticsモジュールが用意されています。このモジュールは、NumPyやPandasといった外部ライブラリを導入することなく、リストやタプルなどの基本的なデータ構造に対して直接、記述統計量を算出できる手軽さが特徴です。
まず、モジュールを利用するためにインポートします。
import statistics
代表値の算出
データ群の特徴を一つの数値で要約する代表値には、平均値、中央値、最頻値などがあります。
平均値 (Mean)
データ全体の合計をデータ数で割った算術平均は、最も基本的な代表値です。
処理内容
リストdata内の数値の算術平均を求めます。これにはstatistics.mean()関数を使用します。
# データセットの定義 data = [10, 20, 25, 30, 35] # 平均値の計算 mean_value = statistics.mean(data) print(f"平均値: {mean_value}")
実行結果
平均値: 24
mean()は、入力データに基づいて整数または浮動小数点数を返します。高速な浮動小数点数 (float) での計算に特化した statistics.fmean() もあり、大規模なデータセットで僅かながらパフォーマンス上の利点があります。
中央値 (Median)
データを昇順に並べたときに、ちょうど中央に位置する値が中央値です。外れ値(極端に大きい、または小さい値)の影響を受けにくい特徴があります。
処理内容
まず、データ数が奇数のリストの中央値をstatistics.median()で求めます。
# データ数が奇数のリスト data_odd = [1, 3, 5, 9, 11] median_value = statistics.median(data_odd) print(f"データ数が奇数の場合の中央値: {median_value}")
実行結果
データ数が奇数の場合の中央値: 5
データ数が偶数の場合、median()は中央に位置する2つの値の平均を返します。
処理内容
データ数が偶数のリストの中央値を求めます。median()が2つの値の平均を返すのに対し、median_low()は2つのうち小さい方を、median_high()は大きい方を返します。
# データ数が偶数のリスト data_even = [1, 3, 5, 9, 11, 13] # 中央の2つの値 (5, 9) の平均を計算 median_value = statistics.median(data_even) print(f"中央値 (平均): {median_value}") # 中央の2つの値のうち小さい方を返す median_low_value = statistics.median_low(data_even) print(f"中央値 (小さい方): {median_low_value}") # 中央の2つの値のうち大きい方を返す median_high_value = statistics.median_high(data_even) print(f"中央値 (大きい方): {median_high_value}")
実行結果
中央値 (平均): 7.0 中央値 (小さい方): 5 中央値 (大きい方): 9
最頻値 (Mode)
データの中で最も出現回数が多い値が最頻値です。
処理内容
リスト内で最も頻出する値をstatistics.mode()で求めます。
data = [1, 2, 2, 3, 3, 3, 4] mode_value = statistics.mode(data) print(f"最頻値: {mode_value}")
実行結果
最頻値: 3
mode()は、最頻値が一意に定まる場合にのみ機能します。もし最頻値が複数存在する場合、mode()はStatisticsErrorを送出します。
処理内容
最頻値が複数存在するデータに対して、statistics.multimode()を使用します。これにより、すべての最頻値をリストとして取得できます。
data_multi_mode = [1, 2, 2, 3, 4, 4, 5] # multimode()で複数の最頻値を取得 multi_mode_values = statistics.multimode(data_multi_mode) print(f"複数の最頻値: {multi_mode_values}")
実行結果
複数の最頻値: [2, 4]
散布度の算出
データのばらつきの度合いを示す指標が散布度です。分散や標準偏差がこれにあたります。
分散 (Variance) と標準偏差 (Standard Deviation)
分散は、各データが平均値からどれだけ離れているかの指標です。標準偏差は分散の正の平方根で、元のデータと同じ単位でばらつきを評価できるため、より直感的に理解しやすい指標です。
これらには「母集団」に対するものと「標本」に対するものの2種類があります。
| 種類 | 対象 | 説明 |
|---|---|---|
| 母分散・母標準偏差 | 手元にあるデータ全体を分析対象とする場合 | 全データを対象に計算します。 (pvariance, pstdev) |
| 標本分散・標本標準偏差 | 手元のデータが、より大きな母集団から無作為抽出した標本(サンプル)である場合 | 抽出した標本から母集団のばらつきを推定します。 (variance, stdev) |
補足: 標本分散は、分母を $n-1$ として計算する不偏分散です。これにより、標本から母集団の分散をより正確に推定できます。
処理内容
はじめに、データ全体を母集団と見なして母分散と母標準偏差を計算します。statistics.pvariance()とstatistics.pstdev()を使用します。
# データ (これを母集団とみなす) data = [1, 3, 4, 6, 8, 10] # 母分散 p_variance = statistics.pvariance(data) print(f"母分散 (pvariance): {p_variance:.4f}") # 母標準偏差 p_stdev = statistics.pstdev(data) print(f"母標準偏差 (pstdev): {p_stdev:.4f}")
実行結果
母分散 (pvariance): 9.4722 母標準偏差 (pstdev): 3.0777
処理内容
次に、データが母集団からの標本であると仮定し、標本分散と標本標準偏差を計算します。statistics.variance()とstatistics.stdev()を使用します。
# 標本分散 variance = statistics.variance(data) print(f"標本分散 (variance): {variance:.4f}") # 標本標準偏差 stdev = statistics.stdev(data) print(f"標本標準偏差 (stdev): {stdev:.4f}")
実行結果
標本分散 (variance): 11.3667 標本標準偏差 (stdev): 3.3714
標本分散・標準偏差の方が、母分散・標準偏差よりもわずかに大きい値になることが確認できます。
分位数の算出
データを昇順に並べ、指定した数で等分割したときの区切りとなる値が分位数です。データを4等分する「四分位数」が代表的です。
処理内容
statistics.quantiles()を使い、データを4等分する四分位数を計算します。この関数は、区切りとなる3つの値をリストで返します。
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] # n=4 (デフォルト) で四分位数を計算 quartiles = statistics.quantiles(data) print(f"四分位数 (25%, 50%, 75%): {quartiles}") print(f"第1四分位数: {quartiles[0]}") print(f"第2四分位数 (中央値): {quartiles[1]}") print(f"第3四分位数: {quartiles[2]}")
実行結果
四分位数 (25%, 50%, 75%): [3.5, 6.0, 8.5] 第1四分位数: 3.5 第2四分位数 (中央値): 6.0 第3四分位数: 8.5
quantiles()はn引数で分割数を指定できます。例えば、n=10とすれば十分位数を算出できます。
処理内容
n=10を指定して十分位数を計算します。これにより、データを10%ずつの区切りで評価できます。
# n=10 で十分位数を計算 deciles = statistics.quantiles(data, n=10) print(f"十分位数: {deciles}")
実行結果
十分位数: [2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8, 10.9]
まとめ
statisticsモジュールは、Pythonの標準機能だけで基本的な統計量を手軽に算出したい場合に適した選択肢です。本記事で紹介した関数を以下の表にまとめます。
| 分類 | 関数 | 説明 |
|---|---|---|
| 代表値 | mean() |
算術平均を返します。 |
fmean() |
高速な浮動小数点数 (float) で算術平均を返します。 |
|
median() |
中央値を返します。データ数が偶数の場合は2つの中心値の平均です。 | |
median_low() |
データ数が偶数の場合に、2つの中心値のうち小さい方を返します。 | |
median_high() |
データ数が偶数の場合に、2つの中心値のうち大きい方を返します。 | |
mode() |
最頻値を返します(一意に定まる場合のみ)。 | |
multimode() |
最頻値のリストを返します(複数存在する場合に対応)。 | |
| 散布度 | pvariance() |
母分散を計算します。 |
pstdev() |
母標準偏差を計算します。 | |
variance() |
標本分散を計算します。 | |
stdev() |
標本標準偏差を計算します。 | |
| 分位数 | quantiles() |
データをn等分する分位点をリストで返します(デフォルトn=4)。 |
より高度で大規模なデータ分析や科学技術計算を行う場合は、高機能な行列演算や豊富な統計関数を備えるNumPy, SciPy, Pandasといった外部ライブラリの利用が推奨されます。目的に応じてこれらのツールを使い分けることが効率的な開発につながります。