Дисперсия панд и результат стандартного отклонения отличаются от ручного расчета - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь найти Mean, Variance и SD, используя панд.Однако ручной расчет отличается от расчета для панд.Есть ли что-то, что я пропускаю, используя панд.Прикрепленный скриншот xl для справки Mean=394, Variance21704, SD=147.32

import pandas as pd

dg_df = pd.DataFrame(
            data=[600,470,170,430,300],
            index=['a','b','c','d','e'])

print(dg_df.mean(axis=0)) # 394.0 matches with manual calculation
print(dg_df.var())        # 27130.0 not matching with manual calculation 21704
print(dg_df.std(axis=0))  # 164.71187 not matching with manual calculation 147.32

Ответы [ 3 ]

0 голосов
/ 04 октября 2018

Существует более одного определения стандартного отклонения.Вы рассчитываете эквивалент Excel STDEV.P, который имеет описание: «Расчет стандартного отклонения на основе всей совокупности ...».Если вам нужно стандартное отклонение выборки в Excel, используйте STDEV.S.

pd.DataFrame.std предполагает 1 степень свободы по умолчанию, также известную как sample стандартное отклонение.

numpy.std предполагает 0 степень свободы по умолчанию, также известную как совокупность стандартное отклонение.

См. Исправление Бесселя , чтобы понять разницу между выборкой и населением.

Вы также можете указать ddof=0 с помощью Pandas std / var.:

dg_df.std(ddof=0)
dg_df.var(ddof=0)
0 голосов
/ 04 октября 2018

Вы также можете использовать dg_df.describe (), затем иметь следующий фрейм данных.Может быть, более визуальный

count   5.00000
mean    394.00000
std 164.71187
min 170.00000
25% 300.00000
50% 430.00000
75% 470.00000
max 600.00000

И вы можете получить правильные данные, такие как dg_df.describe().loc['count']

0 голосов
/ 04 октября 2018

Измените параметр по умолчанию ddof=1 (Дельта степеней свободы) на 0 в DataFrame.var, а также в DataFrame.std, параметр axis=0 является значением по умолчанию, поэтомуследует опустить:

print(dg_df.mean())
0    394.0
dtype: float64

print(dg_df.var(ddof=0))  
0    21704.0
dtype: float64

print(dg_df.std(ddof=0))
0    147.322775
dtype: float64
...