全国旗舰校区

不同学习城市 同样授课品质

北京

深圳

上海

广州

郑州

大连

武汉

成都

西安

杭州

青岛

重庆

长沙

哈尔滨

南京

太原

沈阳

合肥

贵阳

济南

下一个校区
就在你家门口
+
当前位置:首页  >  技术干货

数据分析之异常值和重复值的处理

发布时间:2022-08-12 15:18:00
发布人:wjy

在进行数据分析的时候除了有缺失值之外,还可能遇到异常值和重复值。

#### 异常值

异常值:

> 偏离正常范围的值,不是错误值。
> 出现的频率很低,但是会对数据分析造成偏差

常采用盖帽法或者数据离散化进行处理

屏幕快照 2021-06-03 下午6.48.12

**1、异常值的判断**

也叫n个标准差法,**均值±n个标准差内的数据叫做正常值**,一般为2-3个标准差

屏幕快照 2021-06-03 下午6.57.02

计算均值和标准差

```
import numpy as np
import pandas as pd

data = pd.read_excel('university.xlsx')
jz = data['报名人数'].mean()
print(jz)
bzc = data['报名人数'].std()
print(bzc)
```

结果:

> ```
> 1525.2222222222222
> 4975.899109579891
> ```

搭配any(),查看是否有超过上下限的数据,这种数据为异常值

```
top = data['报名人数'].mean() + 2 * data['报名人数'].std()
bottom = data['报名人数'].mean() - 2 * data['报名人数'].std()
```

结果:

> ```
> 11477.020441382005
> -8426.57599693756
> ```

是否有超过下限的情况

```
any(data.报名人数 < bottom) # 结果:False
```

是否有超过上限的情况

```
any(data.报名人数 > top) # 结果: True
```

查看【报名人数】为正常值的数据

```
data[data['报名人数'].between(bottom,top)]
```

可以看出少了索引为4和12的数据,该数据报名人数分别为17388和20000,超出上限11477.020441382005

屏幕快照 2021-06-03 下午7.08.28

也可以画个直方图看一下数据的分布情况,感受一下:

```
data.报名人数.plot(kind ='hist')
```

屏幕快照 2021-06-03 下午7.12.13

**箱线法**

> 上四分位数:取3/4位置的数
> 下四分位数:取1/4位置的数
> 分位差 = 上四分位数- 下四分位数
>
> 上界 = 上四分位数 + 1.5*分位差
> 下界= 下四分位数 - 1.5*分位差

**上界 、下界范围之内的数据叫做正常值,范围之外的叫做异常值。**

```
# 下四分位数
Q1 = data.报名人数.quantile(0.25)
print(Q1)
# 上四分位数
Q3 =data.报名人数.quantile(0.75)
print(Q3)
# 分位差
IQR = Q3 - Q1
print(IQR)
# 上界
print(Q3 + 1.5 * IQR)
# 下界
print(Q1 - 1.5 * IQR)
# 是否有超出上界的数据
print(any(data.报名人数 > Q3 + 1.5 * IQR))
# 是否有低于下界的数据
print(any(data.报名人数 < Q1 - 1.5 * IQR))
```

结果:

> ```
> 134.5
> 206.5
> 72.0
> 314.5
> 26.5
> True
> True
> ```

箱线图看一下:

```
data.报名人数.plot(kind = 'box')
```

屏幕快照 2021-06-03 下午7.17.21

说明有超出上限和下限的值

**2、异常值的处理**

方法一:

> 用小于上限最大值去替换超出上限的异常值
> 用大于下限最小值去替换低于下限的异常值

数据准备:
(新增一列【new_报名人数】数据,是为了替换异常值后做对比)

```
data['new_报名人数'] = data['报名人数']
```

计算小于上限的最大值,作为替换值

```
# 计算小于上限的最大值,作为替换值
UL = Q3 + 1.5 * IQR
# 低于上限的最大值
replace_value = data.new_报名人数[data.new_报名人数 < UL].max()
# 用替换值替换超出上限的数据:
data.loc[data.new_报名人数>UL,'new_报名人数'] = replace_value
data
```

最终:

屏幕快照 2021-06-03 下午7.23.45

方法二:

> 低于百分之一分位数的数据用百分之一分位数替换
> 高于百分之九十九分位数的数据用百分之九十九分位数替换

计算百分之一分位数、百分之九十九分位数

```
# 百分之一分位数
P1=data.new_报名人数.quantile(0.01)

# 百分之九十九分位数
P99=data.new_报名人数.quantile(0.99)

```


进行替换

```
data.loc[data['new_报名人数']>P99,'new_报名人数'] = P99

data.loc[data['new_报名人数']<P1,'new_报名人数'] = P1
```

屏幕快照 2021-06-03 下午7.29.22

#### 重复值

一般保留第一条重复数据,对其他重复数据进行移除。

> `判断重复值 df.duplicated`
>
> df.duplicated(subset=None, keep='first')
>
> 参数说明:
> subset:列标签,默认使用所有列,若只考虑用某些列来识别重复项,可指定列
> keep,默认first,保留重复值的第一项,也可以指定last,保留最后一项重复值数据
>
> 返回的是一个视图

```
data.duplicated()
```

True为重复数据

屏幕快照 2021-06-03 下午7.33.10

取出重复值

```
data[data.duplicated()]
```

结果:

屏幕快照 2021-06-03 下午7.34.34

按照指定列判断重复数据

```
data[data.duplicated(subset=['学院','报名人数'])]
```

屏幕快照 2021-06-03 下午7.36.17

**`删除重复数据 df.drop_duplicates`**

一般有重复数据后可以删除

> df.drop_duplicates(subset=None, keep='first', inplace=False)
>
> subset:默认全部列,可以指定特定列来判断重复数据
> keep:保留重复数据的第一条数据
> inplace:是否就地操作,默认False,返回一个视图
> True,就地操作,直接在原数组数据上删除重复值

```
data.drop_duplicates(inplace=True)
data
```

删除后无重复数据。

 

相关文章

反欺诈中所用到的机器学习模型有哪些?

反欺诈中所用到的机器学习模型有哪些?

2023-10-14
强化学习中on-policy与off-policy有什么区别?

强化学习中on-policy与off-policy有什么区别?

2023-10-14
为什么交叉熵可以用于计算代价?

为什么交叉熵可以用于计算代价?

2023-10-14
开发网上平台的大概流程有什么?

开发网上平台的大概流程有什么?

2023-10-14

最新文章

常见网络安全面试题:Windows常用的命令有哪些?

常见网络安全面试题:Windows常用的命令有哪些?

2023-10-09
常见网络安全面试题:根据设备告警如何展开排查?

常见网络安全面试题:根据设备告警如何展开排查?

2023-10-09
常见网络安全面试题:mysql加固呢?(数据库加固)

常见网络安全面试题:mysql加固呢?(数据库加固)

2023-10-09
常见网络安全面试题:windows和linux加固?(操作系统加固)

常见网络安全面试题:windows和linux加固?(操作系统加固)

2023-10-09
在线咨询 免费试学 教程领取