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模块smtplib实现纯文本邮件发送功能
May 22 Python
python 按不同维度求和,最值,均值的实例
Jun 28 Python
python如何生成网页验证码
Jul 28 Python
一文带你了解Python中的字符串是什么
Nov 20 Python
python实现文件的备份流程详解
Jun 18 Python
详解Python self 参数
Aug 30 Python
Python openpyxl读取单元格字体颜色过程解析
Sep 03 Python
Python从文件中读取指定的行以及在文件指定位置写入
Sep 06 Python
Python根据服务获取端口号的方法
Sep 25 Python
Python类反射机制使用实例解析
Dec 30 Python
手把手教你安装Windows版本的Tensorflow
Mar 26 Python
Pytorch转onnx、torchscript方式
May 25 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通过正则表达式记取数据来读取xml的方法
2015/03/09 PHP
php单例模式实现方法分析
2015/03/14 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
Javascript实现的分页函数
2006/12/22 Javascript
Js 订制自己的AlertBox(信息提示框)
2009/01/09 Javascript
分享14个很酷的jQuery导航菜单插件
2011/04/25 Javascript
jquery的相对父元素和相对文档定位示例代码
2013/08/02 Javascript
收集json解析的四种方法分享
2014/01/17 Javascript
jQuery时间日期三级联动(推荐)
2016/11/27 Javascript
浅谈Javascript事件对象
2017/02/05 Javascript
几行js代码实现自适应
2017/02/24 Javascript
Nodejs进阶:express+session实现简易登录身份认证
2017/04/24 NodeJs
微信小程序多列选择器range-key使用详解
2020/03/30 Javascript
基于nodejs实现微信支付功能
2017/12/20 NodeJs
echarts鼠标覆盖高亮显示节点及关系名称详解
2018/03/17 Javascript
微信小程序基于canvas渐变实现的彩虹效果示例
2019/05/03 Javascript
Vue.js轮播图走马灯代码实例(全)
2019/05/08 Javascript
Vue 实现一个命令式弹窗组件功能
2019/09/25 Javascript
Vue实现开心消消乐游戏算法
2019/10/22 Javascript
[58:00]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第二场 2月7日
2021/03/11 DOTA
忘记ftp密码使用python ftplib库暴力破解密码的方法示例
2014/01/22 Python
Python中生成器和yield语句的用法详解
2015/04/17 Python
python使用gdal对shp读取,新建和更新的实例
2020/03/10 Python
Python如何读取、写入CSV数据
2020/07/28 Python
如何更换python默认编辑器的背景色
2020/08/10 Python
完美解决torch.cuda.is_available()一直返回False的玄学方法
2021/02/06 Python
解决python的空格和tab混淆而报错的问题
2021/02/26 Python
css3实现wifi信号逐渐增强效果实例
2017/08/09 HTML / CSS
泰国排名第一的家居用品中心:HomePro
2020/11/18 全球购物
创业计划书怎样才能打动风投
2014/01/01 职场文书
优秀学生获奖感言
2014/02/15 职场文书
党支部2014年度工作总结
2014/12/04 职场文书
病人写给医生的感谢信
2015/01/23 职场文书
2015大学生求职信范文
2015/03/20 职场文书
党员干部廉政承诺书
2015/04/28 职场文书
NGINX 权限控制文件预览和下载的实现原理
2022/01/18 Servers