我尝试按组查找 Dataframe 的异常值。我有两个组:Group1
和Group2
,我正在尝试找到实现异常值方法的最佳方式
data = {'Group1':['A', 'A', 'A', 'B', 'B', 'B','A','A','B','B','B','A','A','A','B','B','B','A','A','A','B','B','B','A','A','A','A','A','B','B'], 'Group2':['C', 'C', 'C', 'C', 'D', 'D','C','D','C','C','D', 'C', 'C', 'D', 'D','C', 'C','D','D','D', 'D','C','D','C','C', 'D','C','D','C','C'], 'Age':[20, 21, 19, 24, 11, 15, 18, 1, 17,23, 35,2000,22,24,24,18,17,19,21,22,20,25,18,24,17,19,16,18,25,23]}
df = pd.DataFrame(data)
groups = df.groupby(['Group1', 'Group2'])
means = groups.Age.transform('mean')
stds = groups.Age.transform('std')
df['Flag'] = ~df.Age.between(means-stds*3, means+stds*3)
def flag_outlier(x):
lower_limit = np.mean(x) - np.std(x) * 3
upper_limit = np.mean(x) + np.std(x) * 3
return (x>upper_limit)| (x<lower_limit)
df['Flag2'] = df.groupby(['Group1', 'Group2'])['Age'].apply(flag_outlier)
df["Flag3"] = df.groupby(['Group1', 'Group2'])['Age'].transform(lambda x: (x - x.mean()).abs() > 3*x.std())
然而,所有3种方法都未能检测到明显的离群值-例如,当Age
为2000时,这些方法都没有将其视为离群值。这是有原因的吗?或者有可能我的所有3种离群值检测模型的代码都不正确?
我有一种强烈的感觉,我在某个地方犯了一个愚蠢的错误,但我不知道在哪里,所以任何帮助将不胜感激,谢谢!
1条答案
按热度按时间dzhpxtsq1#
在该组中,2000年的年龄与组平均值相差不超过3个标准差,组平均值为239.666667,组标准差为660.129722。
它可能看起来像一个明显的离群值,但你没有足够的数据来标记为离群值的标准。