在数据处理中,箱线图常用来检测异常值。
数据文件data01.xls
1.绘制箱线图使用boxplot()函数
import pandas as pdimport 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 pdimport 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 pdimport 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_valueup = d4 > up_valueprint(low, up)plt.show()
输出箱线图为:
得到上四分位数(占总数居的75%)和下四分位数(占总数居的25%)分别为4.0和2.0,基于1.5倍的四分位差计算上限和下限对应的值分别为7.0和1.0
输出的low对应的结果,可见第10 行对应的bool值为true,说明在表格中,第10行的数据比下限还小,为一个异常值。(up对应的结果同理,不在重复)