前言

什么是数据分析?通俗来说,就是给你一堆杂乱无章的原始数据,通过清洗、分析、可视化等一系列手段,从中挖掘出有价值的信息和结论,最终解决实际问题。

对于很多刚接触数据分析的同学来说,面对一堆“脏数据”往往不知道从何下手。本文将带你系统梳理数据分析的四大基本流程,并结合 Python 中两个核心库——PandasMatplotlib,帮助你快速入门,建立起完整的数据分析知识框架。

💬 开课小互动:你第一次听说“数据分析”这个词是在什么场景?是想做报表、写论文,还是单纯觉得数据科学家很酷?欢迎在评论区聊聊你的故事!

一、数据分析的四大基本流程

来,跟我一起说一遍:收集 → 清洗 → 分析 → 可视化

步骤 名称 说明
1 数据收集 从数据库、爬虫、API、Excel 等渠道获取原始数据(通常是“脏数据”)。
2 数据清洗 处理缺失值、重复值、异常值,统一数据格式,获得干净可用的数据。
3 数据分析 通过筛选、排序、分组、聚合等手段,提取有价值的信息。
4 数据可视化 将分析结果以图表形式呈现,让数据“会说话”,便于决策和汇报。

✍️ 动笔思考:这四步中,你觉得哪一步最耗时?有经验的同学都知道,数据清洗往往占据 80% 的时间。你认同吗?可以在评论区打出你的答案。


二、数据分析的利器:Jupyter Notebook

在正式开始之前,先给大家推荐一个工具——Jupyter Notebook

它是一个基于 Web 的交互式编程笔记本,可以让你把代码、运行结果、图表、笔记全部整合在一个文件里,特别适合数据分析这种需要反复调试、可视化输出的场景。

常用快捷键速查:

快捷键 功能
Ctrl + Enter 运行当前代码块
Shift + Enter 运行当前代码块并在下方新建

💡 小建议:如果你还在用 PyCharm 跑一段注释一段,不妨试试 Jupyter Notebook,会打开新世界的大门。你用过了吗?评论区说说你的体验。


三、数据清洗与处理:Pandas 库入门

数据分析的第二步(也是重头戏)就是数据清洗与处理,这里我们用到的主角是 Pandas

Pandas 是基于 NumPy 构建的强大数据分析工具集,其核心是两个数据结构:

3.1 核心数据结构:DataFrame 与 Series

很多同学容易把这两个搞混,我教大家一个类比记忆法

Pandas MySQL 数据库 说明
DataFrame Table(表) 二维数据框架
Series Column(列) 一维数据列

🧠 互动联想:把 DataFrame 想象成一张 Excel 表格,Series 就是表格中的某一列。每行前面还有一个隐藏的 index(索引),记住了吗?

3.2 构建 DataFrame

常用方式:列表嵌套 + 指定列名

import pandas as pd

df = pd.DataFrame([
    ['张三', 85, 92, 78],
    ['李四', 78, 88, 95],
    ['王五', 92, 96, 89]
], columns=['姓名', '语文', '数学', '英语'], index=['a', 'b', 'c'])

注意: 每行嵌套列表中的值的数量必须和列数一致,否则会报错。

3.3 DataFrame 常用属性速查

以下都是属性,不是函数,所以不要在后面加 ()

属性 说明
df.columns 获取列名
df.values 获取数据值
df.size 获取单元格总数
df.index 获取索引列
df.dtypes 获取每一列的数据类型
df.shape 获取数据维度(行数, 列数)

🔍 动手试试:用上面的代码创建 df 后,分别打印 df.shapedf.columns,看看输出结果是什么?

3.4 构建 Series

最常用方式:字典构建

s3 = pd.Series({'a': 10, 'b': 20, 'c': 30, 'd': 40, 'e': 50})

Series 除了没有 columns 属性外,其余属性和 DataFrame 类似。


四、数据的读写操作

