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的即时标记项目练习笔记
Sep 18 Python
在Python中操作字典之setdefault()方法的使用
May 21 Python
wxPython定时器wx.Timer简单应用实例
Jun 03 Python
Python实现中文数字转换为阿拉伯数字的方法示例
May 26 Python
flask中使用蓝图将路由分开写在不同文件实例解析
Jan 19 Python
python3.4实现邮件发送功能
May 28 Python
利用Python读取txt文档的方法讲解
Jun 23 Python
浅谈Python里面None True False之间的区别
Jul 09 Python
django序列化时使用外键的真实值操作
Jul 15 Python
Python基础之元类详解
Apr 29 Python
利用Python将list列表写入文件并读取的方法汇总
Mar 25 Python
Python之matplotlib绘制折线图
Apr 13 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在线生成二维码代码(google api)
2013/06/03 PHP
基于PHP创建Cookie数组的详解
2013/07/03 PHP
javascript showModalDialog 多层模态窗口实现页面提交及刷新的代码
2009/11/28 Javascript
js 设置选中行的样式的实现代码
2010/05/24 Javascript
Extjs 3.3切换tab隐藏相应工具栏出现空白解决
2013/04/02 Javascript
JS特殊函数(Function()构造函数、函数直接量)区别介绍
2013/05/19 Javascript
javascript获取隐藏dom的宽高 具体实现
2013/07/14 Javascript
当达到输入长度时表单自动切换焦点
2014/04/06 Javascript
js+csss实现的一个带复选框的下拉框
2014/09/29 Javascript
angularjs指令之绑定策略(@、=、&amp;)
2017/04/13 Javascript
Angular17之Angular自定义指令详解
2018/01/21 Javascript
详解处理bootstrap4不支持远程静态框问题
2018/07/20 Javascript
mpvue+vuex搭建小程序详细教程(完整步骤)
2018/09/30 Javascript
vue微信分享的实现(在当前页面分享其他页面)
2019/04/16 Javascript
JS数组splice操作实例分析
2019/10/12 Javascript
从零开始学Python第八周:详解网络编程基础(socket)
2016/12/14 Python
Python决策树和随机森林算法实例详解
2018/01/30 Python
python实现人脸识别经典算法(一) 特征脸法
2018/03/13 Python
python3通过selenium爬虫获取到dj商品的实例代码
2019/04/25 Python
使用pycharm在本地开发并实时同步到服务器
2019/08/02 Python
使用python实现unix2dos和dos2unix命令的例子
2019/08/13 Python
Python中的引用和拷贝实例解析
2019/11/14 Python
python 无损批量压缩图片(支持保留图片信息)的示例
2020/09/22 Python
pymongo insert_many 批量插入的实例
2020/12/05 Python
HTML利用九宫格原理进行网页布局
2020/03/13 HTML / CSS
JackJones官方旗舰店:杰克琼斯男装
2018/03/27 全球购物
关于赌博的检讨书
2014/01/08 职场文书
宿舍卫生检讨书
2014/01/16 职场文书
社区党员先进事迹
2014/01/22 职场文书
致跳高运动员加油稿
2014/02/12 职场文书
2014两会学习心得:时代的发展
2014/03/17 职场文书
竞聘上岗演讲稿
2014/05/16 职场文书
单位活动策划方案
2014/08/17 职场文书
2015年教师师德师风承诺书
2015/04/28 职场文书
标准发言稿结尾
2019/07/18 职场文书
python爬取企查查企业信息之selenium自动模拟登录企查查
2021/04/08 Python