【20天搞定数据分析】第十天:数据的异常值和重复值怎么处理?拿去抄作业!
千锋python
2021年06月09日 17:25
收录于文集
共20篇

【千锋教育干货暴击】

如果你想更好的学习Python乃至转行,弯道超车,快人一步!本课程零基础即可加入学习,抓住大数据、机器学习、人工智能时代的红利,开启你的第一行代码吧!

   ↓    ↓    ↓

千锋教育Python教程_700集零基础Python入门到精通教程(保姆级新手教程)​

千锋教育Python教程全套_python零基础入门到精通(学完可达到Python工程师水平)​


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

异常值

异常值:

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

1、异常值的判断

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

计算均值和标准差

代码块
JavaScript
自动换行
复制代码
import numpy as np
import pandas as pd

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

结果:

代码块
JavaScript
自动换行
复制代码
> 1525.2222222222222
> 4975.899109579891
复制成功

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

代码块
JavaScript
自动换行
复制代码
top = data['报名人数'].mean() + 2 * data['报名人数'].std()
bottom = data['报名人数'].mean() - 2 * data['报名人数'].std()
复制成功

结果:

代码块
JavaScript
自动换行
复制代码
> 11477.020441382005 
> -8426.57599693756
复制成功

是否有超过下限的情况

代码块
JavaScript
自动换行
复制代码
any(data.报名人数 < bottom)   # 结果:False
复制成功

是否有超过上限的情况

代码块
JavaScript
自动换行
复制代码
any(data.报名人数 > top)  # 结果:True
复制成功

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

代码块
JavaScript
自动换行
复制代码
data[data['报名人数'].between(bottom,top)]
复制成功

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

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

代码块
JavaScript
自动换行
复制代码
data.报名人数.plot(kind ='hist')
复制成功

箱线法

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

代码块
JavaScript
自动换行
复制代码
# 下四分位数Q1 = data.报名人数.quantile(0.25)print(Q1)# 上四分位数Q3 =data.报名人数.quantile(0.75)print(Q3)# 分位差IQR = Q3 - Q1print(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))
复制成功

结果:

代码块
JavaScript
自动换行
复制代码
> 134.5206.572.0314.526.5TrueTrue
复制成功

箱线图看一下:

代码块
JavaScript
自动换行
复制代码
data.报名人数.plot(kind = 'box')
复制成功

结果:

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

2、异常值的处理

方法一:

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

代码块
JavaScript
自动换行
复制代码
data['new_报名人数'] = data['报名人数']
复制成功

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

代码块
JavaScript
自动换行
复制代码
# 计算小于上限的最大值,作为替换值UL = Q3 + 1.5 * IQR# 低于上限的最大值replace_value = data.new_报名人数[data.new_报名人数 < UL].max()# 用替换值替换超出上限的数据:data.loc[data.new_报名人数>UL,'new_报名人数'] = replace_valuedata
复制成功

最终:

方法二:

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

代码块
JavaScript
自动换行
复制代码
# 百分之一分位数P1=data.new_报名人数.quantile(0.01)# 百分之九十九分位数P99=data.n
复制成功

重复值

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

代码块
JavaScript
自动换行
复制代码
data.duplicated()
复制成功

True为重复数据

取出重复值

代码块
JavaScript
自动换行
复制代码
data[data.duplicated()]
复制成功

结果:

按照指定列判断重复数据

代码块
JavaScript
自动换行
复制代码
data[data.duplicated(subset=['学院','报名人数'])]
复制成功

删除重复数据 df.drop_duplicates

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

代码块
JavaScript
自动换行
复制代码
data.drop_duplicates(inplace=True)data
复制成功

删除后无重复数据。


需要资料也可以关注微信公众号:Python专栏,事不宜迟,一起进步吧!