Python实现非正太分布的异常值检测方式


Posted in Python onDecember 09, 2019

工作中,我们经常会遇到数据异常,比如说浏览量突增猛降,交易量突增猛降,但是这些数据又不是符合正太分布的,如果用几倍西格玛就不合适,那么我们如何来判断这些变化是否在合理的范围呢?

小白查阅一些资料后,发现可以用箱形图,具体描述如下:

箱形图(英文:Box plot),又称为盒须图、盒式图、盒状图或箱线图,是一种用作显示一组数据分散情况资料的统计图。因型状如箱子而得名。箱形图最大的优点就是不受异常值的影响,能够准确稳定地描绘出数据的离散分布情况,同时也利于数据的清洗。

Python实现非正太分布的异常值检测方式

异常值可以设置为上四分位数的1.25倍,也可以设置为1.5倍,具体的要通过实验可得。

1、下四分位数Q1

(1)确定四分位数的位置。Qi所在位置=i(n+1)/4,其中i=1,2,3。n表示序列中包含的项数。

(2)根据位置,计算相应的四分位数。

例中:Q1所在的位置=(14+1)/4=3.75,Q1=0.25×第三项+0.75×第四项=0.25×17+0.75×19=18.5;

2、中位数(第二个四分位数)Q2中位数,即一组数由小到大排列处于中间位置的数。若序列数为偶数个,该组的中位数为中间两个数的平均数。

例中:Q2所在的位置=2(14+1)/4=7.5,Q2=0.5×第七项+0.5×第八项=0.5×25+0.5×28=26.5

3、上四分位数Q3计算方法同下四分位数。

例中:Q3所在的位置=3(14+1)/4=11.25,Q3=0.75×第十一项+0.25×第十二项=0.75×34+0.25×35=34.25。

4、上限上限是非异常范围内的最大值。

首先要知道什么是四分位距如何计算的?四分位距IQR=Q3-Q1,那么上限=Q3+1.5IQR5、下限下限是非异常范围内的最小值。下限=Q1-1.5IQR

我这里是使用上四分位数的1.5倍作为上限,下四分位数的1.5倍作为下限。

这里是拿历史一个月每天的产量和间夜量作为参考,统计出历史的箱线图的各个指标,然后将要比较的数据,来进行循环判断,若超过上限/下限那么抛出1和0.

# -*- coding: utf-8 -*-
"""
Created on Tue Apr 30 10:52:37 2019
@author: chen_lib
"""
 
import pandas as pd
catering_sale = 'D:/Users/chen_lib/Desktop/ceshi.csv' #读取历史数据
datax = pd.read_csv(catering_sale) #读取数据
#取出不是昨天的数据
data = datax.loc[datax['orderdate'] != datetime][:]
'''
import time
## yyyy-mm-dd格式
print (time.strftime("%Y-%m-%d"))
'''
#时间减一天
import datetime
datetime = (datetime.datetime.now()+datetime.timedelta(days=-1)).strftime("%Y-%m-%d")
 
 
#保存基本统计量,将常见的统计信息保存为数据框
statistics = data.describe() 
#添加行标签 计算出每个指标的上线下线和四分位间距
statistics.loc['IQR'] = statistics.loc['75%']-statistics.loc['25%'] #四分位数间距
statistics.loc['UP'] = statistics.loc['75%'] + 1.5*statistics.loc['IQR'] #上限
statistics.loc['DAWN'] = statistics.loc['25%'] - 1.5*statistics.loc['IQR']#下限
#取出data的列名
columns = data.columns.values.tolist()
 
 
'''取出要比较的数值,放在统计信息表'''
a = data.loc[data['orderdate'] == datetime][columns[1]]#取出第一列
b = data.loc[data['orderdate'] == datetime][columns[2]]#取出第二列
statistics.loc['res'] = [a[1],b[1]]#取出需要比较的当天的数据 放入统计信息中
  
 
'''循环取出结果是否满足要求''' 
ret = [] 
for i in range(2):
  res = statistics.loc['res'][i]
  max = statistics.loc['UP'][columns[i+1]]#最大值
  min = statistics.loc['DAWN'][columns[i+1]]#最小值
  '''
  #重建三个值的索引,以便比较大小
  res.index = ['ordernum']
  max.index = max['ordernum']
  min.index = min['ordernum']
  #判断异常值,若大于最大值或者小于最小值则抛出结果为1
  '''
  result1 = res>max
  result2 = res<min
  if result1 =='False' or result2 == 'False':
    ret.append([columns[i+1],1])
  else: 
    ret.append([columns[i+1],0])
  df = pd.DataFrame(ret)
  
	#将文件写入excel表中
