mcpField
D
data-scientist

data-scientist

github.com/404kidwiz数据与数据库143 次安装
代码仓库

关于 data-scientist

面向数据分析人员的统计分析与预测建模技能,涵盖数据探索、实验设计、因果推断和模型验证,并强调将结果及不确定性转化为业务表达。

主要功能

  1. 01探索性数据分析与清理
  2. 02预测建模与时间序列预测
  3. 03A/B 测试和实验分析
  4. 04因果推断方法
  5. 05模型验证与不确定性报告

适用场景

  1. 01发现数据集中的模式与异常
  2. 02评估产品实验结果
  3. 03预测销售额或需求
  4. 04估计观察性数据中的影响

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/404kidwiz/claude-supercode-skills --skill data-scientist

安装后在 Claude Code 中输入/data-scientist确认已加载。

详细介绍

数据科学家

用途

提供统计分析和预测建模方面的专业知识,专攻机器学习、实验设计和因果推断。构建严谨的模型,并将复杂的统计发现转化为可执行的业务洞见,同时进行适当的验证和不确定性量化。

适用场景

  • 执行探索性数据分析(EDA),发现模式和异常
  • 构建预测模型(分类、回归、预测)
  • 设计和分析 A/B 测试或实验
  • 执行严谨的统计假设检验
  • 创建高级可视化和数据叙事
  • 为业务问题定义指标和 KPI


核心能力

统计建模
  • 使用回归、分类和聚类构建预测模型
  • 实施时间序列预测和因果推断
  • 设计和分析 A/B 测试及实验
  • 执行特征工程和特征选择
机器学习
  • 训练和评估有监督及无监督学习模型
  • 为复杂模式实施深度学习模型
  • 执行超参数调优和模型优化
  • 使用交叉验证和留出集验证模型
数据探索
  • 执行探索性数据分析(EDA),发现模式
  • 识别数据集中的异常和离群值
  • 创建高级可视化以发现洞见
  • 根据数据探索提出假设
沟通与叙事
  • 将统计发现转化为业务语言
  • 为利益相关者创建有说服力的数据叙事
  • 构建交互式笔记本和报告
  • 在展示发现时量化不确定性


3. 核心工作流

工作流 1:探索性数据分析(EDA)与清洗

目标: 在建模之前了解数据的分布、质量和关系。

步骤:

  1. 加载并分析数据概况

    import pandas as pd
    import numpy as np
    import seaborn as sns
    import matplotlib.pyplot as plt
    
    # Load data
    df = pd.read_csv("customer_data.csv")
    
    # Basic profiling
    print(df.info())
    print(df.describe())
    
    # Missing values analysis
    missing = df.isnull().sum() / len(df)
    print(missing[missing > 0].sort_values(ascending=False))
    
  2. 单变量分析(分布)

    # Numerical features
    num_cols = df.select_dtypes(include=[np.number]).columns
    for col in num_cols:
        plt.figure(figsize=(10, 4))
        plt.subplot(1, 2, 1)
        sns.histplot(df[col], kde=True)
        plt.subplot(1, 2, 2)
        sns.boxplot(x=df[col])
        plt.show()
    
    # Categorical features
    cat_cols = df.select_dtypes(exclude=[np.number]).columns
    for col in cat_cols:
        print(df[col].value_counts(normalize=True))
    
  3. 双变量分析(关系)

    # Correlation matrix
    corr = df.corr()
    sns.heatmap(corr, annot=True, cmap='coolwarm')
    
    # Target vs Features
    target = 'churn'
    sns.boxplot(x=target, y='tenure', data=df)
    
  4. 数据清洗

    # Impute missing values
    df['age'].fillna(df['age'].median(), inplace=True)
    df['category'].fillna('Unknown', inplace=True)
    
    # Handle outliers (Example: Cap at 99th percentile)
    cap = df['income'].quantile(0.99)
    df['income'] = np.where(df['income'] > cap, cap, df['income'])
    

验证:

  • 关键列中没有缺失值。
  • 已了解数据分布(正态或偏斜)。
  • 已检查目标变量的类别平衡。


工作流 3:A/B 测试分析

目标: 分析网站转化实验的结果。

