Питання на співбесіді Data Analyst 2026: Повний посібник з SQL, Python та аналітики

Комплексний посібник з питань на співбесіді для аналітиків даних, що охоплює віконні функції SQL, операції Python pandas, статистичні концепції та бізнес-сценарії, які компанії задають у 2026 році.

Питання на співбесіді Data Analyst 2026

Питання на співбесіді для аналітика даних у 2026 році перевіряють три ключові сфери: володіння SQL, маніпуляції з даними в Python та вирішення бізнес-задач. Такі компанії, як Google, Meta та Amazon, стандартизували свої технічні співбесіди навколо цих навичок, а віконні функції SQL та операції pandas зустрічаються більш ніж у 80% співбесід згідно зі звітом Glassdoor про тренди найму 2026.

На що звертають увагу інтерв'юери

Найсильніші кандидати демонструють не лише знання синтаксису, а й здатність пояснити свій аналітичний підхід. Інтерв'юери оцінюють, чи може кандидат перетворити бізнес-питання на технічний запит і донести результати до нетехнічних зацікавлених сторін.

Віконні функції SQL: Найпоширеніша тема співбесід

Віконні функції зустрічаються майже на кожній технічній співбесіді для аналітиків даних. На відміну від агрегатних функцій, які згортають рядки, віконні функції виконують обчислення над набором рядків, пов'язаних з поточним рядком, зберігаючи дані окремих рядків.

Питання: Обчисліть зарплату кожного працівника як відсоток від загальної зарплати його відділу.

sql
-- employee_salary_percentage.sql
SELECT 
    employee_id,
    department,
    salary,
    -- SUM as window function preserves each row
    ROUND(
        salary * 100.0 / SUM(salary) OVER (PARTITION BY department),
        2
    ) AS pct_of_dept_salary
FROM employees
ORDER BY department, pct_of_dept_salary DESC;

Клауза PARTITION BY створює окремі вікна для кожного відділу. Зарплата кожного працівника ділиться на суму по його відділу, а не по всій компанії. Ця різниця спантеличує багатьох кандидатів, які замість цього використовують підзапит або з'єднання.

Питання: Знайдіть наростаючий підсумок продажів за датою, скидаючи його щомісяця.

sql
-- monthly_running_total.sql
SELECT
    sale_date,
    amount,
    SUM(amount) OVER (
        PARTITION BY DATE_TRUNC('month', sale_date)
        ORDER BY sale_date
        -- Default frame: RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
    ) AS monthly_running_total
FROM sales
ORDER BY sale_date;

Інтерв'юери очікують, що кандидати знають поведінку віконної рамки за замовчуванням. Без явної клаузи ROWS або RANGE рамка простягається від початку розділу до поточного рядка, що дає наростаючий підсумок. Практикуйте ці патерни з модулем віконних функцій SQL.

CTE та підзапити: Організація складних запитів

Загальні табличні вирази (CTE) роблять запити читабельними та легкими для підтримки. Інтерв'юери оцінюють, чи структурують кандидати запити логічно, а не пишуть монолітні вирази.

Питання: Знайдіть клієнтів, які здійснювали покупки в послідовні місяці.

sql
-- consecutive_month_purchasers.sql
WITH monthly_purchases AS (
    -- Step 1: Get distinct customer-month combinations
    SELECT DISTINCT
        customer_id,
        DATE_TRUNC('month', purchase_date) AS purchase_month
    FROM orders
),
with_prev_month AS (
    -- Step 2: Add previous purchase month for each customer
    SELECT
        customer_id,
        purchase_month,
        LAG(purchase_month) OVER (
            PARTITION BY customer_id 
            ORDER BY purchase_month
        ) AS prev_purchase_month
    FROM monthly_purchases
)
-- Step 3: Filter to consecutive months only
SELECT DISTINCT customer_id
FROM with_prev_month
WHERE purchase_month = prev_purchase_month + INTERVAL '1 month';

Цей патерн поєднує CTE з віконною функцією LAG. Розбиття запиту на іменовані кроки демонструє процес мислення, який інтерв'юери цінують не менше, ніж правильну відповідь.

Python Pandas: Основи маніпуляції даними

Питання pandas тестують навички очищення, агрегації та трансформації даних. Інтерв'юери представляють неупорядковані набори даних і просять кандидатів витягти інсайти.

Питання: Маючи DataFrame сесій користувачів, обчисліть середню тривалість сесії за сегментом користувачів, виключаючи сесії коротші за 10 секунд.

python
# session_analysis.py
import pandas as pd

def analyze_sessions(df: pd.DataFrame) -> pd.DataFrame:
    """Calculate average session duration by user segment.
    
    Args:
        df: DataFrame with columns [user_id, segment, session_start, session_end]
    
    Returns:
        DataFrame with average duration per segment
    """
    # Calculate duration in seconds
    df['duration_seconds'] = (
        df['session_end'] - df['session_start']
    ).dt.total_seconds()
    
    # Filter short sessions and aggregate
    return (
        df[df['duration_seconds'] >= 10]
        .groupby('segment')
        .agg(
            avg_duration=('duration_seconds', 'mean'),
            session_count=('user_id', 'count')
        )
        .round(2)
        .reset_index()
    )

