查看全课大纲(第 65 / 101 节)
  1. 1.数据分析基本概念
  2. 2.学习数据分析的一般路线
  3. 3.数据分析的流程
  4. 4.数据类型
  5. 5.环境部署(1)
  6. 6.环境部署(2)
  7. 7.课程介绍
  8. 8.TXT文件操作
  9. 9.JSON文件操作
  10. 10.CSV文件操作
  11. 11.Excel文件操作
  12. 12.数据库及SQL常用语法
  13. 13.数据库基本操作
  14. 14.数据库多表连接
  15. 15.实战:欧洲职业足球数据库分析
  16. 16.爬虫简介
  17. 17.URL管理模块
  18. 18.网页下载模块
  19. 19.网页解析模块(1)
  20. 20.网页解析模块(2)
  21. 21.Scrapy简介
  22. 22.Scrapy使用步骤(1)
  23. 23.Scrapy使用步骤(2)
  24. 24.Scrapy使用步骤(3)
  25. 25.Scrapy使用步骤(4)
  26. 26.实战:获取国内城市空气质量指数数据
  27. 27.NumPy和SciPy介绍
  28. 28.多维数组
  29. 29.多维数组操作
  30. 30.NumPy的常用方法
  31. 31.向量化介绍
  32. 32.向量化及通用函数
  33. 33.实战:2016美国大选分析
  34. 34.数据结构-Series
  35. 35.数据结构-DataFrame
  36. 36.数据结构-Index
  37. 37.Series的索引操作
  38. 38.DataFrame的索引操作
  39. 39.索引操作总结
  40. 40.运算与对齐
  41. 41.函数应用操作(1) -- map
  42. 42.函数应用操作 (2) -- apply applymap
  43. 43.文件读写操作
  44. 44.排序操作
  45. 45.数据清洗--处理缺失数据
  46. 46.数据清洗--处理重复数据
  47. 47.数据清洗--替换数据
  48. 48.常用统计方法(1) -- describe quantile
  49. 49.常用统计方法(2) -- sum mean median count
  50. 50.常用统计方法(3) -- max min idxmax idxmin
  51. 51.常用统计方法(4) -- mad var std cumsum
  52. 52.实战:全球食品数据分析
  53. 53.层级索引
  54. 54.分组与聚合介绍
  55. 55.分组操作(1) -- GroupBy对象及常用聚合操作
  56. 56.分组操作(2) -- 自定义分组及聚合操作
  57. 57.透视表介绍
  58. 58.透视表操作
  59. 59.数据规整(1) -- 数据合并concat
  60. 60.数据规整(2) -- 数据连接merge
  61. 61.数据重构(3) -- 数据重构stack unstack
  62. 62.实战:互联网电影资料库分析
  63. 63.探索性数据分析EDA介绍
  64. 64.EDA的目的
  65. 65.EDA常用工具
  66. 66.Matplotlib绘图基本介绍
  67. 67.Matplotlib画布
  68. 68.散点图和柱状图的绘制
  69. 69.直方图的绘制
  70. 70.矩阵绘图
  71. 71.子图的使用
  72. 72.Matplotlib颜色、标记、线型
  73. 73.Matplotlib坐标刻度、标签、图例、标题
  74. 74.Seaborn介绍
  75. 75.数据集分布可视化(1) -- 单变量分布、双变量分布
  76. 76.数据集分布可视化(2) -- 变量关系可视化
  77. 77.类别数据可视化 -- 类别散布图、类别内数据分布、类别内统计图
  78. 78.交互式数据可视化工具Bokeh介绍
  79. 79.Bokeh绘制散点图、柱状图、盒子图、弦图
  80. 80.Bokeh绘制常用图形元素
  81. 81.3D绘图 -- mplot3d
  82. 82.3D曲线可视化
  83. 83.3D散点图可视化
  84. 84.3D柱状图可视化
  85. 85.Pandas绘图
  86. 86.实战:Lending Club借贷数据探索性分析及可视化
  87. 87.机器学习介绍及应用场景
  88. 88.机器学习建模介绍 (1) -- 分类
  89. 89.机器学习建模介绍 (2) -- 回归
  90. 90.机器学习建模介绍 (3) -- 聚类
  91. 91.机器学习分类
  92. 92.机器学习工具scikit-learn
  93. 93.使用scikit-learn的流程
  94. 94.数据集准备及划分
  95. 95.模型选择
  96. 96.数据预处理及特征工程
  97. 97.过拟合与欠拟合
  98. 98.模型调参介绍
  99. 99.模型调参方法
  100. 100.模型测试及评价
  101. 101.实战:通过移动设备行为数据预测性别和年龄

