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绘制人人网好友关系图示例
Apr 01 Python
Python常用列表数据结构小结
Aug 06 Python
用Python的Django框架编写从Google Adsense中获得报表的应用
Apr 17 Python
在Python 3中实现类型检查器的简单方法
Jul 03 Python
pyqt远程批量执行Linux命令程序的方法
Feb 14 Python
Python实现多态、协议和鸭子类型的代码详解
May 05 Python
python正则表达式匹配不包含某几个字符的字符串方法
Jul 23 Python
Python爬虫:url中带字典列表参数的编码转换方法
Aug 21 Python
python中for循环变量作用域及用法详解
Nov 05 Python
Python使用Turtle库绘制一棵西兰花
Nov 23 Python
Python使用Turtle模块绘制国旗的方法示例
Feb 28 Python
python 指定源路径来解决import问题的操作
Mar 04 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中实现Javascript的escape()函数代码
2010/08/08 PHP
PHP计算指定日期所在周的开始和结束日期的方法
2015/03/24 PHP
php微信公众号开发(2)百度BAE搭建和数据库使用
2016/12/15 PHP
php的命名空间与自动加载实现方法
2019/08/25 PHP
云网广告中的代码,提示出错,大家找找
2006/11/21 Javascript
Prototype Date对象 学习
2009/07/12 Javascript
Javascript中封装window.open解决不兼容问题
2014/09/28 Javascript
原生javascript获取元素样式
2014/12/31 Javascript
EasyUI中在表单提交之前进行验证
2016/07/19 Javascript
基于d3.js实现实时刷新的折线图
2016/08/03 Javascript
JavaScript数据操作_浅谈原始值和引用值的操作本质
2016/08/23 Javascript
jQuery删除当前节点元素
2016/12/07 Javascript
javascript 中null和undefined区分和比较
2017/04/19 Javascript
react-router v4如何使用history控制路由跳转详解
2018/01/09 Javascript
vue鼠标移入添加class样式,鼠标移出去除样式(active)实现方法
2018/08/22 Javascript
sortable+element 实现表格行拖拽的方法示例
2019/06/07 Javascript
[51:06]DOTA2-DPC中国联赛 正赛 Elephant vs Aster BO3 第二场 1月26日
2021/03/11 DOTA
TensorFlow在MAC环境下的安装及环境搭建
2017/11/14 Python
Python使用三种方法实现PCA算法
2017/12/12 Python
python3 读写文件换行符的方法
2018/04/09 Python
使用pandas实现csv/excel sheet互相转换的方法
2018/12/10 Python
Opencv 图片的OCR识别的实战示例
2021/03/02 Python
一款利用纯css3实现的超炫3D表单的实例教程
2014/12/01 HTML / CSS
详解css3中dispaly的Grid布局与Flex布局
2020/09/11 HTML / CSS
Mio Skincare美国官网:身体紧致及孕期身体护理
2017/03/05 全球购物
法国房车租赁网站:Yescapa
2019/08/26 全球购物
就业自荐书
2013/12/05 职场文书
门诊手术室工作制度
2014/01/30 职场文书
大学生开西餐厅创业计划书
2014/02/01 职场文书
社区活动总结报告
2014/05/05 职场文书
违章停车检讨书
2014/10/21 职场文书
2015仓库保管员年终工作总结
2015/05/13 职场文书
表扬信范文
2019/04/22 职场文书
资深HR教你写好简历中的自我评价
2019/05/07 职场文书
详解Html5项目适配系统深色模式方案总结
2021/04/14 HTML / CSS
springboot集成springCloud中gateway时启动报错的解决
2021/07/16 Java/Android