Pynote

Python、機械学習、画像処理について

pandas - 統計量を計算する関数

概要

pandas の統計量を計算する関数を整理する。

順序統計量

DataFrame Series numpy 説明
DataFrame.max Series.max amax 最小値を計算する。
DataFrame.min Series.min amin 最大値を計算する。
DataFrame.idxmax Series.idxmax numpy.argmin 最小値のインデックスを計算する。
DataFrame.idxmin Series.idxmin numpy.argmax 最大値のインデックスを計算する。
DataFrame.median Series.median median メディアンを計算する。
DataFrame.quantile Series.quantile quantile 分位数を計算する。
DataFrame.nsmallest Series.nsmallest 下位 n 個の値
DataFrame.nlargest Series.nlargest 上位 n 個の値

最大値、最小値のインデックス

** 最大値、最小値のインデックスを取得する。 

>|python|
import pandas as pd

s = pd.Series([8, 4, 9, 3, 2])

print(s.idxmin())  # 4
print(s.idxmax())  # 2

|

最大値、最小値、メディアン

import pandas as pd

s = pd.Series([7, 5, 6, 3, 3, 5])

print('max', s.max())  # max 7
print('min', s.min())  # min 3
print('median', s.median())  # median 5.0

分位点

1つだけ指定した場合はスカラー、複数指定した場合は Series で返す。

# 指定した分位点の値を取得する。
print('quantile', s.quantile(0.25))  # quantile 3.5

print('quantile\n', s.quantile([0.25, 0.5, 0.75]))
# quantile
# 0.25    3.50
# 0.50    5.00
# 0.75    5.75
# dtype: float64

下位 n 番目までの値、上位 n 番目までの値

nsmallest は、下位 n 番目までの値を Series で返す。
nlargest は、上位 n 番目までの値を Series で返す。

# 3番目に小さい値までを取得する。
print(s.nsmallest(3))
# 3    3
# 4    3
# 1    5
# dtype: int64

# 3番目に大きい値までを取得する。
print(s.nlargest(3))
# 0    7
# 2    6
# 1    5
# dtype: int64

平均、分散、標準偏差、最頻値

DataFrame Series numpy 説明
DataFrame.mean Series.mean mean 平均を計算する。
DataFrame.var Series.var var 分散を計算する。
DataFrame.std Series.std std 標準偏差を計算する。
DataFrame.mode Series.mode 最頻値

平均、分散、標準偏差、最頻値

import pandas as pd

s = pd.Series([7, 5, 6, 3, 3, 5])

print("mean", s.mean())  # mean 4.833333333333333
print("var", s.var())  # var 2.5666666666666664
print("std", s.std())  # std 1.602081978759722

最頻値

最頻値は2つ以上ある場合が考えられるので、1つの場合でもスカラーではなく、Series を返すことに注意する。

import pandas as pd

s = pd.Series([7, 5, 6, 3, 3, 5])

print(s.mode())
# 0    3
# 1    5
# dtype: int64

相関

DataFrame Series numpy 説明
DataFrame.cov Series.cov cov 共分散を計算する。
DataFrame.corr Series.corr corrcoef 相関係数を計算する。
Series.autocorr 自己相関係数を計算する。
DataFrame.corrwith

Series.cov: 2つの Series の共分散を計算する。

2組のサンプル x_1, x_2, \cdots, x_n 及び y_1, y_2, \cdots, y_n が与えられたとする。
\bar{x}, \bar{y} をそれぞれの平均としたとき、この2組のサンプルの 共分散 \sigma_{xy} は次の式で計算できる。


\displaystyle
\sigma_{xy} = \frac{1}{n - 1} \sum_{i = 0}^n (x_i - \bar{x}) (y_i - \bar{y})

import pandas as pd

s1 = pd.Series([5, 1, 7, 6, 1, 4, 5, 6, 1, 8])
s2 = pd.Series([7, 4, 1, 1, 7, 2, 8, 1, 6, 3])

print(s1.cov(s2))  # -3.6666666666666665

# 共分散の定義に従い、計算した場合
cov = (s1 - s1.mean()).dot(s2 - s2.mean()) / (s1.size - 1)
print(cov)  # -3.6666666666666665

DataFrame.cov: 列同士の組み合わせで分散共分散行列を計算する。

import pandas as pd

df = pd.DataFrame([[6, 4, 2, 8, 8], [5, 2, 5, 5, 7], [1, 4, 8, 2, 4]])

print(df.cov())
#      0         1    2    3         4
# 0  7.0 -1.000000 -7.5  7.5  5.500000
# 1 -1.0  1.333333  0.0  0.0 -0.666667
# 2 -7.5  0.000000  9.0 -9.0 -6.000000
# 3  7.5  0.000000 -9.0  9.0  6.000000
# 4  5.5 -0.666667 -6.0  6.0  4.333333

