当前位置:   article > 正文

Python数据分析实战,使用箱线图识别学生成绩异常值,做原因分析_python 箱线图

python 箱线图

学生成绩可反应某次考试的学业水平情况,对于成绩异常的也可做诊断分析,比如某次高三理科月考成绩就可以做诊断分析,使用箱线图研究学生成绩学业水平情况。

箱线图可显示数据分散情况,常用于异常值的检测和识别,在研究学业水平时,箱线图不受异常值的影响,可以相对稳定地描述数据的离散分布情况,下面一起学习。

1. 初识箱线图

使用Matplotlib包绘制箱形图主要使用boxplot函数,boxplot函数的语法如下:

Signature: plt.boxplot(x, notch=None, sym=None, vert=None, whis=None, positions=None, widths=None,patch_artist=None,bootstrap=None,usermedians=None, conf_intervals=None, meanline=None, showmeans=None, showcaps=None, showbox=None, showfliers=None, boxprops=None, labels=None, flierprops=None, medianprops=None, meanprops=None, capprops=None, whiskerprops=None, manage_ticks=True, autorange=False, zorder=None, *, data=None)

可见boxplot函数的参数众多,这里说明如下几个常用的参数。

  • x:指定要绘制箱形图的数据。
  • whis:指定上下限与上下四分位的距离,默认为1.5倍的四分位差。
  • widths:指定箱形图的宽度,默认为0.5。
  • patch_artist:是否填充箱体的颜色。
  • showmeans:是否显示均值,默认不显示。
  • boxprops:设置箱体的属性,如边框色、填充色等。
  • labels:为箱形图添加标签,类似于图例的作用。
  • filerprops:设置异常值的属性,如异常点的形状、大小、填充色等。
  • medianprops:设置中位数的属性,如线的类型、粗细等。
  • meanprops:设置均值的属性,如点的大小、颜色等。

掌握常用的几个boxplot函数函数,绘制简单的箱形图,在参数中直接导入数据x,即可生成箱线图,生成的箱线图如下。

  1. import matplotlib.pyplot as plt
  2. x=[4,5,6,7,11,19]
  3. plt.boxplot(x)
  4. plt.show()

从上面的箱线图可以看出,图表一共包含以下几个点:异常值、上限、上四分位数、中位数、下四分位数、下限,下面一一介绍箱线图中这几个点的含义。

  • 上四分位数:数据的75%分位点所对应的值(Q3)
  • 中位数:数据的50%分位点所对应的值(Q2)
  • 下四分位数:数据的25%分位点所对应的值(Q1)
  • 上限:上限的计算公式为:Q3+1.5(Q3-Q1)
  • 下限:下限的计算公式为:Q1-1.5(Q3-Q1)

2. 异常值判断

使用箱形图识别异常值,当数据值大于箱形图的上限或者小于箱线图的下限时,即判定为异常值,也就是说当数据点的位置大于Q3+1.5(Q3-Q1)或者小于Q3+1.5(Q3-Q1)时,超出上下限位置,判定为异常值,其中,Q3-Q1为四分位差。

3. 箱线图案例

下面使用一个实际案例来介绍箱线图,首先,导入2022年8月理科成绩数据,数据如下,包含学生姓名、班级、分数等字段。

  1. import pandas as pd
  2. #导入成绩数据
  3. df=pd.read_excel(r'D:\系统桌面(勿删)\Desktop\2022年8月理科.xlsx',skiprows=1)#skiprows=1跳过第一行
  4. df.head()

先判断每个班级的成绩是否有异常值,使用一个简便方法,可以导入seaborn包,快速生成各个班级成绩箱线图,由图可以看出,除3班、8班、7班、10班外,其他班级的成绩都有异常值,其中,6班的成绩异常值最大,表现在该成绩的异常点低于下限很多,需要细项分析该异常点的原因。

  1. import seaborn as sns
  2. import matplotlib.pyplot as plt
  3. import matplotlib.style as psl
  4. plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
  5. plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
  6. psl.use('ggplot')
  7. plt.figure(figsize=(9,6))#设置画布大小
  8. plt.title('各班级成绩箱线图')
  9. sns.boxplot(x=df['班级'],y=df['分数'],data=df)#绘制箱线图

筛选出6班的学生成绩,由于该班级的成绩异常值很大,需单独分析问题所在。

  1. df_select=df[df['班级']=='6班']
  2. df_select.tail()

导入matplotlib包,使用boxplot函数单独绘制箱线图,分析6班成绩异常点的原因,如下图可以看出,异常点为标注红色的点,该异常点低于下限很多,可推断出某位同学的考试成绩有重大异常。

  1. import pandas as pd
  2. import matplotlib.pyplot as plt
  3. import matplotlib.style as psl
  4. plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
  5. plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
  6. psl.use('ggplot')
  7. plt.title('6班学生成绩箱线图')
  8. plt.boxplot(x=df_select['分数'],#指定绘制箱线图的数据
  9. whis=1.5, #指定1.5倍的四分位数差
  10. widths=0.1, #指定箱线图中箱子的宽度为0.3
  11. showmeans=True, #显示均值
  12. #patch_artist=True, #填充箱子的颜色
  13. #boxprops={'facecolor':'RoyalBlue'}, #指定箱子的填充色为宝蓝色
  14. flierprops={'markerfacecolor':'red','markeredgecolor':'red','markersize':3}, #指定异常值的填充色、边框色和大小
  15. meanprops={'marker':'h','markerfacecolor':'black','markersize':8}, #指定中位数的标记符号(虚线)和颜色
  16. medianprops={'linestyle':'--','color':'orange'}, #指定均值点的标记符号(六边形)、填充色和大小
  17. labels=['6班'])
  18. plt.show()

分析出异常值后,需要在原始数据中将该异常点抓取出来,分别计算计算上、下四分位数,然后筛选出大于上限或者小于下限的数据,得出该同学本次理科成绩分数只有18分,为异常数据,经查明该同学因为请假没有参加后面的考试,故而成绩严重异常。

  1. #计算上、下四分位数
  2. Q1=df_select['分数'].quantile(q=0.25)#计算下四分位数
  3. Q3=df_select['分数'].quantile(q=0.75)#计算上四分位数
  4. #基于1.5倍的四分位数差计算上下限对应的值
  5. up_limit=Q3+1.5*(Q3-Q1) #上限值
  6. low_limit=Q1-1.5*(Q3-Q1) #下限值
  7. #查找异常值
  8. Value_error=df_select[(df_select['分数']>up_limit)|(df_select['分数']<low_limit)]
  9. Value_error

以上,借助某次学生理科成绩,介绍箱线图的使用,箱线图将异常值数据有效甄别出来,很大程度帮助我们数据分析,不仅用于数据预处理发现异常值,还可用于数据诊断分析,在实际中有很大用途。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号