基本統計量

Python は R のように標準で統計計算をサポートしているわけではありません。パッケージによって扱い方も違います。

パッケージなしの場合

まずはパッケージなしでやってみます。データを与えます:

x = [2, 3, 4, 5]

これは他のプログラミング言語でいう配列に近いもので、Python では list(リスト)といいます。単に x と打ち込めばデータがそのまま表示されます。これの和は

sum(x)

で求められます。平均を求める関数はないので、和を長さで割って

sum(x) / len(x)

で平均がわかります。

statistics パッケージ

次に、statistics という標準パッケージを使ってみます。短縮名でインポートする際は ststat が使われるようです。

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 パッケージ

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 パッケージ

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 パッケージ

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])  # 四分位数など