ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

МТС Финтех 产品分析师测试题全解析:A/B 测试显著性检验、SQL 客户消费聚合与 Retention 实战

МТС Финтех 产品分析师测试题全解析:A/B 测试显著性检验、SQL 客户消费聚合与 Retention 实战 教程【免费下载链接】ru-test-assignmentsТестовые задания для самостоятельного выполнения от разных it компаний项目地址https://gitcode.com/gh_mirrors/ru/ru-test-assignments点击查看免费下载本文以 МТС Финтех 产品分析师测试题 为骨架逐题拆解其考察点并给出可直接运行的 Python / SQL 解题方案。读者完成本指南后将掌握产品分析岗位最核心的三项硬技能用统计检验为 A/B 测试结论把关、用窗口聚合与分组聚合完成 SQL 报表、以及在需求模糊时通过澄清问题与 cohort 分析落地留存Retention计算。题目标注为(SQL, Python)与仓库目录 analytics 下其他公司测试题一样均收录于 Hexlet 社区维护的开源测试题集 README.md。一、任务背景与仓库上下文本题来自 analytics/mts-produktovyj-analitik/README.md是 МТС ФинтехМТС 银行面向产品分析师岗位的测试题。题目一共三道难度递增覆盖面非常典型A/B 测试显著性判断给定两个版本的点击数据判断该向产品经理推荐哪个版本SQL 聚合基于一张交易流水表完成近 30 天消费与Top-100 客户月度消费两类报表Retention 需求澄清与实现面对产品提出的模糊需求先提问澄清再假设条件并给出 Python 或 SQL 实现。三道题分别对应产品分析师日常工作的三个高频场景实验分析、SQL 取数、指标口径设计与建模。仓库根目录 README.md 将该任务归类于Аналитик分析师方向并注明(SQL, Python)同目录下的 mts-sobesedovanie-02.docx 在本仓库镜像中只是一个 Git LFS 指针文件无实体内容因此解题以 README.md 题面为准。这类测试题由 scripts/download-assignments.py 等脚本从外部来源整理归档是练习真实面试题的开放素材。下面逐题展开。二、Задача 1A/B 测试该推荐哪个横幅2.1 原题В МТС банке запустили аб-тест на странице, где можно оформить заявку на банковскую карту. В варианте А из 2574 клиентов, зашедших на страницу, на баннер нажали 350, в варианте Б из 2855 нажали 375. Какой вариант баннера предложить продакту и почему?译文МТС 银行在可申请银行卡的页面上启动了一个 A/B 测试。变体 A 中2574 位进入页面的客户里有 350 位点击了横幅变体 B 中2855 位里有 375 位点击。你会向产品经理推荐哪个横幅方案为什么2.2 先把数据变成指标先整理成四格表并计算点击率CTR横幅场景常称为点击率变体访客数 n点击数 xCTR x / nA2574350350 / 2574 ≈13.60%B2855375375 / 2855 ≈13.13%表面上看变体 A 的点击率高了约 0.46 个百分点。但这 0.46pp 的差距到底是真实差异还是抽样波动判断的唯一正确方式是把原假设两个变体点击率相同代入统计检验。2.3 方法选择两比例 z 检验 / 卡方检验点击行为是二项分布点击/未点击两个独立样本的比例比较适合用两比例 z 检验等价于 2×2 卡方检验。检验统计量z (p̂_A − p̂_B) / SE SE √( p̂ · (1 − p̂) · (1/n_A 1/n_B) )其中 p̂ 为合并点击率 p̂ (x_A x_B) / (n_A n_B) 725 / 5429 ≈ 0.1335。代入数据p̂_A 350 / 2574 ≈ 0.13597p̂_B 375 / 2855 ≈ 0.13135差 0.00463SE √(0.1335 × 0.8665 × (1/2574 1/2855)) ≈ 0.00925z 0.00463 / 0.00925 ≈0.50双尾 p 值 ≈ 2 × (1 − Φ(0.50)) ≈0.62用 Python 复现推荐scipy.stats或statsmodelsfrom math import sqrt from scipy.stats import norm nA, xA 2574, 350 nB, xB 2855, 375 pA xA / nA pB xB / nB p_pooled (xA xB) / (nA nB) se sqrt(p_pooled * (1 - p_pooled) * (1/nA 1/nB)) z (pA - pB) / se p_value 2 * (1 - norm.cdf(abs(z))) # 双尾 print(fCTR A {pA:.4f}, CTR B {pB:.4f}) print(fz {z:.3f}, p-value {p_value:.3f})输出约为z 0.500, p-value 0.617。p 值远大于常规显著性水平 0.05无法拒绝原假设。再看差异的 95% 置信区间Wald 法0.00463 ± 1.96 × 0.00925约[-1.35%, 2.28%]区间跨越 0同样支持差异不显著的结论。2.4 结论与建议对产品经理怎么说推荐结论是在现有数据量下无法判断哪个横幅更好不应该仅凭这 0.46pp 的领先就上线 A 或回滚 B。给产品的完整建议应包含继续实验 / 延长测试期当前样本量不足以检测出小效应量。补充功效分析若团队期望检测 CTR 从 13% 提升到 14%相对提升约 7.7%的差异用常见功效分析公式α 0.05功效 1−β 0.8估算每组约需 1.5 万2 万用户量级远大于当前的 2574 / 2855估算代码如下from math import sqrt from scipy.stats import norm p1, p2 0.14, 0.13 # 预期 CTR 与基线 CTR z_alpha norm.ppf(0.975) # 1.96 z_beta norm.ppf(0.80) # 0.84 n ((z_alpha * sqrt(2 * ((p1p2)/2) * (1 - (p1p2)/2)) z_beta * sqrt(p1*(1-p1) p2*(1-p2))) ** 2) / ((p1 - p2) ** 2) print(f每组约需 {n:.0f} 个用户)关注业务指标而非单一点击率即使点击率显著也应跟踪后续转化率申请提交、开卡与收入避免点击率上升但转化率下降的幸存者偏差。2.5 该题考察的能力是否具备假设检验思维p 值、置信区间、功效分析是否会被表面数值迷惑A 更高所以选 A是错误答案是否能把统计结论翻译成产品语言现有证据不足继续积累样本。三、Задача 2SQL——客户消费聚合报表3.1 原题与表结构Есть таблица transact с транзакциями клиентов, начиная с 2021 года. В ней столбцы – id_client - id клиента, tran_time - время транзакции, id_tran - id транзакции, sum_tran - сумма транзакцииПосчитать траты каждого клиента за последние 30 дней от текущего числаДля топ-100 наиболее платежеспособных клиентов за всю историю покупок посчитать траты помесячно译文有 transact 表存放自 2021 年起的客户交易列id_client客户 id、tran_time交易时间、id_tran交易 id、sum_tran交易金额。任务① 计算每个客户自当前日期起最近 30 天的消费② 对历史上最有支付能力的 Top-100 客户按月统计消费。表结构对应列即列含义id_client客户 idtran_time交易时间id_tran交易 idsum_tran交易金额两个子任务本质是两类最常用 SQL 聚合时间窗口聚合与先排名取子集、再分组聚合。3.2 子任务 1每个客户最近 30 天的消费核心是把最近 30 天翻译成时间条件再按客户分组求和SELECT id_client, SUM(sum_tran) AS spend_last_30d FROM transact WHERE tran_time CURRENT_DATE - INTERVAL 30 days -- 或 NOW() - INTERVAL 30 days AND tran_time CURRENT_DATE INTERVAL 1 day -- 边界按业务口径调整 GROUP BY id_client;实践要点边界口径要先澄清是自然日 30 天从当前日 00:00 倒推 30 天还是滚动 30×24 小时两种口径用CURRENT_DATE - INTERVAL 30 days与NOW() - INTERVAL 30 days区分结果会差若干小时是否包含今天tran_time CURRENT_DATE INTERVAL 1 day等价于包含今天 0 点之后的所有交易通常符合直觉负金额退款/冲正若 sum_tran 可为负要先与需求方确认消费是否净额sum还是只计正交易SUM(CASE WHEN sum_tran 0 THEN sum_tran ELSE 0 END)数据量大时建议在tran_time上建索引并避免对tran_time套函数导致索引失效若 SQL 方言不同MySQL / BigQuery / ClickHouse把INTERVAL 30 days换成DATE_SUB(CURDATE(), INTERVAL 30 DAY)、DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY)等等价写法。3.3 子任务 2Top-100 客户的历史月度消费思路分三步① 用 CTE 计算每个客户的历史总消费并取前 100 名② 与 transact 关联③ 按客户 × 自然月聚合。WITH client_total AS ( SELECT id_client, SUM(sum_tran) AS total_spend FROM transact GROUP BY id_client ), top100 AS ( SELECT id_client FROM client_total ORDER BY total_spend DESC LIMIT 100 ) SELECT t.id_client, DATE_TRUNC(month, t.tran_time) AS month, SUM(t.sum_tran) AS monthly_spend FROM transact t JOIN top100 c ON c.id_client t.id_client GROUP BY t.id_client, DATE_TRUNC(month, t.tran_time) ORDER BY t.id_client, month;该实现的关键细节最 платежеспособных的定义需澄清本实现按历史累计消费金额排序。更严格的支付能力可能要求排除退款、只看正交易或考察最近 6/12 个月的消费应在需求阶段确认并列第 100 名LIMIT 100在有并列时会截断稳妥做法是改为ORDER BY total_spend DESC, id_client加次级排序键或使用窗口函数ROW_NUMBER()/RANK()并明确并列处理规则聚合粒度DATE_TRUNC(month, ...)把时间归一到自然月若需要客户在月份内有消费的活跃标记用COUNT(DISTINCT id_tran)或直接GROUP BY id_client, month后再COUNT(*)。3.4 该题考察的能力窗口/时间过滤条件与边界处理CTEWITH组合多个聚合步骤排名截取LIMIT / 窗口函数与并列边界意识对业务口径净额、退款、月度归一的敏感度。四、Задача 3Retention 需求澄清与实现4.1 原题Пришел продукт и говорит: хочу посчитать retention клиентов из задачи 2. Опиши, пожалуйста, твои действия - например, вопросы которые ты задашь. Предположи ответы на свои вопросы, и исходя из этих предположений, напиши код в Python или Sql, который поможет достать нужные данные.译文产品经理过来说我想计算任务 2 中客户的 retention。请描述你的行动——比如你会问的问题。请假设这些问题的答案并基于假设用 Python 或 SQL 写出获取所需数据的代码。4.2 为什么先问问题是关键得分点retention不是自明指标。在没有注册时间、没有活跃事件定义、甚至表里只有交易记录的情况下直接写代码大概率算出一个无法解释的数字。该题刻意考察需求澄清能力——这是资深分析师与取数工具人的分水岭。针对任务 2 中的客户 retention至少要问清楚以下问题附推荐追问角度#要澄清的问题为什么重要1retention 的口径是日/周/月留存观察期多长留存周期直接决定聚合粒度与矩阵形状2活跃如何定义当月至少一笔交易还是有登录/打开 App 等其他事件transact 只有交易数据若活跃登录则需要新数据源3客户群如何圈定是任务 2 的 Top-100 名单还是所有客户两者 cohort 构建方式完全不同4cohort群组的分组基准用首笔交易月还是注册月份表里没有注册字段cohort 定义决定留存曲线的 X 轴含义5数据时间范围自 2021 年起的全部数据还是某个窗口决定 truncate / 截断处理6负金额交易退款是否影响活跃判定若当月仅退款交易客户算不算活跃7是否需要分组维度渠道、产品、地区影响是否要 JOIN 其他维度表4.3 假设这些答案为把需求落地成代码做出一组明确、可复核的假设在汇报时须向产品复述确认retention 口径 月度留存观察每个 cohort 自首购月起 12 个月活跃 当月至少有一笔交易sum_tran 不考虑符号有交易即活跃客户群 所有客户若只看 Top-100只需在代码末尾加名单过滤cohort 基准 首笔交易发生的月份表内无注册字段这是可用的代理变量须向产品说明该代理的局限数据范围 自 2021 年起的全部交易。4.4 Pythonpandas实现经典 cohort 留存矩阵import pandas as pd df pd.read_csv(transact.csv, parse_dates[tran_time]) # 1) 归一到月份 df[month] df[tran_time].dt.to_period(M) # 2) cohort 每个客户的首笔交易月 df[cohort] df.groupby(id_client)[month].transform(min) # 3) 每个 cohort 每月活跃去重客户数 active ( df.groupby([cohort, month], observedTrue) .agg(active_users(id_client, nunique)) .reset_index() ) # 4) cohort 规模分母 cohort_size df.groupby(cohort, observedTrue)[id_client].nunique() # 5) 月份偏移量首月 0 active[month_offset] ( active[month] - active[cohort] ).apply(lambda d: d.n) # 6) 留存率 活跃人数 / cohort 规模 active[rate] active[active_users] / active[cohort].map(cohort_size) # 7) 透视成留存矩阵行 cohort列 月份偏移 retention_matrix active.pivot( indexcohort, columnsmonth_offset, valuesrate ) print(retention_matrix.round(3))输出是一个标准留存矩阵例如行2021-01、偏移 0..12 列偏移 0 恒为 1.0首购月客户当然活跃后续偏移递减代表流失曲线。还可补充一行观察满 n 期的 cohort 数避免小样本 cohort 被误读。4.5 SQL 实现cohort 留存把同一逻辑翻译为 SQLPostgreSQL 风格思路与 pandas 版本一一对应WITH cohort AS ( -- 步骤 2首购月 SELECT id_client, MIN(DATE_TRUNC(month, tran_time)) AS cohort_month FROM transact GROUP BY id_client ), monthly_active AS ( -- 步骤 1/3活跃客户×月份去重 SELECT DISTINCT id_client, DATE_TRUNC(month, tran_time) AS m FROM transact ) SELECT c.cohort_month, (EXTRACT(YEAR FROM a.m) - EXTRACT(YEAR FROM c.cohort_month)) * 12 (EXTRACT(MONTH FROM a.m) - EXTRACT(MONTH FROM c.cohort_month)) AS month_offset, -- 步骤 5 COUNT(DISTINCT a.id_client) AS active_users, -- 步骤 3 分子 COUNT(DISTINCT c.id_client) AS cohort_size, -- 步骤 4 分母 COUNT(DISTINCT a.id_client)::numeric / NULLIF(COUNT(DISTINCT c.id_client), 0) -- 步骤 6 留存率 AS retention_rate FROM cohort c LEFT JOIN monthly_active a ON a.id_client c.id_client GROUP BY c.cohort_month, month_offset ORDER BY c.cohort_month, month_offset;要点LEFT JOIN保证没有后续活跃记录的客户也出现在结果里偏移列为 NULL 时忽略即可NULLIF(..., 0)防止除零月份偏移用年份差 ×12 月份差避免DATE_PART跨年歧义若改用 BigQuery / ClickHouse将DATE_TRUNC换成DATE_TRUNCBigQuery 同名词或toStartOfMonthClickHouse即可。4.6 结果的解读与汇报拿到矩阵后分析师的产出不只是数字还应包含首月留存offset 1与12 个月后的稳定留存对比不同 cohort 的时间趋势判断是否要做留存曲线平滑/分组按渠道、客单价分桶指出 cohort 代理变量的局限以首购月代替注册月会高估早期留存首购即强意向行为若后续能补注册表应切换口径复核。4.7 该题考察的能力需求澄清把模糊的retention拆成口径、客户群、活跃定义、cohort 基准假设驱动敢于明确假设并让需求方确认而不是闷头写代码双栈实现同一逻辑能在 Python 与 SQL 中双写且两版语义一致业务解读能把留存矩阵讲成产品行动建议。五、总结这道测试题背后的产品分析师能力模型三道题拼在一起恰好构成产品分析师的能力闭环场景核心能力考察点A/B 测试实验分析与统计推断显著性检验、p 值、置信区间、功效分析、向产品传达结论SQL 报表数据提取与加工时间窗口、CTE、排名截取、边界与并列处理、口径确认Retention指标设计与业务建模需求澄清、cohort 分析、Python/SQL 双实现、结果解读对准备面试的候选人建议按本文流程自行复算任务 1 的 z 值与 p 值、在本地建transact样例表跑通任务 2 与任务 3 的 SQL/Python 代码并把先澄清、再假设、后实现的答题结构内化成习惯——这既是本测试题的满分路径也是产品分析师日常工作的真实写照。赞分享教程【免费下载链接】ru-test-assignmentsТестовые задания для самостоятельного выполнения от разных it компаний项目地址https://gitcode.com/gh_mirrors/ru/ru-test-assignments点击查看免费下载相关推荐PaddleSpeech Tacotron2 特征归一化全解析从 normalize.py 到训练数据管线PaddleSpeech Tacotron2 特征归一化全解析从 normalize.py 到训练数据管线 导读 本文以 PaddleSpeech 仓库中 n教程深入解析MySQL监控利器mysqld_exporter架构设计与实战应用深入解析MySQL监控利器mysqld_exporter架构设计与实战应用 在现代微服务架构中 MySQL数据库监控 已成为确保业务连续性的关键技术环节。m运维OpenDesign Cohere 设计系统实战指南从 22px 签名圆角到企业级 AI 平台的设计语言OpenDesign Cohere 设计系统实战指南从 22px 签名圆角到企业级 AI 平台的设计语言 本文基于 OpenDesign 仓库内置的 Cohe教程上一篇OWASP MASTG 安全测试最佳实践案例视频观看案例视频下一篇如何彻底摆脱YouTube广告骚扰SponsorBlock打造全球最大广告片段数据库的终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表