数据科学家五大核心能力:从地基到起重机的实战路径
1. 这不是技能清单,而是一份数据科学家的“生存地图”
我带过27个从零起步转行的数据科学项目组,亲手筛过近400份简历,也陪不下50位学员熬过第一个真实业务建模夜。每次面试开场,我都不问“你会不会XGBoost”,而是扔出一个真实脱敏的销售漏斗数据集,说:“你有30分钟,告诉我这个月转化率下滑的根本原因,别用模型,就用你手头最顺手的工具。”——结果,83%的人卡在第一步:连数据里到底有多少缺失值、哪些字段存在系统性偏移都讲不清楚。这让我彻底明白:所谓“五大核心技能”,从来不是并列关系,而是一条环环相扣的因果链。 概率统计是你的地基,编程是你的铲子,可视化是你的望远镜,机器学习是你的起重机,而微积分与线性代数,是你看懂所有设备说明书的能力。 没有地基,起重机一开就塌;没有望远镜,你连吊装点在哪都找不到。这篇文章不教你怎么背公式,也不列一堆课程链接,只讲我在银行风控、电商推荐、医疗影像三个领域踩过的坑、验证过的路径、以及那些写在招聘JD里但从不解释的潜规则。如果你正站在转行门口犹豫要不要辞职,或者刚学完Python还在为Kaggle排名焦虑,这篇就是为你写的实战地图——它不承诺速成,但能让你少走两年弯路。
2. 技能底层逻辑:为什么这五项不可替代、不可压缩?
2.1 概率统计:不是数学课,而是“数据翻译器”
很多人把概率统计当成要死记硬背的考试科目,这是致命误区。我接手过一个电商退货预测项目,业务方说“退货率突然涨了15%,快查原因”。团队立刻上LSTM建模,调参三天后发现特征重要性排序里,“用户下单时间”排第一。大家欢呼“找到关键了!”——直到我翻出原始日志,发现那周物流系统升级,所有订单时间戳被统一写成了服务器启动时间(凌晨2:17)。一个系统性时间戳污染,被模型当成了强信号。这就是没吃透“随机变量”和“采样偏差”的代价。
真正的概率统计能力,体现在三个动作上:
- 诊断数据健康度 :看到一个字段的分布直方图,3秒内判断它是否符合正态/泊松/二项分布,进而决定该用Z检验还是卡方检验。比如用户停留时长通常右偏,直接算均值会严重失真,必须用中位数+四分位距。
- 设计可信实验 :A/B测试不是简单分两组。去年帮一家教育平台做课程改版,我们按用户活跃度分层抽样,确保每层内实验组/对照组人数严格1:1,同时设置p值阈值0.01(而非默认0.05),因为教育决策周期长,容错率极低。结果发现表面提升12%的点击率,实则因新按钮位置导致老用户流失率上升8%,若按常规p=0.05可能误判。
- 解读模型输出 :Logistic回归的系数不是“影响大小”,而是log(odds ratio)。当某特征系数为0.69,意味着该特征每增加1单位,事件发生几率翻倍(e^0.69≈2)。我见过太多人把系数绝对值当重要性排序,却忽略其背后的概率解释框架。
提示:别急着刷《统计学习导论》,先拿你手机里的微信步数数据练手。用Excel画7天分布图,手动计算均值、标准差、偏度,再用t检验对比工作日vs周末差异。真实数据永远比教材习题暴露出更多问题。
2.2 微积分与线性代数:模型背后的“机械原理”
很多初学者觉得“调包就行”,直到某天模型突然不收敛。我带的一个金融风控项目,用LightGBM训练逾期预测模型,AUC稳定在0.82,但上线后监控发现F1-score断崖下跌。排查三天无果,最后发现是特征工程中用了SVD降维,但未对训练集/测试集分别fit-transform,导致测试集投影方向错乱。这本质是没理解矩阵分解的几何意义:SVD是在找数据空间的主轴方向,而主轴必须由训练数据唯一确定。
微积分和线性代数的价值,在于让你看懂三类关键文档:
- 损失函数设计 :为什么回归用MSE(均方误差)?因为它的导数是线性的,梯度下降收敛快;分类用交叉熵?因为它的导数包含预测概率误差,对错误预测惩罚更重。当你看到
loss = -y*log(p) - (1-y)*log(1-p),要立刻反应出这是伯努利分布的负对数似然。 - 优化过程本质 :梯度下降不是“往低处走”,而是沿损失函数曲面的法向量方向移动。学习率太大?就像下陡坡不刹车,直接冲出悬崖;太小?像蚂蚁爬山,十年到不了顶。我实测过,对于房价预测这类中等规模数据,初始学习率设为0.01比0.001收敛快3倍,但需配合学习率衰减(step decay)。
- 高维空间直觉 :PCA降维不是“删掉不重要的列”,而是把数据旋转到方差最大的坐标系。想象把一盒杂乱的筷子(原始特征)倒进簸箕,摇晃后自动排列成平行束状(主成分)——这就是协方差矩阵特征向量的物理意义。
注意:不必推导所有公式,但必须掌握核心概念的几何映射。推荐用3Blue1Brown的《线性代数的本质》动画,重点看“基变换”和“特征向量”两集,配合Python用numpy手写一次PCA(不用sklearn),你会瞬间开窍。
2.3 编程:不是写代码,而是“构建数据流水线”
我面试过一位985硕士,Python语法考试满分,但当我让他用pandas读取一个含混合类型(数字/字符串/空值)的CSV,并清洗出“近30天有效订单”时,他写了27行代码,其中12行在处理编码报错。这不是技术问题,而是缺乏“数据流水线思维”。
真正的编程能力,体现在四个层次:
- 第一层:让数据动起来
pd.read_csv('data.csv', dtype={'user_id': str, 'amount': float}, na_values=['N/A', 'NULL'])—— dtype预声明避免后期类型转换错误,na_values指定空值标识,比df.dropna()粗暴删除更安全。 - 第二层:让流程可复现
所有清洗步骤必须封装成函数,输入原始数据,输出清洗后DataFrame。例如:def clean_orders(df_raw): df = df_raw.copy() df['order_time'] = pd.to_datetime(df['order_time'], errors='coerce') df = df[df['order_time'] > (pd.Timestamp.now() - pd.Timedelta(days=30))] return df - 第三层:让错误可追溯
在关键节点插入断言:assert df['amount'].min() >= 0, "存在负金额订单"。这比try-except更能暴露数据质量问题。 - 第四层:让协作无障碍
函数必须带type hint和docstring:def calculate_user_ltv(df_orders: pd.DataFrame, df_users: pd.DataFrame) -> pd.Series: """计算每个用户的生命周期价值(LTV) Args: df_orders: 订单表,含user_id, amount, order_time df_users: 用户表,含user_id, reg_date Returns: Series索引为user_id,值为LTV """
实操心得:别用Jupyter写生产代码!我强制团队用VS Code+Git,所有分析脚本必须通过flake8检查(PEP8规范),且每个脚本开头注明:输入文件路径、输出文件路径、依赖库版本。上周一个实习生改了pandas版本,导致
df.groupby().agg()行为变化,全靠版本锁定才快速定位。
2.4 数据可视化:不是做美图,而是“建立信任契约”
曾有个医疗AI项目,算法团队做出准确率92%的肺结节检测模型,但放射科医生拒绝使用。我调出他们的可视化报告:一张热力图显示模型关注区域,但颜色标尺没标注数值范围,医生问:“红色代表什么强度?是像素值还是概率?”——没人答得出来。最终我们重做可视化:用双坐标轴,左侧显示原始CT图像,右侧叠加模型注意力热图,并在图例明确标注“红色=模型认为该区域贡献概率≥0.8”。医生当场说:“现在我能验证了。”
可视化的核心不是美观,而是解决三个信任问题:
- 数据可信度 :用箱线图(Boxplot)替代柱状图展示收入分布,一眼看出异常值(outlier)是否合理。某次分析外卖骑手收入,箱线图显示顶部有大量离群点,核查发现是系统故障导致重复计费。
- 关系可验证 :散点图必须加趋势线(
sns.regplot)和R²值。当看到销售额vs广告投入散点图R²=0.3时,要立刻质疑:是不是遗漏了关键变量(如季节因素)? - 结论可行动 :仪表盘里“转化率提升5%”是废话,必须拆解:“新用户注册页跳出率下降12%(因按钮颜色优化),但支付页放弃率上升8%(因新增实名认证步骤)”。这才是业务方能执行的结论。
工具选择真相:Tableau/Power BI适合给高管看汇总报表,但数据科学家日常必须掌握matplotlib/seaborn。因为只有代码绘图才能精确控制每个元素——比如在混淆矩阵热力图中,把对角线单元格加粗边框,让准确率一目了然。我坚持用seaborn的
heatmap配合annot=True,从不依赖自动配色,固定用cmap='Blues'保证色盲友好。
2.5 机器学习:不是调参大赛,而是“问题翻译引擎”
最危险的认知是:“机器学习=选算法+调参”。我见过团队为提升0.001的AUC,花两周调参XGBoost,却忽略了一个致命问题:训练数据是2022年Q4的,而业务方要预测2023年Q2——这叫 数据漂移(Data Drift) ,任何模型都救不了。
机器学习的本质,是把业务问题翻译成数学问题。这个过程分三步:
- 第一步:定义问题类型
“预测用户是否会流失”是二分类;“预测用户下个月消费金额”是回归;“把用户分成5类”是聚类。但真实场景常模糊:某电商想“识别高潜力用户”,这既不是纯分类(没标签),也不是纯聚类(有业务目标)。我们最终用半监督学习:先用RFM模型打标(R=最近购买天数,F=购买频次,M=消费金额),再用KMeans聚类,最后人工校验聚类结果是否符合业务直觉。 - 第二步:选择评估指标
分类问题不用准确率(Accuracy)!当欺诈检测中欺诈率仅0.1%,模型全判“正常”也有99.9%准确率。必须用 精确率(Precision) 和 召回率(Recall) 的权衡。我们设定业务约束:宁可多抓10个正常用户(降低Precision),也不能漏掉1个欺诈用户(Recall≥0.95)。 - 第三步:验证落地效果
模型上线后,必须监控 特征重要性漂移 。某次风控模型上线后,原第一重要特征“历史逾期次数”权重骤降至第12位,排查发现是征信接口升级,字段含义已变。这比模型AUC下降更危险——说明数据源本身已失效。
关键提醒:永远从最简单的模型开始。我要求所有新人必须先用逻辑回归跑通baseline,再尝试复杂模型。因为LR的系数可解释性,能帮你快速发现数据问题。当LR在某个特征上系数异常大(如>10),大概率是该特征存在极端异常值或编码错误。
3. 实操路线图:从零到能独立交付项目的90天计划
3.1 第1-15天:筑牢地基,用真实数据练肌肉
别碰Kaggle!用你每天接触的真实数据:
- 第1-3天 :下载微信运动数据(iOS在“健康”App导出CSV),用Excel完成:计算日均步数、周环比变化、绘制7日折线图。重点练习:识别异常值(某天步数10万?可能是手机放洗衣机里了)。
- 第4-7天 :用Python重做上述分析。关键动作:
# 读取时处理日期格式混乱 df['date'] = pd.to_datetime(df['date'], format='%Y-%m-%d', errors='coerce') # 计算周环比(避免用shift()导致首周NaN) df['week_on_week'] = df['steps'].pct_change(periods=7) - 第8-15天 :引入统计检验。假设“工作日步数 > 周末”,用t检验验证(
scipy.stats.ttest_ind)。注意:先用shapiro()检验正态性,若不满足则改用Mann-Whitney U检验。
避坑指南:90%的初学者在
pct_change()后忽略dropna(),导致后续计算全错。我的习惯是每步操作后立即print(df.head())和df.info(),像厨师尝菜一样随时验证。
3.2 第16-45天:构建流水线,让分析可复制
目标:完成一个端到端项目——“分析你所在城市二手房价格影响因素”
- 数据获取 :用链家/贝壳公开页面(非爬虫!),手动记录50套房源的:面积、楼层、房龄、距离地铁站距离、挂牌价。存为CSV。
- 核心任务 :
- 清洗:处理“满五唯一”等文本字段,提取“房龄”(当前年-建成年)
- 探索:用seaborn画
scatterplot(x='area', y='price', hue='floor'),观察楼层溢价规律 - 建模:用statsmodels做多元线性回归,重点关注:
- VIF(方差膨胀因子)检验多重共线性(VIF>5需处理)
- 残差图(
residuals vs fitted)判断模型是否适用
- 交付物 :一个
.py脚本,输入原始CSV,输出:清洗后数据、回归报告PDF、关键图表PNG。
实操细节:处理“距离地铁站”时,别用原始文字“500米内”,要标准化为数值(500)。遇到“步行约10分钟”,按平均步行速度5km/h换算为833米。这种业务规则的制定,比模型本身更重要。
3.3 第46-75天:攻克机器学习,从解释到部署
用UCI机器学习库的 Adult Income Dataset (预测收入是否>50K/年):
- 第46-55天 :用逻辑回归+特征工程(独热编码、标准化)做到AUC≥0.88。关键动作:
- 用
sklearn.preprocessing.StandardScaler标准化连续变量(年龄、资本收益) - 对类别变量(教育程度、职业)用
OneHotEncoder,但合并低频类别(如“Armed-Forces”样本<10,归为“Other”)
- 用
- 第56-65天 :用XGBoost提升至AUC≥0.91。重点监控:
- 学习曲线(
xgb.plot_learning_curve)判断是否过拟合 - SHAP值分析(
shap.TreeExplainer)解释单个预测:“为什么张三被预测为高收入?”
- 学习曲线(
- 第66-75天 :模型轻量化。用
joblib保存模型,写一个Flask API:@app.route('/predict', methods=['POST']) def predict(): data = request.json # 输入验证:检查必填字段 if 'age' not in data or 'education' not in data: return {'error': 'Missing required fields'}, 400 # 特征工程(复用训练时的encoder/scaler) pred = model.predict_proba([features])[0][1] return {'probability_high_income': float(pred)}
部署铁律:API必须包含输入验证、错误码、超时控制。我见过太多模型API因传入空字符串崩溃,导致整个业务系统雪崩。用
pydantic定义请求Schema是底线。
3.4 第76-90天:模拟真实战场,完成一次完整交付
模拟一个企业级需求:“为XX咖啡连锁店分析会员复购率下降原因”
- 需求解析会议 (模拟):
业务方说:“上月复购率从35%降到28%,很着急!”
你要追问:- 复购定义?(30天内二次消费?还是同一品类?)
- 下降是否全局?(查各门店、各会员等级、各渠道)
- 是否有运营动作?(上月发了新优惠券?)
- 交付物清单 :
- 数据诊断报告(缺失值、异常值、分布漂移)
- 归因分析PPT(用瀑布图展示各因素贡献:新客占比上升-3%,优惠券使用率下降-2.5%,...)
- 可执行建议(“暂停向新客发放满30减15券,改为老客专享”)
- 终极考验 :用Zoom录屏,向“虚拟业务方”(朋友扮演)讲解10分钟,必须让对方听懂问题根源和解决方案。
经验之谈:业务方最怕听到“相关性不等于因果性”。所以归因分析必须用 差分法 :对比下降前后,控制其他变量不变,单独看某一因素变化。例如:只筛选“使用过优惠券”的老客,发现其复购率未降,则证明优惠券不是主因。
4. 行业避坑指南:那些招聘JD不会写的残酷真相
4.1 关于“精通Python”的潜台词
招聘JD写“精通Python”,实际考察三件事:
- 能否绕过pandas陷阱 :
df[df['col'] > 0]和df.query('col > 0')性能差10倍(大数据集)。后者用numexpr引擎,前者触发完整DataFrame索引。我要求团队所有过滤操作优先用query()。 - 能否处理内存爆炸 :
读取10GB CSV不能用pd.read_csv()。正确姿势:# 分块读取+即时处理 for chunk in pd.read_csv('big_file.csv', chunksize=10000): processed_chunk = chunk[chunk['amount'] > 100] # 立即保存或聚合,不累积内存 save_to_db(processed_chunk) - 能否写出生产级代码 :
所有脚本必须有if __name__ == '__main__':入口,且支持命令行参数:python analyze_orders.py --start_date 2023-01-01 --end_date 2023-03-31
血泪教训:曾因没加
chunksize,一个同事的笔记本内存爆满蓝屏,丢失3小时分析进度。现在我们所有ETL脚本第一行就是import psutil; print(f"可用内存: {psutil.virtual_memory().available/1024**3:.1f}GB")。
4.2 关于“机器学习项目经验”的审核逻辑
HR筛简历时,看到“用XGBoost提升AUC 0.02”会直接pass。真正值钱的是:
- 数据故事 :
“发现原始数据中‘用户注册渠道’字段有37%缺失,经与市场部确认,缺失值对应线下活动用户。于是将缺失值编码为‘offline’,使模型对线下用户预测准确率提升15%。” - 失败复盘 :
“首次用LSTM预测销量失败,因未处理节假日效应。后加入‘是否节假日’布尔特征+外部天气数据,MAE下降40%。” - 落地影响 :
“模型上线后,库存周转率提升22%,减少滞销品损失约180万元/季度。”
面试官最爱问:“如果给你100万预算,你优先投在哪?”答案不是买GPU,而是请业务专家梳理数据字典。我见过最贵的错误:把“用户等级”字段当数值型处理(1=青铜,2=白银),实际是有序类别,应做独热编码。
4.3 关于“数据可视化能力”的隐藏门槛
老板要看的不是酷炫动效,而是:
- 决策支持速度 :
仪表盘必须支持“下钻”(Drill-down)。点击全国总览图,能秒级切换到省份明细,再点广东,显示广州/深圳对比。这要求数据预聚合(pre-aggregation),而非实时计算。 - 异常预警机制 :
所有关键指标(如日活、支付成功率)必须有红绿灯状态。绿色=波动<±5%,黄色=±5~10%,红色=±10%以上。且红色时自动邮件告警,并附上TOP3相关指标变化。 - 移动端适配 :
60%的管理者用手机看报表。热力图在手机上必须可缩放,表格必须横向滚动。我禁用所有plt.figure(figsize=(12,8)),强制用plt.rcParams['figure.figsize'] = (6, 4)。
真实案例:某次大促期间,支付成功率突降,但仪表盘只显示“整体下降3%”。我们紧急加了“按支付渠道下钻”,发现微信支付成功率暴跌至12%,而支付宝正常。10分钟定位到微信SDK版本兼容问题。
4.4 关于“统计学基础”的实战检验点
面试官不会考你中心极限定理证明,但会问:
- “A/B测试需要多少样本量?如果业务方说‘明天就要结果’,你怎么应对?”
答案:用功效分析(statsmodels.stats.power.zt_ind_solve_power)计算。若最小可检测效应(MDE)为2%,功效0.8,α=0.05,则每组需约12,000样本。若时间不够,可降低MDE或接受更低功效,但必须书面告知业务方风险。 - “如何验证两个渠道的用户留存率是否有显著差异?”
答案:先用chi2_contingency做卡方检验(看整体差异),再用proportion.proportions_ztest做两样本比例z检验(看具体数值)。若样本量小(<30),改用Fisher精确检验。
关键原则:永远报告置信区间,而非p值。说“新方案留存率比旧方案高1.2个百分点(95%CI: 0.8~1.6)”,比“p=0.003”有用100倍。
5. 常见问题与实战排查手册
5.1 模型性能突然下降?先查这三张表
| 检查维度 | 快速验证方法 | 典型案例 |
|---|---|---|
| 数据漂移 | 用 scikit-shift 库计算PSI(Population Stability Index) psi = sum((actual_pct - expected_pct) * np.log(actual_pct / expected_pct)) PSI>0.1需警惕 |
某信贷模型PSI达0.23,发现是征信新规实施,逾期定义从“逾期30天”改为“逾期15天” |
| 特征失效 | 对每个特征计算IV(Information Value) IV = sum((%bad_in_bin - %good_in_bin) * WOE) IV<0.02视为无效特征 |
“用户学历”特征IV从0.35跌至0.01,因竞品推出免费学历认证,字段普遍填“本科” |
| 标签泄露 | 检查训练特征是否包含未来信息 用 pandas_profiling 生成报告,重点看 correlation_with_target |
用“当月还款总额”预测“是否逾期”,但该字段在逾期发生后才更新,属典型泄露 |
操作口诀:每周自动化运行漂移检测脚本,PSI>0.1自动邮件告警,并附上TOP5漂移特征。我们用Airflow调度,凌晨3点执行,确保白天上班前收到报告。
5.2 Jupyter Notebook变慢如龟?五步急救法
- 核杀罪魁祸首 :
!pip list | grep -i "tensorflow\|torch\|xgboost"—— 卸载所有GPU版本库(除非真用GPU),改用CPU版(pip install scikit-learn而非scikit-learn-intelex)。 - 禁用自动补全 :
VS Code中关闭"python.autoComplete.extraPaths",Jupyter Lab中禁用jupyterlab-lsp插件。 - 分块执行 :
将长代码拆为多个cell,每个cell顶部加%%time,执行后立刻del df_large释放内存。 - 缓存中间结果 :
# 用joblib缓存耗时计算 from joblib import Memory memory = Memory(location='./cache', verbose=0) @memory.cache def expensive_calculation(df): return df.groupby('category').agg({'sales': 'sum'}) - 终极方案 :
写.py脚本替代Notebook。用# %%标记cell,在VS Code中享受Notebook交互性,又保有脚本可维护性。
个人实践:我所有分析脚本都以
.py保存,用VS Code的Python Interactive窗口执行。这样既能Ctrl+Enter运行单行,又能用Git管理版本,还能一键部署到服务器。
5.3 业务方说“看不懂模型结果”?三招破冰
- 第一招:用业务语言重述
不说“特征重要性得分0.42”,而说:“如果把所有用户按‘最近一次购买天数’排序,排在前10%的用户,其流失概率比后10%高3.2倍。” - 第二招:做对比实验
拿两个真实用户A/B:A(3天未登录)vs B(30天未登录),用SHAP值图展示模型为何判A为低风险、B为高风险。业务方立刻理解。 - 第三招:提供干预建议
不止说“用户X可能流失”,而给出可执行动作:“向用户X推送‘回归专享券’(满50减20),历史数据显示该动作可提升其7日复购率68%。”
黄金法则:每次汇报,PPT最后一页必须是“下一步行动清单”,且每条都标注负责人和截止时间。业务方只关心“接下来做什么”,不关心你用了什么算法。
5.4 面试被问“如何学习数据科学”?这样回答碾压全场
别再说“看网课+做项目”。我的标准答案:
“我用‘问题驱动学习法’。比如上周业务方问‘为什么华东区退货率比华南高22%?’,我就立刻启动三步:
- 数据侦察 :用SQL查退货订单的SKU分布,发现华东区某款保温杯退货率87%(华南仅5%);
- 根因挖掘 :调取该SKU的质检报告,发现华东仓温控系统故障,导致密封圈老化;
- 知识补缺 :为验证温控数据,我当天学了IoT传感器数据清洗(用
pandas.resample('H').mean()聚合小时数据),并用statsmodels.tsa.seasonal_decompose分析温度周期性。
所有学习都锚定真实问题,学完立刻用,用完立刻反馈。三个月下来,我不仅解决了12个业务问题,还整理出《仓储温控异常检测SOP》被纳入公司知识库。”
这个回答的价值在于:它展示了 学习-应用-沉淀 的闭环,而不仅是知识堆砌。面试官听到的是一个能解决问题的工程师,而不是一个学生。
6. 我的个人体会:技能之外,真正决定上限的是这三件事
带团队十年,我越来越确信:技术能力只是入场券,决定你能走多远的,是三种隐性能力。
第一是 业务翻译能力 。去年一个客户提出“要提升用户满意度”,听起来很虚。我带着分析师驻场两周,跟客服坐席听录音,发现83%的投诉源于“订单状态更新延迟”。于是把问题翻译为:“将订单状态同步延迟从平均12分钟降至≤30秒”。技术方案立刻清晰:重构消息队列,用Redis Stream替代Kafka。没有业务洞察,再好的算法也是空中楼阁。
第二是 沟通颗粒度控制 。给CTO汇报,用技术术语:“我们采用LightGBM的GOSS算法,通过梯度单边采样减少训练时间37%”;给运营总监,说:“新模型能让促销活动效果预测误差从±15%降到±5%,您下次备货可以更精准”。同一件事,不同对象用不同“带宽”传递,这是资深从业者的基本素养。
第三是 承认无知的勇气 。我至今记得第一次面对医疗影像数据时的窘迫:连DICOM文件结构都看不懂。我没有硬撑,而是直接联系医院信息科主任,请他喝咖啡,用一小时搞懂了“窗宽窗位”是什么。后来我们合作开发的肺结节辅助诊断系统,正是基于那次坦诚的请教。在数据科学领域,没有人能掌握所有知识,但敢于说“我不懂,请教您”,往往打开一扇新门。
所以,如果你今天刚学完Python基础,别焦虑。打开你手机里的任意APP,挑一个你觉得奇怪的功能(比如抖音为什么总推相似视频?),用今天学到的pandas读取它的公开数据(如有),试着画个分布图。那个小小的疑问,就是你数据科学家之路的真正起点——它不宏大,但足够真实。
更多推荐



所有评论(0)