df.to_excel("d:/Users/chen_lib/Desktop/ceshi.xlsx",sheet_name="total",index=False,header=False)

以上这篇Python实现非正太分布的异常值检测方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python获取电脑硬件信息及状态的实现方法
Aug 29 Python
wxPython窗口的继承机制实例分析
Sep 28 Python
非递归的输出1-N的全排列实例(推荐)
Apr 11 Python
python实现微信机器人: 登录微信、消息接收、自动回复功能
Apr 29 Python
python3 求约数的实例
Dec 05 Python
python的json中方法及jsonpath模块用法分析
Dec 06 Python
python实现人脸签到系统
Apr 13 Python
python help函数实例用法
Dec 06 Python
Python3.9.0 a1安装pygame出错解决全过程(小结)
Feb 02 Python
python实现图片转字符画
Feb 19 Python
Python 线程池模块之多线程操作代码
May 20 Python
浅谈Python实现opencv之图片色素的数值运算和逻辑运算
Jun 23 Python
python 实现检验33品种数据是否是正态分布
Dec 09 #Python
Python远程开发环境部署与调试过程图解
Dec 09 #Python
使用 Python 合并多个格式一致的 Excel 文件(推荐)
Dec 09 #Python
Python udp网络程序实现发送、接收数据功能示例
Dec 09 #Python
python3 tcp的粘包现象和解决办法解析
Dec 09 #Python
python绘制规则网络图形实例
Dec 09 #Python
Spring实战之使用util:命名空间简化配置操作示例
Dec 09 #Python
You might like
WordPress中用于获取及自定义头像图片的PHP脚本详解
2015/12/17 PHP
php微信公众号开发之关键词回复
2018/10/20 PHP
疯掉了,尽然有js写的操作系统
2007/04/23 Javascript
简单的JS多重继承示例
2008/03/13 Javascript
input、button的不同type值在ajax提交表单时导致的陷阱
2009/02/24 Javascript
jquery更换文章内容与改变字体大小代码
2013/09/30 Javascript
简单的ajax连接库分享(不用jquery的ajax)
2014/01/19 Javascript
查找Oracle高消耗语句的方法
2014/03/22 Javascript
Jquery实现仿腾讯微博发表广播
2014/11/17 Javascript
JavaScript DOM事件(笔记)
2015/04/08 Javascript
javascript原始值和对象引用实例分析
2015/04/25 Javascript
使用jQuery监听DOM元素大小变化
2016/02/24 Javascript
AngularJS 实现JavaScript 动画效果详解
2016/09/08 Javascript
微信小程序 页面传参实例详解
2016/11/16 Javascript
Web开发使用Angular实现用户密码强度判别的方法
2017/09/27 Javascript
JavaScript实现音乐自动切换和轮播
2017/11/05 Javascript
vue2.0之多页面的开发的示例
2018/01/30 Javascript
vue 动态改变静态图片以及请求网络图片的实现方法
2018/02/07 Javascript
vue-infinite-loading2.0 中文文档详解
2018/04/08 Javascript
vue自定义底部导航栏Tabbar的实现代码
2018/09/03 Javascript
单页面vue引入百度统计的使用方法示例详解
2018/10/13 Javascript
浅探express路由和中间件的实现
2019/09/30 Javascript
JavaScript队列结构Queue实现过程解析
2020/03/07 Javascript
Python科学画图代码分享
2017/11/29 Python
Python+Django搭建自己的blog网站
2018/03/13 Python
Python绘制3D图形
2018/05/03 Python
Java文件与类动手动脑实例详解
2019/11/10 Python
django 前端页面如何实现显示前N条数据
2020/03/16 Python
django模板获取list中指定索引的值方式
2020/05/14 Python
Python 列表推导式需要注意的地方
2020/10/23 Python
在HTML5 canvas里用卷积核进行图像处理的方法
2018/05/02 HTML / CSS
加拿大户外探险购物网站:SAIL
2020/06/27 全球购物
大学生标准自荐书
2014/06/15 职场文书
学校节水倡议书
2015/04/29 职场文书
Golang 语言控制并发 Goroutine的方法
2021/06/30 Golang
Java线程的6种状态与生命周期
2022/05/11 Java/Android