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

第一步:读入数据

箱线图怎么判断异常值_Python:异常值检测_第1张图片

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

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

箱线图怎么判断异常值_Python:异常值检测_第2张图片

具体解释,参考:

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

第三步:异常值识别

方法一:箱线图

箱线图怎么判断异常值_Python:异常值检测_第3张图片

箱线图怎么判断异常值_Python:异常值检测_第4张图片

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

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

箱线图怎么判断异常值_Python:异常值检测_第5张图片
参考:https://blog.csdn.net/qq_38121967/article/details/89919607

方法二:3倍标准差

箱线图怎么判断异常值_Python:异常值检测_第6张图片

代码如下:

箱线图怎么判断异常值_Python:异常值检测_第7张图片

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

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

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

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

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

箱线图怎么判断异常值_Python:异常值检测_第8张图片

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

查看所有的异常值记录:

箱线图怎么判断异常值_Python:异常值检测_第9张图片

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

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

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

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

箱线图怎么判断异常值_Python:异常值检测_第10张图片

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

参考资料:

用Python玩转数据_中国大学MOOC(慕课)​www.icourse163.org
箱线图怎么判断异常值_Python:异常值检测_第11张图片

你可能感兴趣的:(箱线图怎么判断异常值)