Python

Python statisticsモジュールの使い方|平均・中央値・最頻値・分散・標準偏差をコードで

statistics は Python に標準で付属する統計計算ライブラリで、追加インストールなしに import statistics だけで平均・中央値・最頻値・分散・標準偏差を求められる。NumPy や pandas を入れるほどでもない小さなデータ、スクリプトや業務ツールでの集計にちょうど合う。この記事では各関数を「何を求めるか」ごとに整理し、標本と母集団の使い分け、外れ値があるときの代表値の選び方、NumPy へ切り替える判断基準まで、実行できるコードで示す。対応は Python 3.4 以降、記載は 3.14 時点の仕様に基づく。

まとめ:statisticsの主要関数早見表

先に結論を示す。代表値と散らばりは次の関数で求まる。母集団か標本かで分散・標準偏差の関数が分かれる点だけ最初に押さえておけば、あとは用途に応じて選ぶだけでよい。

関数 求める値 追加バージョン
mean 算術平均 3.4
fmean 浮動小数点に特化した高速な平均 3.8
geometric_mean 幾何平均(成長率・比率向き) 3.8
harmonic_mean 調和平均(速度・レート向き) 3.6
median 中央値 3.4
median_grouped 階級データの推定中央値 3.4
mode / multimode 最頻値 / 複数の最頻値 3.4 / 3.8
variance / pvariance 標本分散 / 母分散 3.4
stdev / pstdev 標本標準偏差 / 母標準偏差 3.4
quantiles 分位数(四分位ほか) 3.8
NormalDist 正規分布オブジェクト 3.8
correlation / linear_regression 相関係数 / 単回帰 3.10
  • 数百〜数千件程度の集計は statistics で完結する。多次元配列や大量データは NumPy・pandas に渡す。
  • 分散・標準偏差は、手元のデータが母集団そのものなら pvariancepstdev、母集団から抜き取った標本なら variancestdev
  • 外れ値を含むデータの代表値は、平均(mean)より中央値(median)が実態に近い。

statisticsモジュールの位置づけ(標準ライブラリ・インストール不要)

statistics は Python 3.4 で標準ライブラリに加わった数理統計モジュールで、PEP 450 として採用された。pip での追加インストールは不要で、次のように読み込めばすぐ使える。

import statistics

data = [10, 20, 30, 40, 50]
statistics.mean(data)      # 30
statistics.median(data)    # 30
statistics.stdev(data)     # 15.811...

入力は数値のリストやタプル、イテレータを受け付ける。整数・浮動小数点だけでなく FractionDecimal も扱え、金額計算のように誤差を避けたい場面では Decimal を渡すと丸め誤差なく集計できる。空のデータや不正な入力には statistics.StatisticsError が送出されるため、平均などを呼ぶ前に件数を確認しておくと堅い。

平均を求める関数(mean・fmean・幾何平均・調和平均)

「平均」と一口に言っても種類がある。statistics は算術平均のほか、比率や速度に適した平均も関数として持つ。値の性質に合わせて選ぶと集計の意味が正しくなる。

算術平均を求める statistics.mean と fmean

もっとも一般的な算術平均は mean で求める。すべてが浮動小数点で件数が多い場合は、3.8 で追加された fmean のほうが速く、常に float を返す。整数の合計を厳密に扱いたいなら mean、速度優先なら fmean と切り分ける。

import statistics

statistics.mean([1, 2, 3, 4])    # 2.5
statistics.fmean([1, 2, 3, 4])   # 2.5(floatで高速)

幾何平均・調和平均で平均の種類を使い分ける

算術平均が向かないデータもある。年ごとの成長率や指数のように「掛け合わせて効く」値は幾何平均 geometric_mean、時速や単価のように「レートの平均」を取りたい値は調和平均 harmonic_mean が正しい。単純に mean で平均すると過大・過小に偏る。

import statistics

statistics.geometric_mean([1.1, 1.2, 1.05])  # 平均成長率 ≈ 1.115
statistics.harmonic_mean([40, 60])           # 往復の平均時速 = 48.0

往復で行き40km/h・帰り60km/hのとき、平均時速は算術平均の50ではなく調和平均の48になる。どちらの平均を使うかは、値が加算的か乗算的かレートかで決める。

中央値を求める statistics.median と派生関数

中央値はデータを昇順に並べた真ん中の値で、外れ値の影響を受けにくい代表値だ。statistics には基本の median に加え、境界の扱いを変えた派生関数がある。

median の基本と median_low・median_high

データ件数が奇数なら中央の値、偶数なら中央2値の平均を median が返す。偶数件で「実在する値」を返したいときは、小さい側の median_low・大きい側の median_high を使う。順序があれば数値以外(文字列など)にも適用できる。

import statistics

statistics.median([1, 3, 5, 7])       # 4.0(中央2値の平均)
statistics.median_low([1, 3, 5, 7])   # 3
statistics.median_high([1, 3, 5, 7])  # 5

度数分布・階級データの中央値は median_grouped

アンケートやヒストグラムのように、値が階級(区間)にまとめられたデータの中央値は median_grouped で推定する。渡した各値を階級の中点とみなして補間し、階級幅は interval 引数で指定する(既定は1)。テストの点数分布や年齢層別集計など、元データが失われて集計表だけ残っている場面で使う。

import statistics

# 各値を階級の中点とみなす(階級幅10)
statistics.median_grouped([25, 25, 35, 35, 35, 45], interval=10)  # ≈ 33.33

最頻値を求める statistics.mode と multimode

最頻値は出現回数がもっとも多い値で、mode で求める。カテゴリ(血液型・アンケート選択肢など)のように平均が意味を持たないデータの代表値として使う。3.8 以降の mode は最頻値が複数あっても最初に現れた値を返し、例外を投げなくなった。すべての最頻値が欲しいときは multimode をリストで受け取る。