EDA常用工具

约 10 分钟

📺 正在播放小象学院官方高清录播(支持倍速与清晰度调节)

小象实战讲义 · Python数据分析实战

在上一节中,我们了解了探索性数据分析(EDA)的核心思想。本节我们将聚焦于实现EDA的利器——各种可视化图表。你将学习到散点图、直方图、柱状图等常用工具的特点、适用场景,以及如何用它们来揭示数据的内在关系、分布和趋势,从而让数据“开口说话”。

💡 核心导读

  • 图形化量化技术:EDA的核心是通过图表将数据内在的关系、对比和分布直观地呈现出来。
  • 图表家族巡礼:认识散点图、直方图、柱状图、线形图、盒形图等基础图表的形态与作用。
  • 场景化应用:掌握不同图表的最佳应用场景,例如用散点图看关系、直方图看分布、折线图看趋势。
  • 多维信息表达:了解气泡图、雷达图等高级图表如何巧妙地在一个视图中展示三维甚至四维以上的信息。

基于图形的量化技术

探索性数据分析(EDA)的核心方法之一,是使用基于图形的量化技术。简单来说,就是将抽象的数据,通过可视化的图表形式呈现出来,从而帮助我们直观地发现数据内部的关系、对比和分布规律。

在数据可视化领域,有大量成熟的图表工具可供选择。不同的图表有其最适合的应用场景,选择正确的图表是有效沟通数据洞见的第一步。

接下来,我们将逐一介绍几种在EDA中最常用的基础图表。

常用图表及其应用场景

散点图

散点图是一种非常基础且强大的图表。图中的每一个数据点,都用一个独立的点来表示。

import matplotlib.pyplot as plt
import numpy as np

# 使用Agg后端,保证在没有图形界面的环境下也能运行
plt.switch_backend('Agg')

# 模拟身高(cm)和体重(kg)数据
np.random.seed(42)  # 固定随机种子,保证示例可复现
heights = np.random.normal(170, 10, 50)  # 平均身高170cm,标准差10
weights = 0.6 * heights + np.random.normal(0, 5, 50) + 30  # 体重与身高大致相关

# 绘制散点图
plt.figure(figsize=(8, 5))
plt.scatter(heights, weights, alpha=0.7, edgecolors='k')
plt.title('身高与体重关系散点图')
plt.xlabel('身高 (cm)')
plt.ylabel('体重 (kg)')
plt.grid(True, linestyle='--', alpha=0.5)
# plt.savefig('scatter_plot.png') # 实际使用时可以保存图片
plt.show()
# 这是一个图形输出,在Jupyter Notebook或支持的环境中会显示散点图。
# 图中x轴为身高,y轴为体重,每个点代表一个个体。
# 可以观察到,随着身高(x轴)增加,体重(y轴)也呈现总体上升的趋势。

核心特点与应用:

  • 描述二维关系:每个点包含横轴(X)和纵轴(Y)两个维度的信息。例如上例中,X是身高,Y是体重。
  • 揭示相关性:通过点的分布形态,可以直观判断两个变量之间是否存在正相关、负相关或无相关关系。上图中点云呈向右上方倾斜的椭圆形,说明身高和体重存在正相关趋势。
  • 发现异常值:远离主体点群的孤立点,可能就是需要关注的异常数据。

