Python 3-Sigma订单量与行数异常检测器多SoldTo场景失效排查
问题原因分析
- 分组统计逻辑未隔离:核心问题大概率是代码中计算3-Sigma所需的均值、标准差时,没有严格按
SoldTo分组独立计算,而是误用了全局数据的统计值。多SoldTo场景下,不同客户的正常数据会拉平原异常客户的阈值区间,导致原本的异常值落在了被稀释后的全局阈值内,无法被检测。 - 滚动窗口跨分组计算:如果滚动统计窗口未按
SoldTo分组隔离,会出现跨客户的窗口合并计算(比如把客户A和客户B的订单数据混在一起算均值),直接破坏单个客户的订单模式分布,原异常行的偏离度被大幅稀释。 - 预处理未按分组执行:数据预处理阶段(如缺失值填充、格式规整)若采用全局操作,会干扰单个客户的数据分布特征,间接影响后续3-Sigma规则的异常判断准确性。
解决路径
- 全流程按
SoldTo分组隔离执行- 预处理环节:对每个
SoldTo分组单独处理缺失值、数据格式转换等,避免全局操作改变单个客户的原始数据分布。 - 滚动统计计算:使用分组窗口函数(比如Pandas中
df.groupby('SoldTo').rolling(window=你的窗口大小).agg({'订单量':'mean', '行数':'std'})),确保每个客户的均值、标准差仅基于自身历史订单数据计算。
- 预处理环节:对每个
- 独立应用3-Sigma阈值
- 为每个
SoldTo分组单独计算均值±3*标准差的上下阈值,再对该分组内的订单量、行数进行异常标记,禁止将全局阈值套用到所有分组。
- 为每个
- 调试验证分组统计细节
- 在代码中添加打印或日志输出,分别输出单
SoldTo和多SoldTo场景下,原异常行所属分组的均值、标准差、阈值,对比两者的差异,确认是否是阈值被全局拉平导致的检测失效。 - 逐步添加其他
SoldTo数据,每一步验证原异常行的检测结果,定位引入哪个客户数据后出现问题,进一步排查该客户数据对统计结果的影响。
- 在代码中添加打印或日志输出,分别输出单
- 测试用例验证
- 保留原单
SoldTo测试用例的检测逻辑,将多SoldTo场景拆分为多个单分组检测的组合,确保每个分组的检测逻辑与单分组场景完全一致。
- 保留原单
内容的提问来源于stack exchange,提问作者CJB
相关产品推荐
相关产品推荐