步骤:

  1. 定义假设

    • H0:转化率 B <= 转化率 A
    • H1:转化率 B > 转化率 A
    • Alpha:0.05
  2. 加载并汇总数据

    # data: ['user_id', 'group', 'converted']
    results = df.groupby('group')['converted'].agg(['count', 'sum', 'mean'])
    results.columns = ['n_users', 'conversions', 'conversion_rate']
    print(results)
    
  3. 统计检验(比例 Z 检验)

    from statsmodels.stats.proportion import proportions_ztest
    
    control = results.loc['A']
    treatment = results.loc['B']
    
    count = np.array([treatment['conversions'], control['conversions']])
    nobs = np.array([treatment['n_users'], control['n_users']])
    
    stat, p_value = proportions_ztest(count, nobs, alternative='larger')
    
    print(f"Z-statistic: {stat:.4f}")
    print(f"P-value: {p_value:.4f}")
    
  4. 置信区间

    from statsmodels.stats.proportion import proportion_confint
    
    (lower_con, lower_treat), (upper_con, upper_treat) = proportion_confint(count, nobs, alpha=0.05)
    
    print(f"Control CI: [{lower_con:.4f}, {upper_con:.4f}]")
    print(f"Treatment CI: [{lower_treat:.4f}, {upper_treat:.4f}]")
    
  5. 结论

    • 如果 p-value < 0.05:拒绝 H0。B 方案在统计上显著更优。
    • 检查实际显著性(提升幅度)。


工作流 5:因果推断(倾向得分匹配)

目标: 在无法进行 A/B 测试时,估算「高级会员」对「消费金额」的影响(观察性数据)。

步骤:

  1. 问题设置

    • 处理组:高级会员(1)与免费用户(0)
    • 结果:年消费金额($)
    • 混杂因素:年龄、收入、地点、会员时长(同时影响会员状态和消费金额的因素)
  2. 计算倾向得分

    from sklearn.linear_model import LogisticRegression
    
    # P(Treatment=1 | Confounders)
    confounders = ['age', 'income', 'tenure']
    logit = LogisticRegression()
    logit.fit(df[confounders], df['is_premium'])
    
    df['propensity_score'] = logit.predict_proba(df[confounders])[:, 1]
    
    # Check overlap (Common Support)
    sns.histplot(data=df, x='propensity_score', hue='is_premium', element='step')
    
  3. 匹配(最近邻)

    from sklearn.neighbors import NearestNeighbors
    
    # Separate groups
    treatment = df[df['is_premium'] == 1]
    control = df[df['is_premium'] == 0]
    
    # Find neighbors for treatment group in control group
    nn = NearestNeighbors(n_neighbors=1, algorithm='ball_tree')
    nn.fit(control[['propensity_score']])
    
    distances, indices = nn.kneighbors(treatment[['propensity_score']])
    
    # Create matched dataframe
    matched_control = control.iloc[indices.flatten()]
    
    # Compare outcomes
    ate = treatment['spend'].mean() - matched_control['spend'].mean()
    print(f"Average Treatment Effect (ATE): ${ate:.2f}")
    
  4. 验证(平衡性检查)

    • 检查匹配后混杂因素是否平衡(例如,处理组与匹配对照组的平均年龄应相近)。
    • abs(mean_diff) / pooled_std < 0.1(标准化均值差)。


5. 反模式与注意事项

❌ 反模式 1:数据泄漏

表现形式:

  • 在训练集/测试集拆分之前对整个数据集进行缩放/标准化。
  • 使用未来信息(例如,"next_month_churn")作为特征。
  • 包含在整个数据集上计算的目标衍生特征(例如,目标均值编码)。

失败原因:

  • 训练/验证期间的模型表现被人为抬高。
  • 在生产环境中遇到新的、未见过的数据时会彻底失效。

正确做法:

  • 先拆分,再转换。
  • 仅在 X_train 上拟合缩放器/编码器,然后转换 X_test。
  • 使用 Pipeline 对象确保安全。
❌ 反模式 2:P 值操纵(数据挖掘)

表现形式:

  • 检验 50 个不同的假设或子组。
  • 只报告 p < 0.05 的那一个结果。
  • 恰好在达到显著性时停止 A/B 测试(反复查看结果)。

失败原因:

  • 假阳性(第一类错误)的概率很高。
  • 发现结果只是随机噪声,而非可复现的效应。

正确做法:

  • 预先注册假设。
  • 对多重比较应用邦费罗尼校正或假发现率(FDR)控制。
  • 在实验之前确定样本量,并严格遵守。
❌ 反模式 3:忽略类别不平衡

表现形式:

  • 使用包含 0.1% 欺诈数据的数据训练欺诈检测模型。
  • 将 99.9% 的准确率报告为“成功”。

失败原因:

  • 模型只是对所有样本都预测“无欺诈”。
  • 无法检测真正关注的类别。

正确做法:

  • 使用合适的指标:精确率-召回率 AUC、F1 分数。
  • 重采样技术:SMOTE(合成少数类过采样技术)、随机欠采样。
  • 类别权重:XGBoost 中的 scale_pos_weight,Sklearn 中的 class_weight='balanced'。


