按组标准化变量-为什么平均值始终为零?

时间:2018-10-12 21:07:30

标签: python pandas standardized

我有以下数据:

df = pd.DataFrame({'sound': ['A', 'B', 'B', 'A', 'B', 'A'],
                   'score': [10, 5, 6, 7, 11, 1]})
print(df)

  sound  score
0     A     10
1     B      5
2     B      6
3     A      7
4     B     11
5     A      1

如果我将score变量标准化(即Z得分),则会得到以下值。新的z列的平均值基本上为0,SD为1,这两个值均应用于标准化变量:

df['z'] = (df['score'] - df['score'].mean())/df['score'].std()
print(df)
print('Mean: {}'.format(df['z'].mean()))
print('SD: {}'.format(df['z'].std()))

  sound  score         z
0     A     10  0.922139
1     B      5 -0.461069
2     B      6 -0.184428
3     A      7  0.092214
4     B     11  1.198781
5     A      1 -1.567636
Mean: -7.401486830834377e-17
SD: 1.0

但是,我真正感兴趣的是基于组成员身份(sound)计算Z分数。例如,如果某个分数来自声音A,则仅使用声音A值的平均值和SD将该值转换为Z分数。同样,声音B的Z分数将仅使用声音B的平均值和SD。与常规Z分数计算相比,这显然会产生不同的值:

df['zg'] = df.groupby('sound')['score'].transform(lambda x: (x - x.mean()) / x.std())
print(df)
print('Mean: {}'.format(df['zg'].mean()))
print('SD: {}'.format(df['zg'].std()))

  sound  score         z        zg
0     A     10  0.922139  0.872872
1     B      5 -0.461069 -0.725866
2     B      6 -0.184428 -0.414781
3     A      7  0.092214  0.218218
4     B     11  1.198781  1.140647
5     A      1 -1.567636 -1.091089
Mean: 3.700743415417188e-17
SD: 0.894427190999916

我的问题是:为什么基于组的标准化值(zg)的平均值也基本上等于0?这是预期的行为还是我的计算在某处有错误?

z得分很有意义,因为在变量中进行标准化本质上将均值强制为0。但是zg值是针对每个声音组使用不同的均值和SD计算得出的,因此我不确定为什么该新变量的均值也设置为0。

我能看到的唯一情况是,值的总和> 0等于值的总和<0,这在取平均值时会抵消为0。这在常规的Z分数计算中会发生,但我感到惊讶的是,在像这样的多个组中进行操作时也会发生这种情况。

2 个答案:

答案 0 :(得分:3)

我认为这很合理。如果E [abc | def是给定abc的{​​{1}}的期望,然后是def

df['zg'] = E [m1 | 'zg'] = sound = 'A'〜0

(0.872872 + 0.218218 -1.091089)/3 = E [m2 | 'zg'] = sound = 'B'〜0

E [(-0.725866 - 0.414781 + 1.140647)/3] = 'zg' = (m1+m2)/2〜0

答案 1 :(得分:3)

是的,这是预期的行为。

Law of Iterated Expectations来形容,

enter image description here

尤其是,如果组Y是有限的并且因此可数,

enter image description here

其中

enter image description here

但是,根据构造,对于您的E[X|Y_j]组可能的组中0的所有值,每个Y都是G

因此,总平均值也将为零。