Entry Level Data Scientist Interview Preparation Guide - FAANG Standards
This guide is based on general FAANG interview practices and may not reflect specific company procedures.
The Entry Level Data Scientist interview process at FAANG companies typically consists of 6 rounds spanning 4-8 weeks. The process evaluates your foundational technical skills in SQL and Python, understanding of statistics and experimentation, ability to apply data insights to business problems, and culture fit. Rounds progress from initial screening through multiple technical assessments to final behavioral evaluation. The focus is on demonstrating learning potential, clear communication of problem-solving approach, and fundamental competency in core data science tools and concepts.
Interview Rounds
Recruiter Screening
What to Expect
Your first interaction with the company's hiring team. A recruiter will assess your background, technical foundation, motivation for joining the company, and cultural fit. They'll confirm you meet basic educational and experience requirements, discuss your relevant projects or internships, and verify your proficiency with core tools like SQL, Python, and statistics. This round determines whether you advance to technical interviews.
Tips & Advice
Prepare a 2-3 minute elevator pitch about your background, highlighting any data-related projects, internships, or coursework. Research the company and articulate genuine reasons for wanting to join beyond just the brand name. Have 1-2 concrete examples ready that demonstrate your technical skills and enthusiasm for data science. Use keywords from the job description like SQL, Python, A/B testing, machine learning, and data visualization. Be authentic about your skill level - recruiters appreciate honesty over exaggeration.
Focus Topics
Handling Questions About Gaps or Weaknesses
Being prepared to discuss any gaps in experience honestly (e.g., 'I haven't worked with TensorFlow professionally, but I'm familiar with scikit-learn and eager to learn'). Framing learning opportunities positively. Showing self-awareness about areas for growth.
Practice Interview
Study Questions
Motivation and Culture Fit
Articulating genuine reasons for interest in the company and role. Showing awareness of the company's mission, products, or impact. Demonstrating values alignment (e.g., curiosity, collaboration, learning mindset, drive for impact). Being able to describe your work style and how you collaborate with others.
Practice Interview
Study Questions
Technical Proficiency Confirmation
Demonstrating familiarity with core Data Scientist tools: SQL (basic queries), Python (data manipulation), statistics basics, and data visualization. Understanding the difference between correlation and causation, knowing what A/B testing is, and being able to explain your experience with machine learning frameworks if applicable.
Practice Interview
Study Questions
Background and Experience Communication
Effectively articulating your educational background, internships, academic projects, or personal projects with data. Being able to briefly explain what you learned and how it relates to the Data Scientist role. Demonstrating awareness of the role and company.
Practice Interview
Study Questions
Technical Phone Screen
What to Expect
A 45-60 minute virtual interview conducted via video call using a shared code editor. This round assesses your fundamental SQL and Python skills through live coding and data manipulation problems. You'll work on problems that simulate real data challenges, such as filtering datasets, calculating metrics, and joining tables. The interviewer will evaluate your ability to write working code, ask clarifying questions, and explain your approach. Efficiency, readability, and correctness all matter, but the evaluation emphasizes your problem-solving process and communication over perfect code.
Tips & Advice
Before writing code, take 1-2 minutes to understand the problem thoroughly by asking clarifying questions about data, expected output, and constraints. Outline your approach in pseudocode or verbally before implementing. Start with a working solution even if not optimal - correctness matters more than efficiency for entry level. Explain your logic as you write code. After finishing, walk through your solution step-by-step and check for edge cases like null values, empty datasets, or boundary conditions. If you get stuck, verbalize what you're thinking and ask for hints - interviewers appreciate honest communication. Write clean, readable code with meaningful variable names.
Focus Topics
Code Efficiency and Readability
Writing code that is readable with meaningful variable names and comments. Understanding time and space complexity at a basic level. Recognizing when a solution might be inefficient (e.g., nested loops instead of vectorized operations). Optimizing for clarity first, then efficiency.
Practice Interview
Study Questions
Edge Cases and Data Quality
Considering null/missing values, empty datasets, duplicate records, and outliers. Validating data before analysis. Handling different data types (integers, floats, strings, dates). Understanding how data quality issues affect analysis results. Testing solutions with edge cases.
Practice Interview
Study Questions
SQL Fundamentals
Writing basic SQL queries including SELECT, WHERE, GROUP BY, HAVING, ORDER BY clauses. Understanding different JOIN types (INNER, LEFT, RIGHT, FULL OUTER). Aggregating data with functions like COUNT, SUM, AVG, MAX, MIN. Calculating metrics like daily active users, retention, conversion rates. Filtering on multiple conditions. Basic understanding of indexes and query efficiency.
Practice Interview
Study Questions
Python Data Manipulation with Pandas and NumPy
Using Python libraries (pandas, NumPy) to manipulate datasets. Filtering rows and columns, handling missing values, merging/joining dataframes, calculating aggregations, working with different data types. Writing functions and loops. Debugging code. Basic string operations and working with lists/dictionaries. Understanding vectorization for efficiency.
Practice Interview
Study Questions
Problem-Solving Process and Communication
Asking clarifying questions before jumping into coding. Thinking aloud through your approach. Explaining the logic behind your solution. Handling confusion or mistakes gracefully. Requesting hints when stuck. Collaborating with the interviewer rather than treating it as a test to pass alone.
Practice Interview
Study Questions
Coding Interview - Data Manipulation and SQL
What to Expect
A 45-60 minute technical interview conducted on-site or virtually with a data scientist or analyst. This round goes deeper into SQL and Python coding than the phone screen, typically with 2-3 problems of moderate complexity. Problems often simulate real data science scenarios: combining multiple datasets, calculating complex metrics, handling data quality issues, or performing exploratory analysis. The interviewer assesses your problem-solving approach, ability to work with imperfect data, and how clearly you can explain your reasoning.
Tips & Advice
Start each problem by clarifying the requirements and edge cases. Break complex problems into smaller steps - solve the problem correctly first, then optimize if needed. For SQL problems, mentally trace through the query logic before executing. For Python, test your code mentally with sample data. Draw diagrams if helpful (e.g., sketching how to join tables). If stuck on one problem, move forward rather than spending too long. It's better to attempt two problems partially than spend all time on one. Explain your trade-offs when choosing between different approaches (e.g., 'I could use a nested loop which is simpler, or vectorize with NumPy which is faster').
Focus Topics
Problem Analysis and Approach Selection
Breaking down a data problem into steps. Identifying what information is available and what needs to be derived. Choosing between SQL vs Python vs a combination for different problems. Recognizing when different approaches are more appropriate.
Practice Interview
Study Questions
Handling Data Quality Issues
Identifying and handling missing values, duplicates, outliers, and inconsistent data types. Deciding when to filter out bad data vs when to impute or transform it. Understanding how data quality decisions affect analysis results. Validating your output against expectations.
Practice Interview
Study Questions
Advanced SQL Techniques
Writing complex queries with multiple JOINs, subqueries, and window functions (RANK, ROW_NUMBER, LAG, LEAD). Calculating running totals, moving averages, and consecutive event detection. Using CTEs (Common Table Expressions) for readability. Understanding UNION vs UNION ALL. Self-joins and complex filtering logic.
Practice Interview
Study Questions
Data Joining and Merging Strategies
Combining multiple tables or dataframes correctly using different join types. Understanding the implications of each join type (INNER, LEFT, RIGHT, FULL OUTER, CROSS). Handling many-to-many relationships and duplicate records. Identifying and resolving join keys. Dealing with mismatched or missing keys.
Practice Interview
Study Questions
Metric Calculation and Aggregation
Calculating business metrics like conversion rates, customer lifetime value, daily/weekly active users, churn rate, retention cohorts, and funnel analysis. Aggregating data at different levels (daily, weekly, user, segment). Using GROUP BY correctly with filtering. Understanding when to use HAVING vs WHERE.
Practice Interview
Study Questions
Statistics and Experimentation Interview
What to Expect
A 45-60 minute technical interview conducted by a data scientist or analytics specialist. This round tests your understanding of statistics, hypothesis testing, A/B testing, and experimental design. You'll likely be given a scenario like 'We want to test a new recommendation feature. How would you design an A/B test to measure its impact?' or 'How would you determine if a change in a metric is statistically significant?' The round evaluates your conceptual understanding of statistical thinking, ability to balance rigor with practical constraints, and how you translate business questions into statistical frameworks.
Tips & Advice
Don't feel pressured to solve everything with complex math - often the interviewer wants to see your thinking process more than statistical formulas. When presented with a business question, first clarify what you're trying to learn and why it matters. Design experiments that are practical and interpretable, not just theoretically perfect. Explain the purpose of each element (e.g., 'I'm using a control group so we can isolate the effect of the new feature'). Be honest about limitations of your approach. If you're unsure about a statistical concept, ask clarifying questions or reason through it logically. Entry-level candidates aren't expected to know everything - interviewers value clear thinking over perfect knowledge.
Focus Topics
Common Statistical Distributions and Concepts
Understanding normal distribution, binomial distribution, and Poisson distribution. Knowing when each applies. Understanding concepts like mean, median, standard deviation, variance. Understanding correlation vs causation. Basic probability concepts (conditional probability, independence).
Practice Interview
Study Questions
Interpreting and Communicating Results
Explaining what a p-value means in plain language. Communicating confidence intervals and what they represent. Describing results to non-technical stakeholders. Recognizing when statistical significance differs from practical significance. Highlighting limitations and caveats in findings.
Practice Interview
Study Questions
Experiment Design and Practical Considerations
Defining metrics to measure (primary and secondary). Estimating sample size and duration needed. Choosing between between-subjects and within-subjects designs. Considering confounding variables and how to control for them. Planning for randomization strategy. Discussing trade-offs between statistical rigor and practical constraints.
Practice Interview
Study Questions
A/B Testing Fundamentals
Understanding the purpose of A/B tests (isolating causality). Key components: hypothesis, control and treatment groups, randomization, sample size, and statistical significance. Calculating required sample size. Interpreting p-values and confidence intervals. Recognizing when A/B testing is appropriate vs other methods. Avoiding common pitfalls like peeking at results early or not randomizing properly.
Practice Interview
Study Questions
Hypothesis Testing and Statistical Significance
Understanding null and alternative hypotheses. Selecting appropriate statistical tests (t-test, chi-square, z-test) based on data type and question. Interpreting p-values (not as probability a result is correct, but probability of observing this data if null hypothesis is true). Understanding Type I and Type II errors. Determining significance level (alpha). Understanding power analysis at a basic level.
Practice Interview
Study Questions
Product Sense and Case Study Interview
What to Expect
A 45-60 minute technical interview conducted by a product manager or senior data scientist. This round evaluates your ability to apply data-driven thinking to business problems. You'll receive scenarios like 'How would you measure the success of a new feature?' or 'Our user retention is dropping - how would you investigate and what would you do?' The interviewer assesses how you frame business problems, identify relevant metrics, design approaches to answer questions, and communicate findings. This round tests judgment and business acumen alongside technical skills, showing whether you can work effectively on cross-functional teams.
Tips & Advice
Start by asking clarifying questions about the business problem, context, and constraints rather than jumping to solutions. For metric questions, think about leading indicators, lagging indicators, and trade-offs between them. Break complex problems into subquestions you can answer with data. Use your SQL/Python knowledge to suggest how you'd actually measure things. Discuss trade-offs in your approach (e.g., 'This metric is easier to measure but might not capture the full picture'). Don't assume the first idea is right - discuss alternatives and their pros/cons. Relate the analysis back to business impact - why does this matter? Entry-level candidates won't have extensive product experience, so interviewers value structured thinking more than deep product knowledge.
Focus Topics
Communication and Storytelling
Explaining your analysis approach in terms a product manager or executive would understand. Highlighting key findings concisely. Structuring findings to tell a coherent story. Acknowledging assumptions and limitations. Recommending actions based on insights.
Practice Interview
Study Questions
Feature Success Measurement
Designing measurement plans for new features including primary and secondary metrics. Defining guardrail metrics to ensure you're not optimizing for something at the expense of something else. Understanding ramp-up and stabilization periods for new features. Considering different user segments and whether feature affects them differently.
Practice Interview
Study Questions
Applying Data Science Techniques to Business Problems
Recognizing when A/B testing is appropriate vs observational analysis. Suggesting SQL queries or analysis approaches that would answer the business question. Understanding when you'd need advanced modeling vs simpler analysis. Connecting technical approaches to business decisions (e.g., 'This cohort analysis would tell us whether the decline is from existing users or new users').
Practice Interview
Study Questions
Business Metrics and KPI Definition
Identifying appropriate metrics for different business questions (e.g., engagement vs satisfaction vs monetization). Understanding leading vs lagging indicators. Choosing between absolute values, rates, and ratios depending on context. Defining metrics precisely (e.g., what counts as a daily active user?). Understanding metric trade-offs (e.g., optimizing for engagement might reduce monetization).
Practice Interview
Study Questions
Problem Framing and Root Cause Analysis
Breaking down vague problems into specific, answerable questions. Distinguishing between symptoms and root causes. Suggesting hypotheses for why something is happening. Outlining how you'd investigate using data. Building diagnostic funnels to isolate issues (e.g., if revenue is down, is it user acquisition, retention, or monetization?). Structuring problems in a way that suggests next steps.
Practice Interview
Study Questions
Behavioral and Culture Fit Interview
What to Expect
A 45-60 minute interview, often with a hiring manager or senior team member, focused on your background, work style, learning approach, and cultural fit. You'll discuss past projects, how you handle challenges, how you work with others, and your motivation for the role. The interviewer evaluates your curiosity, ability to learn, resilience, teamwork, and alignment with company values. For entry-level candidates, this round emphasizes learning potential, coachability, and collaborative mindset over deep experience.
Tips & Advice
Prepare concrete stories using the STAR method (Situation, Task, Action, Result) that illustrate how you learn, collaborate, handle challenges, and contribute to teams. Focus on projects or situations that show growth and learning rather than just successes. Be genuine - interviewers can tell when answers are rehearsed. Discuss how you handle feedback and failure. Show curiosity about the role and company beyond just the job responsibilities. Ask thoughtful questions about the team, culture, and what success looks like in the first 6-12 months. For entry-level, emphasizing learning ability and coachability matters more than years of experience.
Focus Topics
Handling Feedback and Criticism
Sharing an example of receiving critical feedback and how you responded. Discussing how you use feedback to improve. Showing growth from past mistakes. Explaining how you balance confidence with humility and openness to being wrong.
Practice Interview
Study Questions
Problem-Solving Under Uncertainty
Discussing situations where you didn't know the solution upfront and how you approached figuring it out. Sharing examples of overcoming obstacles or challenges on projects. Explaining how you break down ambiguous problems. Showing comfort with trying different approaches when the first one doesn't work.
Practice Interview
Study Questions
Motivation and Impact Orientation
Articulating genuine interest in using data to solve problems and drive impact. Discussing why data science appeals to you. Sharing examples of situations where insights or data changed decisions or outcomes. Showing understanding of how the data scientist role contributes to the company's mission.
Practice Interview
Study Questions
Learning Ability and Growth Mindset
Demonstrating through examples that you seek to learn and grow. Discussing technologies or techniques you've taught yourself. Sharing situations where you didn't know something and how you approached learning it. Showing comfort with being a beginner and willingness to ask for help. Explaining how you stay current with data science developments.
Practice Interview
Study Questions
Collaboration and Communication
Sharing examples of working effectively with teammates or on group projects. Discussing how you ask for help when stuck. Explaining how you explain technical concepts to non-technical people. Showing openness to feedback and different perspectives. Demonstrating ability to work with people who have different expertise.
Practice Interview
Study Questions
Frequently Asked Data Scientist Interview Questions
The product team wants to compress sprints and skip deep EDA to move faster. How would you make the case for investing the time anyway? What concrete evidence (like the proportion of past incidents traceable to data issues) would you bring, and what lightweight process would you propose instead of an all-or-nothing choice?
Sample Answer
Direct answer
Make the case with concrete evidence rather than a general appeal to rigor: bring data on what share of past incidents or bad decisions were traceable to a data issue that a thorough EDA pass would likely have caught, and propose a lightweight, time-boxed process instead of framing it as an all-or-nothing choice between "skip EDA" and "take a full day."
Building the advocacy case
Quantify the cost of skipping EDA in terms the team already tracks: incidents, wasted engineering time chasing a bad number, or a shipped feature that had to be walked back because of a data problem that could have been caught earlier. Then propose something concrete and cheap enough that "compress sprints" and "keep basic EDA" aren't actually in tension: a lightweight, standardized checklist (the kind of first-pass structural checks that take an hour, not the deep case-study kind that takes days) built into the sprint cadence rather than treated as a separate, cuttable phase.
Worked example
Reviewing the last two quarters of incidents, three of eleven were traceable to a data issue (a schema change nobody caught, a duplicate-event bug, a currency-unit mix-up) that a basic first-pass EDA checklist would very likely have surfaced before shipping. Bringing that specific number ("roughly a quarter of our incidents this half were data issues a one-hour check would likely have caught") alongside a proposed lightweight checklist template that fits inside a normal sprint, rather than asking for a separate EDA phase, reframes the ask from "give me more time" to "let's not cut the one-hour version of this."
Trade-offs and pitfalls
Avoid over-claiming: not every future incident would have been caught by a basic EDA pass, and inflating the number undermines the credibility of the argument. The strongest version of this pitch pairs a specific, honest track record with a concrete, low-cost proposal, rather than a general appeal to "we should always be thorough."
You are asked to document the known limitations of a dataset for non-technical analysts who will build on it. What key information should this documentation include (null semantics, expected lag/freshness, known gaps or sample-size caveats, confidence level, recommended and unsupported use cases), and how would you format and keep it discoverable, for example as a data-catalog entry or a README attached to the dataset, so a new analyst finds it before making a mistake rather than after?
Sample Answer
Direct answer
Documentation of a dataset's known limitations for non-technical analysts should cover null semantics (what a missing value actually means for this dataset), expected lag or freshness, known gaps or sample-size caveats, an explicit confidence level, and recommended versus unsupported use cases, formatted so a new analyst finds it before building on the dataset, not after making a mistake.
Structured elaboration
- Null semantics: does a NULL in this dataset mean "genuinely unknown," "not applicable," or "not yet arrived"? These have very different implications for how an analyst should treat them, and the distinction is rarely obvious from the data alone.
- Freshness/lag: how current is the data, and does that vary by field (some columns updated hourly, others only nightly)?
- Known gaps and sample-size caveats: any known missing time periods, undersampled segments, or known-unreliable subsets, stated explicitly rather than left for an analyst to discover the hard way.
- Confidence level and recommended use: what this dataset is well-suited for versus explicitly NOT suited for (a dataset good for directional trend analysis but not precise point-in-time reporting, for example), stated as clearly as the dataset's actual strengths.
- Discoverability: attach this documentation directly to the dataset in the data catalog or as metadata visible at the point an analyst would query it, rather than in a separate document they have to know to go looking for.
Worked example
A customer-satisfaction survey dataset's limitations doc states: "NULL in response_score means the respondent was shown the question but did not answer, not that they were never asked; response rate varies significantly by channel (68% email, 12% in-app), so channel-level comparisons of raw response counts will be misleading without normalizing by send volume; data before March 2024 uses a different 5-point scale rather than the current 10-point scale and is not directly comparable without an explicit rescaling; recommended for directional trend analysis, not appropriate as a precise measure of absolute satisfaction level for any single period." An analyst who reads this before building a quarter-over-quarter trend chart avoids a specific, predictable mistake (comparing raw scores across the 2024 scale change) that the doc calls out explicitly.
Trade-offs and pitfalls
Documentation that is accurate but buried (a wiki page nobody links to from the dataset itself) provides essentially none of its intended value, since an analyst who does not know to look for it will make exactly the mistake the documentation was written to prevent. The format matters as much as the content: attaching the caveats directly to the dataset's catalog entry, ideally surfaced in the query tool itself, is what actually changes analyst behavior, versus a separate document that exists but is never consulted.
You have robust data suggesting a feature should be rolled back, but engineering and marketing push back because of sunk campaign investments. How do you handle the decision, and how do you address the sunk-cost pressure?
Sample Answer
Direct answer: Separate the decision from the sunk cost explicitly, using the data as the anchor: state clearly that the campaign investment already spent is gone either way and cannot be recovered by continuing to run a feature that is now shown to be harmful, then focus the conversation on the go-forward cost of keeping versus rolling back.
Structured elaboration
- Name the sunk-cost reasoning directly and respectfully, since stakeholders pushing back are often doing so in good faith, not irrationally; acknowledge the investment was real and the intention behind it was reasonable, while being clear that the investment's size has no bearing on what happens going forward.
- Reframe the decision around the go-forward numbers only: what does keeping the feature cost from today onward (continued harm shown in the data), versus what does rolling back cost from today onward (any remaining campaign value that would be lost, any embarrassment or process cost of reversing course); compare those two forward-looking costs, not the money already spent.
- Bring the data itself into the room as the anchor for the conversation, rather than relying on personal authority to win the argument; if possible, quantify the ongoing cost of keeping the feature live in the same terms stakeholders already care about (the campaign's ROI, updated to reflect the newly-discovered harm) so the conversation happens on shared ground.
- If stakeholders still resist, propose a middle path that respects both the data and the organizational reality: a partial rollback, a time-boxed fix-and-recheck window, or a scoped rollback to the specific segment where the harm concentrates, rather than an all-or-nothing framing that invites maximal resistance.
Worked example: A promotional feature tied to a $2M marketing campaign shows clear experiment data that it reduces long-term customer value for a meaningful segment of exposed users. Engineering and marketing resist a full rollback, citing the campaign investment. The response separates the two questions explicitly: "the $2M is spent regardless of what we do today; the question in front of us is whether continuing to run this feature costs us more in ongoing customer value than the marginal campaign benefit we would lose by stopping now." Presenting the ongoing cost in the same dollar terms as the original campaign's expected ROI reframes the conversation productively, and the team agrees to a scoped rollback limited to the segment where the harm is concentrated, preserving the campaign's benefit for the segment where no harm was detected.
Trade-offs and pitfalls: The most common mistake is treating this purely as a persuasion problem (finding the right words to win the argument) rather than a framing problem (getting everyone to evaluate the same, correctly-scoped forward-looking comparison); once the framing is right, the argument often resolves itself. The other pitfall is proposing an all-or-nothing rollback when a scoped, partial option would address the actual harm while preserving legitimate value elsewhere, which needlessly maximizes organizational resistance to a decision that did not need to be all-or-nothing.
A project starting next quarter depends on an area you have no real depth in, and within about three months you are expected to be the person the team defers to on it. How would you build that depth, and how would you tell the difference between being genuinely ready and just being fluent in the vocabulary?
Sample Answer
Direct answer
I build depth in the same order I'd want to trust anyone else's expertise: reproduce something already known to be correct before attempting anything novel, set explicit checkpoints where I decide to continue, change approach, or escalate, and treat "genuinely ready" as a specific test, a real piece of my own work standing up to a domain expert's scrutiny, rather than the fluent feeling of finally being able to use the right vocabulary in a meeting.
How I would build the depth
Secure access first. Whatever gates the work, a dataset, a piece of hardware, compute, or access to the right people, I identify and secure it in week one rather than discovering three weeks in that I've been blocked the whole time. This is the dependency most likely to quietly eat a three-month timeline.
Sequence theory before building, but interleave rather than front-load. I learn just enough of the underlying fundamentals to understand why the standard approaches work, then move into hands-on work quickly and let each build cycle pull in more theory as it becomes necessary, rather than spending the first month purely reading before touching anything real.
Reproduce a known result before attempting anything new. Before I trust my own judgment here, I reproduce an existing, already-validated result: someone else's published finding, a vendor's documented benchmark, or a piece of work a teammate already completed correctly. If I can't reproduce something known to be right, I'm not ready to originate something new, no matter how fluent I've become in the terminology.
Set checkpoints with real decision criteria, not just calendar dates. At each checkpoint I ask explicitly: am I on track to continue as planned, do I need to pivot the approach, or is this blocked in a way that needs escalating now rather than being discovered in month three. I also decide my evaluation metrics before I start, not after, so I'm not tempted to redefine success once I see how the work is going.
Test readiness against an expert, not against my own confidence. The real test of "genuinely ready" is producing a piece of work with real stakes and having someone who already has depth in the area review it and try to break it. Passing that is different from holding a fluent conversation about the topic; vocabulary fluency is necessary but not sufficient, and it's the trap that makes people feel ready before they are.
Worked example
Given three months to become the team's authority on a caching and consistency mechanism the team was about to depend on for a major project, I first confirmed access to a realistic test environment, since the production-like setup was gated behind another team and would have cost two weeks if I'd waited to ask. I spent the first two weeks on the underlying theory just deeply enough to understand the trade-offs, then spent the rest of month one reproducing a known, previously documented failure mode from the vendor's own case studies in our environment, to prove I understood the mechanism rather than just its description. At a one-month checkpoint I judged myself on track and continued; at a two-month checkpoint, a contingency I had planned for, a related dependency becoming unavailable, actually happened, and having already thought through the fallback meant it cost days, not weeks. The real readiness test came in month three: I proposed a design that depended on this mechanism and had the engineer who had run it in production for years review it specifically to find where it would break under real load, not lab conditions. She found one case, a rare failure mode during a specific kind of failover, that I would not have caught, and that correction, not my ability to explain the mechanism fluently, is what told me I still had a gap to close.
Trade-offs and pitfalls
The trade-off is time spent proving readiness against time spent doing new work; skipping the reproduction and expert-review steps to move faster is exactly how vocabulary fluency gets mistaken for real depth. The most common pitfall is testing understanding only in lab or theoretical conditions and never against real, messier ones, which is precisely where the gap between fluent and ready tends to hide.
A key teammate, or the person leading a deliverable, leaves the project unexpectedly and cannot be replaced quickly, and you have to keep the work moving with reduced capacity. Walk through how you would replan the near-term roadmap: what you would triage or cut, what safeguards you would put in place so critical decisions still get proper review, how you would communicate the revised plan to stakeholders, and what you would document to reduce single-person dependency going forward.
Sample Answer
Direct answer
Separate two different problems that this situation creates: what work gets cut or deferred, and who now has the authority to make the calls the departed person used to make alone. The second one is the part most answers miss, and it matters most for whichever category of decision carries the highest risk if it goes unreviewed.
Decision framework
1. Triage by impact and reversibility. Classify remaining roadmap items into must-ship (a real customer or compliance commitment), valuable-but-deferrable, and nice-to-have. Cut the nice-to-have items immediately, and for the must-ship items, identify specifically which ones depended on the departed person's unique, undocumented knowledge.
2. Put a temporary safeguard on the highest-risk decisions specifically. Assign a temporary decision-owner, often the next most senior person or the manager, but require a mandatory second review for exactly the category of decision the departed person used to make solo, such as architecture or technical design calls, rather than letting one new person inherit unilateral authority by default.
3. Communicate the revised plan and the new decision process together. Stakeholders need both: what's cut or delayed, and who to go to for what while the arrangement is temporary.
4. Document to reduce single-person dependency going forward. Capture the departed person's undocumented reasoning, not just their outputs, and change the standing process so future high-risk work always has a documented secondary owner, not only as an emergency response this one time.
Worked example: the lead building a fraud-detection scoring pipeline, one of five people on the team, resigns with two weeks notice, and their replacement won't start for eight weeks. The quarter's roadmap has six remaining items. Triage: two items are customer-committed with a regulator-driven deadline (must-ship), three are deferrable roadmap improvements, and one is a nice-to-have refactor, which I cut for the quarter. Of the two must-ship items, one depends on undocumented model-threshold tuning logic that only the departed lead understood. Safeguard: I assigned a senior remaining engineer as temporary technical decision-owner for the pipeline, but required any threshold or architecture change to get a second review from a named machine learning engineer on an adjacent team, with a 24-hour service level agreement (SLA, a committed turnaround time) for that review, specifically because threshold changes carry real financial and compliance risk, and no single person on the reduced team had full context to safely decide alone. Communicate: I presented the revised roadmap (two must-ship items kept, three deferred, one cut) and the new temporary review process to department stakeholders and the departing lead's manager within the first week, explicit that this was an eight-week interim arrangement, not a permanent capacity cut. Document: I spent six hours of the departing lead's remaining two weeks in structured knowledge transfer specifically on the threshold-tuning logic, recorded as a written runbook plus a 40-minute screen-recorded walkthrough, and instituted a standing rule that any pipeline with real financial or compliance impact must have two people who can explain its core logic, verified at each quarterly review.
Second example (different discipline): a content team's sole search-engine-optimization (SEO) strategist leaves mid-quarter. The editorial lead cuts two experimental content formats, keeps the core publishing cadence, puts a temporary two-person review on any page-structure or metadata change since that was the departed strategist's unilateral domain, tells stakeholders to expect a lighter cadence for six weeks, and documents the strategist's undocumented keyword-research process into a shared playbook so the next hire isn't starting from zero.
Trap to avoid
The mediocre answer treats this purely as a staffing or backfill problem, "we'd hire quickly" or "redistribute the work," without addressing the governance gap: who now has the authority the departed person had, and what specifically stops a wrong high-stakes call from going unreviewed simply because there's no one left who would have caught it.
Explain CUPED (Controlled Experiments Using Pre-Experiment Data) as a variance-reduction technique for A/B tests. Describe what pre-experiment data it requires, the assumptions it relies on, and in plain terms how the adjustment is computed. What makes a pre-experiment covariate a good or a poor choice for CUPED, and what goes wrong if you pick a poor one?
Sample Answer
Direct answer
CUPED (Controlled-experiment Using Pre-Experiment Data) is a variance-reduction technique, published by Microsoft researchers (Deng, Xu, Kohavi and Walker, 2013), that uses a metric measured before the experiment started to strip out some of the between-user noise in the outcome metric, without touching the unbiasedness of the treatment-effect estimate. It requires one thing: a pre-experiment value of a covariate, ideally the same metric you are about to test, measured for the same units, from a period before assignment happened (so it cannot itself have been affected by treatment). The payoff is a tighter estimate of the same treatment effect from the same traffic, which functionally means you can detect the same effect size with less traffic or in less time.
Structured elaboration
What it requires and assumes
- A pre-experiment covariate X for every unit, measured strictly before random assignment (so treatment cannot have influenced it) and ideally correlated with the outcome Y you're testing.
- The scaling coefficient must be estimated without using the treatment label, typically pooled across both arms or from control alone. This is what keeps the adjustment from injecting bias: you are not letting "knowledge of which arm someone is in" leak into how you weight their pre-period value.
How the adjustment is computed, in plain terms
For each unit, adjust its outcome by subtracting a scaled version of how far its pre-experiment covariate was from the population average:
YiCUPED=Yi−θ(Xi−Xˉ)
where the scaling coefficient is the population covariance of X and Y divided by the variance of X:
θ=Var(X)Cov(X,Y)
Intuitively: if a user's pre-period activity was above average, some of their post-period activity being above average too is "expected" and not informative about treatment, so it gets subtracted out. The treatment effect is then estimated as the difference in adjusted outcome means between arms, YˉtreatCUPED−YˉcontrolCUPED, which is algebraically the same as the raw mean difference minus θ times the pre-period mean difference between arms; since randomization makes that pre-period difference expected to be zero, the adjustment does not shift the expected value of the estimate, it only removes the part of each unit's variance that X already explained.
The resulting variance reduction has a clean form: if ρ is the correlation between the pre-experiment covariate and the outcome, the adjusted estimator's variance is (1−ρ2) times the unadjusted variance. A stronger pre-period predictor buys a bigger reduction; a weak one buys almost nothing.
What makes a covariate good or poor
| Property | Good covariate | Poor covariate |
|---|---|---|
| Timing | Strictly pre-experiment, cannot be touched by treatment | Measured after assignment, or partially overlapping the experiment window |
| Correlation with Y | Strong (ideally the same metric's own pre-period value) | Weak or unrelated |
| Availability | Present for essentially all units (e.g., existing users with history) | Missing for a large share of units (e.g., brand-new users with no pre-period) |
| Stability | A stable behavioral trait | Noisy, one-off pre-period value |
What goes wrong with a poor choice
- Using a post-treatment or treatment-adjacent value as X breaks the "cannot be affected by treatment" requirement and reintroduces bias: you would be conditioning on something treatment itself moved, which is a different and more serious problem than losing precision.
- Using a weakly correlated covariate costs almost nothing in bias but also buys almost nothing in variance reduction; the (1−ρ2) factor is close to 1.
- Using a covariate that is missing for a large share of units (commonly new users with no pre-period history) forces a choice: drop those units (losing sample and possibly biasing toward existing users) or impute a value (introducing a modeling assumption you did not need before).
Worked example
Suppose, for illustration, we assume a pre-experiment 7-day conversion rate correlates with the in-experiment conversion rate at ρ=0.6 for a given product (a hypothetical, stated input, not an empirical claim about any real product). The variance reduction from CUPED is then derived directly:
Var(Y)Var(YCUPED)=1−ρ2=1−0.62=1−0.36=0.64
So the adjusted estimator's variance is 64% of the unadjusted one, a 36% reduction, given only the stated assumption ρ=0.6. If ρ had instead been a weak 0.2, the reduction would be 1−0.04=0.96, i.e., only a 4% cut, illustrating why the strength of the pre-period correlation, not just its existence, determines whether CUPED is worth implementing for a given metric.
Trade-offs and pitfalls
- CUPED does not help metrics with no meaningful pre-experiment history, most obviously new-user-only experiments; for those, look at stratification or other covariate-adjustment techniques instead.
- Estimating θ using data that has already been split by arm (rather than pooled or control-only) risks contaminating the coefficient with treatment information; keep the estimation step blind to arm assignment.
- CUPED reduces variance, it does not change what the true effect is; do not present the tighter confidence interval as evidence the effect itself grew, only that you can now see it more precisely.
- CUPED composes with stratified randomization (apply the adjustment within strata), which is a reason to know both rather than treat them as competing choices.
Discuss when NumPy vectorized aggregation can meaningfully outperform pandas groupby for aggregating millions of rows by category label, and show a concrete example of that speedup. Then explain when pandas' own groupby implementation is preferable despite the difference.
Sample Answer
Direct answer: NumPy vectorized aggregation (integer-encode the category labels, then np.bincount) can meaningfully outperform pandas.groupby for simple numeric reductions like sum, count, or mean on a single column, because it skips the general-purpose machinery groupby carries for mixed dtypes, missing values, and multi-column, multi-aggregation pipelines. Once your aggregation needs any of that generality, pandas.groupby becomes the better choice again, both for correctness and for how much code you'd otherwise have to hand-write and maintain.
Structured elaboration, worked end to end (verified, pandas 3.0.3, numpy 2.5.1, seed 0, 20 rows, 4 groups, fully reproducible):
When NumPy wins: you have one (or a few) numeric column(s), a single simple reduction (sum, count, mean), category labels that can be mapped to small contiguous integers, and no missing values to reason about. np.bincount computes a per-group sum or count in one pass with none of groupby's dtype dispatch, index bookkeeping, or Python-level overhead per group.
import numpy as np
import pandas as pd
rng = np.random.RandomState(0)
N, G = 20, 4
groups = rng.randint(0, G, size=N).astype(np.int32)
values = rng.randn(N)
sums = np.bincount(groups, weights=values) # per-group sum, one pass
counts = np.bincount(groups) # per-group count
means = sums / counts # handle any zero-count group separately
print('sums =', sums)
print('counts =', counts)
print('means =', means)
Verified output: sums = [-0.4656, -0.0095, 4.4562, 1.9245], counts = [6, 4, 3, 7], means = [-0.0776, -0.0024, 1.4854, 0.2749] for groups 0-3.
If you need to accumulate in place or handle repeated indices explicitly rather than via weights=, np.add.at is the safe alternative:
acc = np.zeros(G, dtype=np.float64)
np.add.at(acc, groups, values)
print('np.allclose(acc, sums) =', np.allclose(acc, sums))
Verified: acc equals sums above exactly (np.allclose(acc, sums) is True).
Correctness check against pandas.groupby, same data:
df = pd.DataFrame({'cat': groups, 'val': values})
means_pd = df.groupby('cat')['val'].mean()
print('means_pd (sorted by group) =', means_pd.sort_index().to_numpy())
print('max abs difference =', np.max(np.abs(means_pd.sort_index().to_numpy() - means)))
Verified output: means_pd (sorted by group) is [-0.077606, -0.002381, 1.485384, 0.274924], identical to means above to 15 decimal places, max absolute difference 5.6e-17 (floating-point rounding noise, not a real difference). This confirms both approaches compute the identical aggregation on real data, so the choice between them is purely about performance and generality, not correctness. (Wall-clock timing numbers are intentionally omitted here since they are hardware- and environment-dependent and this small fixture is too small to be a fair benchmark anyway; the mechanism below is what actually explains the gap at scale.)
Why NumPy is faster for this narrow case: np.bincount is a single specialized C loop over a pre-encoded integer array with no per-row dtype checks, no handling of missing group labels, and no construction of an intermediate grouped-object representation. pandas.groupby builds a grouping object, handles arbitrary key types (strings, categoricals, tuples of columns), preserves index alignment, and supports dozens of aggregation functions and multi-column .agg() dictionaries, all of which cost something even when your specific case doesn't need it.
When pandas.groupby is preferable despite the difference
- Mixed dtypes or non-numeric group keys,
groupbyhandles string, categorical, and datetime keys directly; you would have to build your own integer encoding by hand for NumPy. - Missing values that need to be preserved or explicitly excluded,
groupbyhas consistent, well-testedNaN(not-a-number, pandas' missing-value marker) handling; a hand-rolledbincountpipeline requires you to reimplement that correctly. - Multiple different aggregations per column or across columns in one pass, e.g.
df.groupby('cat').agg({'sales': 'sum', 'user': 'nunique'}), this is one readable call in pandas versus several hand-written NumPy passes. - Time-aware or hierarchical grouping (resampling,
groupby(level=...)on aMultiIndex). - Code clarity and fewer manual edge-case bugs: division-by-zero on empty groups, sort/stability guarantees, and correct alignment back to the original frame are all handled for you.
Complexity: both approaches are O(n) in the number of rows for a single-pass reduction like sum or count; the difference is in the constant factor, not the asymptotic order, bincount has a smaller constant because it avoids groupby's per-row dispatch and object overhead. Memory is O(G) for both, where G is the number of distinct groups (the accumulator array in one case, the grouped result index in the other), so this trade-off is about per-row overhead and generality, not about complexity class.
Trade-offs and pitfalls
- Reach for the NumPy path only when you can cleanly map categories to small contiguous integers up front (
pd.factorizedoes this for you and returns exactly whatbincountneeds) and your aggregation genuinely is that simple. Building and maintaining that encoding for a case that doesn't actually need the speed is wasted complexity. - Benchmark on your real data and hardware before committing to the NumPy path in a production pipeline, the size of the gap depends heavily on group count, row count, and dtype, and
groupby's internal implementation improves across pandas releases. - A common middle ground: use
pandas.groupbyfor exploratory work and multi-aggregation reporting, and drop to a NumPy pre-aggregation pass only in a narrow, profiled hot path where it has been measured to matter.
Explain the conversion-rate formula and the common pitfalls when measuring it. Discuss denominator selection (sessions vs. unique users vs. qualified users), deduplication, bots, and attribution windows, and how these choices can change the interpretation of a reported conversion-rate change.
Sample Answer
Direct answer
Conversion rate is conversions divided by a chosen denominator, and the denominator choice is the single biggest source of misinterpretation: sessions, unique users, and qualified users answer different questions and can move in opposite directions from the same underlying data. Deduplication rules, bot filtering, and the attribution window compound that risk.
Structured elaboration
| Denominator | What it measures | Distortion risk |
|---|---|---|
| Sessions | Conversions per visit | Inflated or deflated by how often the same person visits, independent of whether their intent changed |
| Unique users | Conversions per person | Insensitive to visit frequency; better for reading a user-level experiment or lifetime-value framing |
| Qualified or eligible users | Conversions per person who could plausibly convert (for example, saw the call-to-action) | Requires a precisely defined precondition; a subtly wrong precondition silently changes the reported number |
Other pitfalls compound the denominator choice: deduplicate repeat conversions according to an explicit business rule (funnel-step conversion is usually deduped per user, while lifetime-value counting may allow repeats); resolve identity across devices (an authenticated user_id, or a deterministic cross-device link) before trusting a "unique users" denominator at all, since the same person on a phone and a laptop is otherwise silently counted as two separate users, understating the true per-person rate; filter known bots and test traffic before computing the rate rather than adjusting after the fact; and choose an attribution window (same-day, 7-day, 30-day) and touch model (last-touch versus multi-touch) that matches how long the product's typical purchase decision actually takes.
The same reasoning is not specific to "conversion rate": any X-per-Y ratio metric built the same way, for example an engagement rate defined as engaged users divided by some population, faces the identical three-way sessions/users/qualified-users choice, the identical deduplication and cross-device question, and the identical bot-filtering discipline. Getting the denominator right is a general metric-definition skill, not a conversion-specific one.
Worked example
Consider a checkout redesign tested against the same 15,000 unique users in both control and treatment, where the redesign happens to make people browse more before converting.
Control: 20,000 sessions1000 conversions=5.00%,15,000 users1000≈6.67% Treatment: 25,000 sessions1050 conversions=4.20%,15,000 users1050=7.00% Session-based relative change=5.004.20−5.00=−16.0%,User-based relative change=6.677.00−6.67≈+5.0%Reported on sessions, the redesign looks like a 16% regression. Reported on unique users, the same underlying data shows a genuine 5% improvement: the same population converted more often, they just also returned to the site more often per person, which inflates the session count without representing a real drop in intent-to-convert. Switching only the denominator flips the conclusion from "kill this feature" to "ship it."
Trade-offs & pitfalls
- Reporting only one denominator without stating it invites stakeholders to compare periods where the true unit changed (a redesign that structurally alters sessions-per-user, for example); always publish the denominator definition next to the rate.
- Bot and test traffic dilutes whichever denominator is chosen; filter it upstream rather than adjusting the formula after the fact.
- Attribution-window choice trades undercounting slow conversions (window too short) against overcounting exposures unrelated to the observed session (window too long); pick a window matched to the typical purchase-consideration cycle and state it.
- Always report the raw counts, numerator and denominator, next to the percentage, so a reader can sanity-check both the direction of the change and the sample size behind it.
You need to combine rows from two or more sources whose schemas don't quite match (different column names, or one source missing a column the others have). Write a UNION ALL that normalizes the columns first, and explain the choices you made for any column that only exists on one side.
Sample Answer
Direct answer. Write out each source's SELECT explicitly, renaming columns to a common set of names and adding any column that's missing on one side as an explicit NULL (or a sensible default) cast to the right type, so every branch of the UNION ALL produces an identically-shaped row.
Structured elaboration. UNION ALL requires the same number of columns, in the same order, with compatible types, across every branch, it does NOT reconcile mismatched column names or missing columns for you. The fix is mechanical: pick one canonical column list, and for each source, alias its columns to match, and explicitly supply a typed NULL for any column that source doesn't have at all.
Worked example. logs_v1(event_time, event_type): ('2025-01-01 10:00:00', 'view'). logs_v2(ts, type, user_id): ('2025-01-01 11:00:00', 'click', 5) (logs_v2 has an extra user_id column that logs_v1 lacks entirely).
SELECT event_time, event_type, CAST(NULL AS INTEGER) AS user_id FROM logs_v1
UNION ALL
SELECT ts AS event_time, type AS event_type, user_id FROM logs_v2
ORDER BY event_time;
Result: ('2025-01-01 10:00:00', 'view', NULL), ('2025-01-01 11:00:00', 'click', 5). logs_v1's rows correctly show a NULL user_id (since that source never captured it), and both sources' columns are now under one consistent set of names.
Trade-offs and pitfalls. The choices you make for a column that only exists on one side matter: a bare NULL correctly communicates "this source never captured this," and is usually the honest choice; a manufactured default (0, or an empty string) can look like real data to anyone querying the combined view later and should only be used if it's genuinely meaningful, not just to avoid a NULL. It's also worth explicitly casting the NULL to the target type (as shown above), since some engines will otherwise infer a type for an untyped NULL that doesn't match the corresponding column in the other branch, causing a type-mismatch error or an unwanted implicit cast across the whole UNION.
Reverse a singly linked list in place and return the new head, in O(n) time and O(1) extra space. Walk through both the iterative and the recursive version, and note what the recursive one costs you that the iterative one does not.
Sample Answer
Direct answer
Walk the list once, and at each node redirect its next reference back to the previous node before advancing, using three tracking references: previous, current, and a temporary save of current's original next. This is O(n) time and O(1) space. A recursive version expresses the identical rewiring, handling everything after the current node first and then flipping the one link back, but it pays for that with O(n) call-stack space that the iterative version does not need.
Structured elaboration
The iterative three-pointer dance. Before overwriting curr.next, save it in a temporary variable, or the rest of the list is lost permanently. Then point curr.next back at prev, advance prev to curr, and advance curr to the saved temporary. Repeat until curr is empty.
The recursive version. The base case is an empty list or a single remaining node, which is already "reversed" as-is. Otherwise, recursively reverse everything after the head first; that recursive call returns the new head of the whole reversed list. Then head.next.next = head flips the one link connecting the old head back into the newly-reversed remainder, and head.next = None prevents the old head from accidentally pointing at itself in a two-node cycle.
What language a solution is written in does not change any of this. The reskin into Python, JavaScript, Swift, or Kotlin, or building the linked-list node class from scratch first, is the same pointer-rewiring skill underneath; only the syntax for holding and dereferencing a reference changes, not the three-step relinking logic itself.
Worked example
class Node:
def __init__(self, val, next=None):
self.val = val
self.next = next
def reverse_iterative(head):
prev = None
curr = head
while curr:
next_tmp = curr.next # save before overwriting
curr.next = prev
prev = curr
curr = next_tmp
return prev
def reverse_recursive(head):
if head is None or head.next is None:
return head
new_head = reverse_recursive(head.next)
head.next.next = head
head.next = None
return new_head
def to_list(head):
out = []
while head:
out.append(head.val)
head = head.next
return out
def build_list(vals):
dummy = Node(0)
tail = dummy
for v in vals:
tail.next = Node(v)
tail = tail.next
return dummy.next
if __name__ == "__main__":
print(to_list(reverse_iterative(build_list([1, 2, 3, 4]))))
print(to_list(reverse_recursive(build_list([1, 2, 3, 4]))))
Running this prints [4, 3, 2, 1] twice, once from each implementation.
Complexity
Time: O(n) for both the iterative and recursive versions, since each one visits every node exactly once.
Space: O(1) extra for the iterative version (three pointer variables regardless of list length); O(n) for the recursive version, from the call stack, since the recursion descends one frame per node before any relinking happens.
Edge cases
- Empty list (
headisNone): both versions returnNoneimmediately without any relinking. - Single-node list: both versions return that same node unchanged as the new head, since there is nothing to reverse.
- Very long list: the recursive version risks an actual stack overflow, since typical call-stack depth limits are far smaller than what a linked list can otherwise hold in memory.
Trade-offs & pitfalls
The recursive version risks an actual stack overflow on a very long list in production, not just an academic concern, since typical call-stack depth limits are far smaller than what a linked list or array can otherwise hold in memory. The single most common bug in the iterative version is forgetting to save curr.next before overwriting it, which permanently disconnects the rest of the list from anything still reachable.
Recommended Additional Resources
- LeetCode - SQL and Python coding problems similar to FAANG interview questions
- StrataScratch - Real data science interview questions from top tech companies
- HackerRank - Coding challenges including SQL and statistics problems
- Cracking the Coding Interview by Gayle Laakmann McDowell - Technical interview preparation guide applicable to data science roles
- Trustworthy Online Controlled Experiments by Kohavi, Tang, Xu - Comprehensive resource on A/B testing and experimental design
- Mode Analytics SQL Tutorial - Free SQL practice and learning resource
- Kaggle Learn - Free courses on Python, SQL, and statistics for data science
- Case Studies in Data Science interviews - Practice explaining feature measurement and business problem solving
- STAR Method preparation - Structure example stories from projects and internships (Situation, Task, Action, Result)
Search Results
Google Data Scientist Interview Guide (2025) – Process, Questions ...
Ace your Google data scientist interview with our 2025 guide. Get the latest interview process breakdown, real sample questions, and expert preparation tips ...
Google Data Scientist Interview Questions
The Google data scientist interview questions asked in this round cover various topics, such as Statistics, Python, Machine Learning, Big Data, SQL, A/B Testing ...
Meta (Facebook) Data Scientist Interview Guide - Exponent
Interview Prep · Write SQL queries daily · Review A/B testing design and randomization methods · Brush up on probability, statistics, and regression basics.
StrataScratch: Master Coding for Data Science
StrataScratch is a data science interview platform that has over 1000+ real interview questions from top tech companies like Facebook, Amazon, Google, ...
Advice to pass your next job interviews - IGotAnOffer
Complete guide to TikTok data scientist interviews. Learn more about the role, the interview process, practice with example questions, and get all the ...
This interview preparation guide was generated using AI-powered research from the sources listed above. While we strive for accuracy, we recommend verifying critical information from official company sources.
Want to create your own tailored preparation guide using our deep research?
Get Started for FreeInterview-Ready Courses
Visual-first, interactive, structured learning paths