直方图

直方图主要用于描述单个连续变量的数据分布情况。

import matplotlib.pyplot as plt
import numpy as np

plt.switch_backend('Agg')

# 模拟一组考试成绩数据
np.random.seed(123)
scores = np.random.normal(75, 12, 200)  # 平均分75,标准差12
scores = np.clip(scores, 0, 100)  # 将分数限制在0-100之间

# 绘制直方图
plt.figure(figsize=(8, 5))
# `bins`参数指定分组的数量(桶),`edgecolor`为每个柱子添加边框
n, bins, patches = plt.hist(scores, bins=15, edgecolor='black', alpha=0.7)
plt.title('考试成绩分布直方图')
plt.xlabel('分数')
plt.ylabel('频数 (学生人数)')
plt.grid(True, axis='y', linestyle='--', alpha=0.5)

# 打印部分统计信息,用于文本输出
print(f"数据点总数: {len(scores)}")
print(f"直方图各柱子高度(频数): {n.astype(int)}")
print(f"分组边界(bins): {bins.round(1)}")
数据点总数: 200
直方图各柱子高度(频数): [ 1  2  1  5  5 10 23 21 28 30 21 17 12 14 10]
分组边界(bins): [ 36.2  40.5  44.7  49.   53.2  57.5  61.7  66.   70.2  74.5  78.7  83.
  87.2  91.5  95.7 100. ]

核心特点与应用:

  • 展示分布:直方图将数据范围划分为若干个连续的区间(称为“桶”或“分组”),每个长方形柱子的高度代表落入该区间的数据点的数量(频数)。
  • 解读图形:观察柱子的高低,可以立刻看出数据集中在哪个区间(柱子最高),以及数据的分散程度。例如上例输出显示,频数最高的柱子(频数 30)对应的分数区间约为 74.5 到 78.7 分。
  • 与柱状图区别:直方图的X轴是连续数值,柱子之间通常没有间隙;而柱状图(接下来介绍)的X轴是离散的类别,柱子之间有间隙。

柱状图

柱状图常用于比较不同类别或分组之间的数值大小。

import matplotlib.pyplot as plt

plt.switch_backend('Agg')

# 数据:不同编程语言在某个调查中的使用人数
languages = ['Python', 'Java', 'C++', 'JavaScript', 'Go']
users = [850, 720, 600, 950, 300]

# 绘制柱状图
plt.figure(figsize=(8, 5))
bars = plt.bar(languages, users, color=['skyblue', 'lightgreen', 'salmon', 'gold', 'violet'])
plt.title('编程语言使用人数对比')
plt.xlabel('编程语言')
plt.ylabel('使用人数')
plt.grid(True, axis='y', linestyle='--', alpha=0.5)

# 在柱子上方显示具体数值
for bar in bars:
    height = bar.get_height()
    plt.text(bar.get_x() + bar.get_width()/2., height + 10,
             f'{int(height)}', ha='center', va='bottom')

# 打印数据,用于文本输出
for lang, count in zip(languages, users):
    print(f"{lang}: {count}人")
Python: 850人
Java: 720人
C++: 600人
JavaScript: 950人
Go: 300人

核心特点与应用:

  • 比较类别:它描述了两个维度,但侧重于比较其中一个维度。例如,X轴维度是“编程语言”(类别),Y轴维度是“使用人数”(数值)。我们主要关注的是比较不同语言之间“使用人数”的多少。
  • 堆叠与分组:柱状图可以演变为堆叠柱状图(比较类别内部构成)或分组柱状图(同时比较多个系列在不同类别下的值),功能非常灵活。
  • 适用场景:适用于数据是离散的、分类型的,并且需要比较其数值大小的场景。

折线图

折线图最擅长展示数据随时间或其他连续序列变化的趋势。

import matplotlib.pyplot as plt
import numpy as np

plt.switch_backend('Agg')

