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 13 Python
python多线程socket编程之多客户端接入
Sep 12 Python
python入门前的第一课 python怎样入门
Mar 06 Python
PyQt5每天必学之拖放事件
Aug 27 Python
python实现画五角星和螺旋线的示例
Jan 20 Python
python3实现点餐系统
Jan 24 Python
python try 异常处理(史上最全)
Mar 07 Python
Python学习笔记基本数据结构之序列类型list tuple range用法分析
Jun 08 Python
Pandas之排序函数sort_values()的实现
Jul 09 Python
python基于Selenium的web自动化框架
Jul 14 Python
如何在C++中调用Python
May 21 Python
OpenCV项目实践之停车场车位实时检测
Apr 11 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
如何在PHP中使用Oracle数据库(4)
2006/10/09 PHP
php录入页面中动态从数据库中提取数据的实现
2006/10/09 PHP
php实现的支付宝网页支付功能示例【基于TP5框架】
2019/09/16 PHP
Jquery 组合form元素为json格式,asp.net反序列化
2009/07/09 Javascript
判断浏览器的javascript版本的代码
2010/09/03 Javascript
JavaScript使用位运算符判断奇数和偶数的方法
2015/06/01 Javascript
基于Css3和JQuery实现打字机效果
2015/08/11 Javascript
js判断手机访问或者PC的几个例子(常用于手机跳转)
2015/12/15 Javascript
Jquery修改image的src属性,图片不加载问题的解决方法
2016/05/17 Javascript
js隐式转换的知识实例讲解
2018/09/28 Javascript
Vue.js中该如何自己维护路由跳转记录
2019/05/19 Javascript
layui实现把数据表格时间戳转换为时间格式的例子
2019/09/12 Javascript
详解vue或uni-app的跨域问题解决方案
2020/02/21 Javascript
[02:34]DOTA2亚洲邀请赛 BG战队出场宣传片
2015/03/09 DOTA
[03:30]DOTA2完美“圣”典精彩集锦
2016/12/27 DOTA
Python中格式化format()方法详解
2017/04/01 Python
利用Python实现网络测试的脚本分享
2017/05/26 Python
python八大排序算法速度实例对比
2017/12/06 Python
wxPython的安装与使用教程
2018/08/31 Python
利用Python库Scapy解析pcap文件的方法
2019/07/23 Python
PyTorch之图像和Tensor填充的实例
2019/08/18 Python
Python3 翻转二叉树的实现
2019/09/30 Python
如何基于Python获取图片的物理尺寸
2019/11/25 Python
Python3 xml.etree.ElementTree支持的XPath语法详解
2020/03/06 Python
浅谈python多线程和多线程变量共享问题介绍
2020/04/17 Python
python爬虫---requests库的用法详解
2020/09/28 Python
python和C++共享内存传输图像的示例
2020/10/27 Python
ESDlife健康生活易:身体检查预订、搜寻及比较
2019/05/10 全球购物
德国购买踏板车网站:Microscooter
2019/10/14 全球购物
学生干部培训方案
2014/06/12 职场文书
工作说明书格式
2014/07/29 职场文书
2014年小学重阳节活动策划方案
2014/09/16 职场文书
离婚协议书的书写要求
2014/09/17 职场文书
乡镇群众路线专项整治方案
2014/11/03 职场文书
2016年秋季运动会加油稿
2015/12/21 职场文书
2016个人先进事迹材料范文
2016/03/01 职场文书