箱线图怎么判断异常值_Python:异常值检测

第一步:读入数据

6b0b6e9d7558df7ec0f181486c5a3951.png

原始数据中有一些缺失值。

第二步:使用均值填充缺失值

7f656452c8e1e85d7617bf3c58e4de46.png

具体解释,参考:

Cara:Python练习:数据缺失值处理​zhuanlan.zhihu.com

第三步:异常值识别

方法一:箱线图

c54bdb5e59d37bbc139001ad3adc75d2.png

5957ccc75490d2ad05a9bb6944bd9e42.png

由图可见,sciencescore、englishscore这两列存在离群点。

箱线图判断异常的的规则如下:

3aa523e1bf00ad262c3997ec818365b9.png
参考:https://blog.csdn.net/qq_38121967/article/details/89919607

方法二:3倍标准差

47e40cf142f7d14020a403341c3b1eab.png

代码如下:

d40f201da25bbac0b2dc01300a9fcdd4.png

注释:①判断异常值需要字段为数值型,字符串(如姓名、班级、性别字段)不能混入。因此,这里先将所有数值型字段摘取出来,单独形成一个数据框t。数据框的iloc()方法用于对数据框进行行和列的摘取。iloc[:,4:]表示摘取所有行,从索引值为4的列开始到最后一列。

当返回结果为NaN时,表示该数字不是异常值。为什么是这样呢?不太明白原理。

abs(t-t.mean()) > 1.5*t.std()中的t指某一列中某一个值,t.mean()指某一列的均值,t.std()指某一列的均值。数据框支持这种运算方式,倒是很特别~

由上述结果可知,四个列的所有值都没有异常值。这一结果与使用箱线图得出的结果不同。因为,二者对于异常点的判断规则不同~

修改异常点的判断规则为1.5倍标准差,结果如下:

86f9d53b2ebef0e110454793e5041d0c.png

返回结果为数字的为异常值。

查看所有的异常值记录:

bc501839891adcb0d893ec9fe872cf47.png

注释:这里有点巧妙!因为返回结果为NaN,即缺失值,表明数据不是异常值,那么如果删除整行全是NaN的记录,则剩下的就是包含异常值的记录啦~

对于异常值可以删除,也可以当作缺失值,采用各种方法进行填充。

已经知道异常值所在的行的索引值为[2,4,5,6,13,17,18]。问题是,Python如何根据索引值删除原数据df中对应的多个行呢?

用笨办法,写一个for循环,一行一行地删:

190e51ba147fec6f592afd0329fe42be.png

不过,手动抄写索引值,真的很笨,有没有大神有更好的办法,快速删除原数据中异常值所在的行啊?

参考资料:

用Python玩转数据_中国大学MOOC(慕课)​www.icourse163.org
06a5fdbc7d60743cbb30a0c25bcc11a9.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值