Python は R のように標準で統計計算をサポートしているわけではありません。パッケージによって扱い方も違います。
まずはパッケージなしでやってみます。データを与えます:
x = [2, 3, 4, 5]
これは他のプログラミング言語でいう配列に近いもので、Python では list(リスト)といいます。単に x
と打ち込めばデータがそのまま表示されます。これの和は
sum(x)
で求められます。平均を求める関数はないので、和を長さで割って
sum(x) / len(x)
で平均がわかります。
次に、statistics
という標準パッケージを使ってみます。短縮名でインポートする際は st
や stat
が使われるようです。
import statistics as st st.mean(x) # 平均 st.fmean(x) # 平均の高速版(3.8以降) st.median(x) # 中央値 st.variance(x) # n-1 で割る方式の分散 st.pvariance(x) # n で割る方式の分散 st.stdev(x) # n-1 で割る方式の標準偏差 st.pstdev(x) # n で割る方式の標準偏差
あまり使われないパッケージでしたが、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) と同じ
のような書き方もできます。これだけならどうでもいいことですが、
np.sqrt(x) # x の一つ一つの要素について平方根を求める
のように、ベクトルや行列の個々の要素に対する計算が一度にできます。
NumPy の機能を視覚的にまとめた A Visual Intro to NumPy and Data Representation も参考になります(邦訳図解でわかるNumPyとデータ表現が出ました)。
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で割る方式の標準偏差
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(x, [0, 0.25, 0.5, 0.75, 1]) # 四分位数など