Python は R のように標準で統計計算をサポートしているわけではありません。パッケージによって扱い方も違います。
まずはパッケージなしでやってみます。データを与えます:
x = [2, 3, 4, 5]
これは他のプログラミング言語でいう配列に近いもので、Python では list(リスト)といいます。単に x と打ち込めばデータがそのまま表示されます。これの和は
sum(x)
で求められます。平均を求める関数はないので、和を長さで割って
sum(x) / len(x)
で平均がわかります。
次に、Python 標準ライブラリの statistics モジュールを使ってみます。短縮名でインポートしたいなら import statistics as st などとするか、あるいは from statistics import mean のように関数そのものをインポートするのでもいいと思います。
import statistics statistics.mean(x) # 平均(整数・浮動小数点数) statistics.fmean(x) # 平均(浮動小数点数に特化した高速版、3.8以降) statistics.median(x) # 中央値 statistics.variance(x) # n-1 で割る方式の分散 statistics.pvariance(x) # n で割る方式の分散 statistics.stdev(x) # n-1 で割る方式の標準偏差 statistics.pstdev(x) # n で割る方式の標準偏差
mean() は結果が整数になるなら多倍長整数演算を使います。fmean() はつねに浮動小数点で計算し、より高速です。
Python 3.10 で correlation()、covariance()、linear_regression() が追加されました。
NumPy パッケージはベクトルや行列を扱う科学技術計算に不可欠なものです。
import numpy as np
これで、例えば平均を求める np.mean() 関数が使えます:
np.mean(x) # 平均 np.median(x) # 中央値 np.var(x) # n で割る方式の分散 np.var(x, ddof=1) # n-1 で割る方式の分散 np.std(x) # n で割る方式の標準偏差 np.std(x, ddof=1) # n-1 で割る方式の標準偏差 np.quantile(x, [0, 0.25, 0.5, 0.75, 1]) # 四分位数など
NumPy の本当の威力を発揮するには、データを次のようにして作ります:
x = np.array([2, 3, 4, 5])
こうすると、標準の list 型ではなく、numpy.ndarray 型になります。この型のものは
x.mean() # np.mean(x) と同じ
のような書き方もできます。
NumPy の機能を視覚的にまとめた A Visual Intro to NumPy and Data Representation も参考になります。
SciPy は科学計算用の巨大なパッケージです。統計計算用の関数はこの中の stats に含まれています。
NumPy と被らないようにという趣旨なのか、頭に t が付いた trimmed なバージョン(オプションで limits=[a,b] と与えればその範囲だけの値を対象にする)になっています。
from scipy import stats stats.tmean(x) # 平均 stats.tvar(x) # n-1で割る方式の分散 stats.tvar(x, ddof=0) # nで割る方式の分散 stats.tstd(x) # n-1で割る方式の標準偏差 stats.tstd(x, ddof=0) # nで割る方式の標準偏差
これら以外に、stats.describe(x) という関数は次のものをまとめて求めます:
nobs 長さminmax 最小値、最大値mean 平均variance 分散(オプション ddof は同上)skewness 歪度kurtosis 尖度pandas は R のデータフレームに近い機能を提供するパッケージです。
import pandas as pd
pandas での1次元配列に相当するものは Series というデータ型です。これは numpy.ndarray 型を拡張したもので、ベクトルというよりは、1個の列だけのデータフレーム(2次元データ)です:
s = pd.Series([1, 2, 3, 4]) s.sum() # 和 pd.Series.sum(s) と同じ(以下同) s.mean() # 平均 s.median() # 中央値 s.var() # n-1 で割る方式の分散 s.var(ddof=0) # n で割る方式の分散 s.std() # n-1 で割る方式の標準偏差 s.std(ddof=0) # n で割る方式の標準偏差 s.quantile([0, 0.25, 0.5, 0.75, 1]) # 四分位数など s.describe() # 基本統計量をまとめて求める
最後の s.describe() は便利ですが、標準偏差はn-1で割る方式に固定されます(それで問題ありませんが)。