Python 之 异常值/离群值的处理

离群值

离群值是指与集合中其他观测值差异较大的任何数据点。

例如:

当一个学生的平均成绩在90%以上,而其他小组的成绩在70%,就会出现明显的离群现象。
通过分析某个客户的购买模式,突然出现了一个非常高价值的购买(如10万)。虽然某客户的交易额大多在1万左右波动。不管是什么原因,10万的购买量在整体数据中都是一个异数。
乌塞恩-博尔特--记录短跑绝对是排放当大多数运动员被考虑。
异常值存在的原因有很多。有可能是分析人员在输入数据时出错,也有可能是设备产生了测量误差,甚至有可能是故意离群。

如果有离群值/异常值,数据分布会有重尾。

离群有两种类型:一维和多维。

一维离群是指仅由一个变量的极端值组成的数据点,而多维离群/异常是指至少两个变量的综合异常值。假设我们有三个不同的变量--X,Y,Z。如果我们将这些变量绘制在三维空间中,就会形成一种云。所有位于在这之外的数据点都将是多维度的排放。

异常/离群值会严重影响分析和统计建模的结果。

大多数参数统计,如平均数、标准差和相关性,以及基于这些参数的任何统计,对离群值都非常敏感。

单纯地消除离群并不总是一个好主意。离群/异常值可以是相当合理的观察,有时也是最有趣的观察。在作出决定之前,必须研究离群值的性质。

如果某项异常值显然是由于输入或测量的数据不正确造成的,则应将其删除。
如果离群/异常值不改变结果,但影响假设,则可删除离群/异常值。不过,报告中值得注意的是这一点。你也可以建立一个有这个版本和没有这个版本的模型,看看结果。

如何查找离群/异常值情况?
1.通过可视化 

2.通过数学计算

import pandas as pd

import matplotlib.pyplot as plt
%matplotlib inline

from sklearn.datasets import load_boston
boston = load_boston()
x = boston.data
y = boston.target
columns = boston.feature_names

#create the dataframe
boston_df = pd.DataFrame(x)
boston_df.columns = columns
boston_df.head()

 

 Box-plot

import seaborn as sns
sns.boxplot(x=boston_df['INDUS']);

剖析框图

sns.boxplot(x=boston_df['PTRATIO']);

sns.boxplot(x=boston_df['DIS']);

最后一张图显示的是10和12之间的三个辍学点,不包括在方框内的其他观察点,即公寓之间。

Scatter-plot

fig, ax = plt.subplots(figsize=(16,8))
ax.scatter(boston_df['INDUS'], boston_df['TAX'])
ax.set_xlabel('Proportion of non-retail business acres per town')
ax.set_ylabel('Full-value property-tax rate per $10,000')
plt.show();

你可以清晰地看到云外的点。

Z-Score

Z-Score是指观测点或数据的值超过观测值或测量值平均值的标准差的符号数。

from scipy import stats
import numpy as np
z = np.abs(stats.zscore(boston_df))
print(z)

threshold = 3
print(np.where(z > 3))

print(z[55][1])
3.375038763517309

例如,ZN中的第55个观测值(划为25,000平方英尺以上地段的住宅用地比例)就是一种离群。

IQR score

四分位数范围(IQR),又称平均数或50%平均数,或技术上称为H-spread,是衡量统计学分散度的指标,等于75%和25%之间的差值,或上四分位数和下四分位数之间的差值,IQR=Q3 - Q1。百度百科解释

Q1 = boston_df.quantile(0.25)
Q3 = boston_df.quantile(0.75)
IQR = Q3 - Q1
print(IQR)
CRIM         3.565378
ZN          12.500000
INDUS       12.910000
CHAS         0.000000
NOX          0.175000
RM           0.738000
AGE         49.050000
DIS          3.088250
RAD         20.000000
TAX        387.000000
PTRATIO      2.800000
B           20.847500
LSTAT       10.005000
dtype: float64

既然我们现在有了IQR估计,那么我们就选择离群值。下面的代码将产生带有真值和假值的结果。带有False的数据点表示这些值是有效的,而True则表示有释放。

print((boston_df < (Q1 - 1.5 * IQR)) | (boston_df > (Q3 + 1.5 * IQR)))
      CRIM     ZN  INDUS   CHAS    NOX     RM    AGE    DIS    RAD    TAX  \
