前置知识: Python

数据分析概述

17 minBeginner

数据分析领域全景概览、Python 工具链介绍与系统化学习路线

1. 什么是数据分析

1.1 定义与核心目标

数据分析是指用适当的统计方法对收集来的大量数据进行分析,提取有用信息和形成结论,从而对数据加以详细研究和概括总结的过程。其核心目标可以归纳为三个层次:

层次目标典型问题核心方法
描述性分析描述过去发生了什么上月销售额是多少?聚合统计、可视化
诊断性分析解释为什么会发生为什么用户流失率上升?相关分析、假设检验
预测性分析预测未来可能发生什么下季度销量预测?回归模型、时间序列

为什么需要分层思考? 因为不同层次的分析对数据质量、方法复杂度和业务理解的要求截然不同。描述性分析只需数据准确即可,诊断性分析需要建立因果逻辑,预测性分析则需要考虑模型的泛化能力。混淆层次会导致”用描述方法回答预测问题”的常见错误。

1.2 数据分析在不同行业的应用

  • 电商/零售:用户行为分析、商品推荐、库存优化、价格弹性分析
  • 金融:风控评分卡、信用评估、量化交易策略、反欺诈检测
  • 医疗健康:临床试验分析、流行病趋势、药物效果评估
  • 互联网:A/B 测试、用户增长分析、内容推荐算法评估
  • 制造业:质量管控(SPC)、设备预测性维护、供应链优化

1.3 数据分析 vs 数据科学 vs 机器学习

三者常被混淆,但侧重点不同:

 数据分析:以业务问题驱动,侧重描述与诊断,输出洞察与建议
 数据科学:在分析基础上加入工程化能力,构建数据产品
 机器学习:侧重算法建模与预测,是数据科学的子集工具

数据分析是数据科学的基础。没有扎实的分析能力,机器学习模型很可能在错误的数据和错误的假设上运行——所谓 “Garbage In, Garbage Out”。

模块参考:Python 基础 是数据分析的编程基础,MySQL 是数据获取的重要来源。


2. 数据分析流程

2.1 完整流程

数据分析不是从打开 Jupyter 开始的,而是从理解业务问题开始的。完整的分析流程如下:

 业务问题定义
  |
  v
 数据采集 (CSV/数据库/API/爬虫)
  |
  v
 数据清洗 (缺失值/异常值/类型转换)
  |
  v
 探索性数据分析 (EDA)
  |
  v
 建模分析 (统计检验/回归/分类)
  |
  v
 可视化呈现 (图表/仪表盘/报告)
  |
  v
 结论与建议 (可执行的行动方案)

2.2 各环节详解