# 模拟某股票24小时内的价格变化
np.random.seed(456)
hours = np.arange(0, 24)
# 创建一个有趋势和波动的价格序列
base_price = 100 + hours * 0.5
noise = np.random.normal(0, 2, 24)
stock_price = base_price + noise

# 绘制折线图
plt.figure(figsize=(10, 5))
plt.plot(hours, stock_price, marker='o', linestyle='-', linewidth=2, markersize=6)
plt.title('股票价格日内走势图')
plt.xlabel('时间 (小时)')
plt.ylabel('价格 (元)')
plt.xticks(hours)
plt.grid(True, linestyle='--', alpha=0.5)

# 打印关键点价格,用于文本输出
print("时间(点) - 价格(元):")
for h, p in zip(hours[::4], stock_price[::4]):  # 每隔4小时打印一次
    print(f"  {h:2d}:00 - {p:6.2f}")
时间(点) - 价格(元):
   0:00 -  98.66
   4:00 - 104.70
   8:00 - 103.31
  12:00 - 103.78
  16:00 - 111.83
  20:00 - 109.79

核心特点与应用:

  • 描述趋势:折线图能清晰显示数据是上升、下降、波动还是保持平稳。上例中,价格整体呈现上升趋势。
  • 时间序列首选:横轴通常是时间(年、月、日、时),纵轴是对应的指标值(如价格、销量、温度)。
  • 大数据量趋势:当数据量很大时,折线图可以平滑掉细节波动,突出长期趋势,比散点图更适合观察整体走向。

高级图表简介

除了上述基础图表,在EDA中我们还会用到一些能表达更复杂信息的“高级”图表。

  1. 盒形图:又称箱线图,盒子两端是第一四分位数(Q1)与第三四分位数(Q3),盒中横线是中位数;盒子向两侧延伸出的须线通常延伸到「距盒端 1.5×IQR 以内」的最远数据点(IQR = Q3−Q1),超出须线的数据点会以散点标出、视为潜在异常值。它能直观显示数据的中心位置、分散程度以及识别潜在的异常值,非常适合用于多组数据的分布比较。

  2. 饼图:用于描述部分与整体的关系,显示各类别占总体的百分比。它也是两个维度(类别和占比),但核心是表达构成比例。需要注意的是,当类别过多或比例接近时,饼图的可读性会变差。

  3. 气泡图:是散点图的增强版,可以用来表示三维或四维数据。

    • 横轴和纵轴代表两个维度(如GDP和平均寿命)。
    • 每个点的大小代表第三个维度(如人口数量)。
    • 点的颜色可以代表第四个维度(如所属大洲)。
    • 这样,一个简单的气泡图就能承载非常丰富的信息。
  4. 雷达图:又称蛛网图,常用于展示四维以上的数据,特别是描述一个对象的多个属性指标。

    • 每个维度(属性)从中心点发射出一条轴。
    • 所有轴以等角度放射状排列,轴的长度代表该维度的数值大小。
    • 将各轴上的点连接起来,就形成了一个多边形。
    • 通过比较不同对象的多边形形状和面积,可以一目了然地看出其各项能力的强弱。这在球员能力分析、产品性能对比等场景中非常有用。

原课说明:原课程在本章使用了Bokeh绘图库进行交互式可视化演示。Bokeh的核心思想是将Python中的数据逻辑(如图元映射)序列化为JSON,最终在浏览器中渲染出可交互的图形。这是一种强大的“声明式”绘图方法。目前,Python交互式可视化的生态还包括Plotly、Streamlit等优秀工具。考虑到本课程环境的统一性,本节所有可视化示例均使用Matplotlib(配合Agg后端)实现,其“数据列→图元映射”的思想与Bokeh等工具一脉相承。

📝 动手练一练

  1. 概念辨析:直方图和柱状图看起来都是“柱子”,它们最本质的区别是什么?分别举出一个适合用直方图分析和适合用柱状图分析的例子。
👉 点击查看参考答案