Pandas 支持多种格式的数据读取与写入,格式统一好记:读用 read_,写用 to_

4.1 读取 CSV 文件(指定列)

df = pd.read_csv('data/students.csv', usecols=['学号', '姓名', '性别'])

usecols 参数用于指定只读取某些列,非常适合字段多的大文件。

4.2 写入 CSV 文件

df.to_csv('data/students_01.csv', index=False)

index=False 表示不写入隐藏索引列,否则 CSV 文件会多出一列无用的序号。

🧪 小挑战:找一个你本地有的 CSV 文件,试着用 pd.read_csv() 读取,并指定 usecols 只看前 3 列。成功了吗?有问题欢迎评论区交流。


五、数据处理:查看、选择与过滤

拿到数据后,我们需要对数据进行查看、选择和过滤,这一步和 MySQL 的 SELECT + WHERE 非常相似。

5.1 数据查看

函数/属性 说明
df.head(n) 查看前 n 行数据,默认 5 行
df.tail(n) 查看末尾 n 行数据,默认 5 行
df.describe() 数值列的统计描述(均值、标准差等)
df.info() 查看数据信息(列名、非空数、类型)
df.shape 查看数据维度
df.columns 查看列名

5.2 数据选择

语法 说明
df['列名']df.列名 选择单列
df[['列1', '列2']] 选择多列
df.iloc[start:stop:step] 基于行号切片(不含stop)
df.loc[start:stop:step] 基于索引标签切片(含stop)

⚠️ 重点区分iloc 用行号(隐藏的,不可更改),loc 用索引标签(可自定义)。两者不是一回事,别搞混了!

5.3 数据过滤

过滤条件的写法和 MySQL 的 WHERE + AND/OR 非常像:

# 单条件:销售数量 >= 10
df[df['销售数量'] >= 10]

# 单条件:产品类别属于服装或食品
df[df['产品类别'].isin(['服装', '食品'])]

# 单条件:单价在 50 到 200 之间
df[df['单价'].between(50, 200)]

# 多条件组合:&(且)、|(或)
df[(df['销售数量'] >= 10) & (df['单价'] < 100)]

六、数据清洗:缺失值、重复值、异常值

数据清洗是数据分析中最耗时的环节,主要包括处理缺失值、重复值、异常值和格式统一。

6.1 缺失值处理

查看缺失值:

df.isnull()  # 返回布尔型的 DataFrame,标记所有缺失位置

删除缺失值:

df.dropna()           # 删除缺失值所在行
df.dropna(axis=1)     # 删除缺失值所在列

填充缺失值:

df.fillna('--')       # 用指定值填充
df.ffill()            # 用上一行数据填充
df.bfill()            # 用下一行数据填充

6.2 重复值处理

查看重复值:

df.duplicated()                      # 所有列都重复才算重复
df.duplicated(subset=['学号'])       # 指定列重复即算重复

删除重复值:

df.drop_duplicates(subset=['订单号'])              # 默认保留第一行
df.drop_duplicates(subset=['订单号'], keep='last')  # 保留最后一行

6.3 异常值处理

查看异常值:

df[df['年龄'] < 18]   # 找出年龄小于 18 的异常数据

删除异常值:

df.drop(df[df['年龄'] < 18].index)  # 删除异常值所在行

修复异常值(如取绝对值、替换等)需根据具体业务场景操作。

6.4 数据格式处理

对于字符串列,可通过 .str 进行链式操作,实现格式统一:

df['姓名'].str.strip()      # 去除两端空格
df['日期'].str.replace()    # 替换特定字符

📝 课后思考:回忆一下,数据清洗四个子任务分别是什么?缺失值、重复值、异常值、格式处理。能不看笔记说出来吗?


七、数据排序与分组

7.1 数据排序

和 MySQL 的 ORDER BY 类似:

# 单列排序:按年龄降序
df.sort_values('年龄', ascending=False)

