『Plotly实战指南』--箱线图绘制与应用

打印 上一主题 下一主题

主题 1727|帖子 1727|积分 5181

在数据可视化领域,箱线图(Box Plot)是一种强大的工具,用于展示数据的分布特征集中趋势以及异常值
它不仅可以或许快速展现数据的偏态离散程度,还能帮助我们识别潜在的数据题目
本文将从基础绘制到业务实战,体系讲解如何用 Plotly 构建交互式箱线图,并掌握其在异常值检测、多组对比分析中的核心应用。
1. 基础绘制

箱线图是一种用于展示一组数据的五数概括(最小值第一四分位数中位数第三四分位数最大值)的图表。
它的几何形态重要由以下几个部分构成:

  • 中位数(Median):位于箱体中间的横线,表示数据的中间值,将数据分为上下两部分。
  • 四分位数(Quartiles):第一四分位数(Q1)位于箱体下边缘,表示数据中有 25% 的值低于此数;第三四分位数(Q3)位于箱体上边缘,表示数据中有 75% 的值低于此数。
  • 箱体(Box):由 Q1 和 Q3 构成,其高度表示数据的中间 50% 的分布范围,反映了数据的集中趋势和离散程度。
  • 触须(Whiskers):从箱体延伸出的两条线,通常表示数据的正常范围。其长度一般为 1.5 倍的四分位距(IQR = Q3 - Q1),超出此范围的数据点被视为异常值。
  • 异常值(Outliers):用单独的点标记,表示那些偏离正常范围的数据点,大概必要进一步分析其成因
箱线图的几何形态与数据分布有着密切的关系。例如,

  • 箱体越窄,说明数据的集中程度越高;
  • 触须越短,说明数据的离散程度越小;
  • 异常值的分布环境则可以提示数据中是否存在异常环境或特别规律。
下面的示例,我们构造一组学生成绩的数据,然后用箱线图来展示成绩的分布环境。
  1. import plotly.graph_objects as go
  2. import numpy as np
  3. # 生成示例数据
  4. np.random.seed(10)
  5. scores = np.random.randint(1, 100, 100)
  6. # 绘制单变量箱线图
  7. fig = go.Figure(
  8.     data=[
  9.         go.Box(
  10.             y=scores,
  11.             boxpoints="outliers",
  12.         )
  13.     ]
  14. )
  15. fig.update_layout(title="学生考试成绩箱线图", yaxis_title="成绩")
  16. fig.show()
复制代码

上图中,箱体范围:从 Q1 到 Q3,表示数据的中间 50% 的分布范围。箱体的高度越小,说明数据越集中。
如果有异常值的话,会用蓝色的圆点标记,表示超出正常范围的数据点。
这些异常值大概是数据录入错误、特别事件影响或其他原因导致的。
比如,我们给变量scores中添加一些异常的数值,再看看箱线图的变革。
  1. scores = np.append(scores, [-100, 200])
复制代码

图中多了2个蓝色的圆点,就是后面添加的两个异常值
2. 分析应用

2.1. 异常值识别

异常值是数据分析中必要特别关注的部分。它们大概会影响统计分析的效果,甚至误导决策。
箱线图提供了一种直观且有效的方法来识别异常值。
异常值通常是通过四分位距(IQR)来判定的。详细规则如下:

  • 小于$ Q1 - 1.5 \times IQR $的数据点被视为下异常值
  • 大于$ Q3 + 1.5 \times IQR $的数据点被视为上异常值
Plotly的交互式功能可以让我们更方便地分析异常值。
通过设置boxpoints='all',我们可以将全部数据点显示出来,并通过颜色或其他样式来区分正常值和异常值。
  1. import plotly.graph_objects as go
  2. import numpy as np
  3. # 生成示例数据
  4. np.random.seed(10)
  5. scores = np.random.randint(1, 100, 100)
  6. scores = np.append(scores, [-100, 200])
  7. fig = go.Figure(
  8.     data=[
  9.         go.Box(
  10.             y=scores,
  11.             boxpoints="all",
  12.             jitter=0.3,
  13.             pointpos=-1.8,
  14.             marker_color="rgba(0, 0, 255, 0.7)",
  15.             line_color="black",
  16.             notched=True,
  17.         )
  18.     ]
  19. )
  20. fig.update_layout(title="学生考试成绩箱线图(高亮异常值)", yaxis_title="成绩")
  21. fig.show()
复制代码

在上述代码中,  jitter参数用于调整数据点的抖动程度,避免数据点重叠;
pointpos参数用于控制数据点的水平位置。
通过这种方式,我们可以清晰地看到哪些数据点是异常值。
在识别出异常值后,一般必要根据详细环境选择合适的处理处罚方法:

  • 删除:如果异常值是由于数据录入错误或不可信的测量效果导致的,可以直接将其删除。
  • 修正:如果异常值大概是真实存在的,但数值有误,可以根据业务逻辑或参考其他数据进行修正。
  • 保留:在某些环境下,异常值大概具有重要的业务意义,如特别事件的影响,此时应保留异常值并进行进一步分析。
2.2. 多组数据箱线图

箱线图不仅可以用于单变量的分析,还可以用于多组数据的对比分析。
通过将不同组的数据绘制在同一张箱线图上,我们可以直观地比力它们的分布特征和差异。
假设我们有一组包含多个分类变量的数据,例如不同班级学生的考试成绩。
  1. # 示例数据:不同班级学生的考试成绩
  2. data = {
  3.     "Class A": [85, 90, 78, 92, 88, 76, 89, 95, 67, 83],
  4.     "Class B": [82, 87, 79, 91, 85, 75, 88, 93, 77, 84],
  5.     "Class C": [88, 93, 81, 95, 86, 78, 90, 94, 82, 87],
  6. }
  7. fig = go.Figure()
  8. colors = ["blue", "green", "red"]
  9. for class_name, scores in data.items():
  10.     fig.add_trace(
  11.         go.Box(
  12.             y=scores,
  13.             name=class_name,
  14.             boxpoints="outliers",
  15.             line_color="black",
  16.             fillcolor=colors.pop(),
  17.         )
  18.     )
  19. fig.update_layout(
  20.     title="不同班级学生考试成绩对比",
  21.     yaxis_title="成绩",
  22.     xaxis_title="班级",
  23.     boxgap=0.3,
  24. )  # 调整箱线图之间的间距
  25. fig.show()
复制代码

通过分析分组箱线图,我们可以发现不同班级学生成绩的差异环境。
3. 总结

箱线图作为探索性数据分析中的重要工具,不仅可以或许帮助我们快速把握数据的分布特征,还能有效识别异常值,促进数据清洗与预处理处罚。
在实际应用中,建议:

  • 优先清洗数据中的极端异常值,避免误导分析结论。
  • 在业务报告中,充分利用箱线图的直观性,通报数据分布与组间差异信息,辅助决策订定。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

曂沅仴駦

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表