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实现去除代码前行号的方法
Mar 10 Python
Python2.7简单连接与操作MySQL的方法
Apr 27 Python
python安装cx_Oracle模块常见问题与解决方法
Feb 21 Python
分享vim python缩进等一些配置
Jul 02 Python
详解Python最长公共子串和最长公共子序列的实现
Jul 07 Python
python3调用百度翻译API实现实时翻译
Aug 16 Python
Django框架教程之中间件MiddleWare浅析
Dec 29 Python
6行Python代码实现进度条效果(Progress、tqdm、alive-progress​​​​​​​和PySimpleGUI库)
Jan 06 Python
Python tkinter模版代码实例
Feb 05 Python
python使用turtle库绘制奥运五环
Feb 24 Python
python统计字符串中字母出现次数代码实例
Mar 02 Python
PO模式在selenium自动化测试框架的优势
Mar 20 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 魔术方法详解
2014/11/11 PHP
PHP执行SQL文件并将SQL文件导入到数据库
2015/09/17 PHP
Yii 2中的load()和save()示例详解
2017/08/03 PHP
php创建多级目录与级联删除文件的方法示例
2019/09/12 PHP
解密效果
2006/06/23 Javascript
Javascript模板技术
2007/04/27 Javascript
CSS和JS标签style属性对照表(方便js开发的朋友)
2010/11/11 Javascript
jquery 与NVelocity 产生冲突的解决方法
2011/06/13 Javascript
jQuery插件的写法分享
2013/06/12 Javascript
Jquery弹出层插件ThickBox的使用方法
2014/12/09 Javascript
JavaScript中Array的实用操作技巧分享
2016/09/11 Javascript
JavaScript重定向URL参数的两种方法小结
2016/10/19 Javascript
JS实现控制图片显示大小的方法【图片等比例缩放功能】
2017/02/18 Javascript
JavaSctit 利用FileReader和滤镜上传图片预览功能
2017/09/05 Javascript
vue项目总结之文件夹结构配置详解
2017/12/13 Javascript
Vue实现导出excel表格功能
2018/03/30 Javascript
微信小程序自定义tabBar组件开发详解
2020/09/24 Javascript
微信自定义分享链接信息(标题,图片和内容)实现过程详解
2019/09/04 Javascript
[03:18]【TI9纪实】社区大触GL与木木
2019/08/25 DOTA
Python循环语句中else的用法总结
2016/09/11 Python
Python中的浮点数原理与运算分析
2017/10/12 Python
python递归全排列实现方法
2018/08/18 Python
python实现同一局域网下传输图片
2020/03/20 Python
使用CSS禁止textarea调整大小功能的方法
2015/03/13 HTML / CSS
移动端html5 meta标签的神奇功效
2016/01/06 HTML / CSS
小米旗下精品生活电商平台:小米有品
2018/12/18 全球购物
当x.equals(y)等于true时,x.hashCode()与y.hashCode()可以不相等,这句话对不对
2015/05/02 面试题
学前教育专业毕业生自荐信
2013/10/03 职场文书
顶岗实习接收函
2014/01/09 职场文书
政治表现评语
2014/05/04 职场文书
村长党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
2014年街道办事处工作总结
2014/12/11 职场文书
2015年教师节感恩寄语
2015/03/23 职场文书
2015年超市工作总结
2015/04/09 职场文书
公司食堂管理制度
2015/08/05 职场文书
vue.js 使用原生js实现轮播图
2022/04/26 Vue.js