本教程面向数据分析师、数据科学家和Python开发者,系统讲解如何使用Claude Code完成从数据加载、清洗、特征工程、统计分析到可视化输出的全链路数据分析工作流。学完后,你将能够用一条提示词让Claude Code处理50万行级别的真实数据集,生成可复用的分析脚本和参数化报表——无需手写一行pandas代码。
适用人群:有基础Python知识、了解pandas概念的数据从业者 预计学习时长:90-120分钟(含实战练习)
| 条件 | 说明 |
|---|---|
| Claude Code | 已安装并激活(npm install -g @anthropic-ai/claude-code) |
| Python 3.10+ | 系统已安装Python |
| 包管理器 | 推荐UV(pip install uv),比pip快10-20倍 |
| 基础知识 | 了解DataFrame、CSV、基本统计概念即可 |
| Anthropic API | Claude Max或Team订阅,确保额度充足 |
在终端中执行:
mkdir claude-data-analysis && cd claude-data-analysis
claude
首次启动后,Claude Code会在当前目录创建会话。所有文件操作都基于这个工作目录。
在Claude Code交互界面输入:
/init
Claude Code会自动分析当前目录结构并生成CLAUDE.md。对于数据分析项目,你需要手动补充数据偏好配置。编辑CLAUDE.md加入以下内容:
# Data Analysis Preferences
## Environment
- Python package manager: uv
- Preferred packages: pandas, numpy, matplotlib, seaborn, openpyxl, scipy, statsmodels
- Chart style: seaborn darkgrid theme, professional color palette
- Output directory: ./output/
## Data Analysis Rules
- Always write Python scripts, not one-liners
- Save all charts as PNG at 150 DPI to ./output/charts/
- Generate multi-sheet Excel workbooks using openpyxl
- Include a QA/reconciliation sheet in every workbook
- Never estimate numbers from pattern matching — always compute from actual data
- Use chunked processing for files over 100MB
这条规则至关重要:永远不要让Claude从模式匹配"猜"数字,必须从真实代码计算结果中总结。 这直接消除了数据分析中最常见的准确性问题。
告诉Claude Code:
用UV创建一个虚拟环境,安装pandas、matplotlib、seaborn、openpyxl、scipy、statsmodels、scikit-learn
Claude Code会执行:
uv venv
source .venv/bin/activate
uv pip install pandas matplotlib seaborn openpyxl scipy statsmodels scikit-learn
预期结果:.venv目录创建成功,所有依赖安装完毕。Claude Code会自动在后续脚本中使用这个虚拟环境。
常见问题:
| 问题 | 解决方案 |
|---|---|
| UV安装失败 | 改用python -m venv .venv && source .venv/bin/activate && pip install ... |
| 权限错误 | 在项目目录下执行,不要在系统目录操作 |
| 网络超时 | 配置pip镜像源:uv pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple |
我们使用UCI Online Retail Dataset——一个真实的51万行英国零售交易数据集,包含退货、取消订单、缺失客户ID等典型的脏数据特征。
在Claude Code中输入:
下载UCI Online Retail数据集(https://archive.ics.uci.edu/ml/machine-learning-databases/00352/Online%20Retail.xlsx)到当前目录,用pandas加载它,输出基本信息:行数、列名、数据类型、缺失值统计、前5行样本
Claude Code会生成类似以下脚本并执行:
import pandas as pd
df = pd.read_csv("Online Retail.csv", encoding="latin-1")
print(f"数据形状: {df.shape}")
print(f"\n列名: {list(df.columns)}")
print(f"\n数据类型:\n{df.dtypes}")
print(f"\n缺失值统计:\n{df.isnull().sum()}")
print(f"\n前5行:\n{df.head()}")
预期输出:
数据形状: (541909, 8)
缺失值统计:
InvoiceNo 0
StockCode 0
Description 1454
Quantity 0
InvoiceDate 0
UnitPrice 0
CustomerID 135080
Country 0
关键发现:约25%的行缺失CustomerID——这是真实业务数据的典型特征。
对这个零售数据集执行完整的探索性数据分析。告诉我:
1. 哪些列有数据质量问题(缺失值、异常值、类型错误)?
2. 哪些特征可能影响销售额?
3. 应该优先创建哪些可视化图表?
4. 这份数据能回答哪些业务问题?
在回答之前,先写Python代码加载文件,执行计算,再从输出结果中总结。不要猜测数字。
Claude Code会创建一个完整的EDA脚本,包含: - 数值列的描述性统计(均值、中位数、分位数) - 异常值检测(IQR方法或Z-score) - 时间范围和季节性模式 - 分类变量的频率分布 - 缺失值的模式分析
关键提示:始终使用"先写代码、后总结"的提示策略。这强制Claude从真实计算结果得出结论,而非凭统计直觉猜测。
许多教程会告诉你"drop掉退货和取消订单"。但在真实业务中,退货率本身就是关键业务信号。某产品40%的退货率比任何正面指标都值得关注。
告诉Claude Code:
清洗这个数据集,但不要丢弃退货和取消订单。要求:
1. 新增 IsCancellation 列:标记InvoiceNo以'C'开头或Quantity为负的行
2. 新增 LineTotal 列:Quantity × UnitPrice
3. 新增 GrossLineTotal 列:非取消订单的LineTotal,否则为0
4. 新增 ReturnLineTotal 列:取消订单的LineTotal绝对值,否则为0
5. 处理Description缺失值(填充为"UNKNOWN")
6. 确保InvoiceDate为datetime类型
输出清洗前后的行数对比和每列的缺失值统计
Claude Code生成的清洗函数大致如下:
def clean_retail_data(df: pd.DataFrame) -> pd.DataFrame:
# 标记取消订单
df['IsCancellation'] = (
df['InvoiceNo'].str.startswith('C', na=False) |
(df['Quantity'] < 0)
)
# 计算行总计
df['LineTotal'] = df['Quantity'] * df['UnitPrice']
df['GrossLineTotal'] = df['LineTotal'].where(~df['IsCancellation'], 0)
df['ReturnLineTotal'] = df['LineTotal'].abs().where(df['IsCancellation'], 0)
# 填充缺失描述
df['Description'] = df['Description'].fillna('UNKNOWN')
# 确保日期类型
df['InvoiceDate'] = pd.to_datetime(df['InvoiceDate'])
return df
当CSV超过100MB或超过内存容量时,Claude Code会自动采用分块策略:
# 自动分块处理
chunks = pd.read_csv('huge_file.csv', chunksize=50000)
results = []
for chunk in chunks:
processed = process_chunk(chunk)
results.append(processed)
df = pd.concat(results)
这是Claude Code相比ChatGPT Code Interpreter的核心优势之一——它运行在你的本地机器上,能使用全部系统RAM,没有云端文件大小限制。
使用matplotlib和seaborn生成以下图表:
1. 月度销售额趋势折线图(区分毛收入和退货)
2. Top 10产品柱状图(按收入排名,标注退货率)
3. 客户生命周期价值分布直方图(含KDE曲线)
4. 国家/地区收入占比饼图(Top 8 + Others)
使用深色主题,添加适当的标签和标题,每张图保存为PNG到./output/charts/目录
Claude Code生成的可视化代码会直接使用你的实际列名(如GrossLineTotal、ReturnLineTotal),而非占位变量。这消除了手动替换列名的繁琐步骤。
对于需要交互性的场景,可以请求Plotly:
用Plotly生成一个交互式散点图:X轴为订单数量,Y轴为平均订单金额,气泡大小为客户生命周期价值,悬停显示客户ID和国家。保存为HTML文件。
Claude Code不仅能运行统计测试,更重要的是解释结果对业务的实际意义:
对plan_type和churn之间进行卡方独立性检验。结果包含:卡方统计量、p值、自由度。
然后为非技术利益相关者解释:
- 我们是否应该按套餐类型制定不同的留存策略?
- 除了统计显著性,实际业务意义是什么?
- 样本量或混杂因素可能如何影响结论?
Claude Code输出示例:
from scipy import stats
contingency = pd.crosstab(df['plan_type'], df['churn'])
chi2, p_value, dof, expected = stats.chi2_contingency(contingency)
print(f"卡方统计量: {chi2:.4f}")
print(f"p值: {p_value:.6f}")
print(f"自由度: {dof}")
Claude的业务解读(非逐字引用,而是其典型分析风格):
p值远小于0.001,说明套餐类型与流失行为之间存在统计显著关联。从列联表来看,Premium套餐用户的流失率比Basic套餐高出约2.3倍。建议针对Premium用户设计专属留存策略——可能是价格敏感度问题,也可能是服务期望未满足。但需注意:未控制收入、使用时长等混杂变量,因果关系需进一步验证。
这是Claude Code数据分析工作流的核心产出——一个可复用的、带CLI参数的报表脚本:
# retail_report.py
import argparse
import pandas as pd
def generate_report(input_path, output_path, top_n=10, freq='M',
start_date=None, end_date=None):
"""参数化零售报表生成器"""
df = pd.read_csv(input_path)
df = clean_retail_data(df)
# 日期过滤
if start_date:
df = df[df['InvoiceDate'] >= start_date]
if end_date:
df = df[df['InvoiceDate'] <= end_date]
# 生成六个工作表
with pd.ExcelWriter(output_path, engine='openpyxl') as writer:
generate_kpi_sheet(df, writer)
generate_top_products(df, writer, top_n=top_n)
generate_top_customers(df, writer)
generate_sales_over_time(df, writer, freq=freq)
generate_country_breakdown(df, writer)
generate_qa_reconciliation(df, writer) # 关键:交叉验证
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--input', required=True)
parser.add_argument('--output', default='./output/retail_report.xlsx')
parser.add_argument('--top_n', type=int, default=10)
parser.add_argument('--freq', choices=['W', 'M', 'Q'], default='M')
parser.add_argument('--start_date', type=str, default=None)
parser.add_argument('--end_date', type=str, default=None)
args = parser.parse_args()
generate_report(args.input, args.output, args.top_n,
args.freq, args.start_date, args.end_date)
六维报表工作表结构:
| 工作表 | 内容 |
|---|---|
| KPIs | 毛收入、净收入、退货率、交易数 |
| Top Products | 按收入和销量排名,含退货率 |
| Top Customers | 客户生命周期价值、订单频率 |
| Sales Over Time | 按周/月/季度趋势(由--freq控制) |
| Country Breakdown | 各国家收入和交易占比 |
| QA Reconciliation | 交叉验证——用两种独立方法计算净收入,确认结果一致 |
QA工作表是核心。它用两种独立的计算路径得出净收入,然后验证差异为零。这是确保数字可靠而非"看起来合理"的关键机制。
运行方式:
python retail_report.py --input Online_Retail.csv --top_n 15 --freq W --start_date 2011-01-01
一条命令,15秒内重新生成完整报表。对比手动重建Excel数据透视表,效率提升不可同日而语。
Jupyter Notebook在数据分析领域占据主导地位,但它与Claude Code的协作存在两个结构性问题:
问题一:图表导致Token爆炸。Notebook内的matplotlib图表以base64编码存储在JSON中。一个包含10张图表的notebook可能消耗数万个Token——这些Token被用来传输图片数据,而非真正的分析内容。
问题二:内核状态不可见。Claude Code无法查看Jupyter内核的运行状态——不知道哪些变量已定义、哪些import已加载、哪些cell已执行。编辑某个cell可能导致NameError或过时状态bug。
Marimo是推荐替代方案:
uv pip install marimo
marimo edit analysis_notebook.py
Marimo的优势:
- 代码存储为纯Python文件——没有base64 blob
- 反应式执行模型——修改一个值,所有依赖cell自动更新,不存在过时状态
- MCP集成——marimo --mcp标志将notebook暴露为MCP服务器,让Claude Code能结构化地检查和修改
- 内置错误检测——marimo check可在执行前发现错误
告诉Claude Code:
将刚才的数据分析脚本转换为Marimo notebook,每个分析步骤对应一个cell。确保cell之间的依赖关系正确。
如果你必须留在Jupyter生态中,采用模块分离模式:
创建以下文件结构:
- src/data_loader.py:数据加载和清洗函数
- src/analysis.py:统计分析和特征工程函数
- src/visualization.py:图表生成函数
- notebooks/exploration.ipynb:只包含import和函数调用
这样notebook只负责交互探索,所有逻辑在.py文件中由Claude Code维护。
现在将前面所有步骤整合为一个端到端项目——从原始数据到预测模型。
churn-prediction/
├── CLAUDE.md
├── .venv/
├── data/
│ └── customers.csv
├── src/
│ ├── __init__.py
│ ├── data_loader.py
│ ├── feature_engineer.py
│ ├── model_trainer.py
│ └── visualization.py
├── output/
│ ├── charts/
│ └── reports/
├── notebooks/
│ └── exploration.py # Marimo notebook
└── reports/
└── churn_report.py # 参数化报表
加载data/customers.csv,执行完整EDA。数据集包含age、income、churn、plan_type、tenure_months、support_tickets列。
重点分析:哪些特征与流失(churn=1)相关?缺失值模式是什么?有无明显的数据泄露风险?
基于EDA结果,构建scikit-learn特征工程Pipeline:
- 数值列:StandardScaler标准化
- 分类列:OneHotEncoder独热编码
- 缺失值:按plan_type分组的年龄中位数填充
- 新增交互特征:support_tickets_per_month = support_tickets / tenure_months
确保无数据泄露——先用train_test_split再fit Pipeline
Claude Code生成的Pipeline:
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.impute import SimpleImputer
from sklearn.model_selection import train_test_split
numeric_features = ['age', 'income', 'tenure_months', 'support_tickets',
'support_tickets_per_month']
categorical_features = ['plan_type']
numeric_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='median')),
('scaler', StandardScaler())
])
categorical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='most_frequent')),
('encoder', OneHotEncoder(drop='first', sparse_output=False))
])
preprocessor = ColumnTransformer(transformers=[
('num', numeric_transformer, numeric_features),
('cat', categorical_transformer, categorical_features)
])
训练三个模型——逻辑回归、随机森林、梯度提升。
使用分层抽样(stratified split),因为churn正例率只有12%。
输出每个模型的精确率、召回率、F1、AUC-ROC,用表格对比。
绘制ROC曲线和混淆矩阵,保存到output/charts/。
Claude Code会自动:
- 使用stratify=y处理类别不平衡
- 生成对比表格
- 绘制ROC曲线和混淆矩阵
- 推荐最优模型并进行超参数调优
将所有分析结果汇总为一个多sheet Excel报表,包含:
Sheet 1: 执行摘要——关键发现和模型建议
Sheet 2: EDA统计——描述性统计和缺失值报告
Sheet 3: 特征重要性——按模型排序的Top 15特征
Sheet 4: 模型对比——三模型性能指标表
Sheet 5: 业务建议——按风险等级分组的客户分群
Sheet 6: QA验证——数据完整性检查
flowchart TB
A[启动Claude Code] --> B[/init 生成 CLAUDE.md]
B --> C[UV创建虚拟环境]
C --> D[数据加载与EDA]
D --> E{数据质量评估}
E -->|高质量| F[特征工程]
E -->|有问题| G[智能数据清洗]
G --> F
F --> H[统计分析与假设检验]
H --> I[可视化生成]
I --> J[模型训练与评估]
J --> K[参数化报表脚本]
K --> L{验证QA工作表}
L -->|通过| M[输出交付物]
L -->|不通过| N[修复计算逻辑]
N --> K
M --> O[Excel报表 / HTML图表 / Python脚本]
style A fill:#4A90D9,color:#fff
style M fill:#2ECC71,color:#fff
style L fill:#E74C3C,color:#fff
style E fill:#F39C12,color:#fff
flowchart LR
subgraph "Claude Code vs ChatGPT Code Interpreter"
direction TB
A[Claude Code<br/>本地运行]
B[ChatGPT CI<br/>云端沙箱]
end
A ---|文件大小| A1[无实际限制<br/>使用全部系统RAM]
B ---|文件大小| B1[上传上限<br/>受沙箱资源约束]
A ---|持久化| A2[生成可复用脚本<br/>CLAUDE.md记忆偏好]
B ---|持久化| B2[会话级临时代码<br/>无持久记忆]
A ---|适用场景| A3[生产分析、大型数据集<br/>重复性报表]
B ---|适用场景| B3[快速探索、小中型文件<br/>一次性分析]
在长期实践中,以下七条规则对确保Claude Code数据分析质量最为关键:
法则一:强制代码先行。每一条涉及数字的提示词都加上:"先写Python代码加载数据并执行计算,再从输出中总结。" 这一条规则消除了90%的准确性问题。
法则二:保留退货/取消数据。不要简单drop——标记并分类。退货率、取消率本身就是核心业务指标。
法则三:QA交叉验证。在每份报表中加入reconciliation工作表,用两种独立方法计算关键指标并验证一致。
法则四:参数化一切。分析脚本应该接受CLI参数(日期范围、Top N、时间粒度),让一次编写能反复使用。
法则五:CLAUDE.md配置数据偏好。包管理器、图表风格、输出目录、图表DPI——这些偏好一次配置,终身生效。
法则六:大文件分块处理。超过100MB的CSV,明确要求Claude使用chunksize参数,保持内存占用平稳。
法则七:Marimo替代Jupyter。如果Claude Code是你的主力工具,Marimo的反应式执行和纯Python文件格式能显著提升协作效率。
| 维度 | 评估 |
|---|---|
| 适合训练营类型 | 数据分析训练营、AI+Python实战营、企业数据团队内训 |
| 教学时长 | 基础版4小时(步骤1-4),完整版8小时(含实战案例) |
| 学员前置要求 | Python基础语法、pandas概念理解、终端操作能力 |
| 硬件要求 | 8GB+ RAM(处理50万行数据),稳定网络连接 |
| 分组建议 | 2-3人一组,每组一个真实数据集,完成全链路分析 |
| 考核方式 | 提交参数化报表脚本 + QA验证通过 + 业务洞察报告 |
[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。