import statistics

statistics.mode(["A", "B", "A", "O", "A"])   # 'A'
statistics.multimode([1, 1, 2, 2, 3])        # [1, 2]

分散と標準偏差を求める関数(variance・pvariance・stdev・pstdev)

データの散らばりは分散と標準偏差で表す。標準偏差は分散の平方根で、元データと同じ単位になるため解釈しやすい。statistics では分散・標準偏差がそれぞれ「標本用」と「母集団用」の2関数に分かれており、ここを取り違えると値がずれる。

import statistics

sample = [102, 98, 110, 95, 105]
statistics.variance(sample)   # 標本分散(n-1で割る)
statistics.stdev(sample)      # 標本標準偏差 ≈ 5.87
statistics.pvariance(sample)  # 母分散(nで割る)
statistics.pstdev(sample)     # 母標準偏差 ≈ 5.25

標本と母集団で関数を使い分ける

関数選びの基準は「手元のデータが全体か一部か」の一点に尽きる。調べたい対象すべてが揃っている(クラス全員の点数、全製品の重量など母集団そのもの)なら pvariancepstdev。母集団から抜き取った標本から全体を推定する(抜き取り検査、アンケートの回答者など)なら、不偏推定になる variancestdev を使う。variance 系は n−1 で割るぶん値がわずかに大きくなる。判断に迷ったら、実務のデータはほぼ標本なので stdevvariance を既定にしてよい。平均が既知なら第2引数(variancestdev は標本平均 xbar、pvariancepstdev は母平均 mu)に渡すと平均の再計算を省ける。

四分位数と正規分布(quantiles・NormalDist)

3.8 では分布を扱う関数が加わった。quantiles はデータを等確率で分割する境界値を返し、n=4 で四分位点になる。箱ひげ図の作成やパーセンタイル集計に使える。

import statistics

statistics.quantiles([1, 2, 3, 4, 5, 6, 7, 8], n=4)  # 四分位点 [2.25, 4.5, 6.75]

NormalDist は平均(mu)と標準偏差(sigma)から正規分布オブジェクトを作り、累積確率や確率密度、逆関数を計算できる。偏差値や合格ライン、品質管理の不良率見積もりなど、正規分布を前提とした計算をライブラリなしで完結できる。

import statistics

nd = statistics.NormalDist(mu=50, sigma=10)
nd.cdf(60)         # 60以下となる確率 ≈ 0.841
nd.inv_cdf(0.95)   # 上位5%の境界値 ≈ 66.4

2変数の関係を見る correlation(相関係数)と linear_regression(単回帰)は 3.10 で追加された。散布図の傾向を数値で押さえたいときに使える。

平均値と中央値の使い分け(外れ値があるとき)

代表値をどれにするかで、データの見え方は変わる。平均値は全データを均等に反映するが、極端な外れ値に引きずられる。年収や住宅価格のように一部の大きな値が混じる分布では、平均が実感より高く出て、中央値のほうが「多くの人の実態」を表す。左右対称で外れ値の少ないデータなら平均でよい。分布が歪んでいる、または外れ値を含むと分かっているなら中央値を主に据える、と決めておくと判断が速い。カテゴリデータには平均も中央値も使えないので最頻値を採る。

statisticsとNumPy・pandasの使い分け

同じ統計量は NumPypandas でも計算できる。それでも statistics を選ぶ理由は、標準ライブラリで依存が増えず、1次元の少量データに対して読みやすいコードになるからだ。判断の目安は次のとおり。

  • statistics で十分:数百〜数千件程度の1次元データ、スクリプトや業務ツールでの集計、依存ライブラリを増やしたくない環境。FractionDecimal で誤差を避けたい金額計算。
  • NumPy へ切り替える:多次元配列、数万件以上でループ速度が問題になる場合、行列演算やブロードキャストが必要な場合。大規模データでは NumPy がC実装ぶん桁違いに速い。
  • pandas を使う:CSVや表形式データを列単位で集計する、欠損値処理やグループ集計を伴う場合。

科学計算全般に踏み込むなら SciPy も選択肢になる。まず statistics で書き、速度や次元数で頭打ちになったら NumPy へ移す、という順序が無駄がない。

よくある質問

statisticsモジュールのインストールは必要ですか?

不要です。Python 3.4 以降に標準で含まれる標準ライブラリのため、pip での追加インストールなしに import statistics だけで使えます。

stdevとpstdevの違いは何ですか?

stdev は標本標準偏差で、母集団から抜き取った標本から全体を推定するとき(n−1で割る不偏推定)に使います。pstdev は母標準偏差で、データが母集団そのものであるとき(nで割る)に使います。分散の variancepvariance も同じ区別です。

statistics.meanとNumPyのmeanはどちらが速いですか?

大量データでは NumPy が明確に速いです。NumPy はC実装で配列全体を一括処理するため、数万件以上や多次元配列では statistics のループ処理より桁違いに高速です。数百〜数千件程度なら差は小さく、依存の少ない statistics で十分です。

中央値と平均値はどう使い分けますか?

外れ値を含む、または分布が歪んでいるデータでは中央値(median)が実態に近く、左右対称で外れ値の少ないデータでは平均値(mean)が使えます。年収や価格のように一部の大きな値が混じる分布は中央値が適します。

対応しているPythonのバージョンは?

モジュール自体は 3.4 以降で使えます。fmeangeometric_meanmultimodequantilesNormalDist は 3.8、correlationlinear_regression は 3.10 で追加されました。利用予定の関数が実行環境のバージョンに含まれるかは公式ドキュメントで確認してください。

関連記事

資料請求

RELATED POSTS 関連記事