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 相关文章推荐
django自定义Field实现一个字段存储以逗号分隔的字符串
Apr 27 Python
Python实现将16进制字符串转化为ascii字符的方法分析
Jul 21 Python
Python zip()函数用法实例分析
Mar 17 Python
pyQt4实现俄罗斯方块游戏
Jun 26 Python
使用Python机器学习降低静态日志噪声
Sep 29 Python
使用Python的Turtle库绘制森林的实例
Dec 18 Python
python内置模块collections知识点总结
Dec 19 Python
Python tkinter常用操作代码实例
Jan 03 Python
django自带的权限管理Permission用法说明
May 13 Python
python装饰器实现对异常代码出现进行自动监控的实现方法
Sep 15 Python
python 解决函数返回return的问题
Dec 05 Python
Python爬虫之用Xpath获取关键标签实现自动评论盖楼抽奖(二)
Jun 07 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 自写函数代码 获取关键字 去超链接
2010/02/08 PHP
php实现按指定大小等比缩放生成上传图片缩略图的方法
2014/12/15 PHP
php实现与python进行socket通信的方法示例
2017/08/30 PHP
js prototype截取字符串函数
2010/04/01 Javascript
jquery ajax同步异步的执行最终解决方案
2013/04/26 Javascript
JS实现清除指定cookies的方法
2014/09/20 Javascript
简介JavaScript中strike()方法的使用
2015/06/08 Javascript
javascript实现图片上传前台页面
2015/08/18 Javascript
JavaScript制作淘宝星级评分效果的思路
2020/06/23 Javascript
写给小白的JavaScript引擎指南
2015/12/04 Javascript
jquery实现的判断倒计时是否结束代码
2016/02/05 Javascript
详解webpack babel的配置
2018/01/09 Javascript
Vue父子组建的简单通信之控制开关Switch的实现
2018/06/04 Javascript
详解微信小程序实现跑马灯效果(附完整代码)
2019/04/29 Javascript
axios封装,使用拦截器统一处理接口,超详细的教程(推荐)
2019/05/02 Javascript
详解vue-cli3开发Chrome插件实践
2019/05/29 Javascript
如何给element添加一个抽屉组件的方法步骤
2019/07/14 Javascript
[01:06:07]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS CIS
2014/05/22 DOTA
详解Python3.1版本带来的核心变化
2015/04/07 Python
python的pdb调试命令的命令整理及实例
2017/07/12 Python
Python生成rsa密钥对操作示例
2019/04/26 Python
安装2019Pycharm最新版本的教程详解
2019/10/22 Python
python字符串判断密码强弱
2020/03/18 Python
HTML5触摸事件演化tap事件介绍
2016/03/25 HTML / CSS
Expedia马来西亚旅游网站:廉价酒店,度假村和航班预订
2016/07/26 全球购物
建筑实习自我鉴定
2013/10/18 职场文书
信息专业本科生个人的自我评价
2013/10/28 职场文书
给海归自荐信的建议
2013/12/13 职场文书
最新会计专业求职信范文
2014/01/28 职场文书
股东合作协议书范本
2014/04/14 职场文书
学校学习雷锋活动总结
2014/07/03 职场文书
社区党的群众路线教育实践活动总结材料
2014/10/31 职场文书
土地租赁协议书
2015/01/29 职场文书
毕业典礼邀请函
2015/01/31 职场文书
alibaba seata服务端具体实现
2022/02/24 Java/Android
《Estab Life》4月6日播出 正式PV、主视觉图公开
2022/03/20 日漫