python数据分析实战指南之异常值处理

目录
  • 异常值
  • 1、异常值定义
  • 2、异常值处理方式
    • 2.1 均方差
    • 2.2 箱形图
  • 3、实战
    • 3.1 加载数据
    • 3.2 检测异常值数据
    • 3.3 显示异常值的索引位置
  • 总结

异常值

异常值是指样本中的个别值,其数值明显偏离其余的观测值。异常值也称离群点,异常值的分析也称为离群点的分析。

常用的异常值分析方法为3σ原则、箱型图分析、机器学习算法检测,一般情况下对异常值的处理都是删除和修正填补,即默认为异常值对整个项目的作用不大,只有当我们的目的是要求准确找出离群点,并对离群点进行分析时有必要用到机器学习算法,其他情况下不用费精力去分析他们

1、异常值定义

在统计学中,离群点是并不属于特定族群的数据点,是与其它值相距甚远的异常观测。离群点是一种与其它结构良好的数据不同的观测值。

例如,你可以很清楚地看到这个列表中的离群点:[20,24,22,19,29,18,4300,30,18]

当观测值是一堆数字且都是一维时,辨别离群点很容易,但如果有数以千计的观测值或数据是多维的,你可能会需要更机智的方法来检测这些离群点。

2、异常值处理方式

2.1 均方差

3σ原则
如果数据服从正态分布,在3σ原则下,异常值被定义为一组测定值中与平均值的偏差超过三倍标准差的值。
在正态分布下,距离平均值3σ之外的值出现的概率为 P(|x-μ|>3σ)<=0.003,属于极个别的小概率事件。
如果数据不服从正态分布,也可以用远离平均值的多少倍标准差来描述

这个原则有个前提条件:数据需要服从正态分布

在3∂原则下,如果观测值与平均值的差值超过3倍标准差,那么可以将其视为异常值。
正负3∂的概率是99.7%,那么距离平均值3∂之外的值出现的概率为P(|x-u| > 3∂) <= 0.003,属于极个别的小概率事件。

import numpy as np
import pandas as pd

def detect_outliers(data,threshold=3):
    mean_d = np.mean(data)
    std_d = np.std(data)
    outliers = []

    for y in data_d:
        z_score= (y - mean_d)/std_d
        if np.abs(z_score) > threshold:
            outliers.append(y)
    return outliers

2.2 箱形图

四分位间距 (IQR) 的概念被用于构建箱形图。IQR 是统计学中的一个概念,通过将数据集分成四分位来衡量统计分散度和数据可变性。

简单来说,任何数据集或任意一组观测值都可以根据数据的值以及它们与整个数据集的比较情况被划分为四个确定的间隔。四分位数会将数据分为三个点和四个区间。

四分位间距对定义离群点非常重要。它是第三个四分位数和第一个四分位数的差 (IQR = Q3 -Q1)。在这种情况下,离群点被定义为低于箱形图下触须(或 Q1 − 1.5x IQR)或高于箱形图上触须(或 Q3 + 1.5x IQR)的观测值。

IQR是统计分散程度的一个度量,分散程度通过需要借助箱线图来观察,通常把小于 Q1 - 1.5 * IQR 或者大于 Q3 + 1.5 * IQR的数据点视作离群点,探测离群点的公式是:

outliers =  value < ( Q1 - 1.5 * IQR )  or value > ( Q3 + 1.5 * IQR )

这种探测离群点的方法,是箱线图默认的方法,箱线图提供了识别异常值/离群点的一个标准:

异常值通常被定义为小于 QL - l.5 IQR 或者 大于 Qu + 1.5 IQR的值,QL称为下四分位数, Qu称为上四分位数,IQR称为四分位数间距,是Qu上四分位数和QL下四分位数之差,其间包括了全部观察值的一半。

def detect_outliers(sr):
    q1 = sr.quantile(0.25)
    q3 = sr.quantile(0.75)
    iqr = q3-q1 #Interquartile range
    fence_low  = q1-1.5*iqr
    fence_high = q3+1.5*iqr
    outliers = sr.loc[(sr < fence_low) | (sr > fence_high)]
    return outliers

3、实战

上面数据基础知识的介绍了,下面我们进入今天的正题,也就是利用python与pandas进行数据分析,今天的主要目标就是找到数据中的异常值。(我们使用的是前面介绍的第一种方法)

3.1 加载数据

首先,我们需要加载进行分析的数据,同样使用beer的数据,不过这里的数据是经过处理的,可以看到abv属性列的值中大部分都是0.0*,基本都不超过1,但是也有数据是55,也就是说这些数据是远大于其他数据的,我们主要是对这部分数据进行处理。

