Python箱线图:识别数据异常值
Python箱线图实战:一眼揪出数据里的“刺头”异常值
做数据分析的朋友,大概都经历过这种崩溃瞬间:辛辛苦苦跑完的模型,准确率惨不忍睹,排查半天发现是几个离谱的异常值在作祟。面对成千上万条数据,挨个肉眼排查显然不现实。这时候,箱线图(Boxplot) 就成了我们手里最趁手的“照妖镜”。今天咱们不聊干瘪的理论,直接上手用Python把数据里的“刺头”揪出来。
把箱线图当成数据的“体检报告”
把箱线图想象成一次班级考试成绩的体检报告。中间那个箱子,装着全班大部分人的成绩(中间50%的数据),箱子中间的线是中位数。箱子上下伸出的两条“触须”,代表着正常发挥的上下限。
如果有个同学考了10分,或者突然考了150分(满分100),这些点就会孤零零地落在“触须”外面。在统计学里,这些外面的点就是我们要找的异常值。它的核心判断标准叫IQR(四分位距),也就是箱子的高度。通常,超出触须范围(一般是1.5倍IQR)的数据,就会被标记为异常。
Python实操:画出你的“照妖镜”
在Python里,画箱线图最省事的工具是Seaborn。假设我们有一份用户每日消费金额的数据df。
import seaborn as sns
import matplotlib.pyplot as plt
# 设置中文字体,防止图表标题乱码
plt.rcParams['font.sans-serif'] = ['SimHei']
# 绘制单变量箱线图
sns.boxplot(x=df['daily_spend'])
plt.title('用户每日消费金额分布')
plt.show()
图表一出来,那些飘在上下边缘外面的小圆点,就是潜在的异常值。不过,光用眼睛看还不够,我们需要让代码自动把它们提取出来。
精准提取:让异常值无处遁形
看图只是第一步,把异常值单独拎出来做后续处理才是关键。我们可以直接利用箱线图的底层逻辑(1.5倍IQR规则)来写筛选代码。
import numpy as np
# 计算第一四分位数(Q1)和第三四分位数(Q3)
Q1 = np.percentile(df['daily_spend'], 25)
Q3 = np.percentile(df['daily_spend'], 75)
# 计算四分位距(IQR)
IQR = Q3 - Q1
# 设定异常值的上下边界
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
# 筛选出异常数据
outliers = df[(df['daily_spend'] < lower_bound) | (df['daily_spend'] > upper_bound)]
print(f"共发现 {len(outliers)} 条异常数据")
这里的核心操作在于准确计算Q1和Q3,并利用逻辑或(|)条件将低于下限和高于上限的数据同时框选出来。拿到outliers后,你就可以针对这批数据做专项分析了。
揪出异常值后,直接删掉吗?
很多新手看到异常值,第一反应是“赶紧删了保平安”。但这其实是个危险的举动。处理异常值,得看它是怎么来的。
如果是业务逻辑错误,比如用户年龄填了200岁,或者消费金额出现了负数,这种属于脏数据,直接清洗掉没商量。
但如果数据是真实的极端情况,比如大促期间某个土豪用户单笔消费了十万块。这个“异常值”恰恰是业务最关心的高净值客户。这时候不仅不能删,还得给他们打个标签,单独做用户分层分析。
还有一种情况,数据没填错,但就是偏离常态(比如某地区突发暴雨导致外卖订单量暴跌)。这时候可以考虑对数转换或者分箱处理,削弱极端值对整体模型的拉扯,让算法跑得更稳。
箱线图不仅仅是一个画图工具,它更是我们理解数据分布、洞察业务真相的切入点。下次再遇到数据模型“水土不服”,别急着盲目调参,先画个箱线图看看,说不定那些藏在角落里的“刺头”,才是解开问题的真正钥匙。


还没有评论,来说两句吧...