ARTICLE DETAIL

资讯详情

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

2024秋招OPPO数据分析岗笔试全复盘:从SQL到业务题

2024秋招OPPO数据分析岗笔试全复盘:从SQL到业务题 9月初收到OPPO数据分析岗笔试邀请时我手边还堆着另外两家公司的真题和面经。坦白说我当时对这场笔试的预期是有点偏低的——市面上流传的校招笔试攻略大多把“行测SQLPython统计学”四件套拿出来反复练练到后面甚至产生了一种错觉只要这几项够熟笔试就能稳过。真正坐到电脑前面对那份时长两个半小时的卷子我才意识到这种四件套式的备考策略恰恰最容易让人在最后一道业务题上翻车。这篇文章来复盘一下我参加2024年秋招OPPO数据分析岗笔试的全过程。我会把笔试结构、每类题型的考点、我当时现场是怎么答的、以及回头来看哪些地方能做得更好尽量完整地写出来。文章不是标准答案汇编更像是一个过来人把踩过的坑和临场反应重新摊开给你看。如果你正在准备手机厂商或硬件大厂的数据分析岗秋招这篇应该能帮你少绕一点弯。1. 从投递到笔试先想清楚这张卷子要筛什么笔试模拟题刷多了容易陷入一个误区把笔试当成“题库抽题”于是拼命背题。但企业出题不是随机抽题而是围绕岗位需要的能力画像来设计。想在OPPO数据分析岗笔试里拿高分第一步不是做题而是先理解这张卷子的筛选逻辑。1.1 从岗位JD倒推笔试的隐性考点投递前我把OPPO数据分析岗的职位描述翻来覆去看了几遍关键词反复出现数据提取与清洗、指标体系搭建、专题分析、业务洞察、跨团队沟通。翻译成笔试语言对应的能力就是SQL数据处理能力能不能从数据库里把分析所需的数据拿对、拿全。统计分析基础能不能用假设检验、AB实验、归因分析等方法回答业务问题。逻辑思维与商业敏感度给一个业务场景能不能提出靠谱的分析框架而不是堆砌指标。工具使用能力Python或Excel处理数据的熟练程度直接体现在笔试题里。这些能力不会均匀分布在卷子里。从我实际体验来看OPPO的笔试明显更侧重“业务分析题”和“SQL实操题”纯记忆性的统计学选择题占比并没有想象中高。这一点值得所有备考的人注意不要花太多时间死记硬背公式而要把时间花在“用分析方法解决具体业务问题”的练习上。1.2 开场前的整体节奏与时间分配我这场笔试是远程进行总时长两个半小时题量不算夸张但每一类题都需要留足思考时间。大致构成是题目类型数量建议时间考察重点行测逻辑/资料分析约15题25分钟快速反应、图表解读统计学与业务选择题约10题20分钟统计基础、业务常识SQL手写题3题30分钟取数逻辑、窗口函数Python/数据处理题2题25分钟Pandas熟练度、逻辑严谨业务开放题1题30分钟结构化表达、业务理解这个时间分配比我预想的要紧凑尤其是最后那道业务开放题需要打很多字如果没有提前构思框架很容易写到最后发现自己结构混乱。我当时是严格按照这个时间计划执行的只有选择题稍微超了些时间后面靠SQL和Python的熟练度又追了回来。建议你也提前给自己设定时间上限遇到卡壳的题先标记跳过不能在一道题上耗着。2. 选择题里的统计陷阱AB实验、漏斗分析与行测时间管理选择题部分乍一看都很基础但细做下来会发现真正拉开分数的不是会不会算而是能不能识别题目里那些“看起来对、实际错”的干扰项。2.1 一道AB实验题显著性不是只看p值我印象很深的一道选择题题干大致是某功能上线后进行了为期两周的AB实验实验组转化率比对照组高5%p值小于0.05因此产品经理准备全量上线问以下哪个说法最合理。选项里有几个典型干扰项一个是“p值小于0.05说明实验组一定比对照组好”另一个是“样本量足够大所以结果可信”还有一个是“应该直接全量上线不用再看其他指标”。这道题表面考显著性检验实际考的是AB实验的完整流程。现场我是这么推理的p值小于0.05只能说明“在该样本量下差异不太可能是随机波动造成的”但不能排除实验本身有偏。比如两周时间是否有新奇效应实验组和对照组的分流是否均匀有没有其他产品迭代在同期上线。更关键的是除了转化率还要观察对用户时长、留存、客诉率等指标是否有负面影响。所以正确答案应该落在“需要进一步评估成本和其他指标后再决定”这个方向上。这类题给我最大的提醒是统计基础题不只是背公式而是要把公式放到真实业务决策的场景中理解。平时练习时多问自己一句“如果我是分析师这个结论能直接给业务方用吗”比刷一百道纯计算题更有效。2.2 漏斗分析在选择题里的考法另一个印象比较深的是和转化漏斗相关的选择题题干给了一个电商App从首页曝光到支付成功的四步漏斗各步骤转化率分别为曝光到点击15%点击到加购10%加购到提交订单30%提交订单到支付成功50%问整体转化率是多少以及哪个环节最值得优化。计算整体转化率不难15%乘以10%乘以30%乘以50%等于0.225%这个细节很多人会漏算“曝光到点击”这一层直接把后面三层乘起来。但更值得说的是第二问——“哪个环节最值得优化”。很多人凭直觉选“转化率最低的环节”也就是点击到加购的10%。但真正回答这个问题还得考虑两个因素一是各环节的绝对用户量如果曝光是100万人点击到加购环节的优化空间和支付成功环节的基础用户量差距极大二是优化难度有些环节提升了1个百分点就能带来几十万订单有些环节做到80%也已经到天花板了。这类题其实是后续业务开放题的缩小版核心逻辑完全是数据分析师日常工作的思路先定位问题再评估改进空间最后给决策建议。备考时不要只满足于算对数字一定要把“下一步怎么做”的思维练出来。2.3 行测部分的时间管理策略行测部分基本是言语理解、图形推理和资料分析混着来难度和公考行测差不多但时间压力更小一些。我的策略是资料分析题优先做因为分值高且可以通过硬算拿分图形推理和言语题如果30秒内没思路直接凭第一印象选一个然后跳到下一题。这里有个小技巧行测部分往往分布在卷首如果你的逻辑感一般千万不要在前面死磕否则后面SQL和业务题的时间会被严重挤压。把行测当成热身和筛选门槛就好它的区分度远不如后面的专业题。我当时平时练题的时候给自己定的目标是正确率70%左右剩下的时间去抢专业题的分数事实证明这个策略在最终结果上是划算的。3. SQL手写题窗口函数决定你能不能进下一轮SQL题是数据分析岗笔试的重头戏OPPO这场也不例外。三题里两题用了窗口函数这个信号很明确只学会GROUP BY和JOIN是不够的窗口函数必须熟练到能默写的程度。3.1 留存率计算的两种写法对比第一道题是典型的用户留存计算给定用户活跃表user_active字段包括user_id、active_date求每日新增用户之后第7天的留存率。这个题有两个关键点一是要先定义“新增用户”二是计算留存率需要把“新增日期”和“第7天是否活跃”关联起来。我的写法是先用MIN(active_date)找出每个用户的首活日期再判断该用户在首活日期之后第7天是否仍有活跃记录。两个思路都可以-- 思路一子查询关联 WITH first_date AS ( SELECT user_id, MIN(active_date) AS first_day FROM user_active GROUP BY user_id ) SELECT a.first_day AS install_date, COUNT(DISTINCT b.user_id) * 1.0 / COUNT(DISTINCT a.user_id) AS retention_rate FROM first_date a LEFT JOIN user_active b ON a.user_id b.user_id AND b.active_date DATE(a.first_day, 7 day) GROUP BY a.first_day;-- 思路二窗口函数 WITH user_first AS ( SELECT user_id, active_date, MIN(active_date) OVER(PARTITION BY user_id) AS first_day FROM user_active ), user_flag AS ( SELECT user_id, first_day, MAX(CASE WHEN active_date DATE(first_day, 7 day) THEN 1 ELSE 0 END) AS retained FROM user_first WHERE active_date first_day GROUP BY user_id, first_day ) SELECT first_day, SUM(retained) * 1.0 / COUNT(*) AS retention_rate FROM user_flag GROUP BY first_day;这个题想拿全分除了计算结果对还要注意一个坑活跃表每天可能有多次活跃记录计算留存用户时要用COUNT(DISTINCT user_id)或者提前去重否则会把同一个人同一日的多条活跃记录重复计入。我现场特意加了一层DISTINCT这种细节往往就是阅卷时区分高分和普通分的关键。3.2 连续登录问题的通用模板第二题考的是“找出连续登录5天及以上的用户”。这个题在各大厂笔试里出现频率极高解法套路比较固定用ROW_NUMBER对每个用户的登录日期排序然后拿登录日期减去排序序号得到一个“临时分组日期”。如果用户连续登录排序序号和日期差值会保持为同一个值那么按这个差值分组后组内天数就是连续登录的天数。WITH t1 AS ( SELECT user_id, active_date, ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY active_date) AS rn FROM ( SELECT user_id, active_date FROM user_active GROUP BY user_id, active_date ) tmp ), t2 AS ( SELECT user_id, active_date, rn, DATE(active_date, - || rn || day) AS group_date FROM t1 ) SELECT user_id, COUNT(*) AS continuous_days FROM t2 GROUP BY user_id, group_date HAVING COUNT(*) 5;核心逻辑我背得很熟但现场还是卡了一下如果在子查询里没对同一用户同一天的活跃记录去重ROW_NUMBER排序后同一日的多条记录会生成不同的序号日期减去序号后就会拼出一个错误的“连续分组”。所以我在写之前先做了一步“SELECT DISTINCT user_id, active_date”这个是这个题真正的隐含考点。面试官其实不是看你记不记得连续登录模板而是看你会不会在模板上处理脏数据。3.3 我踩过的坑LEFT JOIN的隐式陷阱第三题是常规的多表关联取数题要求统计各渠道的付费用户数和ARPU值。我一开始顺手用了LEFT JOIN把订单表挂在用户渠道表后面结果ARPU算出来明显偏大。原因很快意识到一个用户可能有多个订单JOIN之后用户级的渠道记录被复制成了多行每人被重复计算了。这类问题在笔试里非常隐蔽因为结果看起来有数据、有逻辑但用户数会虚高。正确的做法是在聚合时用COUNT(DISTINCT user_id)算人数或者在JOIN之前先对订单表按用户粒度汇总。这个坑我刷题时就犯过所以考试时能立刻反映过来。建议所有备考的人把“JOIN会产生放大效应”这个意识焊在脑子里凡是用户级指标和订单级明细关联先想想会不会重复。4. Python数据处理题不考算法考的是业务翻译能力Python题比我想象中务实没有考机器学习算法也没有考复杂的数据结构而是给了两个贴近业务的Pandas数据处理场景。这类题看起来门槛低实际想写对也不容易因为真正的难点不在代码本身在于把自然语言描述的需求准确翻译成数据处理逻辑。4.1 Pandas清洗题里的三个核心动作第一题给了用户订单表包含user_id、order_id、order_time、amount、status字段要求做清洗后按周汇总GMV。要处理的脏数据情况包括重复的order_id、amount为空或负数、order_time格式不统一。我当时的处理顺序是先统一时间格式再去重最后处理金额异常。用代码表达大概是import pandas as pd import numpy as np # 统一时间格式 df[order_time] pd.to_datetime(df[order_time]) # 按order_id去重保留第一次出现的记录 df df.drop_duplicates(subset[order_id], keepfirst) # 过滤异常金额 df df[df[amount].notna()] df df[df[amount] 0] # 添加周字段并汇总 df[week] df[order_time].dt.to_period(W) weekly_gmv df.groupby(week)[amount].sum().reset_index()这个题的给分点我觉得主要看两个地方一是去重时是保留第一次还是最后一次要有合理解释二是负金额是直接删除还是单独统计需要结合业务来定。我现场在代码旁边留了注释说明“负金额可能来自退款这里先排除如需分析退款率可另行计算”这种对业务边界的思考会给阅卷人留下很好的印象。4.2 分组聚合与透视表的潜规则第二题是商品维度的分析给了一个订单明细表包含商品ID、类目、销售额、利润要求统计每个类目的销售额Top 3商品。这个题直接用groupby和sort_values就能做但要在组内排序取前N需要用到groupby后的apply或者rank方法。# 每个类目下的销售额Top3商品 top3 ( df.groupby([类目, 商品ID], as_indexFalse)[销售额] .sum() .assign(ranklambda x: x.groupby(类目)[销售额].rank(methoddense, ascendingFalse)) .query(rank 3) )这里有一个容易踩的坑同一款商品名字一样但规格不同可能对应不同商品ID如果直接按商品ID分组结果会显得很碎如果按商品名分组又有可能把不同类目的同名商品混在一起。题目本身没有说明这类情况需要自己提前判断。我当时的做法是保守一点按商品ID分组但把商品名称一并带上保证结果既明细又独立。4.3 一道“读懂需求”的送命题还有一小问是补全代码他们给了一段残缺逻辑要求筛选出“连续两个月都有购买记录的用户”。现场看到这个需求时我第一反应是“用户表的时间字段是字符串还是日期”然后计算每个用户购买月份列表再判断是否有连续两个月同时出现。这种题本质上在考你处理时间序列的熟练度。我当时用了set和月份差值的思路# 假设df已包含user_id, month字段month格式为2024-01 month_purchase df.groupby(user_id)[month].apply(lambda x: set(x)) def has_continuous_two(s): sorted_months sorted(s) return any( (pd.to_datetime(sorted_months[i1], format%Y-%m) - pd.to_datetime(sorted_months[i], format%Y-%m)).days 32 for i in range(len(sorted_months) - 1) )这个题难度不大但我很确定会有人把月份直接当成字符串排序导致‘2024-2’排在‘2024-10’后面。做这种题的时候建议先确认时间字段类型再动手写逻辑这个检查顺序本身就是拿分点。5. 那道30分的业务题在线商城转化率下降怎么分析笔试最后一道业务开放题分值非常重题目大意是最近一个月OPPO在线商城的整体转化率相比之前下降了约15%作为数据分析师你会如何定位原因并给出分析方案。要求写清楚分析思路、数据需求、预期产出和可能遇到的难点。这类题没有标准答案但阅卷人有明确的给分维度。我现场大概是这么组织的写完感觉结构比内容本身更重要。5.1 把模糊问题拆成可执行的分析框架我先做了一步很关键的事把概念定义清楚。“转化率下降”具体是指哪个转化率从曝光到点击从点击到加购还是从支付成功率不同环节的下降原因和应对方式完全不同。所以我在答案开头先写了一句“我会先定义本问题中的转化率口径并拆解为分环节漏斗数据”这会给阅卷人传递一个信号这个人不是看到指标就慌而是有结构化思考能力。接着我把原因拆成四个维度流量质量变化、用户体验变化、商品与价格策略变化、外部环境变化。流量质量维度是不是投放渠道结构变了导致更多泛流量进入点击意愿下降是否存在某个渠道的拉新活动带来低意向用户。用户体验维度是不是页面改版、加载速度变慢、支付流程出现异常、登录环节被阻塞。商品与价格维度是不是折扣力度减弱、热销品缺货、主推商品下架或定价调整。外部环境维度是不是竞品大促分流、整体消费热度下降、退换货政策带来的观望情绪。这个四分法不算什么独创但它的价值是把模糊的“转化率下降”切成了用户可感知的具体假设下一步才能逐一验证。5.2 数据需求与验证路径框架之后我列了具体的数据需求漏斗各环节的日粒度转化率、渠道来源拆分数据、用户画像变化数据、页面性能指标、支付失败日志、商品维度的曝光与加购数据、竞品与行业大盘数据。然后针对每个假设写了验证方法。比如流量质量假设可以看新老用户占比、各渠道的次日留存是否有变化、关键词投放的成本和转化率是否同时波动用户体验假设可以看各环节的报错率、页面平均加载时长、用户停在各环节的时长分布商品策略假设可以按品类拆解转化率看是全线下跌还是某个类目拉低了大盘。这里我特别提到一个容易忽略的点先看数据准确性和口径是否发生变化。比如统计代码被人改过、埋点漏了某一端、活动期间冒烟测试产生的虚假曝光这些都会导致转化率“假性下跌”。笔试题里主动提这一点很容易让阅卷人觉得你有真实的数据处理经验而不是只会刷题。5.3 这道题真正想考察的三种能力从分数角度看这种业务题不会因为“分析全面”就拿满分关键看三点第一能否把业务问题转化为数据分析问题而不是上来就写一堆指标第二分析框架是否可落地数据需求和验证路径是否清晰第三行文逻辑是否结构化有没有优先级判断和输出物定义。我当时把每条假设都标注了优先级和预计耗时还加了一个小节写“与业务方的沟通计划”比如什么时候同步阶段结论什么时候出最终报告。这一小段在考场上可能不会立刻提分但它能很好地展示“数据分析师不是写SQL的工具人而是业务决策的参与者”。这个定位在这道题里非常重要。6. 笔试之后的工具链复盘与面试衔接准备笔试交卷之后我做的第一件事不是对答案而是把整张卷子按题型重新过了一遍标记哪些题是稳定拿分、哪些是临场发挥、哪些暴露了明显的短板。这个复盘过程直接决定了我后面面试的准备方向。6.1 从笔试暴露的问题反推复习重点我复盘后列出的短板有两个一是统计分析里贝叶斯相关的概念记得不够扎实选择题有一道关于先验概率的题我犹豫了很久二是SQL连续登录那题在去重逻辑上多花了两分钟说明日常写练习还是没有形成肌肉记忆。针对这两个问题我在等面试通知的那几天做了两件事一是把概率统计的核心概念重新过了一遍特别是假设检验、置信区间、贝叶斯思想和AB实验流程之间的关联二是把SQL高频题型整理成个人模板包括留存、连续登录、最大在线人数、累计求和、同比环比、行列转换等每个题型都自己重写了一遍直到能闭着眼睛写出无误的版本。如果你也刚考完建议你按照这个思路做一次复盘比盲目刷新题有用得多。笔试暴露出来的薄弱点往往也是面试官喜欢追问的方向。6.2 我能推荐的数据分析工具链复盘的时候我还顺手整理了自己平时用到的工具链。笔试现场写代码用的是网页版环境没办法用本地IDE但平时的积累工具还是很关键的。日常取数和探索性分析我用的是DBeaver写SQL查数它连接各种数据库都很方便而且自带的图表可视化功能可以直接在查询结果上快速画折线图和柱状图不用每次为了看一个趋势就导出到Excel。笔试备考阶段我用它重刷了大量SQL练习题一边写一边快速验证结果效率比直接在LeetCode上盲写要高很多。数据清洗和复杂分析主力还是Python的Pandas。不过最近我尝试了用Dify搭建几个简单的数据清洗工作流确实能把一些重复性较高的操作流程化比如日志格式统一、异常值标记、字段映射这些环节。对于数据量不大但流程固定的场景它比每次手写Python更省心。当然笔试和面试手写代码还是得靠实打实的功底工具只是辅助。数据量比较大的离线分析我也系统学了Spark的DataFrame操作。笔试虽然不怎么考大数据组件但面试聊到海量数据处理场景时能说出Spark SQL和Pandas在算子设计上的差异会很加分。另外Excel加Python的组合最近越来越常用Power Query做清洗、Python脚本做自动化两者配合能覆盖很多临时需求日常做业务支持时效率提升非常明显。6.3 一张可以直接抄的备考清单最后给你一份我整理过的数据分析岗笔试备考清单覆盖了我在OPPO以及后续多场笔试中反复遇到的知识点模块必须掌握的内容SQL窗口函数四件套ROW_NUMBER、RANK、DENSE_RANK、NTILE、CASE WHEN条件聚合、JOIN的放大与过滤逻辑、留存/连续登录/累计求和PythonPandas去重与缺失值处理、groupby聚合、pivot_table透视、日期时间处理、apply与向量化写法统计学描述统计、假设检验流程、p值与置信区间、AB实验设计、混淆变量与辛普森悖论业务分析漏斗分析、拆解思维、对比分析、归因逻辑、指标体系搭建、数据口径定义行业知识手机厂商或电商业务的常见指标DAU、MAU、GMV、ARPU、留存、复购率、流量成本、转化率这个清单不保证覆盖所有公司所有场次的题但应对硬件大厂数据分析岗的主流笔试已经够用了。可以把每个模块当成一个checklist逐个确认自己能不能在不查资料的情况下讲清楚核心概念能讲清楚再进入下一个模块。笔试只是秋招路上的第一道关卡它筛掉的从来不是“不够聪明的人”而是“没有准备但以为自己有准备的人”。如果你能静下心来把上面这些内容一条条过一遍我相信你在考场上的表现会比大多数人从容很多。
返回列表