class Repair_Dirty(object):
    __init_data = 0

    def __init__(self, filename):
        self.filename = filename

    def get_data(self):
        if self.filename == " ":
            # print("您输入的文件路径为空")
            return
        else:
            self.__init_data = pd.read_csv(self.filename)

        return self.__init_data

#主函数定义一个对象,并实现对方法的调用
if __name__ == "__main__":
    file_path = 'dirty_beer_last.csv'
    data_cla = Repair_Dirty(file_path)
    data = data_cla.get_data()#得到数据

形如下面的数据图,红色框内数据为55的,就是我们所说的异常值,我们的目标就是通过第一种方法,将此类数据找出来。

3.2 检测异常值数据

使用第一种检测方式来检测异常值,我们主要是定义一个函数find_outlier(),并且函数是在类的内部实现的。

    # 找到异常值,abv列
    def find_outlier(self, attribute):
        data_att = self.__init_data[attribute]
        # 找到异常值
        outlier = data_att[np.abs(data_att - data_att.mean()) > 3 * data_att.std()]
        print(data.loc[data[attribute] == 55])#对abv属性的异常值进行输出
        #print(np.where(self.__init_data[attribute] == 55))  # 返回指定位置的索引
        return outlier

下面的图片中可以看到整个数据表中有108行数据中abv值为55的,所以很明显,我们基本上已经达到了想要的目标,找到了数据中的异常值,根据索引或者id我们便可以将其进行值替换操作,对异常值进行修复。

3.3 显示异常值的索引位置

既然已经找到了异常值,那我们再对其进行索引显示就比较简单了,也就是一行代码的事,其实在上面代码中也可以看到,只不过上面这行代码被我们给注释掉了,下面将其单独拿出来显示。

print(np.where(self.__init_data[attribute] == 55))  # 返回指定位置的索引

这行代码就是对异常值索引进行显示了。

至此,我们今天的数据分析异常值处理的博文就写到这里了,小张同学仍在马不停蹄的进行学习,希望这篇文章能够帮助正在学习数据分析的小伙伴!!!
奥利给

最后,将源代码附上,有需要的小伙伴可以自取。

import pandas as pd
import numpy as np
import re

class Repair_Dirty(object):
    __init_data = 0

    def __init__(self, filename):
        self.filename = filename

    def get_data(self):
        if self.filename == " ":
            # print("您输入的文件路径为空")
            return
        else:
            self.__init_data = pd.read_csv(self.filename)

        return self.__init_data

	# 找到异常值,abv列
    def find_outlier(self, attribute):
        data_att = self.__init_data[attribute]
        # 找到异常值
        outlier = data_att[np.abs(data_att - data_att.mean()) > 3 * data_att.std()]
        print(data.loc[data[attribute] == 55])#对abv属性的异常值进行输出
        print(np.where(self.__init_data[attribute] == 55))  # 返回指定位置的索引
        return outlier

if __name__ == "__main__":
    file_path = 'dirty_beer_last.csv'
    data_cla = Repair_Dirty(file_path)
    data = data_cla.get_data()
    print((data))
    if data is None:
        print("路径为空,程序退出!!!")
    else:
        data = data_cla.fill_na()
        outlier = data_cla.find_outlier()
        print(outlier)

总结

到此这篇关于python数据分析实战指南之异常值处理的文章就介绍到这了,更多相关python异常值处理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2022-01-24

利用Python进行异常值分析实例代码

前言 异常值是指样本中的个别值,也称为离群点,其数值明显偏离其余的观测值.常用检测方法3σ原则和箱型图.其中,3σ原则只适用服从正态分布的数据.在3σ原则下,异常值被定义为观察值和平均值的偏差超过3倍标准差的值.P(|x−μ|>3σ)≤0.003,在正太分布假设下,大于3σ的值出现的概率小于0.003,属于小概率事件,故可认定其为异常值. 异常值分析是检验数据是否有录入错误以及含有不合常理的数据.忽视异常值的存在是十分危险的,不加剔除地把异常值包括进数据的计算分析过程中,对结果会产生不良影响:重

python实现数据清洗(缺失值与异常值处理)

1. 将本地sql文件写入mysql数据库 本文写入的是python数据库的taob表 source [本地文件] 其中总数据为9616行,列分别为title,link,price,comment 2.使用python链接并读取数据 查看数据概括 #-*- coding:utf-8 -*- #author:M10 import numpy as np import pandas as pd import matplotlib.pylab as plt import mysql.connector

Python Pandas找到缺失值的位置方法

