我有一个超市的交易数据集。假设平均支出为 50 美元。
我想获取每个客户的平均支出,并根据这 50 美元的平均支出对他们进行排名。
例如:
John Doe 的平均支出是总体平均支出的 150% = “金牌客户”。
Jane Doe 的平均支出是总体平均支出的 25% = “青铜”
等等等等
现在要计算超市的总体平均支出,我想去掉异常值。这是一家杂货店,但他们可能会时不时地出售一台电视机。所以有一些单笔交易可能是 600 美元以上。我想摆脱这些。
问题是,我用什么代替它们?
我寻找高于平均值 3 个标准差的交易。这些是我的异常值。
我不想用平均值/中位数替换它们。如果我删除他们更大的购买并用 50 美元代替他们,我可能会失去一些“黄金”客户。
我可以用 替换异常值mean + 3*std_dev吗?
我正在使用python,所以当前代码是:
# set threshold above which transaction will be labeled an outlier
# this is the average spend plus 3 times standard dev
value_threshold = (df['amount'].mean()+(df['amount'].std()*3))
# now replace any outlier with the value threshold.
# this will ensure any big spenders stay big spenders so I can rank them accordingly
df['amount'] = np.where(df['amount']>value_threshold ,value_threshold ,df['amount'])
我的方法有意义还是违反了任何规则?
我应该使用中位数而不是四分位间距来查找异常值吗?
分配:
使用我上面的方法删除异常值后。请注意,我们在图表右侧的数据中仍然有大笔支出。(我的黄金客户)
奖金
在修复异常值之前,我的交易数据的箱线图。太可怕了:



