快学数据挖掘—数据探索—异常值分析

缺失值分析


缺失值产生的原因

  1. 有些信息暂时无法获取,或者获取信息的代价太大。
  2. 有些信息是被遗漏的。可能是因为输入时认为不重要、忘记填写或对数据理解错误等一些人为因素而遗漏,也可能是由于数据采集设备的故障、存储介质的故障、传输媒体的故障等非人为原因而丢失。
  3. 属性值不存在。在某些情况下,缺失值并不意味着数据有错误。对一些对象来说某些属性值是不存在的,如一个未婚者的配偶姓名、一个儿童的固定收入等。

使用描述性统计分析,可以得到含有缺失值的属性的个数,以及每个属性的未缺失数、缺失数与缺失率等。

异常值分析


异常可能由于测量、输入错误或系统运行错误而造成,也可能是由数据内在特性引起的,或异常行为所导致。异常值分析是检验数据是否含有不合理的数据。由于异常产生的机制是不确定的,因此,异常检测算法检测出的“异常”是否真正地对应为实际的异常行为,不是由异常检测算法来说明、解释的,只能由领域专家来解释。

异常值分析方法

  • 基于统计的方法
  • 基于距离的方法
  • 基于密度的方法
  • 基于聚类的方法
  • 基于分类的方法
  • 基于深度的方法
  • 基于小波变换的方法
  • 基于图的方法
  • 基于模式的方法
  • 基于神经网络的方法

基于统计的方法

  • 描述性统计分析
  • Z得分
  • 箱形图分析

本文只检测缺失值,并使用箱型图检测异常值

数据集


日期 销量
2015/3/1 51
2015/2/28 2618.2
2015/2/27 2608.4
2015/2/26 2651.9
2015/2/25 3442.1
2015/2/24 3393.1
2015/2/23 3136.6
2015/2/22 3744.1
2015/2/21 6607.4
2015/2/20 4060.3
2015/2/19 3614.7
2015/2/18 3295.5

...

数据集下载地址

缺失值分析


我们使用SPSS进行缺失值分析,设置如下

img

img

img

img

缺失值分析结果

img

img

结论分析

1. 日期没有缺失值2. 销量存在一个缺失值,对应的日志为2015-02-143. 销量的缺失率:0.5%

缺失值替换


img

箱型图分析


img

img

img

img

img

箱型图分析结果

1. 箱型图超过3倍IQR的一共5个值,分别是 22, 51, 60 和 6607.40, 9106.442. 根据具体业务我们把日销量在400以下或5000以上设置为异常数据

Python程序

#coding: utf-8

import matplotlib.pyplot as plt
from numpy import nan as NA
import pandas as pd

# 读取数据源
xlsFilename = "catering_sale.xls"
df = pd.read_excel(xlsFilename)

########################################################
# 缺失值
# 获得缺失值的个数
missingNumCountDf = df.isnull().sum()
print("\n缺失值个数")
print(missingNumCountDf)

# 获得缺失率
missingPercentDf = 100 * (missingNumCountDf / df.count())
print("\n缺失率")
print(missingPercentDf)

# 获得缺失记录
missingDf = df[df.iloc[:,1].isnull()]
print("\n缺失记录")
print(missingDf)

# 过滤掉缺失值
df2 = df.dropna()

# 显示箱图
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
#bp = df2.boxplot()
bp = plt.boxplot(df2.values[:,1], patch_artist=True)

fliers = bp['fliers']
for fly in fliers:
    data = fly.get_data()
    for (x,y) in fly.get_xydata():
        plt.text(x, y, "%.2f" % y, verticalalignment="top", horizontalalignment='right')
    
    print("\n异常值")
    print(data[1])

plt.show()


缺失值个数
日期0
销量1
dtype: int6488888888888888888888

缺失率
日期0.0
销量0.5
dtype: float64
![img](http://)
缺失记录
   日期  销量
14 2015-02-14 NaN

异常值
[51.0 865.0 22.0 60.0 6607.4 4060.3 9106.44 4065.2]

img

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章