业务问题定义:这是最容易被忽视但最重要的环节。一个清晰的问题定义决定了后续所有工作的方向。好的问题定义应该满足 SMART 原则——具体的(Specific)、可度量的(Measurable)、可实现的(Achievable)、相关的(Relevant)、有时限的(Time-bound)。 数据采集:数据来源决定了数据质量的上限。常见数据源包括:

  • 内部数据库(需要 MySQL 等 SQL 技能)
  • CSV/Excel 文件(Pandas read_csv/read_excel
  • Web API(requests + JSON 解析)
  • 公开数据集(Kaggle、UCI、政府开放数据) 数据清洗:通常占整个分析项目 60%-80% 的时间。详见 data-cleaning.md探索性数据分析(EDA):在建模之前,必须先”看”数据。EDA 的目标是:
  • 了解数据的分布特征
  • 发现异常模式或数据质量问题
  • 生成初步假设供后续验证 建模分析:基于 EDA 的发现,选择合适的统计方法或机器学习模型。详见 statistics.md可视化呈现:好的可视化能让复杂的数据关系一目了然。详见 matplotlib.mdseaborn.md结论与建议:分析的最终价值在于驱动决策。结论需要回答业务问题,建议需要可执行。

2.3 流程中的常见陷阱

陷阱描述规避方法
跳过问题定义直接拿数据开始分析先写问题陈述,再碰数据
忽视数据质量假设数据是干净的先做数据质量评估
过早建模EDA 不充分就建模型至少花 30% 时间在 EDA
幸存者偏差只分析可见数据思考数据缺失的原因
相关当因果相关性不等于因果性用 A/B 测试或因果推断验证
过度拟合模型在训练集上表现好但不可泛化交叉验证、留出测试集

3. Python 数据分析工具链

3.1 核心库概览

Python 数据分析生态由以下核心库构成,它们各司其职又紧密协作:

 +
 | 数据分析应用层 |
 | +----------+ +----------+ +----------------+ |
 | | Seaborn | | Statsmo- | | Scikit-learn | |
 | | (统计可视化)| | dels | | (机器学习) | |
 | +----+-----+ +----+-----+ +-------+--------+ |
 | | | | |
 | +----+-----+ +-----+----+ | |
 | |Matplotlib| | SciPy | | |
 | | (底层绘图)| | (科学计算)| | |
 | +----+-----+ +-----+----+ | |
 | | | | |
 | +----+--------------+----------------+----+ |
 | | NumPy (数值计算基础) | |
 | +-----------------------------------------+ |
 +
  |
  +----+-----+
  | Pandas |
  | (表格处理)|
  +----------+

为什么 NumPy 是基础? NumPy 提供了高效的多维数组对象 ndarray,Pandas 的 SeriesDataFrame 底层就是基于 NumPy 数组构建的。Matplotlib 的数值计算也依赖 NumPy。理解 NumPy 的数组操作和广播机制,是高效使用上层库的前提。

3.2 各库定位与关系

定位核心数据结构典型用途详细文档
NumPy数值计算基础ndarray数组运算、线性代数numpy.md
Pandas表格数据处理Series, DataFrame数据清洗、聚合、合并pandas.md
Matplotlib底层绘Figure, Axes基础表、精细控制matplotlib.md
Seaborn统计可视化基于 Matplotlib统计表、快速探索seaborn.md
SciPy科学计算基于 NumPy统计检验、优化statistics.md
Statsmodels统计建模DataFrame回归分析、时间序列statistics.md
Scikit-learn机器学习NumPy/Pandas、回归、聚超出本系列范围

3.3 库之间的协作模式

 import numpy as np
 import pandas as pd
 import matplotlib.pyplot as plt
 import seaborn as sns
 from scipy import stats
 np.random.seed(42)
 data = np.random.randn(1000)
 s = pd.Series(data)
 print(s.describe())
 fig, ax = plt.subplots(figsize=(8, 5))
 sns.histplot(s, kde=True, ax=ax)
 ax.set_title('Standard Normal Distribution')
 plt.show()

输出说明:上述代码演示了典型的库协作流程——NumPy 生成随机数据,Pandas 将其转换为 Series 并计算描述统计量,Seaborn 基于 Matplotlib 的 Axes 绘制直方和核密度估计曲线。这种 “NumPy 生成 -> Pandas 处理 -> Seaborn/Matplotlib 可视化” 的模式是数据分析中最常见的工作流。

4. 环境搭建与配置

4.1 Anaconda vs Miniconda

特性AnacondaMiniconda
安装包大小~3 GB~80 MB
预装包数量250+仅 conda + Python
适合人群初学者、教学有经验的开发者
磁盘占用

为什么推荐 Miniconda? Anaconda 预装了大量你可能永远用不到的包,不仅浪费磁盘空间,还可能导致版本冲突。Miniconda 只安装最小依赖,按需安装更可控。

4.2 环境创建与依赖安装

 conda create -n data-analysis python=3.11 -y
 conda activate data-analysis
 conda install numpy pandas matplotlib seaborn scipy statsmodels jupyterlab -y

也可以使用 pip 安装:

 pip install numpy pandas matplotlib seaborn scipy statsmodels jupyterlab

4.3 验证安装

 import numpy as np
 import pandas as pd
 import matplotlib
 import seaborn as sns
 from scipy import stats
 import statsmodels.api as sm
 packages = {
  'NumPy': np.__version__,
  'Pandas': pd.__version__,
  'Matplotlib': matplotlib.__version__,
  'Seaborn': sns.__version__,
  'SciPy': stats.__version__,
  'Statsmodels': sm.__version__,
 }
 for name, version in packages.items():
  print(f'{name}: {version}')

输出说明:运行上述代码将打印各库的版本号,确认所有核心依赖已正确安装。如果某个库导入失败,说明安装不完整,需要重新安装。

4.4 JupyterLab 扩展推荐

 conda install -c conda-forge jupyterlab-git jupyterlab-lsp python-lsp-server -y
扩展功能
jupyterlab-gitGit 版本控制集成
jupyterlab-lsp代码补全与跳转定义
jupyterlab-code-formatter代码自动格式化(black/isort)

5. Jupyter Notebook 工作流

5.1 核心概念

Jupyter Notebook 是数据分析的标准交互环境。其核心概念

  • Notebook:由一系列单元格(Cell)组成的文档,后缀 .ipynb
  • 单元格类型:Code(代码)、Markdown(文本)
  • 内核(Kernel):执行代码的 Python 进程
  • 状态:内核维护所有变量的运行时状态

    为什么用 Jupyter 而不是 IDE? 数据分析的核心工作模式是”探索”——写几行代码、看结果、调整、再看。Jupyter 的单元格执行模式天然适合这种交互式探索。IDE 更适合开发软件系统,而 Notebook 更适合做分析实验。

5.2 常用快捷键

快捷键功能模式
Enter进入编辑模式命令模式
Esc进入命令模式编辑模式
Shift + Enter运行当前单元格并跳到下一个通用
Ctrl + Enter运行当前单元格通用
A在上方插入单元格命令模式
B在下方插入单元格命令模式
DD删除当前单元格命令模式
M切换为 Markdown 单元格命令模式
Y切换为 Code 单元格命令模式

5.3 Magic 命令

Magic 命令是 IPython/Jupyter 提供的特殊指令,以 %(行级)或 %%(单元格级)开头:

 %
 %
 %
 total = 0
 for i in range(10000000):
  total += i
 print(total)
 %
 %

输出说明

  • %matplotlib inline:将表直接嵌入 Notebook 输出区域,而非弹出窗口
  • %timeit:自动多次运行并报告平均执行时间
  • %%time:报告整个单元格的执行时间
  • %who:列出当前命名空间中的所有变量
  • %history:查看历史执行记录

5.4 组织可复现的分析笔记本

一个好的分析笔记本应该像一篇结构清晰的报告:

# 项目标题

## 1. 业务背景与问题定义

## 2. 数据加载

## 3. 数据清洗

## 4. 探索性分析

## 5. 建模与检验

## 6. 结论与建议

关键原则:

  • 每个 Markdown 单元格解释”为什么”,每个 Code 单元格展示”怎么做”
  • 在笔记本顶部集中导入所有依赖
  • 设置随机种子确保可复现
  • 清洗步骤保留原始数据的备份
 import numpy as np
 import pandas as pd
 import matplotlib.pyplot as plt
 import seaborn as sns
 from scipy import stats
 np.random.seed(42)
 pd.set_option('display.max_columns', None)
 pd.set_option('display.float_format', '{:.4f}'.format)
 plt.rcParams['figure.figsize'] = (10, 6)
 plt.rcParams['font.size'] = 12
 sns.set_theme(style='whitegrid')
 df_raw = pd.read_csv('data.csv')
 df = df_raw.copy()

6. 学习路线

6.1 分阶段学习路径

 阶段一:基础工具(2-3 周)
  |
  +---> [numpy.md] 数组操作、广播、线性代数
  +---> [pandas.md] DataFrame 操作、索引、聚合
  |
  v
 阶段二:可视化(1-2 周)
  |
  +---> [matplotlib.md] 图表基础、样式定制、子图布局
  +---> [seaborn.md] 统计图表、热力图、多图网格
  |
  v
 阶段三:统计基础(2-3 周)
  |
  +---> [statistics.md] 描述统计、假设检验、回归分析
  |
  v
 阶段四:实战技能(2-3 周)
  |
  +---> [data-cleaning.md] 缺失值、异常值、类型转换
  +---> [project.md] 完整项目实战

6.2 各阶段学习目标

阶段一:基础工具 学完此阶段,你应该能够:

  • 使用 NumPy 进行高效的数值计算
  • 使用 Pandas 完成常见的数据筛选、聚合、合并操作
  • 理解向量化操作与循环的性能差异 前置知识:Python 基础,特别是列表、字典、函数、模块导入 阶段二:可视化 学完此阶段,你应该能够:
  • 使用 Matplotlib 绘制常见
  • 使用 Seaborn 快速绘制统计
  • 根据数据型选择合适的表选择速查:
    数据关系推荐工具
    趋势变化折线Matplotlib ax.plot
    别比较柱状Matplotlib ax.bar / Seaborn sns.barplot
    分布形态直方/箱线Seaborn sns.histplot / sns.boxplot
    相关关系散点/热力Seaborn sns.scatterplot / sns.heatmap
    占比构成/堆叠柱状Matplotlib ax.pie / ax.bar(stacked=True)
    阶段三:统计基础
    学完此阶段,你应该能够:
  • 计算并解释描述统计量
  • 选择并执行合适的假设检验
  • 理解 p 值、置信区间的含义与局限 阶段四:实战技能 学完此阶段,你应该能够:
  • 独立完成一个完整的数据分析项目
  • 处理真实数据中的各种质量问题
  • 将分析结果转化为业务建议

6.3 学习资源推荐

资源适合阶段说明
Python for Data Analysis书籍阶段一、二Wes McKinney 著,Pandas 作者本人编写
Kaggle Learn在线课程全阶段免费交互式教程,边学边练
Statistical Thinking in Python课程阶段三DataCamp 上的统计思维课程
Storytelling with Data书籍阶段四数据可视化叙事技巧

7. 速查表

7.1 数据分析流程速查

 1. 定义问题 -> 明确分析目标与成功标准
 2. 获取数据 -> read_csv / read_sql / API
 3. 评估质量 -> info() / describe() / isna().sum()
 4. 清洗数据 -> fillna / dropna / astype / drop_duplicates
 5. 探索分析 -> histplot / boxplot / scatterplot / heatmap
 6. 统计检验 -> ttest_ind / f_oneway / pearsonr
 7. 建模分析 -> OLS / Logit / 机器学习模型
 8. 可视化报告 -> subplots + suptitle + savefig
 9. 结论建议 -> 洞察 -> 行动 -> 预期影响

7.2 常用导入语句

 import numpy as np
 import pandas as pd
 import matplotlib.pyplot as plt
 import seaborn as sns
 from scipy import stats
 import statsmodels.api as sm
 np.random.seed(42)
 pd.set_option('display.max_columns', None)
 pd.set_option('display.float_format', '{:.4f}'.format)
 sns.set_theme(style='whitegrid')
 %

7.3 数据型与表映射

数据变量数量推荐
单个连续变量1直方、箱线、KDE
单个分变量1柱状、饼
连续 vs 连续2散点、回归
连续 vs 分2分组箱线、小提琴
vs 分2堆叠柱状、热力
多变量3+分面、气泡、PairGrid

7.4 常见问题排查

问题可能原因解决方法
中文乱码字体未配置plt.rcParams['font.sans-serif'] = ['SimHei']
表不显示未开启内联%matplotlib inline
内存不足数据量过大使用 chunksize 分块读取
编码错误文件非 UTF-8尝试 encoding='gbk''latin-1'
列名有空格读取时未处理df.columns = df.columns.str.strip().str.replace(' ', '_')

8. 延伸阅读

模块关联