在数据处理中,箱线图常用来检测异常值。

数据文件data01.xls

python箱型图代码异常值符号 python箱线图代码找出异常_数据挖掘

1.绘制箱线图使用boxplot()函数

import pandas as pd
import matplotlib.pyplot as plt

# 读取excel文件
file_01 = pd.read_excel("data01.xls")

fig = plt.figure(figsize=(16, 8))
d1 = file_01['变量1']
d2 = file_01['变量2']
d3 = file_01['变量3']
d4 = file_01['变量4']

label = '变量1', '变量2', '变量3', '变量4'
plt.boxplot([d1, d2, d3, d4], labels=label)  # label设置横轴每个箱图对应的横坐标
plt.xticks(fontproperties='KaiTi')
plt.xlabel('变量', fontproperties='KaiTi')
plt.ylabel('变量值', fontproperties='KaiTi')

plt.show()

python箱型图代码异常值符号 python箱线图代码找出异常_python箱型图代码异常值符号_02

 2.使用vert=False:水平箱线图;showmeans=True:显示均值

# vert=False:水平箱线图;showmeans=True:显示均值
plt.boxplot([d1, d2, d3, d4], labels=label, vert=False, showmeans=True)

python箱型图代码异常值符号 python箱线图代码找出异常_数据挖掘_03

3.notch:是否是凹口的形式展现箱线图;sym:异常点的形状;还可设置箱体的颜色,箱体边框的颜色等,比较简单,不过多叙述

import pandas as pd
import matplotlib.pyplot as plt

# 读取excel文件
file_01 = pd.read_excel("data01.xls")

fig = plt.figure(figsize=(16, 8))
d1 = file_01['变量1']
d2 = file_01['变量2']
d3 = file_01['变量3']
d4 = file_01['变量4']

label = '变量1', '变量2', '变量3', '变量4'

# vert=False:水平箱线图;showmeans=True:显示均值
# plt.boxplot([d1, d2, d3, d4], labels=label, vert=False, showmeans=True)

# notch:是否是凹口的形式展现箱线图;sym:异常点的形状;
# plt.boxplot([d1, d2, d3, d4], labels=label, vert=False, showmeans=True, notch=True, sym='*')

# 1.箱体颜色的设置需配合 patch_artist = True 使用
# 2.boxprops:color箱体边框色,facecolor箱体填充色;
plt.boxplot([d1, d2, d3, d4], labels=label, patch_artist=True, vert=False, boxprops={'color': 'orangered', 'facecolor': 'pink'})

# plt.boxplot([d1, d2, d3, d4], labels=label)  # label设置横轴每个箱图对应的横坐标
plt.yticks(fontproperties='KaiTi')
plt.ylabel('变量', fontproperties='KaiTi')
plt.xlabel('变量值', fontproperties='KaiTi')

plt.show()

 

python箱型图代码异常值符号 python箱线图代码找出异常_数据挖掘_04

 4.在使用箱线图查看异常值时,需要计算计算上四分位数和下四分数,基于1.5倍的四分位差计算上限和下限对应的值

箱线图简图:

python箱型图代码异常值符号 python箱线图代码找出异常_python_05

 假设有一组n个数据从小到大排列,箱体中包含了非异常数据的50%,上限和上四分位数之间为非异常数据的25%,下限和下四分位数之间为非异常数据的25%。上下限的数据为非异常数据的最大值和最小值。

首先可以计算上四分位数(占总数居的75%)和下四分位数(占总数居的25%),使用quantile

# 计算上四分位数和下四分数
# 上四分位数,d4接收 pandas.Series 数据格式
Q3 = d4.quantile(0.75)
# 下四分位数
Q1 = d4.quantile(0.25)

再计算基于1.5倍的四分位差计算上限和下限对应的值

# 基于1.5倍的四分位差计算上限和下限对应的值
# 上限值
up_value = Q3 + 1.5 * (Q3 - Q1)
# 下限值
low_value = Q3 - 1.5 * (Q3 - Q1)

python箱型图代码异常值符号 python箱线图代码找出异常_python箱型图代码异常值符号_06

 这里以excel文件中变量4对应的数据为例,需要注意的是在上下四分位数,d4接收的是pandas.Series 数据格式

import pandas as pd
import matplotlib.pyplot as plt

# 读取excel文件
file_01 = pd.read_excel("data01.xls")

fig = plt.figure(figsize=(8, 8))
d4 = file_01['变量4']

plt.boxplot([d4], sym='*')
plt.xticks(fontproperties='KaiTi')
plt.xlabel('变量', fontproperties='KaiTi')
plt.ylabel('变量值', fontproperties='KaiTi')

# 删除异常值,调用warnings模块忽略警告
"""可在boxplot参数中加入:
    showfliers=False"""
# 计算上四分位数和下四分数
# 上四分位数,d4接收 pandas.Series 数据格式
Q3 = d4.quantile(0.75)
# 下四分位数
Q1 = d4.quantile(0.25)
print('Q3:', Q3, 'Q1:', Q1)

# 基于1.5倍的四分位差计算上限和下限对应的值
# 上限值
up_value = Q3 + 1.5 * (Q3 - Q1)
# 下限值
low_value = Q3 - 1.5 * (Q3 - Q1)
print('up_value:', up_value, 'low_value', low_value)

# low和up为d4中小于下限和大于上限输出的bool值
low = d4 < low_value
up = d4 > up_value
print(low, up)

plt.show()

 输出箱线图为:

python箱型图代码异常值符号 python箱线图代码找出异常_机器学习_07

 得到上四分位数(占总数居的75%)和下四分位数(占总数居的25%)分别为4.0和2.0,基于1.5倍的四分位差计算上限和下限对应的值分别为7.0和1.0

python箱型图代码异常值符号 python箱线图代码找出异常_数据挖掘_08

输出的low对应的结果,可见第10 行对应的bool值为true,说明在表格中,第10行的数据比下限还小,为一个异常值。(up对应的结果同理,不在重复)