7. 质量检查清单

方法与严谨性:

  • 在分析之前明确界定假设。
  • 针对统计检验检查假设条件(正态性、独立性、方差齐性)。
  • 正确完成训练集/测试集/验证集拆分(无数据泄漏)。
  • 以适当方式处理类别不平衡(指标、重采样)。
  • 使用交叉验证评估模型。

代码与可复现性:

  • 使用 git 存储代码,并附带 requirements.txt 或 environment.yml。
  • 设置随机种子以确保可复现性(random_state=42)。
  • 将硬编码路径替换为相对路径或配置变量。
  • 将复杂逻辑封装到带有文档字符串的函数/类中。

解读与沟通:

  • 使用业务术语解读结果(例如,“营收提升”而非“对数损失下降”)。
  • 为估算值提供置信区间。
  • 如有需要,使用 SHAP 或 LIME 解释“黑盒”模型。
  • 明确说明注意事项和局限性。

性能:

  • 如果数据集大于 10GB,则使用抽样数据进行探索性数据分析(EDA)。
  • 使用向量化操作(pandas/numpy)而非循环。
  • 优化查询(尽早筛选,只选择所需列)。

示例

示例 1:功能上线的 A/B 测试分析

场景: 产品团队想了解新的推荐算法是否能提高用户参与度。

分析方法:

  1. 实验设计:随机分配(50/50),计算最小样本量
  2. 数据收集:跟踪点击率、页面停留时间和转化率
  3. 统计检验:双样本 t 检验,并使用自助法计算置信区间
  4. 结果:点击率(CTR)显著提升(p < 0.01),提升幅度为 12%

关键分析:

# Bootstrap confidence interval for difference in means
from scipy import stats
diff = treatment_means - control_means
ci = np.percentile(bootstrap_diffs, [2.5, 97.5])

结果: 功能上线,产生正向影响的概率为 95%

示例 2:用于需求规划的时间序列预测

场景: 零售连锁企业需要预测下一季度的销售额,以便规划库存。

建模方法:

  1. 探索性分析:识别趋势和季节性(每周、节假日)
  2. 特征工程:促销活动、天气、经济指标
  3. 模型选择:比较 ARIMA、Prophet 和梯度提升
  4. 验证:使用最近 12 个月的数据进行滚动验证

结果:

模型MAPE90% 置信区间宽度
ARIMA12.3%±15%
Prophet9.8%±12%
XGBoost7.2%±9%

交付成果: 配备自动化再训练流水线的生产模型

示例 3:因果归因分析

场景: 营销团队希望了解哪些渠道能带来实际转化,哪些渠道只是表面上与转化相关。

因果方法:

  1. 倾向评分匹配:匹配特征相似的用户
  2. 双重差分法:比较营销活动前后的变化
  3. 工具变量:解决观察性数据中的选择偏差

主要发现:

  • 电视广告:ROAS 为 3.2 倍(归因效果最强)
  • 社交媒体:ROAS 为 1.1 倍(归因效果不明确)
  • 电子邮件:ROAS 为 5.8 倍(效率最高)

最佳实践

实验设计
  • 随机化:确保真实随机地分配到处理组或对照组
  • 样本量计算:在开始实验前进行统计功效分析
  • 多重检验:检验多个假设时调整显著性水平
  • 控制变量:纳入相关协变量以降低方差
  • 时长规划:让实验运行足够长的时间,以获得稳定结果
模型开发
  • 特征工程:创建可解释且具有预测能力的特征
  • 交叉验证:对时间序列数据使用考虑时间顺序的划分方式
  • 模型可解释性:使用 SHAP/LIME 解释预测结果
  • 验证指标:选择与业务目标一致的指标
  • 防止过拟合:采用正则化、提前停止和留出数据
统计严谨性
  • 不确定性量化:始终报告置信区间
  • 显著性解读:P 值并不等于效应大小
  • 假设检验:验证统计检验的假设
  • 敏感性分析:测试结果对建模选择的稳健性
  • 预注册:在查看结果前记录分析计划
沟通与影响
  • 业务转化:将统计术语转化为业务影响
  • 可执行的建议:将发现与具体决策联系起来
  • 可视化叙事:基于数据构建引人入胜的叙述
  • 利益相关方沟通:根据受众调整技术细节的深度
  • 文档记录:维护可复现的分析记录
负责任的数据科学
  • 公平性考量:检查受保护群体之间是否存在偏差
  • 隐私保护:适当匿名化敏感数据
  • 透明度:记录数据来源和方法
  • 负责任的 AI:考虑模型的社会影响
  • 数据质量:承认局限性和潜在偏差

评论

支持 Markdown