Pandasで分散(variance)を計算する方法はいくつかあります。
以下で基本的な使い方から細かいオプションや注意点まで詳しく解説します。
目次
分散を計算する基本的な方法
Pandasでは、Series
やDataFrame
オブジェクトに対して .var()
メソッドを使うことで分散を求められます。
Seriesの場合
import pandas as pd
# サンプルデータ
s = pd.Series([10, 20, 30, 40, 50])
# 分散を計算(デフォルトは不偏分散:ddof=1)
variance = s.var()
print("Seriesの分散:", variance)
DataFrameの場合
import pandas as pd
# サンプルデータ
df = pd.DataFrame({
"A": [10, 20, 30, 40, 50],
"B": [5, 15, 25, 35, 45]
})
# 各列ごとの分散を計算
print("DataFrame各列の分散:\n", df.var())
デフォルトの挙動(自由度)
Pandasの .var()
メソッドは、デフォルトで 不偏分散(標本分散) を計算します。
つまり、分母に n-1
を使う(自由度調整がある)方式です。
ddof=1
がデフォルト(不偏分散)ddof=0
を指定すると母分散になります
import pandas as pd
s = pd.Series([10, 20, 30, 40, 50])
# 母分散(ddof=0)
print("母分散 (ddof=0):", s.var(ddof=0))
# 不偏分散(ddof=1:デフォルト)
print("不偏分散 (ddof=1):", s.var(ddof=1))
NaNの扱い
- デフォルトでは
NaN
を無視して計算します(skipna=True
)。 skipna=False
にすると、NaN
が含まれる場合はNaN
を返します。
import pandas as pd
s2 = pd.Series([10, 20, None, 40, 50])
# NaNを無視(デフォルト)
print("NaN無視:", s2.var())
# NaNを含む場合
print("NaNを含む:", s2.var(skipna=False))
行方向・列方向の分散
DataFrameでは axis
を指定できます。
axis=0
(デフォルト):列ごとに分散を計算axis=1
:行ごとに分散を計算
import pandas as pd
df = pd.DataFrame({
"A": [10, 20, 30, 40, 50],
"B": [5, 15, 25, 35, 45]
})
# 列ごとの分散(デフォルト)
print("列ごとの分散:\n", df.var(axis=0))
# 行ごとの分散
print("行ごとの分散:\n", df.var(axis=1))
NumPyとの違い
Pandasは内部でNumPyを使っていますが、分散のデフォルト設定が異なります。
numpy.var()
のデフォルトは 母分散(ddof=0)pandas.Series.var()
のデフォルトは 不偏分散(ddof=1)
そのため、同じデータに対してそのまま計算すると結果が違います。
import pandas as pd
import numpy as np
data = [10, 20, 30, 40, 50]
# NumPy(母分散がデフォルト)
print("NumPy var (母分散, ddof=0):", np.var(data))
# Pandas(不偏分散がデフォルト)
print("Pandas var (不偏分散, ddof=1):", pd.Series(data).var())
応用例
import pandas as pd
df = pd.DataFrame({
"A": [10, 20, 30, 40, 50],
"B": [5, 15, 25, 35, 45],
"C": [2, 4, 6, 8, 10]
})
# 単一列
print("列Aの分散:", df["A"].var())
# 複数列
print("列AとBの分散:\n", df[["A", "B"]].var())
まとめ
Series.var()
/DataFrame.var()
で分散を計算できる- デフォルトは 不偏分散(ddof=1)
NaN
はデフォルトで無視される(skipna=True
)- 行方向・列方向を
axis
で切り替え可能 - NumPyとデフォルト挙動が違うので注意
以上、Pandasで分散を計算する方法についてでした。
最後までお読みいただき、ありがとうございました。