1. 数据分析完整项目,到底难在哪里
很多同学学数据分析,路径基本一致:先学 Excel,再学 SQL,然后啃 Python 和 Pandas,最后看了一堆可视化图表。学完之后打开招聘网站,发现岗位要求上都写着“有完整的数据分析项目经验”。这时候才会意识到一个问题:什么都学过,但真正让我独立做一个项目,我居然不知道从哪里下手。
这不是个例。从我接触到的读者反馈来看,“学过工具但做不出完整项目”是数据分析入门阶段最常见的一道坎。原因不是大家学得不够努力,而是大多数教程只讲工具用法,比如这一章教你 groupby,下一章教你画柱状图,却没有告诉你这些知识点在一个真实项目中是如何串联起来的。你学会了一堆零件,却没看过一台完整机器的组装过程。
所以这篇文章想做的事情很简单:用一套模拟电商订单数据,带你从头到尾走完一个标准的数据分析项目。这个项目不需要你提前准备数据库,不需要部署大数据环境,只需要本机装了 Python 就能跑。整个过程包括项目定义、数据获取、数据清洗、探索性分析、可视化、结论输出和复盘,也就是你简历上“数据分析项目经历”那一栏真正需要的完整环节。
读完这篇文章,你可以收获三样东西:一是建立“从业务问题到数据结论”的完整流程意识;二是拿到一套可以直接运行、改数据就能复用的项目代码;三是知道哪些环节最耗时、最容易踩坑,以及如何在项目里避开它们。如果你正准备找数据分析相关工作,这篇文章可以作为你第一个可落地的实战项目模板。
2. 一个完整项目的前期准备:业务问题与项目设计
很多初学者做项目时有一个习惯,就是拿到数据后直接开始写代码。先跑一下df.describe(),再画两张图,然后不知道接下来要干什么。这种做法的本质问题在于:你是在“逛数据”,不是在“分析数据”。
在完整的分析流程里,第一步永远不是碰数据,而是先定义问题。
2.1 业务问题怎么来
一个真正能让面试官认可的数据分析项目,通常有一个可以讲清楚的业务出发点。比如:
- 当前订单量出现波动,想找出最可能的影响因素是什么。
- 想知道哪些用户群体贡献了主要销售额,以便设计更精准的运营策略。
- 商品复购率持续走低,需要通过数据分析定位问题出在哪个环节。
这些问题听起来不复杂,但它们的共同点是都指向一个具体的“决策”。数据分析不是写一份描述报告,而是通过数据帮业务做决策。
在这篇文章里,我们的业务问题可以设定为:
某电商平台希望分析 2023 年上半年的订单数据,明确不同品类、不同客户类型的销售贡献差异,找出提升客单价的可能方向。
这个设定已经足够了。我们后续的清洗、分析和可视化,都会围绕这个问题展开。你不需要真的拥有一家电商平台的数据,用一条模拟数据就能完成整个流程,等流程跑通了,把你的数据替换进去即可。
2.2 项目设计的五个模块
一个完整的数据分析项目,无论业务背景怎么变,都可以拆成五个模块:
| 模块 | 核心任务 | 对应简历描述 |
|---|---|---|
| 数据获取 | 确定数据来源,读取数据,了解字段含义 | 完成多源数据接入 |
| 数据清洗 | 处理缺失值、异常值、重复值和格式问题 | 完成数据预处理流程 |
| 探索性分析(EDA) | 通过统计量和可视化理解数据分布、关联关系 | 通过统计分析识别核心规律 |
| 分析与建模 | 用统计方法或简单模型验证业务猜想 | 建立分析模型,输出可解释结论 |
| 结果呈现 | 生成图表和结论,给出可落地的业务建议 | 输出可视化报告与业务建议 |
后续章节的代码,基本就按照这五步来写。先有模块划分,再写代码,比边写边想质量要高得多。
3. 环境准备与数据获取
开始写代码之前,先确认一下本机环境。数据分析基础项目对环境的要求不高,但版本不一致确实会带来一些莫名其妙的报错。
3.1 检查 Python 环境
建议使用 Python 3.8 及以上版本。版本查看命令:
python --version如果本机还没有 Python,直接安装官网的 Python 即可,安装时注意勾选 “Add Python to PATH”。不建议初学者一上来就折腾虚拟环境,先用最简单的方式把环境跑通,等做生产级项目时再引入虚拟环境管理。
3.2 安装依赖库
本项目需要用到的核心库是 Pandas、NumPy 和 Matplotlib,如果希望图表风格更好看,可以额外安装 Seaborn。安装命令:
pip install pandas numpy matplotlib seaborn在写文章的时候,我没有把版本号写死,原因是不同操作系统、不同 Python 版本下可安装的版本会有差异。安装完成后,可以用下面的命令确认已安装版本:
import pandas as pd import numpy as np import matplotlib import seaborn as sns print(pd.__version__) print(np.__version__) print(matplotlib.__version__) print(sns.__version__)只要不报ModuleNotFoundError,环境就说明没问题。
3.3 准备数据集
在真实项目中,数据可能来自数据库、Excel 文件或数据仓库。这里为了让你能完整体验项目流程,我用 Python 直接模拟一份电商订单数据,包含下面这些字段:
- order_id:订单编号
- order_date:下单日期
- customer_type:客户类型
- category:商品品类
- quantity:购买数量
- unit_price:商品单价
- total_amount:订单金额
这里要特别说明:模拟数据和真实数据的区别仅在于来源,处理逻辑没有任何差别。等你把这段代码跑通,只需要把数据读取部分换成你实际的数据源即可。
模拟数据生成的代码如下:
import pandas as pd import numpy as np # 设置随机种子,保证每次运行生成的数据一致 np.random.seed(42) n = 2000 order_ids = ["ORD" + str(i).zfill(6) for i in range(1, n + 1)] order_dates = pd.date_range(start="2023-01-01", end="2023-06-30", periods=n) customer_types = np.random.choice(["新客户", "普通客户", "会员客户"], size=n, p=[0.3, 0.5, 0.2]) categories = np.random.choice(["数码", "服饰", "家居", "美妆", "食品"], size=n, p=[0.2, 0.3, 0.2, 0.15, 0.15]) quantity = np.random.randint(1, 5, size=n) unit_price = np.random.choice([99, 199, 299, 399, 499, 799, 1299], size=n, p=[0.2, 0.2, 0.15, 0.15, 0.1, 0.1, 0.1]) total_amount = quantity * unit_price df = pd.DataFrame({ "order_id": order_ids, "order_date": order_dates, "customer_type": customer_types, "category": categories, "quantity": quantity, "unit_price": unit_price, "total_amount": total_amount })为了让数据更接近真实情况,我们再人为加入一些质量问题,比如缺失值、重复记录、异常订单,这样清洗环节才有实际操作空间:
# 人为制造缺失值 df.loc[10, "customer_type"] = None df.loc[25, "category"] = None df.loc[50, "total_amount"] = None # 人为制造重复记录 df = pd.concat([df, df.iloc[[100, 200]]], ignore_index=True) # 人为制造异常订单号 df.loc[300, "order_id"] = "UNKNOWN"生成完数据后,先创建一个项目文件夹,建议按下面的结构存放文件:
data-analysis-project/ ├── data/ │ └── raw_orders.csv ├── notebooks/ │ └── analysis.ipynb └── output/把数据保存下来:
import os os.makedirs("data", exist_ok=True) df.to_csv("data/raw_orders.csv", index=False, encoding="utf-8-sig") print("原始数据已保存,共 {} 行".format(len(df)))这一步看起来简单,但它体现了完整项目的一个重要习惯:原始数据永远不要直接修改,后续每一步操作都应该生成新的文件,或者至少在代码里保留处理过程。这样万一处理逻辑出问题,还能回到原始数据重新来。
4. 数据清洗:最耗时也最容易出错的一环
如果你的项目经验只停留在“用dropna()删掉空值”这个层面,那么数据清洗这一环会在真实项目中给你带来很大的挫败感。因为真实数据里的脏数据,远不止“缺个值”那么简单。
4.1 第一步:整体了解数据质量
拿到数据后先别急着处理,先查看数据的基本信息:
print(df.info()) print(df.head()) print(df.describe()) print(df.isnull().sum())从df.info()可以直观看到每个字段是否存在缺失值,以及字段类型是否符合预期。df.describe()能看到数值型字段的基本统计量,这一步能发现明显的异常范围。
4.2 第二步:处理重复值
重复值在真实订单数据里经常出现,原因可能是一个订单被重复上报、页面重复提交,或者数据同步时发生了重复。如果不去重就直接做统计,最后的订单总额、销量数字都会被“虚高”。
处理重复值前,先要判断哪些字段重复才算是真正的重复。这里我们以order_id为准:
print("去重前记录数:", len(df)) df = df.drop_duplicates(subset=["order_id"], keep="first") print("去重后记录数:", len(df))这里要提醒一下:keep="first"的含义是保留第一次出现的记录,删除后续重复出现的记录。如果你的分析目标是追踪异常数据产生的原因,那就应该先保留重复记录做诊断,不要直接删除。数据清洗永远要服务分析目的,不是机械地套模板。
4.3 第三步:处理缺失值
缺失值的处理没有统一答案,只有相对合适的选择。通常的做法是:
- 缺失值占比较小的字段,直接删除缺失行。
- 缺失值占比大且不影响核心分析的字段,删除该字段。
- 数值型字段可以根据业务含义填充均值、中位数或业务经验值。
- 分类型字段可以填充众数,或者单独标记为“未知”。
本项目里缺失值出现在customer_type、category和total_amount三个字段上,数量很少,直接删除缺失行即可:
# 查看缺失值 print("缺失值统计:") print(df.isnull().sum()) # 删除关键字段为空的记录 df = df.dropna(subset=["customer_type", "category", "total_amount"]) # 删除后确认 print("清洗后缺失值统计:") print(df.isnull().sum())4.4 第四步:处理异常值与格式问题
异常值是数据分析里最需要业务经验的环节。比如total_amount出现负数、quantity出现 0 或异常大的值,这些都不一定是程序错误,也可能是退款订单、测试订单等特殊业务场景。
在这个项目里,我们将total_amount小于等于 0 的订单视为异常数据,先看一下有多少:
print("金额小于等于0的订单数:", (df["total_amount"] <= 0).sum())如果存在这样的数据,处理方法有两种:一是直接删除,二是单独创建一张异常订单表留档备查。在项目实践中推荐第二种,因为这类数据在分析退款率、订单质量时可能仍有价值。本模拟数据里金额异常记录为 0,所以示例中不需要额外删除。但格式问题值得处理,比如order_date是否为正确的日期类型:
# 统一日期格式 df["order_date"] = pd.to_datetime(df["order_date"]) # 新增月份字段和星期字段,便于后续按时间维度分析 df["order_month"] = df["order_date"].dt.to_period("M") df["order_weekday"] = df["order_date"].dt.day_name() print(df[["order_date", "order_month", "order_weekday"]].head())同时把total_amount的缺失值按已知的quantity * unit_price规则进行补充:
# 计算缺失订单金额,并保留计算痕迹 df["total_amount"] = df["total_amount"].fillna(df["quantity"] * df["unit_price"])这一步的逻辑很直观:订单金额本来就等于数量乘单价,用业务规则去补缺失值,比单纯用均值填充可靠得多。这也是数据清洗面试题里常出现的考点:为什么用均值填充有时候是错的?因为订单金额和商品单价、数量强相关,必须用业务规则计算,而不是用一个全局统计值去替代。
最后把清洗后的数据单独保存:
os.makedirs("data", exist_ok=True) df.to_csv("data/cleaned_orders.csv", index=False, encoding="utf-8-sig") print("清洗后数据已保存,共 {} 行".format(len(df)))清洗环节完成后,你可以想一想:如果这份数据是每天从数据库同步过来的,清洗逻辑是不是应该写成固定脚本,每周自动跑一次?这就是“分析脚本”和“数据工程”之间的衔接点。一个完整的数据分析项目,不只是分析过程本身,还要具备流程化的思维。
5. 探索性分析与可视化
数据清洗完之后,很多人会急着“上模型”。这一步在探索性分析阶段反而可以放一放。先通过统计指标和图表把数据全貌看清楚,比直接建模更高效,也能避免后面分析方向的偏差。
5.1 整体指标概览
先看几个最核心的指标:
total_sales = df["total_amount"].sum() avg_order_value = df["total_amount"].mean() total_orders = df["order_id"].nunique() total_quantity = df["quantity"].sum() print("总订单数:", total_orders) print("总销量:", total_quantity) print("总销售额:", round(total_sales, 2)) print("客单价(平均订单金额):", round(avg_order_value, 2))这些整体指标可以作为后续分析的基准。比如分析某个品类表现好不好,不能只看绝对销售额,还要对照它的订单量占比、客单价有没有拉高或拉低整体水平。
5.2 不同品类的销售贡献分析
先按品类分组,看销售额和订单量占比情况:
category_group = df.groupby("category").agg( 订单数=("order_id", "nunique"), 销量=("quantity", "sum"), 销售额=("total_amount", "sum"), 客单价=("total_amount", "mean") ).reset_index() category_group["销售额占比"] = category_group["销售额"] / category_group["销售额"].sum() * 100 category_group = category_group.sort_values("销售额", ascending=False) print(category_group)这里的输出已经能回答一个问题:哪类商品贡献了主要销售额。但要注意,销售额高不一定代表效率高,因为不同品类的单价差异可能很大。所以还需要看品类占比,从而判断“销售额高”到底是靠“卖得多”还是“单价高”推动的。
5.3 用可视化辅助判断
用 Matplotlib 和 Seaborn 画图,把数据结果以更直观的形式呈现出来。
import matplotlib.pyplot as plt import seaborn as sns # 设置中文字体,避免乱码 plt.rcParams["font.sans-serif"] = ["SimHei", "Microsoft YaHei"] plt.rcParams["axes.unicode_minus"] = False fig, axes = plt.subplots(1, 2, figsize=(14, 5)) # 第一个图:各品类销售额 sns.barplot(data=category_group, x="category", y="销售额", ax=axes[0]) axes[0].set_title("各品类销售额对比") axes[0].set_xlabel("品类") axes[0].set_ylabel("销售额") # 第二个图:各品类订单量 sns.barplot(data=category_group, x="category", y="订单数", ax=axes[1]) axes[1].set_title("各品类订单量对比") axes[1].set_xlabel("品类") axes[1].set_ylabel("订单数") plt.tight_layout() plt.savefig("output/category_sales_analysis.png", dpi=150) plt.show()注意,中文字体配置在不同操作系统上有差异。Windows 一般用SimHei可以正常显示,macOS 可能需要换成Arial Unicode MS或PingFang SC,Linux 服务器如果没装中文字体,需要先安装字体或者改用英文标签。这在图表落地时是一个高频坑。
5.4 客户类型的价值分析
再看不同客户类型的消费特点:
customer_group = df.groupby("customer_type").agg( 订单数=("order_id", "nunique"), 销售额=("total_amount", "sum"), 客单价=("total_amount", "mean") ).reset_index() customer_group["销售额占比"] = customer_group["销售额"] / customer_group["销售额"].sum() * 100 print(customer_group)这一步的关注点在于:会员客户虽然人数占比可能不高,但他们的客单价是否显著高于普通客户。如果答案是肯定的,那么运营侧的结论就可以往会员运营倾斜。如果会员客单价反而不高,那就要进一步分析是不是会员权益设置出了问题。
5.5 时间趋势分析
把订单按月汇总,看销售趋势:
monthly_sales = df.groupby("order_month")["total_amount"].sum().reset_index() monthly_sales["order_month"] = monthly_sales["order_month"].astype(str) plt.figure(figsize=(12, 5)) plt.plot(monthly_sales["order_month"], monthly_sales["total_amount"], marker="o") plt.title("月度销售额趋势") plt.xlabel("月份") plt.ylabel("销售额") plt.grid(True, linestyle="--", alpha=0.5) plt.tight_layout() plt.savefig("output/monthly_sales_trend.png", dpi=150) plt.show() print(monthly_sales)趋势图看起来简单,但它能帮你快速判断业务是否存在季节性波动。如果把时间细分到周或天,还能看出星期几是订单高峰、哪几天容易出现销量低谷,这些信息在制定促销计划时非常有用。
探索性分析阶段的小结可以这样写:通过统计量和图表确认了不同品类的销售贡献差异、不同类型客户的客单价差异、以及订单量的月度波动情况。下一步需要回答的问题是:这些差异在统计意义上是否显著,影响客单价的因素到底是什么。
6. 从相关性到回归:验证你的结论
探索性分析能帮你发现现象,但要支撑一个“有说服力的结论”,建议在项目里加入统计验证环节。这一步是很多入门项目缺失的,也是拉开项目质量差距的关键。
6.1 相关性分析
以订单金额为研究对象,先看数值型字段之间的相关性:
numeric_cols = df[["quantity", "unit_price", "total_amount"]] corr = numeric_cols.corr() print(corr) plt.figure(figsize=(6, 5)) sns.heatmap(corr, annot=True, cmap="coolwarm", fmt=".2f") plt.title("数值字段相关性热力图") plt.tight_layout() plt.savefig("output/correlation_heatmap.png", dpi=150) plt.show()这里的相关矩阵能非常清楚地展示出total_amount与unit_price强相关。从业务上讲,这很自然,但也正因为太自然,很多项目到这一步就停了,没有继续挖掘下去。更好的做法是把客户类型、品类这些分类变量也纳入分析框架,用分组对比的方式比较客单价是否存在显著差异。
6.2 用回归分析验证“品类和客户类型对客单价的影响”
我们可以做一个比较简单的线性回归,把客户类型和品类转化为哑变量,然后看它们对total_amount的影响。这里使用 statsmodels 库:
import statsmodels.api as sm # 构造哑变量 df_reg = pd.get_dummies(df, columns=["customer_type", "category"], drop_first=True) # 选择特征列 feature_cols = [col for col in df_reg.columns if col.startswith("customer_type_") or col.startswith("category_")] X = df_reg[feature_cols] y = df_reg["total_amount"] # 添加截距项 X = sm.add_constant(X) model = sm.OLS(y, X).fit() print(model.summary())运行之后,重点关注两个地方:
- 每个变量的
coef(系数):表示在控制其他变量不变的情况下,该类别与基准类别相比,客单价高或低多少。 - 变量的
p-value:一般小于 0.05 可以认为影响显著。
需要特别强调的是,这里做回归的目的不是“预测”,而是“解释变量贡献”。初学者经常混用这两者,导致项目报告写得逻辑混乱。预测关心的是未来订单金额能不能算准,解释关心的是哪一个特征对金额影响更大。数据分析岗的日常更多倾向于后者。
6.3 做一个结果解释的示例
假设回归结果显示“数码”品类的系数显著为正,而“食品”品类的系数显著为负,那么业务结论就可以写成:
在控制客户类型和购买数量后,数码类商品的客单价显著高于食品类,差异约为 X 元。这说明品类是影响客单价的强因素;客户类型对客单价的解释力相对较弱,会员身份并未带来预期的订单金额提升。
写报告的时候,这种有数据、有逻辑、有业务含义的表述,比贴一张回归截图有说服力得多。
7. 结果呈现:让分析变成可执行的结论
很多分析做完就结束了,图表没有保存,结论随口一说,代码也乱成一堆。这种状态可以称为“能跑,但不可复用”。在简历项目或团队协作中,结果呈现和代码质量同样重要。
7.1 输出关键图表和分析表
把前面生成的核心图表统一存到output目录,并额外导出一份汇总表:
os.makedirs("output", exist_ok=True) with pd.ExcelWriter("output/analysis_summary.xlsx") as writer: category_group.to_excel(writer, sheet_name="品类分析", index=False) customer_group.to_excel(writer, sheet_name="客户类型分析", index=False) monthly_sales.to_excel(writer, sheet_name="月度趋势", index=False) print("分析结果已输出到 output/analysis_summary.xlsx")导出 Excel 时注意:如果文件名已经存在,Pandas 会用默认模式覆盖,如果项目要求保留历史版本,需要先加时间戳再保存。
7.2 形成结论清单
分析报告的结论部分,建议采用“发现 + 数据依据 + 建议”的结构。我们的模拟项目可以给出这样几条:
| 发现 | 数据依据 | 业务建议 |
|---|---|---|
| 服饰品类订单量占比最高,但客单价偏低 | 订单量占比 30% 左右,客单价低于整体均值 | 可尝试在服饰品类做组合销售或满减活动 |
| 会员客户客单价高于普通客户 | 会员客户平均订单金额显著更高 | 加大会员拉新投入,设计会员专属权益 |
| 订单金额与单价强相关,与数量弱相关 | 相关矩阵显示 unit_price 与 total_amount 相关系数高 | 提升客单价应更多关注高单价品类曝光,而非单纯增加购买件数 |
这样的结论清单好处是:每一句话都能对应到前面的分析结果,不会出现“凭感觉给建议”的问题。面试官追问“你是怎么得出这个结论的”,你完全可以拿出数据链路来回答。
7.3 写项目复盘笔记
做完一个项目,强烈建议写一份 markdown 格式的复盘文件,内容可以包括:
- 项目目标
- 数据来源与字段说明
- 清洗逻辑和处理细节
- 分析过程中的关键图和结论
- 如果重新做一次,哪些地方可以改进
这份复盘笔记不需要很长,但它直接对应招聘时的“项目描述”。你可以把复盘笔记中的关键段落贴到简历上,面试前再看一遍,比临时组织语言要清晰得多。
8. 常见问题与排查思路
结合实践中的高频问题,整理如下:
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
pip install pandas安装慢或超时 | 网络原因或默认镜像源不稳定 | 查看 pip 输出日志 | 使用国内镜像源,例如pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple |
| Matplotlib 中文显示为方框 | 系统缺少中文字体或字体配置错误 | 运行plt.rcParams["font.sans-serif"]查看当前字体列表 | 更换为系统已安装的中文字体,或安装中文字体包 |
drop_duplicates去重后行数不符合预期 | 去重字段选取不正确,比如订单号存在为空的情况 | 打印df["order_id"].isnull().sum()查看空值情况 | 先填充或删除空值,再执行去重 |
时间字段order_date显示为字符串对象 | 读入数据时没有解析日期 | 使用pd.to_datetime()显式转换 | 转换后重新检查dtypes |
| 回归结果系数与业务常识方向相反 | 特征间存在多重共线性 | 查看 VIF 或相关系数矩阵 | 处理冗余特征,或重新选择特征 |
| 保存 Excel 时覆盖重要文件 | 没有追加版本号 | 检查 output 目录文件列表 | 文件名加上时间戳,例如analysis_summary_20240101.xlsx |
9. 最佳实践与后续学习方向
最后一个部分,分享几条做数据分析项目时比较重要的实践建议。
第一,保持原始数据只读。无论是本地文件还是数据库里的表,都不要直接在原数据上修改。你的分析流程里应该有一份原始数据备份,所有清洗和分析都基于复制后的数据。这样能避免误操作导致数据不可恢复。
第二,你的代码要能被别人运行。很多项目代码跑完一遍就再也跑不起来了,原因可能是路径写死了、依赖版本没记录、或者中间步骤依赖了前面某个手动操作的结果。建议在项目里加上requirements.txt:
pandas==2.2.0 numpy==1.26.0 matplotlib==3.8.0 seaborn==0.13.0 statsmodels==0.14.0注意,这里的版本号只是示例,实际版本请以你本机运行成功为准。锁定版本的最大价值是让项目可复现。将来这个分析脚本要重跑,或者换一台电脑运行,只需要执行:
pip install -r requirements.txt第三,先完成再完善。新手做项目时非常容易陷入“优化细节”的怪圈:先想着把图表配色调好看,再研究怎么把代码写得更高效。建议第一遍只求流程跑通、结论自洽。等整个流程走完了,再回头优化代码结构和图表样式。
第四,注重数据安全意识。如果用的是公司真实数据,脱敏处理是必须的。任何涉及个人信息、订单明细的数据,都不应该在未经授权的情况下带出企业环境。在简历项目中使用脱敏后的公开数据集,既安全又合法。
如果你已经把这个项目跑通,接下来有几个方向可以继续深入:
- 把数据源从本地文件换成 MySQL 数据库,练习用 SQL 做数据提取和数据清洗。
- 针对时间序列数据做更深入的分析,比如周维度、月维度的同比环比。
- 把分析结论做成一个自动化的日报脚本,每天定时输出最新数据图表。
- 在相关性分析基础上,学习更完善的因果推断方法。
做完这些扩展,你就不再是只会“调用 Pandas API”,而是真正具备独立完成数据分析项目的能力。建议你先动手把文章里的代码跑一遍,数据样本就放在data/raw_orders.csv,跑的过程中遇到任何报错,按照第 8 节的排查表格先自查一遍即可。
本篇文章的项目代码都是可以用最小数据量直接演示的,跑通之后你也可以换一套自己的模拟数据,或者直接导入一份公开数据集再走一遍流程。真正练过一次完整项目之后,你会发现“数据分析项目经验”这件事,其实并没有想象中那么难。