在数据处理中,箱线图常用来检测异常值。
数据文件data01.xls
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()
2.使用vert=False:水平箱线图;showmeans=True:显示均值
# vert=False:水平箱线图;showmeans=True:显示均值
plt.boxplot([d1, d2, d3, d4], labels=label, vert=False, showmeans=True)
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()
4.在使用箱线图查看异常值时,需要计算计算上四分位数和下四分数,基于1.5倍的四分位差计算上限和下限对应的值
箱线图简图:
假设有一组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)
这里以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()
输出箱线图为:
得到上四分位数(占总数居的75%)和下四分位数(占总数居的25%)分别为4.0和2.0,基于1.5倍的四分位差计算上限和下限对应的值分别为7.0和1.0
输出的low对应的结果,可见第10 行对应的bool值为true,说明在表格中,第10行的数据比下限还小,为一个异常值。(up对应的结果同理,不在重复)