Python の statistics モジュール入門と実用ガイド

ジャンプリンク
- Python の statistics モジュールとは何か
- 記述統計(平均・分散・分位点など)
- 回帰と相関
- 正規分布の利用例
- NumPy・SciPy などとの棲み分け
- いつ使うべきか/代替手段
Python の statistics モジュールとは何か
statistics は Python 標準ライブラリに含まれるモジュールで、単純な統計計算を手早く行うための関数群を提供します。Python をインストールすれば追加パッケージ不要で使えます。
短い定義: statistics モジュールは「学習用途/電卓用途向けの軽量な統計ツールボックス」です。
使い方の基本:
import statistics
# 対話セッションやノートブックなら、関数だけ import して使うことも可能
from statistics import mean, median
注意: 対話的なセッション(REPL、IPython、Jupyter)では関数を直接 import すると入力が短くなり便利です。スクリプトでは名前衝突(組み込み関数の上書き)を避けるため、モジュール名を付けて使用するのが安全です。
重要: statistics は「小規模データ・学習・簡易解析」に最適化されています。大規模データやベクトル演算、高速化が必要な場面では後述するライブラリを検討してください。
記述統計(基本概念と statistics の関数)
記述統計はデータの中心傾向やばらつきを数値で表す手法です。ここでは代表的な関数と使い方、簡単なコード例を示します。
平均(算術平均)
算術平均はデータ点の合計をデータ数で割ったものです。statistics の mean を使います。
from statistics import mean
a = [4, 4, 3, 6]
print(mean(a)) # => 4.25
注: 元の記事の例で「結果は 4.6」とありますが、リスト [4, 4, 3, 6] の算術平均は (4+4+3+6)/4 = 4.25 です。元の数値表記に誤りがあった可能性があります。ここでは実際の計算式に従って示しています。
fmean(浮動小数点での平均)と加重平均
fmean は内部的に float に変換して計算します。加重平均もサポートします。
from statistics import fmean
a = [4, 4, 3, 6]
weights = [1, 2, 3, 4]
print(fmean(a))
print(fmean(a, weights=weights))
加重平均は各データ点に重みを掛けた合計を重み合計で割ったものです。
幾何平均と調和平均
成長率の比較には幾何平均(geometric_mean)が有用です。逆数平均が調和平均(harmonic_mean)です。
from statistics import geometric_mean, harmonic_mean
print(geometric_mean(a))
print(harmonic_mean(a))
ヒント: 調和平均は速度や率の平均を取るときに使います(例: 一定区間を異なる速度で移動した平均速度)。
中央値・最頻値
中央値(median)はデータを小さい順に並べて中央の値を取ります。最頻値(mode)は最も頻出する値です。
from statistics import median, mode
print(median(a))
print(mode(a))
注意: mode は一意に定まらない場合に例外を投げることがあります。複数のモードを扱いたい場合は collections.Counter や pandas を使う方が柔軟です。
分散と標準偏差
分散(variance)と標準偏差(stdev)はデータのばらつき(散らばり)を表します。statistics は標本用(不偏推定)と母集団用の両方を提供します。
- variance / stdev: 標本(n-1 で割る不偏分散)
- pvariance / pstdev: 母集団(n で割る)
from statistics import stdev, pstdev, variance, pvariance
print(stdev(a))
print(pstdev(a))
print(variance(a))
注: 標本標準偏差はサンプルサイズが小さいときにより代表的な推定を与えるため n-1 で割ります。
分位点(quantiles)と最小・最大
quantiles 関数でデータを四分位などに分割できます。min / max は Python 組み込み。
from statistics import quantiles
print(quantiles(a)) # デフォルトは四分位
print(min(a), max(a))
実践例: 小さなデータセットでの一連の操作
次のコードは、よくある探索的解析の流れを示します。
from statistics import mean, median, mode, stdev, quantiles
data = [12, 15, 14, 16, 15, 14, 18]
print('count:', len(data))
print('mean:', mean(data))
print('median:', median(data))
print('mode:', mode(data))
print('stdev:', stdev(data))
print('quantiles:', quantiles(data))
このようなスクリプトはデータの最初の把握に適しています。
Important: スクリプトで欠損値(None や float(‘nan’))が混じると多くの関数は例外を投げます。欠損値は事前に除去または補間してください。
回帰と相関
statistics モジュールは単回帰(一次元の直線フィッティング)と相関係数の計算をサポートします。内部では最小二乗法(ordinary least squares)を使います。
from statistics import linear_regression, correlation
x = [1, 2, 3, 4, 5]
y = [5, 7, 9, 11, 13]
print(linear_regression(x, y)) # slope, intercept
slope, intercept = linear_regression(x, y)
print('y =', slope, '* x +', intercept)
print('correlation r:', correlation(x, y))
上記の例では slope が 2、intercept が 3 となり y = 2*x + 3 です。correlation は 1 に近ければ強い正の相関を示します。
制約: linear_regression は単純線形回帰(説明変数 1 つ)しか扱えません。多変量回帰や回帰診断、信頼区間の推定、モデル選択などが必要な場合は statsmodels や scikit-learn を使ってください。
正規分布の利用例
正規分布は連続確率分布の代表です。statistics モジュールは NormalDist クラスを提供し、CDF(累積分布関数)などを使えます。
実例(出典を確認してください): CDC のデータに基づいて、20 歳以上男性の平均身長が 175.1 cm、標準誤差が 0.3 cm、サンプル数が 2690 と仮定します。
標準偏差を標準誤差から求めるときの式: 標準偏差 ≈ 標準誤差 × sqrt(N)。
import math
se = 0.3
n = 2690
sd = math.sqrt(n) * se
print(sd) # 約 15.56
計算結果は約 15.56 cm です(丸め方によって変わります)。これを使って NormalDist オブジェクトを作ります。
from statistics import NormalDist
men_height = NormalDist(mu=175.1, sigma=sd)
# 160 cm ~ 180 cm の割合
prob = men_height.cdf(180) - men_height.cdf(160)
print('約 {:.1%}'.format(prob))
この例だと約 45% 前後の男性が 160~180 cm の間に入ると推定できます(正規分布の仮定の下で)。
注意: 実データを扱う際は分布の適合性(正規性)を確認してください。外れ値や歪度が強い場合、正規分布の仮定は成り立ちません。
NumPy・SciPy・pandas などとの棲み分け
statistics は「学習用」「電卓代わり」「小規模な探索」に最適です。以下に選び方の目安を示します。
statistics を使うべき場面
- 数十〜数千のデータで単純な統計量をすばやく計算したい
- 追加パッケージを入れたくない軽いスクリプト
- 学習やデモ、Jupyter ノートでの素早い確認
NumPy / pandas / SciPy / statsmodels / scikit-learn を使うべき場面
- ベクトル化、高速演算、大規模データ(数万〜数百万以上)
- 欠損値処理、データフレーム操作、結合、グルーピング
- 多変量解析、回帰診断、統計検定、可視化との連携
代替アプローチの簡単な比較(概念):
- NumPy: 数値配列の高速処理。線形代数やベクトル演算に最適。
- pandas: 表形式データ(DataFrame)操作に最適。集約や欠損値処理が得意。
- SciPy: 高度な統計関数や最適化、信号処理などの科学技術計算。
- statsmodels: 回帰や統計モデルの推定・診断に特化。
- scikit-learn: 機械学習と予測モデルのライブラリ。
Decision tree(短い判断フロー):
flowchart TD
A[目的は何か?] --> B{データ量}
B -->|小規模| C[statistics]
B -->|中〜大| D{処理内容}
D -->|単純集計| E[pandas]
D -->|数値計算| F[NumPy]
D -->|回帰・統計モデル| G[statsmodels]
D -->|機械学習| H[scikit-learn]
いつ statistics が失敗しやすいか(注意点と回避策)
- 欠損値や NaN が混ざると many functions は例外を投げます。事前にフィルタリングや補間を行ってください。
- 非数値データ(文字列等)はエラーになります。数値化が必要です。
- 大規模データではメモリと速度の問題が出ます。配列演算を高速化したい場合は NumPy へ。
- 多重共線性や複雑なモデル診断が必要な場合は statsmodels を使ってください。
回避策サンプル:
# 欠損値の除去例
clean = [x for x in raw if x is not None and not math.isnan(x)]
実務でのチェックリスト(役割別)
データサイエンティスト:
- データの分布を可視化して正規性を確認する
- 欠損値・外れ値を処理する
- 必要に応じて statsmodels で回帰診断を行う
ソフトウェアエンジニア:
- スクリプトが小規模で依存を増やしたくないなら statistics を使用
- パフォーマンス要件がある場合は NumPy に置き換える
- 単体テストを用意して数値の期待値を検証する
学生・学習者:
- 手計算や概念の理解が主目的なら statistics で十分
- 実データを扱う練習は pandas も並行して学ぶことを推奨
ミニ・メソドロジー: どのライブラリを選ぶか
- データサイズを確認する(数十〜数千 → statistics、数万以上 → NumPy/pandas)
- 欠損値や文字列が含まれるか確認する(ある → pandas)
- 必要な解析の深さを考える(回帰診断や多変量 → statsmodels)
- 可視化やレポートは別途 Matplotlib/Seaborn/Altair を利用する
受け入れテスト例(関数の出力確認)
- mean([1, 2, 3]) == 2
- median([1, 2, 3, 4]) == 2.5
- variance([1, 2, 3]) > 0
単体テストのテンプレート(pytest を想定):
def test_mean():
from statistics import mean
assert mean([1, 2, 3]) == 2
チートシート: よく使う関数一覧
- mean(data) — 算術平均
- fmean(data, weights=…) — float ベースの平均(加重も可)
- geometric_mean(data) — 幾何平均
- harmonic_mean(data) — 調和平均
- median(data) — 中央値
- mode(data) — 最頻値
- variance(data), pvariance(data) — 分散(標本 / 母集団)
- stdev(data), pstdev(data) — 標準偏差(標本 / 母集団)
- quantiles(data) — 分位点
- linear_regression(x, y) — 単回帰の slope, intercept
- correlation(x, y) — 相関係数
- NormalDist(mu, sigma) — 正規分布オブジェクト
まとめ
- statistics モジュールは標準ライブラリで手軽に統計量を計算できる小回りの利くツールです。
- 学習や小規模データの探索には非常に便利ですが、大規模データや高度な統計解析には NumPy・pandas・statsmodels 等を選びましょう。
- 実務では前処理(欠損値・外れ値の処理)と関数の入出力を確かめるユニットテストを忘れないでください。
重要: 本稿で示した数値(例: CDC の身長データなど)は元データの解釈や出典確認が必要です。実務で使う際は必ず元データとメタデータ(サンプル数、標準誤差の定義など)を確認してください。
キャプション: statistics を使った基本操作の例。
要点まとめ:
- 軽い解析は statistics、重い処理や高度解析は NumPy/pandas/Statsmodels
- 欠損値と外れ値は事前に処理する
- 単体テストで結果を確認する習慣をつける