Jupyter Notebook 数据科学:交互式探索分析
为什么选择 Jupyter Notebook
Jupyter Notebook 是一个开源的 Web 应用程序,允许你创建和共享包含实时代码、方程、可视化和叙述性文本的文档。它已经成为数据科学领域事实上的标准工具,尤其适合交互式探索性数据分析。你可以在同一个界面里编写代码、查看输出、添加注释和图表,这种“文学编程”风格让数据分析过程的记录与沟通变得极其流畅。
安装与启动
使用 Anaconda 安装(推荐)
Anaconda 是一个开源的 Python 和 R 发行版,内置了超过 250 个常用的数据科学包,并预装了 Jupyter Notebook。
- 访问 Anaconda 官网 下载对应系统的最新版本安装包。
- 运行安装程序,按照引导完成安装。
- 安装完成后,打开终端(Mac/Linux)或 Anaconda Prompt(Windows)。
使用 pip 安装(轻量)
如果你已经安装了 Python 和 pip,可以通过命令行快速安装:
pip install jupyter notebook
启动 Notebook
在终端中输入以下命令:
jupyter notebook
命令执行后,系统会在默认浏览器中自动打开 Notebook 仪表板,展示当前目录的文件列表。你也手动访问终端提示的地址,通常是 http://localhost:8888。
Notebook 界面详解
进入仪表板后,你可以新建一个 Notebook 文件,或者打开已有的 .ipynb 文件。一个 Notebook 主要由以下部分组成:
- 标题栏:显示 Notebook 名称,点击可重命名。
- 菜单栏:提供文件操作、编辑、视图、单元格类型切换、内核管理等选项。
- 工具栏:常用操作的快捷方式,如保存、添加单元格、运行等。
- 单元格区域:核心工作区,所有代码和文本都在单元格中编写。
- 内核状态指示器:位于右上角,显示内核空闲或忙碌。
Jupyter 支持两种主要单元格类型:
- 代码单元格(Code):用于编写和执行代码,按
Shift + Enter运行当前单元格。 - Markdown 单元格:用于书写解释说明,支持 Markdown 语法,可添加标题、列表、链接、Latex 公式等。
基础操作与快捷键
掌握快捷键能够大幅提升效率。在命令模式(按 Esc 进入)和编辑模式(按 Enter 进入)下,快捷键有所不同。
| 操作 | 快捷键 | 说明 |
|---|---|---|
| 运行单元格 | Shift + Enter |
运行当前单元格并选中下一个 |
| 运行单元格并插入 | Alt + Enter |
运行当前单元格并在下方插入新单元格 |
| 转为代码单元格 | Y |
在命令模式下使用 |
| 转为 Markdown 单元格 | M |
在命令模式下使用 |
| 插入上方单元格 | A |
在命令模式下使用 |
| 插入下方单元格 | B |
在命令模式下使用 |
| 删除当前单元格 | D, D (连续按两次) |
在命令模式下使用 |
| 保存 Notebook | Ctrl + S |
内核不会因保存而中断 |
建议初学者先熟悉这几个核心操作,逐步提升编码流畅度。
数据加载:从文件到 DataFrame
数据科学的第一步是获取数据。在 Jupyter 中,我们通常使用 Pandas 库来读取和处理数据。确保已经安装了 Pandas:
pip install pandas
读取 CSV 文件
import pandas as pd
# 读取本地 CSV 文件,指定编码以防中文乱码
df = pd.read_csv('data.csv', encoding='utf-8')
# 查看前 5 行数据
df.head()
读取 Excel 文件
# 需要安装 openpyxl 或 xlrd
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
df.head()
直接从 URL 读取
url = 'https://example.com/dataset.csv'
df = pd.read_csv(url)
常用探查方法
加载数据后,立刻执行以下代码快速了解数据概况:
# 数据集形状(行数,列数)
print(df.shape)
# 各列的数据类型
print(df.dtypes)
# 基本信息,包括非空值数量
df.info()
# 数值型列的统计摘要
df.describe()
交互式数据清洗
现实世界的数据往往不干净,需要清洗和预处理。Jupyter Notebook 最大的优势在于可以分步骤进行清洗,每一步都能立即看到结果,方便发现问题。
处理缺失值
# 检查每一列的缺失值数量
df.isnull().sum()
# 删除包含缺失值的行
df_clean = df.dropna()
# 用均值填充数值型列
df['age'].fillna(df['age'].mean(), inplace=True)
# 用众数填充分类型列
df['gender'].fillna(df['gender'].mode()[0], inplace=True)
重命名列
df.rename(columns={'old_name': 'new_name', 'col2': 'new_col2'}, inplace=True)
数据类型转换
# 将字符串日期转为 datetime 类型
df['date'] = pd.to_datetime(df['date'])
# 将对象类型转换为分类类型以节省内存
df['category'] = df['category'].astype('category')
字符串处理
# 删除前后空格
df['name'] = df['name'].str.strip()
# 提取字符串中的数字部分
df['number'] = df['code'].str.extract('(\d+)')
这些操作都可以在一个个独立的单元格中执行,你可以随时回顾、修改或重新运行,完美体现交互式分析的灵活性。
探索性数据分析(EDA)
单变量分析
通过表格和可视化快速理解单个变量的分布。
# 分类变量频数统计
df['category'].value_counts().plot(kind='bar')
# 数值变量直方图
df['score'].hist(bins=30)
多变量分析
探索变量之间的关系,常用 groupby 和透视表。
# 按类别分组的均值统计
df.groupby('category')['value'].mean()
# 使用 pivot_table 创建透视表
pd.pivot_table(df, values='sales', index='region', columns='product', aggfunc='sum')
相关性分析
# 数值型列的相关性矩阵
corr = df.corr()
corr
利用 Seaborn 的热力图可以直观呈现相关性:
import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 8))
sns.heatmap(corr, annot=True, cmap='coolwarm')
plt.show()
交互式可视化
Jupyter Notebook 天然支持 Matplotlib,但结合 Seaborn、Plotly 等库可以创建更丰富、更具交互性的图表。
Matplotlib + Seaborn 快速画图
import matplotlib.pyplot as plt
import seaborn as sns
# 设置风格
sns.set_style('whitegrid')
# 散点图
sns.scatterplot(data=df, x='height', y='weight', hue='gender')
plt.title('身高与体重关系')
plt.show()
Plotly 交互式图表
Plotly 生成的图表支持缩放、悬停显示数值等交互操作。
import plotly.express as px
fig = px.scatter(df, x='gdp_per_capita', y='life_expectancy',
size='population', color='continent',
hover_name='country', log_x=True)
fig.show()
在 Notebook 中,Plotly 图表直接嵌入输出单元格,你可以与它互动,这是传统静态图表无法比拟的。
使用 %matplotlib inline 魔法命令
为了在 Notebook 中内嵌显示图表,通常需要添加以下魔法命令(默认已在大多数环境下启用):
%matplotlib inline
利用 Markdown 单元格构建分析故事
一个优秀的数据科学 Notebook 不只是代码的堆砌,更是一份可读性强的分析报告。使用 Markdown 单元格添加:
- 标题与章节:用
#、##、###组织文档结构。 - 项目列表:用于总结发现。
- 链接:引用外部资源或数据集。
- 图像:
,也可直接粘贴截图。 - 数学公式:利用 LaTeX 语法,
$$E = mc^2$$可渲染出美观的公式。
通过交替使用代码、输出和 Markdown 文本,你能构建出一个连贯的分析叙事,让协作者或未来的自己快速理解分析思路。
魔法命令:提升效率的利器
Jupyter 提供了许多内置的魔法命令(Magic Commands),以 % 或 %% 开头,帮助完成环境配置、性能测试、文件操作等任务。
| 魔法命令 | 作用 |
|---|---|
%lsmagic |
列出所有可用的魔法命令 |
%pwd |
显示当前工作目录 |
%matplotlib inline |
在 Notebook 中内嵌图表 |
%timeit |
测量单行代码的执行时间 |
%%timeit |
测量整个单元格代码的执行时间 |
%reset |
清除当前命名空间中的所有变量 |
%who |
列出当前所有变量 |
%run script.py |
在 Notebook 中运行外部 Python 脚本 |
%timeit sum(range(1000000))
分享与导出
导出为静态文件
通过菜单 File -> Download as 可以将 Notebook 导出为多种格式:
- HTML:保留交互式输出,适合直接分享查看。
- PDF:适合打印,需要安装 LaTeX。
- Markdown:可用于博客或文档生成工具。
- Python 脚本 (.py):去除输出,仅保留代码。
使用 nbviewer 在线分享
将 .ipynb 文件上传到 GitHub,然后通过 nbviewer 生成可共享的链接,接收方无需安装任何东西即可查看 Notebook 的完整渲染版本。
进阶技巧
自动重载模块
当你修改了导入的自定义模块,使用 autoreload 可以避免反复重启内核。
%load_ext autoreload
%autoreload 2
在 Notebook 中执行 Shell 命令
在代码单元格中,在命令前加上 ! 即可直接运行终端命令。
!pip list | grep pandas
多内核支持
Jupyter 支持安装多种语言的内核(如 R、Julia、Scala)。你可以通过 ipykernel 管理内核,并在新建 Notebook 时选择相应内核。
JupyterLab:下一代界面
JupyterLab 是 Jupyter 的下一代用户界面,提供了更灵活的工作区布局、终端、文本编辑器、文件管理器等集成。如果你从 Notebook 开始,可以无缝迁移到 JupyterLab。
pip install jupyterlab
jupyter lab
常见问题与解决
1. 内核一直显示忙碌或卡死
可在菜单栏选择 Kernel -> Interrupt 中断执行,如果无法恢复则 Kernel -> Restart。
2. 图片不显示
检查是否执行了 %matplotlib inline,并确保在绘图后调用了 plt.show() 或直接将 figure 对象放在单元格最后一行。
3. Pandas 输出被截断 可以通过以下设置显示完整内容:
pd.set_option('display.max_rows', 500)
pd.set_option('display.max_columns', None)
pd.set_option('display.max_colwidth', 100)
4. Notebook 文件过大导致加载缓慢
清理输出单元格(Cell -> All Output -> Clear)或使用 nbstripout 工具在提交版本前自动清除输出。
总结
Jupyter Notebook 将代码、数据探索和文档融为一体,是数据科学家的瑞士军刀。从快速的数据加载与清洗,到丰富的可视化与交互式分析,再到可复现的报告生成,它覆盖了数据分析的整个生命周期。掌握本教程中的基础操作和进阶技巧后,你将能够更高效地探索数据、验证想法,并将分析成果清晰地传达给他人。现在,打开你的终端启动 jupyter notebook,开始交互式数据科学之旅吧。