ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

数据分析岗笔试复盘:从SQL到业务案例的实战经验

数据分析岗笔试复盘:从SQL到业务案例的实战经验 我是去年春季参加的小满数据分析岗第二批笔试的。这一批和第一批很不一样因为春招到了后半程筛选节奏明显加快笔试题目也更偏向实战纯理论题的比例比预期低很多。我原本按第一批面经重点准备了SQL和统计学结果一打开试卷业务场景题占了将近一半当场有点慌。后来复盘下来这场笔试其实有很清晰的套路——能不能过看的不是你会多少工具而是面对一个模糊业务问题时能不能把它拆成可量化的步骤。这篇文章我就完整复盘一下这场笔试包括考前怎么搜集信息、复习计划怎么排、每类题型怎么答、考试现场怎么分配时间以及最后踩了哪些坑。如果你正在准备数据分析岗笔试尤其是很可能参加二批、三批流程的这篇文章的经验应该能直接用上。1. 笔试前的准备信息搜集与知识体系梳理1.1 岗位JD里的隐藏信息很多人在笔试前只会刷题其实第一步应该是把岗位JD读透。小满这个数据分析岗的JD里写的是“负责业务数据监控、异动归因、实验评估、报表建设”关键词是“监控”“归因”“评估”。这意味着笔试大概率不会只考SQL和Python一定会出业务分析题而且会偏向异常归因和实验评估方向。再结合我是第二批和第一批的时间间隔大概一周我专门去搜了第一批的笔试面经。第一批反馈最多的题型是SQL窗口函数、Python数据清洗、统计假设检验以及一道“指标下降归因”的业务题。这个信息很关键我判断第二批大概率会在同样框架下加深难度或者在业务题上换一个场景。所以我把复习重点划分成四块统计学基础、SQL窗口函数、Python pandas数据处理、业务分析框架。这里有一个很多人会忽略的点岗位JD里如果写了“具备商业敏感度”那笔试里的业务题占比就一定不会低。你光会写SQL是不够的得能解释清楚指标波动背后的业务含义。我在考前专门花了两个晚上把常见业务指标的定义、计算口径、影响因素全部过了一遍比如DAU、留存率、转化率、GMV、客单价、复购率这些。事实证明这个准备非常有用业务题基本就是围绕这些指标展开的。1.2 我的复习计划与资料清单我的实际准备周期是两周但如果你时间更紧一周也够用关键是抓重点。我每天的安排大概是上午刷SQL题下午练Python数据分析晚上看统计和业务案例。周末用来做整套的模拟卷严格限定时间模拟考场节奏。资料这块我不建议贪多。SQL我用的是LeetCode的数据库题库重点刷中等难度以上、涉及窗口函数的题目比如连续登录、分组TopN、同比环比这类。Python刷的是pandas官方文档里的基础部分配合一些真实的电商订单数据练清洗、聚合、透视。统计方面我看的是《赤裸裸的统计学》里关于假设检验和置信区间的部分外加一些AB测试的资料。业务分析则是刷各种公众号和社区里的案例比如“订单量下降如何分析”“留存率提升方案”这类。我把这些整理成一个复习清单贴在电脑旁边每天对照着过一遍统计学假设检验、p值、置信区间、第一类错误和第二类错误、中心极限定理SQL窗口函数、CASE WHEN、日期处理、表关联、去重与空值处理Pythonpandas读写、数据清洗、groupby聚合、merge关联、apply自定义函数业务分析漏斗分析、留存分析、维度下钻、同期群分析、AB测试复习的过程中我最大的体会是不要只刷题要给自己出题。比如看完留存分析我就会问自己如果次日留存率下降了5%我该怎么排查先看哪个指标、拆哪些维度、用什么工具验证这种自问自答的方式能帮你把知识真正内化成解题能力。2. 题型拆解与答题思路从统计到业务案例2.1 统计概率题别只会背公式笔试里的统计题出的不是那种“给出公式让你算”的题而是给你一个业务场景让你判断该用哪种方法并说清楚为什么。我印象很深的一道题是这样的某功能改版后新版本的用户点击率是8.2%旧版本是7.5%样本量各约1万问这个提升是否显著。如果只是背过t检验公式你可能会直接开始算p值。但实际答题时考官想看到的是你完整的分析思路。我的答题步骤是先说明这属于两个独立样本的比例检验可以用双样本z检验原假设是新旧版本点击率无差异然后写清楚检验统计量的计算公式代入数据说明p值小于0.05拒绝原假设最后补充一句结论成立的前提是样本独立、随机分组、样本量足够大如果改版不是全量随机上线结论就要打折扣。这道题我后面复盘时觉得拿高分的关键不是最后那个结论而是你对假设条件的敏感度。数据分析里有个重要原则任何结论都要有限定条件。笔试阅卷的人通常不会只看结果对不对更看重你有没有考虑到业务场景的复杂性。所以遇到统计题即使时间紧也要把“前提假设”和“结论的局限性”写上去这部分很容易被忽视但它很加印象分。另外还有一道概率题一个游戏玩家每天登录的概率是0.6连续登录两天后第三天继续登录的概率提升到0.8问玩家在连续登录两天后第三天不登录的概率。这题看起来简单其实考的是条件概率和事件关系。我在草稿纸上画了个简单的树状图把“连续登录两天”作为条件然后直接算1减0.8。这种题要说清楚思路别只写答案因为笔试是人工阅卷为主过程分占比很高。2.2 SQL题窗口函数是分水岭SQL题是数据分析岗笔试的重头戏小满这批也不例外。一共出了三道SQL题难度递增前面是常规查询后面就直接上窗口函数了。我记得有一道题是给定用户登录日志表login_log(user_id, login_date)求每个用户连续登录的最大天数。这种题在面试里被问烂了但考试时还是有不少人写不出来。核心思路是用日期减去row_number的序号得到一个新的分组标识同一组内的日期就是连续的。我当时写的SQL大概是这样的SELECT user_id, MAX(cnt) AS max_consecutive_days FROM ( SELECT user_id, DATE_SUB(login_date, INTERVAL ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY login_date) DAY) AS grp, COUNT(*) OVER(PARTITION BY user_id, DATE_SUB(login_date, INTERVAL ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY login_date) DAY) DAY) AS cnt FROM login_log ) t GROUP BY user_id;实际答题时我没有写得这么复杂我是分了两步先算出grp再按user_id和grp分组统计次数。笔试中SQL题阅卷不会像机器一样严格跑代码更看重你的思路是不是清晰。所以我会在SQL旁边写一两句注释说明每一步在做什么。比如“用登录日期减去行号得到分组字段同一组说明这些日期是连续的”。这种注释不扣分反而能帮助阅卷人理解你的思路。SQL还有一道题是算每个品类下销售额排名前3的商品这个就是典型的窗口函数应用用ROW_NUMBER()或者RANK()都可以。但要注意细节题目要求“如果销售额相同排名并列”那就需要用RANK()而不是ROW_NUMBER()。这个小坑如果没注意到整个答案就会错。做题时一定要先看清楚题目里对排序规则的要求再决定用哪个函数。窗口函数是SQL题的分水岭如果只是停留在SELECT、WHERE、JOIN阶段大概率会卡住。但窗口函数的掌握其实没那么难核心就是记住几类排序类ROW_NUMBER、RANK、DENSE_RANK、偏移类LAG、LEAD、聚合类SUM、AVG、COUNT配合OVER。把这些吃透了大部分数据分析岗的SQL题都能应付。2.3 Python题数据清洗与分析的实战Python题这部分小满这批出的不是那种“用print输出斐波那契数列”的算法题而是给你一份模拟的订单数据让你完成数据清洗和分析。题目的大意是有一个订单表包含订单ID、用户ID、下单时间、订单金额、支付状态等字段要求完成以下几步读取数据查看数据概况处理缺失值订单金额为空或小于等于0的数据要剔除新增一列“月份”格式为YYYY-MM按用户ID和月份分组统计每个用户每个月的订单总金额和订单数找出每个用户下单金额最高的那个月份这个题我写下来大概是这样的import pandas as pd df pd.read_csv(orders.csv, parse_dates[order_time]) print(df.info()) print(df.describe()) # 处理缺失值和异常值 df df.dropna(subset[order_id, user_id]) df df[df[order_amount].notna()] df[order_amount] pd.to_numeric(df[order_amount], errorscoerce) df df[df[order_amount] 0] # 新增月份列 df[month] df[order_time].dt.strftime(%Y-%m) # 分组聚合 summary df.groupby([user_id, month]).agg( total_amount(order_amount, sum), order_count(order_id, count) ).reset_index() # 找出每个用户下单金额最高的月份 max_month summary.loc[summary.groupby(user_id)[total_amount].idxmax()]说实话这个题难度不大但有几个坑很致命。第一个坑是pd.read_csv之后没有检查列名实际数据里的列名可能带空格或特殊字符不处理的话后面全部报错。我考试时先跑了一遍df.columns确认列名没问题才开始写。第二个坑是订单金额的缺失值既要处理NaN也要处理小于等于0的异常值如果只dropna后面的统计结果就会偏大。第三个坑是用groupby之后记得reset_index不然user_id会在索引里后续按用户ID查找会出问题。还有一个我想提醒的点笔试里的Python题不要求你写出最高性能的代码但一定要求代码思路清晰、逻辑完整。阅卷人会看你有没有处理边界情况比如空数据、重复数据、类型转换失败等。哪怕你代码风格稍微啰嗦一点只要思路对、关键细节都覆盖了分数就不会低。反过来如果你只写了核心的groupby没处理缺失值那这道题基本就是一半分。2.4 业务案例题用框架说话业务案例题是整张试卷里分值最高的一道也是最容易拉开差距的地方。小满这批的业务题大概是这样的某电商平台最近30天整体订单量环比下降了8%领导让你分析原因你会怎么入手这道题没有标准答案但阅卷人会看你的分析框架是不是完整。我当时的答题思路分了四层。第一层是确认数据口径环比下降8%是哪个指标、哪个周期、哪个范围是全平台还是某个业务线、是否剔除节假日和促销活动的影响这一步特别重要因为很多下降是口径变化造成的假象。第二层是维度拆解把整体订单量按渠道、地区、商品类目、用户分层拆开定位下降主要集中在哪个维度。第三层是假设验证针对定位到的维度提出可能的原因比如某个渠道的流量下降、某个类目的供给减少、某类用户的流失加剧、竞品活动分流等然后再用数据逐一验证。第四层是输出建议根据验证结果给出下一步动作建议。框架写完我又补充了一个很重要的点我要先做数据质量校验。如果底层数据抽数有延迟、或者上游表某个字段出了问题那计算出8%的下降可能就是错的。这个点我在后来的复盘里觉得特别加分因为大多数考生会直接开始归因很少有人会先质疑数据本身。业务题答题时最怕的就是没有结构、想到哪写到哪。如果你说“可能是竞争者搞活动也可能是天气原因”这种答案是没有说服力的。你要让阅卷人看到你的思考过程是层层递进的。一个很好用的方法是先给结论框架再逐层展开。比如先写“我会按照确认口径—维度拆解—假设验证—输出建议四步来分析”然后再展开每一步。这样即使你后续细节写不全至少整体框架是完整的阅卷人一眼就知道你会不会做业务分析。还有一个小技巧在业务题里适当写一些具体指标名比如GMV、支付转化率、加购率、退款率会让你的答案显得更专业。我当时就写了“订单量下降可能是前端流量减少导致进店用户数下降也可能是转化率下降导致同样流量下订单减少这两者的分析思路完全不同”这个表述等于把你的分析框架进一步细化到了指标层面比空泛地说“流量变了”要强很多。3. 实操过程与现场记录一场四小时的笔试3.1 考试流程与答题顺序小满第二批笔试是整个下午总共四个小时线上机考平台是通用的在线笔试系统可以切到本地IDE写代码但提交答案需要在网页里粘贴代码。题量大概是这样统计概率题3道、SQL题3道、Python题2道、业务案例分析题1道另外还有5道不定项选择题。整体时间其实不算特别宽裕平均每道大题要控制在30到40分钟。我的答题顺序是先做选择题因为速度快能快速进入状态然后做SQL题趁脑子清醒先把代码写对再做Python题最后留一个半小时给业务题。统计题我穿插在选择题和SQL之间做因为统计题需要写文字写太多容易手累穿插着来可以调节节奏。这个顺序是我模拟考的时候摸索出来的。第一次模拟考我先做业务题结果耗费了大量时间写框架导致后面SQL题时间不够代码写得乱七八糟。后来我调整了策略计算类的题先做文字类的题后做。因为代码题一旦时间不够基本就是零分而业务题即使时间紧只要写出框架和要点也能拿不少分。所以我的建议是先把能稳定拿分的题做完再来写那些需要发挥的题。3.2 我印象最深的三道题第一道是SQL题里算连续登录天数的那道。当时我写完主查询之后突然想到题目要求的是“最大连续天数”而我算的是所有连续区间的天数如果用户有两个连续登录区间我需要取MAX。我赶紧又套了一层MAX才把答案改对。这个细节提醒我写完SQL一定要回到题目检查输出是不是题目要求的那个粒度。第二道是Python题里有个坑读取的文件是CSV格式但有一个字段的值里带了英文逗号直接pd.read_csv会导致列错位。当时我看数据概况时就发现列数不对所以加了一个参数解决。这里有个经验拿到数据后先不要急着分析先看数据形状、列名、前几行和缺失值。这个习惯帮我避免了好几处后续报错。第三道是业务题里我写维度拆解时提到“按用户分层”之后又补了一句“需要区分新客和老客因为新客转化路径和老客完全不同影响订单量的因素也不一样。”这其实是我之前看面经时学到的点考试时正好用上了。所以平时多积累业务分析的表达考场上真的能自然写出来。3.3 时间分配与临场策略四个小时看起来很长实际写下来会觉得非常紧凑。我给自己定的时间表大概是选择题15分钟统计概率题45分钟SQL题60分钟Python题40分钟业务题60分钟最后留20分钟检查。但实际执行时Python题比预想的难多花了10分钟我只好从业务题里匀了10分钟过去。这个微调是可以接受的但前提是你心里有数知道哪道题可以压缩时间。临场还有一个很重要的策略不会的题先跳过。我统计概率里有一道题卡了10分钟没思路果断先跳过去做了SQL等后面再回头想结果做SQL的时候脑子里突然冒出一个解题方向回去就写出来了。笔试和笔试不一样线上笔试没法跳来跳去的情况很少一般系统都支持自由切换题目所以遇到卡壳千万别死磕。检查环节也很关键。我最后20分钟主要做三件事第一检查SQL代码里的字段名和表名有没有写错第二检查Python代码里有没有reset_index、有没有处理空值第三检查业务题的框架是否完整有没有忘了写某个分析层次。这三类检查都能稳定挽回几分尤其是SQL和Python有时候就是一个小错误导致整个答案全错仔细检查能救回来。4. 常见失误与避坑指南4.1 时间不够用的三大原因我考完之后和同期参加笔试的几个朋友聊了聊发现大家挂在笔试上的原因高度一致时间不够。时间不够背后主要就三个原因。第一个原因是在选择题上纠结太久。有些不定项选择题本身就有迷惑性比如“以下哪些指标可以衡量用户活跃度”选项里有DAU、MAU、留存率、客单价、PV正确答案是DAU、MAU、留存率、PV但很多人会把客单价也选上。这种题分值不高纠结太久性价比极低。我的建议是每道选择题控制在2分钟以内拿不准就标记最后有时间再回来纠结。第二个原因是SQL代码写完后没有验证。在线笔试平台通常提供了“运行”按钮很多环境支持本地查询但有些人写完代码不运行、不测试直接提交一旦有语法错误或者逻辑问题就是零分。我考场上每道SQL题都运行了一遍虽然多花了几分钟但是能确保代码确实能跑出结果这比追求速度重要得多。第三个原因是业务题写太多。有些人业务题上来就写五六百字把每个维度都展开得非常细结果写到后面时间不够其他题没做完。业务题确实分值高但也不需要写成小论文。我实际写了大概七八百字但重点放在框架和分层上每个维度的解释控制在两三句话这样既显得专业又不至于浪费时间。4.2 容易丢分的细节清单笔试丢分往往不是因为你不会而是因为细节没注意到。我整理了一个丢分清单算是用真实教训换来的字段名写错。比如题目里是user_id你写成useridSQL直接报错。遗漏去重。统计订单数时如果没有DISTINCT遇到重复订单会多算。时间维度处理错误。题目要求按月你按天统计输出粒度不对。空值和零值混淆。在Python里NaN和0含义完全不同处理不当会影响聚合结果。业务题里没有先定义指标口径。如果你不说明“订单量指的是支付成功的订单”后面分析就缺乏边界。统计题只写结论不写过程。笔试阅卷很多时候是看步骤哪怕结论错了只要步骤对也能拿分。这些细节看着不起眼但每一条都可能让你丢掉一道题的分数。我笔试时因为SQL里一个字段少写了一个s运行报错检查了整整五分钟才找出来。所以建议大家在写代码的时候尽量从题目里复制字段名不要手打能减少很多低级错误。4.3 心态调整与突发情况应对笔试心态也很重要尤其是遇到“本以为是送分题结果卡住”的情况。我这次就遇到一道选择题关于置信区间和p值我看着特别眼熟但选项里有两个长得特别像当时心里一慌差点选错。后来我强迫自己深呼吸把那两个选项各读了三遍用定义去套才选出了正确的那个。考场上如果真的遇到完全不会的题不要空着。尤其是业务题和统计文字题哪怕不会写完整答案也可以把自己能想到的分析思路写上去哪怕只有几句话。阅卷人看到你有分析框架多少会给一点分。空着是肯定零分写了还能争取部分分。对于突发情况比如系统崩溃、网页卡顿、代码运行超时一定不要慌。先截图保存现场然后尽量多刷新几次如果还是不行第一时间联系在线监考的客服。我在笔试中间遇到过代码运行超时其实是我本地网络波动导致的重跑了一次就成功了。所以遇到系统问题先冷静别因为着急乱操作。写在最后这次笔试让我有个很深的感触数据分析岗的笔试已经不是单纯考SQL和Python怎么写了而是考你面对一个模糊业务问题时能不能把业务问题翻译成数据问题再用工具去解决。工具只是基础分析思维才是分水岭。如果你正在准备类似岗位的笔试我建议你在刷题之外多花时间练业务案例分析尤其是指标异动归因这类题多看看面经里的分析框架然后试着自己写一遍。最后再分享一个小技巧笔试开考后先别急着做题花两分钟时间把常用的SQL窗口函数模板和pandas清洗步骤默写到草稿纸上。比如连续登录题的grp分组思路、groupby聚合后记得reset_index、dropna和fillna的用法这些高频知识点先在草稿纸上占个位后面写题时直接对照着用会快很多也不容易卡壳。这个小办法帮我稳住了好几道题你下次笔试也可以试试。
返回列表