在Azure Data Explorer中过滤坏数据,确保Max()返回正确有效值
处理数据集异常值:精准过滤无效数据并正确计算最大值
针对你遇到的问题——用百分位数方法会误过滤有效值,而需要剔除像100000这类极端坏数据后取最大值,这里提供几个实用的解决方案:
方法一:改进四分位距(IQR)法(推荐)
IQR是比简单百分位数更稳健的异常值识别方法,能避免误删合理的高值。以你的数据集为例:
- 先对数据排序:
1, 2, 8, 10, 20, 25, 55, 95, 98, 99, 100, 100000 - 计算下四分位(Q1):前1/4数据的中位数,即第3个和第4个数的平均值
(8+10)/2=9 - 计算上四分位(Q3):后1/4数据的中位数,即第9个和第10个数的平均值
(98+99)/2=98.5 - 计算四分位距:
IQR = Q3 - Q1 = 98.5 - 9 = 89.5 - 设定异常值上限:
Q3 + 1.5*IQR = 98.5 + 1.5*89.5 = 232.75 - 过滤掉超过上限的数值,剩下的有效值最大值就是100
用Python实现的代码示例:
data = [1, 2, 8, 10, 20, 25, 55, 100, 100000, 98, 99, 95] sorted_data = sorted(data) q1 = sorted_data[len(sorted_data) // 4] q3 = sorted_data[3 * len(sorted_data) // 4] iqr = q3 - q1 upper_limit = q3 + 1.5 * iqr filtered_data = [x for x in data if x <= upper_limit] print(max(filtered_data)) # 输出:100
方法二:基于领域知识设定范围
如果你明确知道数据的合理取值边界(比如你的场景里正常数据不会超过100),直接设定过滤范围是最高效的:
data = [1, 2, 8, 10, 20, 25, 55, 100, 100000, 98, 99, 95] filtered_data = [x for x in data if x <= 100] print(max(filtered_data)) # 输出:100
方法三:中位数绝对偏差(MAD)法
适合数据分布偏斜的场景,比IQR更抗极端值干扰:
- 计算数据集的中位数:
(25+55)/2=40 - 计算每个数据与中位数的绝对偏差
- 计算这些偏差的中位数(MAD):
(15+20)/2=17.5 - 设定阈值(通常取3倍MAD):
3*17.5=52.5 - 偏差超过阈值的数值判定为异常值(这里100000的偏差是99960,远大于阈值,会被过滤)
为什么百分位数方法会失效?
常规的百分位数截断(比如取95%分位数)会把接近分位数的有效值误删——你的数据集里100处于高值但属于正常范围,若用95%分位数,可能会把它和100000一起过滤,而IQR或MAD方法能区分合理高值和极端异常值。
内容的提问来源于stack exchange,提问作者KNDM
相关产品推荐
相关产品推荐