Series.corr: 2つの Series の相関係数を計算する。

2組のサンプル x_1, x_2, \cdots, x_n 及び y_1, y_2, \cdots, y_n が与えられたとする。
\sigma{x}, \sigma{y} をそれぞれの標準偏差\sigma_{xy} を共分散としたとき、この2組のサンプルの 相関係数 \sigma_{xy} は次の式で計算できる。


\displaystyle
\sigma_{xy} = \frac{\sigma_{xy}}{\sigma_x \sigma_y}

import pandas as pd

s1 = pd.Series([5, 1, 7, 6, 1, 4, 5, 6, 1, 8])
s2 = pd.Series([7, 4, 1, 1, 7, 2, 8, 1, 6, 3])

print(s1.corr(s2))  # -0.5075121578347136

# 相関係数の定義に従い、計算した場合
corr = s1.cov(s2) / (s1.std() * s2.std())
print(corr)  # -0.5075121578347136

DataFrame.corr: 列同士の組み合わせで相関係数行列を計算する。

import pandas as pd

df = pd.DataFrame([[6, 4, 2, 8, 8], [5, 2, 5, 5, 7], [1, 4, 8, 2, 4]])

print(df.corr())
#           0         1         2         3         4
# 0  1.000000 -0.327327 -0.944911  0.944911  0.998625
# 1 -0.327327  1.000000  0.000000  0.000000 -0.277350
# 2 -0.944911  0.000000  1.000000 -1.000000 -0.960769
# 3  0.944911  0.000000 -1.000000  1.000000  0.960769
# 4  0.998625 -0.277350 -0.960769  0.960769  1.000000

Series.autocorr: 自己相関係数を計算する。

import pandas as pd

s = pd.Series([5, 1, 7, 6, 1, 4, 5, 6, 1, 8])

print(s.autocorr(lag=3))  # 0.28554619406639103

DataFrame.corrwith: 2組の DataFrame 列または行同士の組み合わせで相関行列を計算する。

import pandas as pd

df1 = pd.DataFrame([[3, 6, 5, 6, 6], [3, 2, 2, 2, 5], [7, 4, 3, 2, 5]])
df2 = pd.DataFrame([[2, 1, 5, 5, 1], [4, 4, 4, 8, 5], [1, 4, 1, 2, 8]])

print(df1.corrwith(df2))
# 0   -0.755929
# 1   -0.866025
# 2    0.419314
# 3    0.000000
# 4   -0.904194
# dtype: float64

その他

DataFrame Series numpy 説明
DataFrame.mad Series.mad 平均絶対偏差を計算する。
DataFrame.sem Series.sem 平均の標準偏差を計算する。
DataFrame.kurt Series.kurt 尖度を計算する。
DataFrame.kurtosis Series.kurtosis 尖度を計算する。(Series.kurt のエイリアス)
DataFrame.skew Series.skew 歪度を計算する。

describe: 各種統計量を一度に計算する。

DataFrame Series numpy 説明
DataFrame.describe Series.describe 各種統計量を計算する。

Series.describe

各種統計量を計算して、Series で返す。
Series のインデックス及び値はそれぞれ統計量の名前、値に対応している。

import pandas as pd

s = pd.Series([5, 1, 7, 6, 1, 4, 5, 6, 1, 8])
s2 = s.describe()
print(s2)
# count    10.000000
# mean      4.400000
# std       2.590581
# min       1.000000
# 25%       1.750000
# 50%       5.000000
# 75%       6.000000
# max       8.000000
# dtype: float64

DataFrame.describe

各列または行ごとの各種統計量を計算して、DataFrame で返す。
DataFrame のインデックスは統計量の名前に対応している。

import pandas as pd

df = pd.DataFrame([[3, 6, 5, 6, 6], [3, 2, 2, 2, 5], [7, 4, 3, 2, 5]])

df2 = df.describe()
print(df2)
#               0    1         2         3         4
# count  3.000000  3.0  3.000000  3.000000  3.000000
# mean   4.333333  4.0  3.333333  3.333333  5.333333
# std    2.309401  2.0  1.527525  2.309401  0.577350
# min    3.000000  2.0  2.000000  2.000000  5.000000
# 25%    3.000000  3.0  2.500000  2.000000  5.000000
# 50%    3.000000  4.0  3.000000  2.000000  5.000000
# 75%    5.000000  5.0  4.000000  4.000000  5.500000
# max    7.000000  6.0  5.000000  6.000000  6.000000