Відповідь демонструє ланцюжок методів, обробку datetime та функцію agg з іменованими виходами. Інтерв'юери перевіряють, чи фільтрують кандидати до агрегації, а не після, що спотворило б середні значення.

Питання: Об'єднайте два DataFrame та належним чином обробіть відсутні значення.

python
# merge_and_clean.py
import pandas as pd
import numpy as np

def merge_user_data(
    users: pd.DataFrame,
    transactions: pd.DataFrame
) -> pd.DataFrame:
    """Merge user demographics with transaction history.
    
    Users without transactions get total_spent = 0.
    Transactions without user data are excluded.
    """
    merged = pd.merge(
        users,
        transactions.groupby('user_id')['amount'].sum().reset_index(),
        on='user_id',
        how='left'  # Keep all users, even without transactions
    )
    
    # Fill NaN for users with no transactions
    merged['amount'] = merged['amount'].fillna(0)
    merged.rename(columns={'amount': 'total_spent'}, inplace=True)
    
    return merged

Параметр how='left' та явна обробка fillna показують увагу до граничних випадків. Кандидати, які використовують how='inner', втрачають користувачів без транзакцій, що змінює популяцію аналізу.

Готовий до співбесід з Data Analytics?

Практикуйся з нашими інтерактивними симуляторами, flashcards та технічними тестами.

Статистичні концепції: Що аналітики повинні чітко пояснювати

Статистичні питання оцінюють, чи можуть кандидати застосовувати концепції до реальних бізнес-проблем і доносити результати до зацікавлених сторін.

Питання: Продакт-менеджер стверджує, що новий процес оформлення замовлення збільшив конверсію на 5%. Тест тривав один тиждень з 10 000 користувачів на варіант. Чи є цей результат статистично значущим?

Повна відповідь охоплює розмір вибірки, статистичну потужність та практичну значущість:

  1. Обчисліть стандартну похибку: Для показників конверсії SE = sqrt(p(1-p)/n). При базовій конверсії 10% та n=10 000, SE дорівнює приблизно 0,003.

  2. Обчисліть z-оцінку: 5% відносне зростання означає, що нова конверсія становить 10,5%. Різниця в 0,5 відсоткового пункту, поділена на об'єднану SE, визначає значущість.

  3. Врахуйте практичну значущість: Навіть якщо p < 0,05, зростання на 0,5 відсоткового пункту може не виправдати інженерних витрат на новий процес.

  4. Перевірте на заплутувальні фактори: Один тиждень охоплює патерни вихідних та робочих днів, але може пропустити місячні цикли або сезонні ефекти.

Інтерв'юери цінують кандидатів, які ставлять під сумнів припущення, а не механічно обчислюють p-значення. Модуль принципів візуалізації даних охоплює представлення цих результатів.

Питання: Поясніть різницю між кореляцією та причинно-наслідковим зв'язком на бізнес-прикладі.

Продажі морозива та випадки утоплення позитивно корелюють. Обидва зростають влітку через заплутувальну змінну температури. Рекомендувати скорочення виробництва морозива для запобігання утопленням — означає плутати кореляцію з причинністю.

У бізнес-аналітиці: рекламні витрати та дохід часто корелюють, але зв'язок може відображати те, що компанії збільшують рекламні витрати, коли прогнози доходів вже сильні, а не те, що реклама генерує дохід. Встановлення причинності вимагає контрольованих експериментів або методів причинного висновку, таких як різниця в різницях.

Бізнес-кейси: Перетворення проблем на запити

Кейсові питання тестують здатність розкладати неоднозначні бізнес-проблеми на конкретні аналітичні кроки.

Питання: Утримання користувачів впало на 15% минулого місяця. Як би ви це досліджували?

Структурований підхід:

  1. Валідуйте метрику: Підтвердіть, що визначення утримання відповідає історичним обчисленням. Перевірте проблеми з пайплайном даних або зміни в трекінгу.

  2. Сегментуйте падіння: Розбийте утримання за когортою користувачів, каналом залучення, типом пристрою та географією. 15% загальне падіння може бути 50% падінням в одному сегменті, що маскує стабільність в інших.

  3. Визначте час: Чи утримання падало поступово чи раптово? Раптове падіння вказує на зміну продукту або баг. Поступове зниження вказує на ринкові або конкурентні фактори.

  4. Корелюйте з подіями: Зіставте часову шкалу з релізами продукту, маркетинговими кампаніями, запусками конкурентів та зовнішніми подіями.

  5. Сформулюйте гіпотези: На основі патернів сегментації запропонуйте тестовані пояснення та дані, необхідні для підтвердження або спростування кожного з них.