0    False  False  False  False  False  False  False  False  False  False   
1    False  False  False  False  False  False  False  False  False  False   
2    False  False  False  False  False  False  False  False  False  False   
3    False  False  False  False  False  False  False  False  False  False   
4    False  False  False  False  False  False  False  False  False  False   
5    False  False  False  False  False  False  False  False  False  False   
6    False  False  False  False  False  False  False  False  False  False   
7    False  False  False  False  False  False  False  False  False  False   
8    False  False  False  False  False  False  False  False  False  False   
9    False  False  False  False  False  False  False  False  False  False   
10   False  False  False  False  False  False  False  False  False  False   
11   False  False  False  False  False  False  False  False  False  False   
12   False  False  False  False  False  False  False  False  False  False   
13   False  False  False  False  False  False  False  False  False  False   
14   False  False  False  False  False  False  False  False  False  False   
15   False  False  False  False  False  False  False  False  False  False   
16   False  False  False  False  False  False  False  False  False  False   
17   False  False  False  False  False  False  False  False  False  False   
18   False  False  False  False  False  False  False  False  False  False   
19   False  False  False  False  False  False  False  False  False  False   
20   False  False  False  False  False  False  False  False  False  False   
21   False  False  False  False  False  False  False  False  False  False   
22   False  False  False  False  False  False  False  False  False  False   
23   False  False  False  False  False  False  False  False  False  False   
24   False  False  False  False  False  False  False  False  False  False   
25   False  False  False  False  False  False  False  False  False  False   
26   False  False  False  False  False  False  False  False  False  False   
27   False  False  False  False  False  False  False  False  False  False   
28   False  False  False  False  False  False  False  False  False  False   
29   False  False  False  False  False  False  False  False  False  False   
..     ...    ...    ...    ...    ...    ...    ...    ...    ...    ...   
476  False  False  False  False  False  False  False  False  False  False   
477   True  False  False  False  False  False  False  False  False  False   
478   True  False  False  False  False  False  False  False  False  False   
479   True  False  False  False  False  False  False  False  False  False   
480  False  False  False  False  False  False  False  False  False  False   
481  False  False  False  False  False  False  False  False  False  False   
482  False  False  False  False  False  False  False  False  False  False   
483  False  False  False  False  False  False  False  False  False  False   
484  False  False  False  False  False  False  False  False  False  False   
485  False  False  False  False  False  False  False  False  False  False   
486  False  False  False  False  False  False  False  False  False  False   
487  False  False  False  False  False  False  False  False  False  False   
488  False  False  False  False  False  False  False  False  False  False   
489  False  False  False  False  False  False  False  False  False  False   
490  False  False  False  False  False  False  False  False  False  False   
491  False  False  False  False  False  False  False  False  False  False   
492  False  False  False  False  False  False  False  False  False  False   
493  False  False  False  False  False  False  False  False  False  False   
494  False  False  False  False  False  False  False  False  False  False   
495  False  False  False  False  False  False  False  False  False  False   
496  False  False  False  False  False  False  False  False  False  False   
497  False  False  False  False  False  False  False  False  False  False   
498  False  False  False  False  False  False  False  False  False  False   
499  False  False  False  False  False  False  False  False  False  False   
500  False  False  False  False  False  False  False  False  False  False   
501  False  False  False  False  False  False  False  False  False  False   
502  False  False  False  False  False  False  False  False  False  False   
503  False  False  False  False  False  False  False  False  False  False   
504  False  False  False  False  False  False  False  False  False  False   
505  False  False  False  False  False  False  False  False  False  False   

     PTRATIO      B  LSTAT  
0      False  False  False  
1      False  False  False  
2      False  False  False  
3      False  False  False  
4      False  False  False  
5      False  False  False  
6      False  False  False  
7      False  False  False  
8      False  False  False  
9      False  False  False  
10     False  False  False  
11     False  False  False  
12     False  False  False  
13     False  False  False  
14     False  False  False  
15     False  False  False  
16     False  False  False  
17     False  False  False  
18     False   True  False  
19     False  False  False  
20     False  False  False  
21     False  False  False  
22     False  False  False  
23     False  False  False  
24     False  False  False  
25     False   True  False  
26     False  False  False  
27     False   True  False  
28     False  False  False  
29     False  False  False  
..       ...    ...    ...  
476    False  False  False  
477    False  False  False  
478    False  False  False  
479    False  False  False  
480    False  False  False  
481    False  False  False  
482    False  False  False  
483    False  False  False  
484    False  False  False  
485    False  False  False  
486    False  False  False  
487    False  False  False  
488    False  False  False  
489    False   True  False  
490    False   True  False  
491    False  False  False  
492    False  False  False  
493    False  False  False  
494    False  False  False  
495    False  False  False  
496    False  False  False  
497    False  False  False  
498    False  False  False  
499    False  False  False  
500    False  False  False  
501    False  False  False  
502    False  False  False  
503    False  False  False  
504    False  False  False  
505    False  False  False  

[506 rows x 13 columns]

在ModelTestingTemplate中的影响措施。

聚类/分类。
1.K-means
2.隔离林

 


离群值/异常值怎么办?
识别异常值--分析有无异常值的结果模型--做出结论。
如果你确定数值是错误的,就修正它。
如果离群值不在利益分配范围内,则删除。
考虑到数据的差距。
使用抗离群值的统计工具,例如,稳健回归(用另一种参数估计方法)Robust_regression
离群值的常见原因是两种分布的混合,可能是两个不同的子人群,也可能表明 "测量正确 "和 "测量误差";这通常是由混合模型来建模。 (Mixture model).

 

  • 11
    点赞
  • 100
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Python3中,我们可以使用各种方法来处理西格玛异常值。 一种常见的方法是通过计算数据的标准差和均值来识别异常值。标准差反映数据的离散程度,当某个数据点与均值的差距超过3倍标准差时,可以将其视为异常值。可以使用NumPy库中的函数来计算标准差和均值,并使用条件语句来判断是否为异常值。 另一种方法是使用箱线图来识别异常值。箱线图可以显示数据的分布情况,包括中位数、上下四分位数和异常值。可以使用Matplotlib库中的函数绘制箱线图,并使用条件语句来判断是否为异常值。如果数据点超过上下四分位数的1.5倍距离,可以将其视为异常值。 还有一种方法是使用数据的离群值检测算法,例如LOF(Local Outlier Factor)。LOF算法使用密度和最近邻距离的概念来识别离群点。可以使用Scikit-learn库中的函数来应用LOF算法,并使用条件语句来判断是否为异常值处理异常值的方法可以是删除、替换或修正。如果异常值对后续分析和建模没有意义,可以选择删除异常值。如果异常值是数据收集或输入错误造成的,可以选择替换异常值为合理的值。如果异常值是由于特殊情况引起的,可以选择修正异常值,使其符合数据的分布特征。 综上所述,处理西格玛异常值的方法有很多种,具体使用哪种方法取决于数据的特点和需要处理异常值情况。通过合适的方法处理异常值,可以提高数据的质量和分析结果的准确性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值