# 多列排序:先按年龄升序,相同年龄再按学分降序
df.sort_values(['年龄', '学分'], ascending=[True, False])

7.2 数据分组与聚合

和 MySQL 的 GROUP BY + 聚合函数对应:

# 按年龄分组,统计学分的 sum、count、max、min、mean
df.groupby('年龄')['学分'].agg(['sum', 'count', 'max', 'min', 'mean'])

🎯 动手挑战:用你手头的数据,试着按某个字段分组,算出各组的平均值和总和。把代码截图发在评论区,看看大家的写法有什么不同!


八、数据可视化:Matplotlib 入门

数据分析的最后一步,就是把结果画出来,让人一目了然。Python 中最常用的绘图库就是 Matplotlib

8.1 快速上手:画一张折线图

import matplotlib.pyplot as plt
import random

# 设置中文字体(否则中文会显示方块)
plt.rcParams['font.sans-serif'] = ['SimHei']

# 准备数据
x = [i for i in range(1, 25)]
y_bj = [random.randint(10, 15) for i in x]
y_xa = [random.randint(13, 18) for i in x]

# 创建画布
plt.figure(figsize=(10, 5))

# 画折线图
plt.plot(x, y_bj, label='北京')
plt.plot(x, y_xa, label='西安')

# 美化细节
plt.title('气温变化折线图', fontsize=15)    # 标题
plt.xlabel('时间')                          # X 轴标签
plt.ylabel('温度')                          # Y 轴标签
plt.xticks(x)                               # X 轴刻度
y_ticks = [i for i in range(5, 21)]
plt.yticks(y_ticks)                         # Y 轴刻度
plt.grid(linestyle='--', alpha=0.3)         # 网格线
plt.legend(loc='upper right')               # 图例

# 显示图表
plt.show()

画图通用原则:先跑起来,再美化。 先把基础图画出来,再逐步添加标题、标签、网格等细节。

8.2 一张画布,多个子图

实际项目中,经常需要在一张画布上展示多个图表:

# 创建 1 行 2 列的子图布局
figure, axes = plt.subplots(nrows=1, ncols=2, figsize=(20, 6), dpi=100)

# 在第一个子图画折线图
axes[0].plot(x, y_bj, label='北京')

# 在第二个子图画柱状图
axes[1].bar(x, y_xa, label='西安')

axes[0]axes[1] 分别对应两个子图对象,通过索引操作不同的子图。

8.3 三种常用图表类型

图表类型 函数 适用场景
折线图 plot(...) 展示趋势变化
柱状图 bar(...) 展示数量对比
饼状图 pie(...) 展示比例构成

🎨 创意挑战:用 Matplotlib 把你的学习时长画成一张折线图,或者把本月各项支出画成饼状图。画好之后欢迎在评论区晒图,看看谁是“数据可视化大师”!


九、总结:一张图回顾全部知识点

流程步骤 主要任务 核心工具/库
1. 数据收集 从各种渠道获取原始数据(脏数据) 爬虫、API、Excel
2. 数据清洗 处理缺失值、重复值、异常值、格式 Pandas
3. 数据分析 查看、选择、过滤、排序、分组、聚合 Pandas
4. 数据可视化 绘制折线图、柱状图、饼状图等 Matplotlib

理论是基础,实践出真知。今天讲的每一个知识点,课后都要动手敲一遍代码,才能真正变成自己的技能。数据不会自己说话,但你可以让它“开口”。

🎤 结课小调查:学完本文后,你觉得最难啃的骨头是哪一块?
A. Pandas 数据处理
B. Matplotlib 可视化
C. 正则表达式(数据清洗)
D. Jupyter Notebook 使用

在评论区打出你的选项,我会根据呼声最高的话题,考虑出一篇深度详解!


本文为 Python 数据分析入门理论授课内容整理,后续可继续推出实战案例文章。如果觉得有帮助,欢迎点赞、收藏、关注,您的支持是我持续输出的动力!

更多推荐