本质区别:

  • 直方图:用于展示单个连续变量的分布。X轴是数值区间(连续的),柱子之间通常没有间隙,柱子高度表示频数(落入该区间的数据个数)。
  • 柱状图:用于比较不同离散类别的数值。X轴是类别标签(离散的),柱子之间有间隙,柱子高度表示该类别的数值大小。

例子:

  • 适合直方图:分析一个班级所有学生的身高分布。X轴是身高区间(如160-165cm, 165-170cm…),Y轴是每个身高区间的学生人数。
  • 适合柱状图:比较A、B、C三个部门本季度的销售额。X轴是部门名称(A部、B部、C部),Y轴是各部门的销售额。
  1. 动手实践:下面的代码模拟了某产品一周七天的日销量。请将其修改为折线图,以便更清晰地观察销量随时间(星期)的变化趋势。
import matplotlib.pyplot as plt

plt.switch_backend('Agg')

days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
sales = [120, 135, 128, 150, 210, 305, 280]

# 原代码为柱状图
plt.figure(figsize=(8,5))
plt.bar(days, sales)
plt.title('Product Weekly Sales')
plt.xlabel('Day')
plt.ylabel('Sales')
plt.show()
👉 点击查看参考答案

将 plt.bar(days, sales) 替换为 plt.plot(days, sales, marker='o') 即可将柱状图改为带标记点的折线图。折线图能更好地连接数据点,展示从周一到周日的销量变化趋势(先平稳,周末激增,周日略有回落)。

import matplotlib.pyplot as plt

plt.switch_backend('Agg')

days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
sales = [120, 135, 128, 150, 210, 305, 280]

plt.figure(figsize=(8,5))
plt.plot(days, sales, marker='o', linestyle='-', linewidth=2) # 修改为折线图
plt.title('Product Weekly Sales Trend')
plt.xlabel('Day')
plt.ylabel('Sales')
plt.grid(True, linestyle='--', alpha=0.5)
plt.show()

本章小结

本节我们系统学习了EDA中常用的可视化工具。从基础的散点图、直方图、柱状图、折线图,到能表达更复杂信息的盒形图、气泡图和雷达图,每一种图表都是我们探索数据未知世界的独特“镜头”。记住,没有最好的图表,只有最合适的图表。选择哪种图表,取决于你想要回答什么问题,以及你的数据具有什么样的特性。

📋 行动清单

  • 回顾与记忆:合上笔记,尝试默写出散点图、直方图、柱状图、折线图各自最核心的用途(一句话概括)。
  • 场景匹配练习:找一份你熟悉的数据(如月度开支、运动记录),思考如果要分析“花费类别占比”、“跑步配速分布”、“体重变化趋势”,分别应该选用哪种图表?
  • 动手尝试:使用Python的Matplotlib库,为你手头的一组数据绘制至少两种不同类型的图表,直观感受它们带来的不同视角。

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 本节课件:EDA常用工具
    PDF · 566KB
    下载
  • 全套课件打包(第1-5章)
    ZIP · 12.8MB
    下载
  • 全套课件打包(第6-8章)
    ZIP · 15MB
    下载
  • 实战数据集:AppleStore 应用商城分析
    ZIP · 329KB
    下载
  • 实战数据集:女性服装电商分析
    ZIP · 2.8MB
    下载
  • Python 数据分析环境搭建指南
    PDF · 2MB
    下载
  • Scrapy 安装教程
    PDF · 12.7MB
    下载
  • 附加实战项目:AppleStore 应用商城数据分析
    ZIP · 0.3MB · ipynb + CSV 数据
    下载
  • 附加实战项目:银行电话营销数据分析
    ZIP · 0.4MB · ipynb + CSV 数据
    下载
  • 附加实战项目:女性服装电商评论数据分析
    ZIP · 2.7MB · ipynb + CSV 数据
    下载
  • 附加实战项目:美国化学学会杂志数据分析
    ZIP · 34.2MB · ipynb + SQLite 数据库
    下载