盖帽处理异常值

本文探讨了数据分析中异常值的几种类型,包括单值异常、相关性异常和突发异常,并通过实例解释如何识别和处理这些异常值。提到了盖帽法作为处理异常值的一种常见策略,根据置信区间的标准差来决定删除范围。同时,区分了异常值与强影响点,并介绍了回归模型中判断强影响点的方法。最后,讨论了对异常值敏感的模型,如聚类分析和时间序列。
部署运行你感兴趣的模型镜像

                                                                  异常值的几种情况

       数据分析中,异常值是比较难于界定的,一般数据异常值会有几种情况:

  • 单值异常

       如下图所示,某市场产品客群的样本分布中,年龄为0-5岁与150-200岁即可判定为异常,一般单值异常需结合实际的业务进行判断。

 

  • 相关性异常

        一般收入随年龄的增长呈现类线性趋势,如果出现下图情况,即低龄高收入者(如思聪)、高龄低收入者(如流浪老人),虽也可能属于正常情况,但还是要将其排除在建模样本外。如下为实现该散点图的SAS代码:

  • 突发异常

        如果出现下图情况,首先需要思考为什么会出现异常值,针对这种激增的异常,我一般会添加一个哑变量,用哑变量去表示该点发生了异常情况。

        一般,如果判断了该点确实为异常值,我会标记出该点并禁止其入模,这里还需要注意区分强影响点与异常值的区别,如何判断某点是异常值还是强影响点?如果模型中,排除某点后模型并无变动,则该点确实为异常值,如果排除某点后模型被完全改变了,则该点可能为强影响点。

                                                                    回归中的强影响点

       通常,回归模型可以用如下方法判断强影响点:

  • 剔出残差
  • 杠杆值
  • COOK距离
  • 协方差比

                                                                    异常值怎么处理

       一般,我习惯用盖帽法去处理数据中的异常值,即:

       如果一个置信区间左右两边各有三个标准差,即区间置信度为99%时,一般建议三倍标准差以外删除;而如果一个置信区间左右两边各有两个标准差,即区间置信度为95%,此时到底取两个还是三个标准差则取决于模型对于异常的敏感程度

       通常,回归模型对于异常的敏感程度还算可以,有异常值放在那里也问题不大,但对于对异常值非常敏感的模型,一般需要删除掉两倍标准差以外的异常值了,例如聚类分析

      我认为,比较害怕异常值的两个模型除聚类分析外,另外一个应该就属时间序列了

我的公众号:Data Analyst

个人网站:https://www.datanalyst.net/

 

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

数据处理中,处理异常值数据清洗的重要环节,目的是确保数据的准确性和建模结果的可靠性。以下是一些常用的处理异常值的函数或方: ### 1. 基于统计方异常值处理 这种方通常利用统计学原理识别并处理异常值,例如使用均值和标准差(如三西格玛原则)或四分位距(IQR)来判断异常值。 - **三西格玛原则(3σ原则)**:假设数据服从正态分布,那么数据落在均值±3倍标准差之外的概率非常小,因此可以将这些视为异常值。 - **IQR方**:通过计算第一四分位数(Q1)和第三四分位数(Q3),然后计算IQR = Q3 - Q1,任何低于 Q1 - 1.5*IQR 或高于 Q3 + 1.5*IQR 的值可被视为异常值。 ```python def detect_outliers_iqr(data): q1 = data.quantile(0.25) q3 = data.quantile(0.75) iqr = q3 - q1 lower_bound = q1 - 1.5 * iqr upper_bound = q3 + 1.5 * iqr outliers = data[(data < lower_bound) | (data > upper_bound)] return outliers ``` ### 2. 删除异常值 识别出异常值后,可以直接删除这些记录。在Pandas中,可以使用 `drop` 方根据索引删除异常值行。 ```python # 假设 outliers_index 是包含异常值行索引的列表 clean_data = excel_data.drop(outliers_index) ``` 此方适用于异常值数量较少且不影响整体数据分布的情况 [^1]。 ### 3. 异常值替换(盖帽盖帽是一种处理异常值的替代方,即将异常值替换为某个合理范围内的最大值或最小值。 ```python def cap_outliers(data, lower, upper): return data.clip(lower=lower, upper=upper) ``` 此方适用于不希望丢失数据但又需要控制异常值影响的场景 [^2]。 ### 4. 异常值视为缺失值处理异常值视为缺失值后,可以使用缺失值插补方进行处理,例如均值、中位数、众数填充,或者使用插值进行填补 [^3]。 ```python # 将异常值替换为 NaN data[outliers_mask] = np.nan # 使用前后观测值的平均值进行填充 data.fillna(method='ffill', inplace=True) ``` ### 5. 使用机器学习方识别异常值 对于复杂数据集,可以使用专门的异常检测算,例如孤立森林(Isolation Forest)、随机切割森林(Random Cut Forest, RCF)等 [^3]。 ```python from sklearn.ensemble import IsolationForest # 训练孤立森林模型 model = IsolationForest(contamination=0.05) model.fit(data.values.reshape(-1, 1)) # 预测异常值 outliers = model.predict(data.values.reshape(-1, 1)) == -1 ``` ### 6. 数据变换 通过数据变换(如对数变换、Box-Cox变换)可以减少数据的偏态分布,从而降低异常值影响。 ```python import numpy as np # 对数据进行对数变换 data_transformed = np.log1p(data) ``` 这种方适用于数据分布偏斜严重的情况。 ### 7. 可视化方 使用箱线图(Boxplot)或散图(Scatter Plot)等可视化工具,可以直观地识别异常值。 ```python import seaborn as sns sns.boxplot(x=data) ``` 这种方适用于探索性数据分析阶段,帮助识别潜在的异常值。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值