pythonでは、数列を格納する仕組みがいくつか存在する。そのうえ、平均値などの統計量を計算する文法も各データ型に応じて異なっている。
ここに、リスト型・Numpyによる配列(ndarray)・Dataframe形式の3つのデータ型に対して、基本統計量を計算する文法をまとめる。
1. リスト型の場合
1.0. サンプルデータの準備
list_ = [1,2,3,4,5]
1.1. 総和・最大値・最小値
これらについては、組み込み関数を使えば計算できる。
print(sum(list_)) # 総和
print(max(list_)) # 最大値
print(min(list_)) # 最小値
出力
15
5
1
1.2. 平均・分散・標準偏差
これらを1行で計算するには、statisticsモジュールをインポートする必要がある。
import statistics
print(statistics.mean(list_)) # 平均
print(statistics.variance(list_)) # 不偏分散
print(statistics.stdev(list_)) # 不偏標準偏差
出力
3
2.5
1.5811388300841898
標本分散と標本標準偏差を求める場合は、以下のように計算する。ここでの標本○○の定義は、サンプルを母集団と考えたときの推定量(nで割る)とする。
print(statistics.pvariance(list_)) # 標本分散
print(statistics.pstdev(list_)) # 標本標準偏差
出力
2
1.4142135623730951
2. Numpyによる配列の場合
2.0. サンプルデータの準備
import numpy as np
array_ = np.array([1,2,3,4,5])
2.1. 総和・最大値・最小値
print(np.sum(array_)) # 総和
print(np.max(array_)) # 最大値
print(np.min(array_)) # 最小値
出力
15
5
1
2.2. 平均・分散・標準偏差
print(np.mean(array_)) # 平均
print(np.var(array_)) # 標本分散
print(np.std(array_)) # 標本標準偏差
出力
3.0
2.0
1.4142135623730951
2.3. パーセンタイル
print(np.percentile(array_, 25)) # 第一四分位数
print(np.percentile(array_, 50)) # 中央値
print(np.percentile(array_, 75)) # 第三四分位数
print(np.percentile(array_, 95)) # 下から数えて95%の点
出力
2.0
3.0
4.0
4.8
2.4. 多次元配列に対する平均・分散・標準偏差の計算
以上は配列が1次元だった場合についての計算例であるが、2次元以上の場合では行ごと/列ごとに統計量を集計できる。第2引数のaxisを指定する。
array_ = np.array([
[1,2,3,4],
[5,6,7,8],
[9,10,11,12]
]) # サンプルデータの準備
print(np.mean(array_, axis = 0)) # 列ごとに集計した平均
print(np.var(array_, axis = 0)) # 列ごとに集計した標本分散
print(np.std(array_, axis = 0)) # 列ごとに集計した標本標準偏差
print(np.mean(array_, axis = 1)) # 行ごとに集計した平均
print(np.var(array_, axis = 1)) # 行ごとに集計した標本分散
print(np.std(array_, axis = 1)) # 行ごとに集計した標本標準偏差
出力
[5. 6. 7. 8.]
[10.66666667 10.66666667 10.66666667 10.66666667]
[3.26598632 3.26598632 3.26598632 3.26598632]
[ 2.5 6.5 10.5]
[1.25 1.25 1.25]
[1.11803399 1.11803399 1.11803399]
axisが大きくなればなるほど配列の入れ子構造の奥から計算するようになると考えればよい。
なお、axisを指定しない場合は、すべての要素について集計される。
array_ = np.array([
[1,2,3,4],
[5,6,7,8],
[9,10,11,12]
]) # サンプルデータの準備
print(np.mean(array_)) # すべての要素の平均
print(np.var(array_)) # すべての要素の標本分散
print(np.std(array_)) # すべての要素の標本標準偏差
出力
6.5
11.916666666666666
3.452052529534663
3. Dataframe形式の場合
3.0. サンプルデータの準備
import numpy as np
import pandas as pd
df = pd.DataFrame({
'A': [1, 2, 3, 4, 5],
'B': [6, 7, 8, 9, 10]
})
df
出力:
A | B | |
---|---|---|
1 | 1 | 6 |
2 | 2 | 7 |
3 | 3 | 8 |
4 | 4 | 9 |
5 | 5 | 10 |
3.1. 総和・最大値・最小値
print(df.sum()) # 総和
print(df.max()) # 最大値
print(df.min()) # 最小値
出力
A 15
B 40
dtype: int64
A 5
B 10
dtype: int64
A 1
B 6
dtype: int64
3.2. 平均・分散・標準偏差
print(df.mean()) # 平均
print(df.var()) # 不偏分散
print(df.std()) # 不偏標準偏差
print(df.var(ddof = 0)) # 標本分散
print(df.std(ddof = 0)) # 標本標準偏差
出力
A 3.0
B 8.0
dtype: float64
A 2.5
B 2.5
dtype: float64
A 1.581139
B 1.581139
dtype: float64
A 2.0
B 2.0
dtype: float64
A 1.414214
B 1.414214
dtype: float64
3.3. パーセンタイル
Numpyのときと異なり、パーセンタイルの引数には0以上1以下の値を入れる。
print(df.quantile(0.25)) # 第一四分位数
出力
A 2.0
B 7.0
Name: 0.25, dtype: float64
パーセンタイルに複数の引数を指定することによって、データフレーム形式で結果を表示することができる。
df.quantile([0, 0.75, 0.99])
出力:
A | B | |
---|---|---|
0.00 | 1.00 | 6.00 |
0.75 | 4.00 | 9.00 |
0.99 | 4.96 | 9.96 |
3.4. 列を指定して集計
データフレームの列を指定して統計量を集計することもできる。
print(df["A"].mean()) # 平均
print(df["A"].var()) # 不偏分散
print(df["A"].std()) # 不偏標準偏差
print(df["A"].var(ddof = 0)) # 標本分散
print(df["A"].std(ddof = 0)) # 標本標準偏差
出力
3.0
2.5
1.5811388300841898
2.0
1.4142135623730951