问题描述: python pandas判断缺失值一般采用 isnull(),然而生成的却是所有数据的true/false矩阵,对于庞大的数据dataframe,很难一眼看出来哪个数据缺失,一共有多少个缺失数据,缺失数据的位置. 首先对于存在缺失值的数据,如下所示 import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(10,6)) # Make a few areas have NaN values df.

Python Pandas对缺失值的处理方法

Pandas使用这些函数处理缺失值: isnull和notnull:检测是否是空值,可用于df和series dropna:丢弃.删除缺失值 axis : 删除行还是列,{0 or 'index', 1 or 'columns'}, default 0 how : 如果等于any则任何值为空都删除,如果等于all则所有值都为空才删除 inplace : 如果为True则修改当前df,否则返回新的df fillna:填充空值 value:用于填充的值,可以是单个值,或者字典(key是列名,valu

python3对拉勾数据进行可视化分析的方法详解

前言 上回说到我们如何把拉勾的数据抓取下来的,既然获取了数据,就别放着不动,把它拿出来分析一下,看看这些数据里面都包含了什么信息. (本次博客源码地址:https://github.com/MaxLyu/Lagou_Analyze (本地下载)) 下面话不多说了,来一起看看详细的介绍吧 一.前期准备 由于上次抓的数据里面包含有 ID 这样的信息,我们需要将它去掉,并且查看描述性统计,确认是否存在异常值或者确实值. read_file = "analyst.csv" # 读取文件获得数据

记录模型训练时loss值的变化情况

记录训练过程中的每一步的loss变化 if verbose and step % verbose == 0: sys.stdout.write('\r{} / {} : loss = {}'.format( step, total_steps, np.mean(total_loss))) sys.stdout.flush() if verbose: sys.stdout.write('\r') sys.stdout.flush() 一般我们在训练神经网络模型的时候,都是每隔多少步,输出打印一下l

python数据清洗系列之字符串处理详解

前言 数据清洗是一项复杂且繁琐(kubi)的工作,同时也是整个数据分析过程中最为重要的环节.有人说一个分析项目80%的时间都是在清洗数据,这听起来有些匪夷所思,但在实际的工作中确实如此.数据清洗的目的有两个,第一是通过清洗让数据可用.第二是让数据变的更适合进行后续的分析工作.换句话说就是有"脏"数据要洗,干净的数据也要洗. 在数据分析中,特别是文本分析中,字符处理需要耗费极大的精力,因而了解字符处理对于数据分析而言,也是一项很重要的能力. 字符串处理方法 首先我们先了解下都有哪些基础方

python实现数据预处理之填充缺失值的示例

1.给定一个数据集noise-data-1.txt,该数据集中保护大量的缺失值(空格.不完整值等).利用"全局常量"."均值或者中位数"来填充缺失值. noise-data-1.txt: 5.1 3.5 1.4 0.2 4.9 3 1.4 0.2 4.7 3.2 1.3 0.2 4.6 3.1 1.5 0.2 5 3.6 1.4 0.2 5.4 3.9 1.7 0.4 4.6 3.4 1.4 0.3 5 3.4 1.5 0.2 4.4 2.9 1.4 0.2 4.9

python解决pandas处理缺失值为空字符串的问题

踩坑记录: 用pandas来做csv的缺失值处理时候发现奇怪BUG,就是excel打开csv文件,明明有的格子没有任何东西,当然,我就想到用pandas的dropna()或者fillna()来处理缺失值. 但是pandas读取csv文件后发现那个空的地方isnull()竟然是false,就是说那个地方有东西... 后来经过排查发现看似什么都没有的地方有空字符串,故pandas认为那儿不是缺失值,所以就不能用dropna()或者fillna()来处理. 解决思路:先用正则将空格匹配出来,然后全部替

Python基于matplotlib画箱体图检验异常值操作示例【附xls数据文件下载】

本文实例讲述了Python基于matplotlib画箱体图检验异常值操作.分享给大家供大家参考,具体如下: # -*- coding:utf-8 -*- #! python3 import pandas as pd import os import matplotlib.pyplot as plt data=pd.read_excel('catering_sale.xls',index_col='日期') plt.rcParams['font.sans-serif']=['SimHei']#正常

对python数据清洗容易遇到的函数-re.sub bytes string详解

re.sub 功能,比replace强大的替换函数,将正则表达式匹配上的模块替换成repl re.sub(pattern, repl, string, count=0, flags=0) 返回最左边正则表达式限定的被repl代替的字符串,如果正则表达式没有匹配上,则字符串不做修改. \n is converted to a single newline character, \r is converted to a carriage return, and so forth. Unknown e