PythonのPandasで分散を計算する方法について

Python,イメージ

AI実装検定のご案内

Pandasで分散(variance)を計算する方法はいくつかあります。

以下で基本的な使い方から細かいオプションや注意点まで詳しく解説します。

目次

分散を計算する基本的な方法

Pandasでは、SeriesDataFrameオブジェクトに対して .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で分散を計算する方法についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次