sql
-- retention_by_cohort.sql
WITH user_cohorts AS (
    SELECT
        user_id,
        DATE_TRUNC('week', created_at) AS cohort_week
    FROM users
),
weekly_activity AS (
    SELECT
        user_id,
        DATE_TRUNC('week', activity_date) AS activity_week
    FROM user_events
)
SELECT
    c.cohort_week,
    a.activity_week,
    COUNT(DISTINCT a.user_id) AS active_users,
    COUNT(DISTINCT c.user_id) AS cohort_size,
    ROUND(
        COUNT(DISTINCT a.user_id) * 100.0 / COUNT(DISTINCT c.user_id),
        1
    ) AS retention_pct
FROM user_cohorts c
LEFT JOIN weekly_activity a 
    ON c.user_id = a.user_id 
    AND a.activity_week >= c.cohort_week
GROUP BY c.cohort_week, a.activity_week
ORDER BY c.cohort_week, a.activity_week;

Цей запит когортного аналізу генерує дані, необхідні для кроку 2. Модуль когортного утримання охоплює варіації цього патерну.

Домашні завдання: Що оцінюють рецензенти

Багато компаній включають домашні завдання тривалістю від 2 до 4 годин. Рецензенти оцінюють подання за якістю коду, аналітичною строгістю та комунікацією.

Типове завдання: Маючи набір даних транзакцій електронної комерції, визначте фактори, що передбачають відтік клієнтів.

Сильні подання мають спільні характеристики:

  • Спочатку дослідницький аналіз: Описова статистика, графіки розподілу та оцінка відсутніх значень перед моделюванням
  • Інженерія ознак: Створення релевантних ознак, таких як давність, частота, грошова цінність (RFM) та індикатори трендів
  • Обґрунтування вибору моделі: Пояснення, чому логістична регресія або випадковий ліс підходить для проблеми, а не просто запуск налаштувань за замовчуванням
  • Підхід до валідації: Використання розбиття на основі часу замість випадкового, щоб уникнути витоку даних
  • Чітка комунікація: Виконавче резюме на початку, технічні деталі в додатку, візуалізації, що підтримують висновки
python
# churn_analysis_structure.py
import pandas as pd
from sklearn.model_selection import TimeSeriesSplit
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import precision_recall_curve, auc

def create_rfm_features(df: pd.DataFrame, analysis_date: str) -> pd.DataFrame:
    """Create Recency, Frequency, Monetary features per customer."""
    analysis_dt = pd.to_datetime(analysis_date)
    
    rfm = df.groupby('customer_id').agg(
        recency=('order_date', lambda x: (analysis_dt - x.max()).days),
        frequency=('order_id', 'nunique'),
        monetary=('order_total', 'sum')
    ).reset_index()
    
    return rfm

def evaluate_with_time_split(
    X: pd.DataFrame, 
    y: pd.Series,
    n_splits: int = 5
) -> list:
    """Evaluate model using time-based cross-validation."""
    tscv = TimeSeriesSplit(n_splits=n_splits)
    scores = []
    
    for train_idx, val_idx in tscv.split(X):
        model = RandomForestClassifier(n_estimators=100, random_state=42)
        model.fit(X.iloc[train_idx], y.iloc[train_idx])
        
        y_pred_proba = model.predict_proba(X.iloc[val_idx])[:, 1]
        precision, recall, _ = precision_recall_curve(y.iloc[val_idx], y_pred_proba)
        scores.append(auc(recall, precision))
    
    return scores

Код демонструє інженерію ознак, релевантну для домену, та відповідну методологію валідації для даних часових рядів.

Ключові висновки для співбесід Data Analyst у 2026 році

  • Віконні функції SQL з PARTITION BY та ORDER BY зустрічаються на більшості технічних співбесід. Практикуйте обчислення наростаючих підсумків, відсотків та рангів.

  • Питання Python pandas наголошують на ланцюжку методів, агрегаціях groupby та операціях merge з належною обробкою відсутніх значень.

  • Статистичні питання вимагають пояснення концепцій бізнес-термінами. Інтерв'юери оцінюють здатність до комунікації, а не лише технічні знання.

  • Бізнес-кейси тестують структуровану декомпозицію проблем. Починайте з валідації метрики, потім сегментуйте для ізоляції проблеми.

  • Домашні завдання оцінюються за якістю коду та комунікацією не менше, ніж за аналітичною точністю. Включіть виконавче резюме та поясніть свої рішення.

  • Модуль BigQuery просунутий рівень та Модуль Python pandas основи надають додаткові практичні питання, узгоджені з поточними патернами співбесід.

Починай практикувати!

Перевір свої знання з нашими симуляторами співбесід та технічними тестами.

Щоденний виклик

Чи знайдеш ти помилку в Data Analytics?

Справжній фрагмент коду, прихована помилка, одна спроба на день. Щоб спробувати, акаунт не потрібен.

Anthony Fillion-Maillet

Автор:

Anthony Fillion-Maillet

Засновник SharpSkill

Fullstack-розробник понад 10 років. Керує SharpSkill і відповідає за все, що тут публікується.

Оновлено 8 вересня 2026 р.

Теги

#data-analytics
#sql
#python
#pandas
#interview

Поділитися

Пов'язані статті