Что такое CASE WHEN в SQL
CASE WHEN — это условный оператор SQL, который позволяет выполнять различные операции на основе заданных условий. Это аналог if-else в программировании. Он используется для трансформации данных и создания новых колонок с условными значениями.
Синтаксис CASE WHEN
Существует две формы синтаксиса:
Простая форма (с выражением)
CASE expression
WHEN value1 THEN result1
WHEN value2 THEN result2
ELSE default_result
END
Поисковая форма (с условиями)
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
WHEN condition3 THEN result3
ELSE default_result
END
Практические примеры
Пример 1: Категоризация по диапазону
SELECT
employee_id,
salary,
CASE
WHEN salary < 50000 THEN Junior
WHEN salary >= 50000 AND salary < 100000 THEN Middle
WHEN salary >= 100000 THEN Senior
END AS level
FROM employees;
SQL JOIN: полное руководство
JOIN — один из самых важных инструментов в SQL. Это основа для объединения данных из разных таблиц.
Что такое JOIN?
JOIN — это операция, которая комбинирует строки из двух (или более) таблиц на основе условия связи.
Просто говоря: я беру строки из таблицы A, ищу соответствующие строки в таблице B, и объединяю их.
Пример в реальной жизни:
Таблица Users:
id | name | city
1 | Alice | NYC
2 | Bob | LA
3 | Charlie | NYC
Таблица Orders:
id | user_id | amount
101| 1 | $100
102| 1 | $200
103| 2 | $150
104| 3 | $300
Что хочу: Вывести имя пользователя и его заказы
Что нужно: JOIN на user_id
Основные типы JOIN
1. INNER JOIN (пересечение)
SELECT u.id, u.name, o.amount
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
Результат:
id | name | amount
1 | Alice | 100
1 | Alice | 200
2 | Bob | 150
3 | Charlie | 300
Инструменты Data Analyst: полный стек
В своей работе я использую комплексный набор инструментов для полного цикла анализа данных — от загрузки и обработки до визуализации и ML.
1. Языки программирования и данные
Python (основной язык)
# Типичный рабочий стек
import pandas as pd # DataFrames и манипуляция данными
import numpy as np # Численные вычисления
import matplotlib.pyplot as plt # Визуализация
import seaborn as sns # Статистическая графика
from scipy import stats # Статистические тесты
scikit-learn # Machine Learning
import plotly # Интерактивные графики
SQL (критически важен)
-- Работаю с PostgreSQL, MySQL, BigQuery
-- Основные паттерны:
О себе
Я — Data Analyst с 10+ летним опытом работы в области аналитики данных. За этот период я прошёл путь от junior-специалиста до senior-аналитика, руководившего командой из 5-6 человек.
Ключевые компетенции
SQL & базы данных: Глубокое понимание реляционных БД (PostgreSQL, MySQL, T-SQL). Опыт оптимизации сложных запросов, работа с индексами, профилированием. Регулярно пишу оконные функции, CTE, работаю с миллионами строк данных.
Python & аналитика: Свободно работаю с pandas, numpy, scipy. Использую Python для ETL-процессов, статистического анализа, автоматизации рутины. Знаком с scikit-learn для базовой машинного обучения (кластеризация, регрессия).
Визуализация: Квалифицированно использую Tableau, Power BI, Looker. Создавал более 100 дашбордов, которые внедрялись в бизнес-процессы. Понимаю принципы effective data storytelling.
Задачи, решённые с использованием Python
1. ETL-процессы и автоматизация
Задача: Автоматизация загрузки данных из API в DWH
В e-commerce компании были данные о заказах, которые приходили из десяти различных источников (Shopify, WooCommerce, интеграции с маркетплейсами). Каждый источник имел разный формат данных.
Решение:
import requests
import pandas as pd
from datetime import datetime, timedelta
import logging
logger = logging.getLogger(__name__)
ETL-процесс: Определение и основные этапы
ETL (Extract, Transform, Load) — это фундаментальная архитектурная парадигма в области обработки данных. ETL-процесс описывает комплексный workflow для перемещения, преобразования и интеграции данных из разнородных источников в целевую систему хранения (Data Warehouse, Data Lake или операционные базы данных).
Основные этапы ETL
Первый этап подразумевает извлечение данных из различных исходных систем:
Критически важно минимизировать нагрузку на исходные системы при извлечении данных.
Опыт работы
Мой путь в аналитике: от junior-специалиста (2013) до senior-аналитика и analytics lead (10+ лет опыта).
Роль 1: Junior/Mid Data Analyst (2013-2016, E-commerce маркетплейс)
Основное:
Достижения:
Роль 2: Senior Data Analyst (2016-2019, FinTech Series B)
Обязанности:
Крупные проекты:
Критерии выбора компании для Data Analyst
1. Данные и инфраструктура
Первое, что интересует меня — как устроена работа с данными в компании:
Ключевые вопросы на интервью:
Почему это важно: Если данных нет или они ужасного качества, то весь анализ будет на песке. Я предпочитаю работать там, где данные — уже критичная инфраструктура, а не хаос.
Задачи, которые я хочу решать
1. Стратегические аналитические проекты
Меня привлекают задачи, где аналитика влияет на стратегические решения компании:
Эти задачи требуют не просто технических навыков, но и глубокого понимания бизнеса и экономики.
2. Growth Analytics
Python библиотеки в моей практике
Основной стек для анализа данных
За 10+ лет я использовал практически все основные библиотеки Python для аналитики. Расскажу про те, что я применял регулярно и глубоко.
1. Pandas — король анализа данных
Использование: ежедневно, на все 100%
Это основной инструмент для работы с табличными данными. Практически каждый анализ начинается с pandas.
import pandas as pd
# Загрузка данных
df = pd.read_csv('data.csv')
df = pd.read_sql('SELECT * FROM users', connection)
# Базовая разведка
print(df.info()) # типы и пропуски
print(df.describe()) # статистика
# Группировка и агрегация
df.groupby('month')['revenue'].sum()
df.pivot_table(values='sales', index='category', aggfunc='mean')
# Фильтрация
df[df['age'] > 18]
df.query('age > 18 and city == "Moscow"')
# Преобразования
df['revenue_per_item'] = df['revenue'] / df['items']
df['date'] = pd.to_datetime(df['date'])
SQL: основной инструмент Data Analyst для анализа данных
SQL — это первый инструмент, к которому я обращаюсь при решении аналитических задач. За 10+ лет я нашёл оптимальный баланс между простотой, производительностью и масштабируемостью.
Основные сценарии применения SQL
1. Создание витрин и датасетов для аналитики
2. Расчёт бизнес-метрик и KPI
3. Исследовательский анализ данных (EDA)
Корреляция vs Причинно-следственная связь
Корреляция — это статистическая зависимость (две переменные меняются вместе). Причинно-следственная связь (каузальность) — это когда одна переменная ПРИЧИНА, другая СЛЕДСТВИЕ. Это фундаментальное различие, которое часто путают, приводя к неверным выводам.
Определение корреляции
Корреляция измеряет, как две переменные двигаются вместе:
import numpy as np
import pandas as pd
from scipy.stats import pearsonr
# Пример: ледяное мороженое и утопления
ice_cream_sales = [100, 120, 150, 180, 200, 210, 190, 160, 130, 110]
drowing_deaths = [10, 12, 15, 18, 20, 21, 19, 16, 13, 11]
# Коэффициент корреляции Пирсона
corr, p_value = pearsonr(ice_cream_sales, drowning_deaths)
print(f"Корреляция: {corr:.3f}") # 0.998 (очень сильная!)
print(f"P-value: {p_value:.6f}") # < 0.001 (статистически значима)
# Вывод: ледяное мороженое и утопления сильно коррелируют!
Но это НЕ означает, что мороженое вызывает утопления!
Построение воронки конверсии: архитектура и метрики
Воронка конверсии — основной инструмент для понимания пути пользователя и выявления узких мест. Покажу как я её строю и анализирую.
1. Архитектура воронки
Классический путь e-commerce:
Пользователь посетил сайт
↓ (Landing Page View)
100% (100k)
↓
Посмотрел каталог товаров
↓ (Category View)
75% (75k) ← потеря 25%
↓
Добавил в корзину
↓ (Add to Cart)
30% (30k) ← потеря 45% (!)
↓
Начал оформлять заказ
↓ (Checkout Started)
25% (25k) ← потеря 5%
↓
Добавил способ оплаты
↓ (Payment Added)
20% (20k) ← потеря 5% (!
↓
Завершил покупку
↓ (Order Completed)
18% (18k) ← потеря 2% ← узкое место!
2. SQL для построения воронки
-- Метод 1: Event-based (рекомендуемый)
-- Считаю количество пользователей на каждом этапе
Реальные проблемы аналитика на работе и как я их решал
Я уверен, что интервьюер хочет услышать честный ответ. Идеальных ситуаций не бывает. Вот пять серьезных проблем, с которыми я сталкивался.
1. Грязные и неполные данные
Проблема: В CRM системе 40% записей о клиентах содержали ошибки:
Это сломало анализ LTV: было непонятно, кто реально платит, кто дублик.
Решение:
import pandas as pd
import numpy as np
from fuzzywuzzy import fuzz
# 1. Нормализация телефонов
def normalize_phone(phone):
if pd.isna(phone):
return None
phone = ''.join(filter(str.isdigit, str(phone)))
if len(phone) == 10:
phone = '7' + phone # Россия
return phone if len(phone) == 11 else None
df['phone_normalized'] = df['phone'].apply(normalize_phone)
Проверки качества данных (Data Validation)
Качество данных — основание любого аналитического вывода. Я всегда следую принципу: "Не доверяй данным, пока не проверишь". Вот мой набор проверок, которые я выполняю для каждого датасета.
1. Проверки на полноту (Completeness)
Проблема: Пропущенные значения (NULL) могут исказить выводы.
-- Проверка: какой процент NULL в каждой колонке
SELECT
'users' as table_name,
COUNT(*) as total_rows,
COUNT(*) FILTER (WHERE id IS NULL) as null_id,
COUNT(*) FILTER (WHERE email IS NULL) as null_email,
COUNT(*) FILTER (WHERE created_at IS NULL) as null_created_at,
COUNT(*) FILTER (WHERE name IS NULL) as null_name,
ROUND(100.0 * COUNT(*) FILTER (WHERE email IS NULL) / NULLIF(COUNT(*), 0), 2) as null_email_pct,
ROUND(100.0 * COUNT(*) FILTER (WHERE created_at IS NULL) / NULLIF(COUNT(*), 0), 2) as null_created_at_pct
FROM users;
-- Результат: если null_email_pct > 1%, это красный флаг
Задачи на последнем месте работы
На последней позиции Data Analyst я работал в быстрорастущей SaaS компании, где решал задачи по всему спектру аналитики: от создания дашбордов до A/B тестирования и статистического анализа. Вот основные проекты.
1. Создание системы мониторинга метрик (KPI Dashboard)
Задача: Руководство не видит в реальном времени состояние основных метрик продукта. Данные были разбросаны по разным инструментам (Google Analytics, Mixpanel, внутренней БД).
Решение:
Результат: Руководство получило единый источник истины. За 3 месяца выявили утечку в воронке, повысили conversion на 18%.
Статистический вывод: основы и применение
Статистический вывод — это методология, которая позволяет на основе выборки данных делать заключения о генеральной совокупности. Это фундаментальный инструмент для любого Data Analyst, поскольку мы редко можем собрать и проанализировать все возможные данные.
Основная идея
Представьте, что нужно узнать среднюю зарплату всех IT-специалистов в России. Невозможно опросить каждого, поэтому берём выборку из 1000 человек и на её основе оцениваем параметры генеральной совокупности.
Ключевые компоненты:
Два основных подхода
Предполагает, что параметр — неизвестная константа, выборка — случайная.
Как правильно прерывать A/B тесты
Преждевременное прерывание A/B тестов — одна из самых распространённых ошибок аналитиков. Это приводит к ложным выводам и потере денег. Разберу правильный подход.
Основные принципы
Правило 1: Нельзя прерывать тест на основе промежуточных результатов
Это называется peeking problem или optional stopping problem. Когда вы подглядываете в результаты и принимаете решение, вы увеличиваете вероятность ошибки первого рода (false positive) с обещанных 5% до 25-30%.
Почему так происходит? Потому что случайные колебания в начале теста могут дать ложный сигнал о разнице. Если вы останавливаете тест, когда видите p-value < 0.05, вы ловите эти случайные колебания, а не реальный эффект.
Как правильно остановить тест
1. Установите размер выборки заранее
Используйте power analysis до теста:
from scipy.stats import norm
В какой технической области хочу развиваться
После 10+ лет в аналитике я определил для себя ключные направления, которые наиболее интересны и перспективны:
1. Advanced SQL и оптимизация запросов
Глубокое понимание работы СУБД, индексации, плана выполнения запросов — это фундамент эффективной аналитики. Мне интересно:
2. Data Engineering и инфраструктура данных
Переход от реактивной аналитики к построению систем, которые автоматически снабжают аналитиков качественными данными:
3. Machine Learning и предиктивная аналитика
Стандартная ошибка среднего (SEM)
Определение
Стандартная ошибка среднего показывает, насколько точно выборочное среднее оценивает истинное среднее генеральной совокупности.
Формула: SEM = σ / √n
Где σ — стандартное отклонение, n — размер выборки
Пример
Среднее время использования приложения = 50.4 минуты SEM = 1.08 минуты
Это означает: истинное среднее находится примерно в диапазоне 50.4 ± 1.08 минут.
SEM vs Стандартное отклонение
Ключевое свойство
SEM уменьшается с √n:
Вывод: Чтобы уменьшить SEM в 2 раза, увеличь n в 4 раза.
Применение
Расчёт в Python
P-value и его интерпретация
Что такое p-value?
P-value — это вероятность получить наблюдаемый результат (или ещё более экстремальный) при условии, что нулевая гипотеза верна.
Формально: p-value = P(наблюдаемые данные | H0 верна)
Правильная интерпретация
✅ Правильно: "Если между группами нет разницы (H0 верна), вероятность увидеть такую разницу составляет 2%"
❌ Неправильно:
Порог значимости
Стандартный порог: α = 0.05 (5%)
Пример: A/B тест платёжной страницы
import numpy as np
from scipy.stats import chi2_contingency
# Данные
control_purchases = 95 # из 1000
treatment_purchases = 115 # из 1000
Мой подход к решению аналитических задач
За 10+ лет я выработал структурированный процесс, который помогает избежать ошибок и находить инсайты быстро. Вот он:
Фаза 1: Уточнение и понимание
Первый шаг — задать правильные вопросы:
Почему это важно: 50% ошибок в аналитике происходят потому, что мы решаем не ту задачу. Иногда бизнес просит одно, а имеет в виду совсем другое.
Пример: Бизнес говорит: "Почему упал доход?" Но реально нужно понять, упал ли трафик, конверсия или средний чек.
Фаза 2: Формулировка гипотез
Не начинаю с данных. Сначала думаю, что могло произойти:
Retention Rate и Churn Rate: Метрики Удержания
Retention Rate (коэффициент удержания) и Churn Rate (коэффициент оттока) — это две взаимодополняющие метрики, характеризующие способность компании удерживать пользователей или клиентов. Они критичны для оценки здоровья и прибыльности бизнеса.
Retention Rate (Коэффициент Удержания)
Retention Rate — это процент пользователей, которые остались активными после определённого периода времени. Высокий retention означает, что продукт хорошо удовлетворяет потребности пользователей.
Основная формула:
Retention Rate = (Пользователи на конец периода - Новые пользователи) / Пользователи на начало периода × 100%
SQL-запрос для расчёта Day-7 Retention (удержание через 7 дней):
Когортный анализ: Определение и применение
Когортный анализ — это мощный аналитический метод, позволяющий сегментировать пользователей на основе общих характеристик или поведения в определённый период времени, а затем отслеживать и сравнивать их поведение на протяжении времени. Когорта — это группа пользователей или объектов, объединённых общим признаком.
Основные типы когорт
Пользователи группируются по месяцу/неделе/году первого визита или регистрации. Это наиболее распространённый тип когортного анализа.
Пользователи сегментируются на основе совершённых действий: покупка определённого товара, использование конкретной функции, размер первого заказа.
Группировка по возрасту, геолокации, устройству (мобильный/десктоп), источнику трафика.
Для чего используется когортный анализ
MAU и DAU: Определения и Расчёты
MAU (Monthly Active Users) и DAU (Daily Active Users) — это ключевые метрики для оценки активности и размера пользовательской базы мобильных и веб-приложений. Они помогают понять, насколько активны пользователи и как растёт аудитория продукта.
DAU (Daily Active Users)
DAU — количество уникальных пользователей, которые совершили определённое действие (открыли приложение, совершили покупку, просмотрели контент) в течение одного календарного дня.
Как рассчитывать:
SELECT
DATE(event_timestamp) as date,
COUNT(DISTINCT user_id) as dau
FROM events
WHERE event_timestamp >= CURRENT_DATE - INTERVAL 30 day
GROUP BY DATE(event_timestamp)
ORDER BY date DESC;
Этот запрос считает уникальных пользователей за каждый день, используя COUNT(DISTINCT user_id). Важно использовать именно DISTINCT, чтобы один пользователь, совершивший несколько действий в день, считался один раз.
MAU (Monthly Active Users)
Оконные функции (Window Functions) в SQL
Оконная функция — это функция, которая применяется к подмножеству (окну) строк, связанных с текущей строкой.
Просто говоря: это позволяет считать агрегаты (SUM, AVG, RANK) не сворачивая всю таблицу, а сохраняя детальность.
Простой пример
-- БЕЗ оконной функции
SELECT
employee_id,
salary,
(SELECT AVG(salary) FROM employees) as avg_salary ← считаю среднее для всех
FROM employees;
-- С оконной функцией (НАМНОГО проще)
SELECT
employee_id,
salary,
AVG(salary) OVER() as avg_salary ← автоматически
FROM employees;
Синтаксис
FUNCTION() OVER (
[PARTITION BY column] ← разбить на подгруппы
[ORDER BY column] ← порядок сортировки
[ROWS BETWEEN ...] ← диапазон окна
)
Типы оконных функций
1. Агрегатные функции
Что такое HAVING в SQL: полное руководство
HAVING — это один из самых неправильно понимаемых clauses в SQL. Многие путают его с WHERE. На самом деле, это разные инструменты с разными целями.
Основное определение
HAVING — это clause SQL, который фильтрует группы данных (результаты GROUP BY), а не отдельные строки. WHERE фильтрует строки перед группировкой, HAVING фильтрует группы после.
WHERE vs HAVING: ключевая разница
Порядок выполнения SQL запроса:
1. FROM — выбираем таблицы
2. WHERE — фильтруем строки (ПЕРЕД группировкой)
3. GROUP BY — группируем строки
4. HAVING — фильтруем группы (ПОСЛЕ группировки)
5. SELECT — выбираем колонки
6. ORDER BY — сортируем результат
Как запомнить: WHERE это фильтр на входе (строки), HAVING это фильтр на выходе (группы).
Пример 1: WHERE vs HAVING
Оптимизация SQL запросов: что влияет на скорость
Быстрые запросы — основа хорошей аналитики. Давайте разберёмся что замедляет запросы и как их ускорять.
1. Основные факторы, влияющие на скорость
Фактор 1: Размер данных (объём строк)
-- МЕДЛЕННО: Сканирую всю таблицу 10M строк
SELECT * FROM orders;
-- Время: 5 сек
-- БЫСТРО: Фильтрую по дате (partition pruning)
SELECT * FROM orders
WHERE created_at >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY);
-- Время: 0.2 сек (25x быстрее!)
Почему разница?
Фактор 2: Индексирование
-- БЕЗ индекса
CREATE TABLE orders (
id INT PRIMARY KEY,
user_id INT,
created_at TIMESTAMP,
amount DECIMAL
);
SELECT * FROM orders WHERE user_id = 123;
-- Время: 3 сек (full table scan — смотрю все 10M строк)
Research на проектах Data Analyst
В моей практике research — это не опциональное дополнение, а критическая часть работы аналитика. Вот несколько примеров исследований, которые привели к конкретным решениям.
Research 1: Анализ причин высокой стоимости привлечения пользователя (CAC)
Контекст: Маркетинг говорит, что CAC = $50 за нового пользователя. Это высоко. Нужно понять, почему.
Вопросы, которые я задал:
Результат анализа:
Меры центральных тенденций (Central Tendency)
Меры центральной тенденции — это статистические показатели, которые описывают центр распределения данных. Это фундаментальные инструменты для понимания любого датасета. Разберу все основные меры, их применение и различия.
1. Среднее арифметическое (Mean)
Определение: Сумма всех значений, разделённая на их количество.
Формула:
μ = (x₁ + x₂ + ... + xₙ) / n
Код:
import numpy as np
import pandas as pd
data = [10, 20, 30, 40, 50]
mean = np.mean(data) # 30
# Или через pandas
df = pd.DataFrame({'values': data})
mean = df['values'].mean() # 30
Свойства:
Когда использовать:
Стратегия улучшения качества данных
Что такое качество данных?
Качество данных — это комплексная характеристика, включающая:
Процесс улучшения качества
Первый шаг — понять, где стоят проблемы:
-- Проверка полноты
SELECT
column_name,
COUNT(*) as total,
COUNT(DISTINCT column_name) as filled,
ROUND(100.0 * COUNT(*) FILTER (WHERE column_name IS NULL) / COUNT(*), 2) as null_percent
FROM table_name
GROUP BY 1
HAVING COUNT(*) FILTER (WHERE column_name IS NULL) > 0;
-- Проверка уникальности
SELECT id, COUNT(*) as duplicates
FROM users
GROUP BY id
HAVING COUNT(*) > 1;
Подход к решению проблем в Data Analytics
Философия решения проблем
В Data Analytics я применяю системный и структурированный подход, основанный на аналитическом мышлении. Проблемы в этой области обычно можно разбить на три категории: технические, данные и бизнес-логика. Каждая требует своей стратегии.
Этап 1: Определение и диагностика
Первое, что я делаю — это чётко определить проблему:
Пример из практики: когда дашборд показывал неправильные цифры, я не просто пересчитал метрики. Я:
Этап 2: Анализ данных и логирование
Работа с датами в SQL
Даты — неотъемлемая часть аналитики. SQL предоставляет мощные функции для работы с временем: DATE_TRUNC для группировки, EXTRACT для выделения частей даты, INTERVAL для расчетов.
DATE_TRUNC — обрезание дат
FUNKCIYA DATE_TRUNC обрезает дату до указанной единицы времени (год, месяц, день, час и т.д.).
-- Обрезать до начала месяца
SELECT DATE_TRUNC('month', order_date) AS month_start
FROM orders;
-- Результат: 2024-01-01, 2024-02-01, 2024-03-01
-- Группировка продаж по месяцам
SELECT
DATE_TRUNC('month', order_date) AS month,
COUNT(*) AS orders_count,
SUM(amount) AS total_revenue
FROM orders
GROUP BY DATE_TRUNC('month', order_date)
ORDER BY month;
-- Группировка по неделям
SELECT
DATE_TRUNC('week', order_date) AS week_start,
SUM(amount) AS weekly_revenue
FROM orders
GROUP BY DATE_TRUNC('week', order_date);
EXTRACT — извлечение части даты
EXTRACT выделяет конкретную часть даты: год, месяц, день, час, минуту и т.д.
ROW_NUMBER, RANK и DENSE_RANK: Window Functions для Ранжирования
ROW_NUMBER, RANK и DENSE_RANK — это три различных способа ранжирования строк в SQL. Они работают как Window Functions и позволяют нумеровать, ранжировать или находить топ элементов. Различия между ними критичны для правильного анализа данных.
ROW_NUMBER — Последовательная Нумерация
Применяет уникальный номер каждой строке в порядке сортировки. Если есть дубликаты, они всё равно получают разные номера.
SELECT
product_name,
revenue,
ROW_NUMBER() OVER (ORDER BY revenue DESC) as rank
FROM products;
Результат:
product_name | revenue | rank
---
Laptop | 5000 | 1
Phone | 5000 | 2 <- Один номер = одна строка
Tablet | 3000 | 3
Watch | 2000 | 4
RANK — Ранжирование с Пробелами
Применяет одинаковый ранг дубликатам, но пропускает следующие номера (создаёт пробелы).
pandas merge(): объединение DataFrame'ов
merge() — это функция для объединения (JOIN) двух DataFrame'ов по одной или нескольким колонкам. Это аналог SQL JOIN'а в pandas.
Что такое merge()?
# Основной синтаксис
pd.merge(df1, df2, on='key', how='inner')
# df1, df2 — DataFrame'ы которые объединяю
# on — колонка для связи
# how — тип JOIN'а
Простой пример:
import pandas as pd
users = pd.DataFrame({
'user_id': [1, 2, 3],
'name': ['Alice', 'Bob', 'Charlie']
})
orders = pd.DataFrame({
'order_id': [101, 102, 103],
'user_id': [1, 1, 2],
'amount': [100, 200, 150]
})
# Объединяю по user_id
result = pd.merge(users, orders, on='user_id')
print(result)
Результат:
user_id name order_id amount
0 1 Alice 101 100
1 1 Alice 102 200
2 2 Bob 103 150
Типы merge (как SQL JOIN)
1. INNER JOIN (how='inner') — только совпадения
Чем я хотел бы заниматься
Эволюция моих интересов в аналитике
Я начинал с простых отчетов в Excel, но за 10+ лет понял, что меня по-настоящему зажигают два направления: Causal Inference и Product Analytics. Расскажу подробнее.
1. Causal Inference — понимание причин, а не корреляций
Почему это важно:
В обычной аналитике ты видишь корреляцию:
Но это может быть ложная корреляция!
Causal Inference позволяет:
# Вместо простой корреляции
corr = df['email_opens'].corr(df['ltv']) # 0.45
# Мы вычисляем каузальный эффект
from econml.dml import DML
from sklearn.ensemble import RandomForestRegressor
Опыт работы в командах: структуры и коллаборация
За свою карьеру я работал с разными командами и типами организационных структур. Каждый опыт дал мне ценные навыки.
1. Ранний опыт: Стартап (20 человек)
Контекст: E-commerce платформа с нуля
Структура команды:
Мои задачи:
- Настройка event tracking (Mixpanel)
- Ежедневные метрики конверсии и LTV
- A/B тестирование new features
- Product insights для PM
- Прогнозирование revenue для CFO
Что научило:
Ключевое достижение: Создал daily dashboard, который сэкономил 5 часов в неделю аналитики при росте из 100k до 1M DAU
2. Масштабирование: Mid-size Company (500 человек)
Типы данных в моей практике
Обзор: очень разнообразный опыт
За 10+ лет работал с практически всеми типами данных, которые встречаются в большом бизнесе. Расскажу про самые значимые проекты.
1. E-commerce данные
Масштаб: 50 млн+ транзакций в месяц
-- Основные таблицы
Orders (order_id, user_id, amount, status, created_at)
OrderItems (item_id, order_id, product_id, quantity, price)
Products (product_id, category, price, stock)
Users (user_id, email, country, signup_date)
Payments (payment_id, order_id, method, amount, status)
Задачи анализа:
Ключевые метрики:
2. СRM данные
Количество строк после LEFT JOIN: минимум и максимум
Основной принцип LEFT JOIN
LEFT JOIN сохраняет ВСЕ строки из левой таблицы и добавляет соответствующие строки из правой. Результат всегда >= количество строк в левой таблице.
Минимальное количество строк
Минимум = количество строк в левой таблице
Это происходит, когда:
Пример:
-- Левая таблица: 5 строк
SELECT * FROM users
-- id | name
-- 1 | Alice
-- 2 | Bob
-- 3 | Charlie
-- 4 | David
-- 5 | Eve
-- Правая таблица: 2 строки
SELECT * FROM orders
-- id | user_id | amount
-- 101| 1 | 100
-- 102| 2 | 200
-- LEFT JOIN: результат 5 строк (количество юзеров)
SELECT u.id, u.name, o.amount
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
Методы решения проблемы несбалансированных выборок
Несбалансированные выборки (imbalanced datasets) — это классическая проблема в машинном обучении и анализе данных, когда одна класс существенно преобладает над другой. Например, фрод встречается в 0.1% транзакций, а обычные операции в 99.9%. Это приводит к смещённым моделям. Разберу методы борьбы с этой проблемой.
1. Переsampling методы
Идея: Увеличить количество примеров редкого класса путём дублирования или синтеза новых примеров.
from sklearn.utils import resample
import pandas as pd
import numpy as np
# Исходные данные
df = pd.DataFrame({
'feature': np.random.randn(1000),
'label': [0]*990 + [1]*10 # Несбалансированные
})
print(f"Исходное распределение: {df['label'].value_counts().to_dict()}")
# {0: 990, 1: 10}
Интересные и нестандартные задачи в карьере
Сколько я работаю аналитиком, встречал задачи, которые выходили за рамки стандартных отчётов. Вот несколько, которые особенно запомнились.
Задача 1: Предсказание цены сделки через аналитику CRM
Контекст: В B2B компании нужно было понять, какой будет средний размер сделки на основе её характеристик на ранних стадиях, чтобы прогнозировать выручку точнее.
Проблема: Обычные подходы (средняя цена по отрасли) дают ошибку ±50%. Нужна была точная модель.
Решение:
Сначала я собрал признаки из CRM, которые могут влиять на цену сделки:
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from sklearn.preprocessing import StandardScaler
Решение связей многие-ко-многим (Many-to-Many)
Связь многие-ко-многим (M2M) — одна из самых сложных в работе Data Analyst при проектировании БД и анализе данных. Например, студенты могут изучать несколько курсов, а курсы могут быть у нескольких студентов. Решение этой проблемы зависит от контекста и инструментов.
1. Нормализация БД: Таблица соединения (Junction Table)
Это классический и правильный подход в реляционных БД:
CREATE TABLE students (
student_id INT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100)
);
CREATE TABLE courses (
course_id INT PRIMARY KEY,
course_name VARCHAR(100),
duration_days INT
);
CREATE TABLE student_courses (
student_id INT,
course_id INT,
enrollment_date DATE,
completion_status VARCHAR(20),
grade DECIMAL(3,2),
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES students(student_id),
FOREIGN KEY (course_id) REFERENCES courses(course_id)
);
Важность очистки данных: фундамент качественной аналитики
Очистка данных (Data Cleaning) — это один из самых критичных и трудозатратных этапов аналитического проекта. Её значение часто недооценивают, хотя она определяет качество всех последующих выводов. Я посвящаю 30-40% своего времени именно этому процессу.
Определение
Очистка данных — это процесс обнаружения и исправления ошибок, пропусков, аномалий и несоответствий в данных перед анализом.
Классический парадокс данных:
80% времени аналитика: Очистка и подготовка данных
20% времени аналитика: Реальный анализ и моделирование
Почему очистка данных критична?
1. "Garbage In, Garbage Out" (GIGO) принцип
Если на входе грязные данные:
Грязные входные данные
↓
Любой анализ (правильный или нет)
↓
Грязные результаты и выводы
Пример:
Данные о доходах: [10000, 5000, 999999, 7500, -1000, NULL, 12000]
SQL vs Python: где больше опыта
Краткий ответ
Примерно поровну (50/50), но SQL глубже, Python шире.
Разбор по навыкам
SQL (Expert level, 10+ лет)
Что могу делать:
Примеры задач:
-- Когортный анализ с оконными функциями
SELECT
cohort,
months_since_signup,
100.0 * COUNT(*) /
LAG(COUNT(*)) OVER (PARTITION BY cohort ORDER BY months_since_signup) as retention_pct
FROM users
GROUP BY 1, 2;
Почему SQL: Основной инструмент для работы с данными. Быстрее, чем Python для больших объёмов. Source of truth.
Python (Advanced level, 8+ лет)
Инструменты в арсенале Data Analyst
1. SQL и базы данных
PostgreSQL / MySQL
Мой основной инструмент для работы с данными. Опыт:
Пример использования: Переписал набор из 15 отчётов в единый параметризованный запрос, сократив время выполнения с 10 минут на ~20 секунд через правильное индексирование и CTE.
Redshift / Snowflake
Опыт работы с облачными DWH:
2. Python
Мой основной язык для аналитики:
Оценка статистической значимости
Статистическая значимость — это мера того, насколько вероятно, что наблюдаемый результат произошёл не случайно, а отражает реальный эффект в данных. Это критическая концепция при выводах из выборки на всю генеральную совокупность.
Основные концепции
Нулевая и альтернативная гипотезы:
Пример:
P-value (p-значение):
p-value — это вероятность получить наблюдаемый результат (или более экстремальный), если H0 верна.
# Пример p-value
# p-value = 0.03
# Интерпретация: если нет реального различия,
# вероятность получить такую разницу случайно = 3%
Уровень значимости (α):
Это порог, ниже которого результат считается статистически значимым. Обычно α = 0.05 (5%).
Что важно при выборе работы аналитиком
После 10+ лет в этой сфере я понимаю, что выбор правильной компании и команды важнее, чем зарплата. Вот факторы, на которые я обращаю внимание.
1. Зрелость аналитической культуры компании
Красный флаг: компания говорит, что нужна аналитика, но:
Зелёный флаг:
Мой опыт: в компании, где я лучше всего работал, каждое совещание начиналось с дашборда. Это создавало контекст для обсуждения.
2. Качество данных и архитектура
Слои данных в хранилище (Data Warehouse Layers)
Данные в аналитическом хранилище организуются в слои для обеспечения качества, производительности и удобства анализа. Это одна из ключевых архитектурных концепций в аналитике данных. Разберу стандартные слои и их назначение.
Архитектура Data Warehouse (3-4 слойная архитектура)
┌─────────────────────────────────┐
│ Presentation Layer (Витрины) │ <- Дашборды, отчёты, BI инструменты
├─────────────────────────────────┤
│ Mart Layer (Витрины данных) │ <- Готовые таблицы для аналитики
├─────────────────────────────────┤
│ Core / Processing Layer │ <- Преобразование и агрегация
├─────────────────────────────────┤
│ Staging Layer (Промежуточный) │ <- Очистка и трансформация
├─────────────────────────────────┤
│ Raw / Source Layer │ <- Исходные данные без обработки
├─────────────────────────────────┤
│ Source Systems (ERP, CRM, etc) │ <- Системы-источники
└─────────────────────────────────┘
Ключевые KPI (Key Performance Indicators) по сферам бизнеса
1. SaaS и подписные модели
Monthly Recurring Revenue (MRR) — ежемесячный повторяющийся доход.
SELECT
DATE_TRUNC('month', created_at) as month,
SUM(monthly_subscription_price) as MRR
FROM subscriptions
WHERE status = 'active'
GROUP BY 1
ORDER BY 1 DESC;
Annual Run Rate (ARR) — годовой прогноз дохода = MRR × 12.
Customer Acquisition Cost (CAC) — стоимость привлечения одного клиента. CAC = (Sales & Marketing costs) / (New customers acquired)
Customer Lifetime Value (CLV) — ожидаемый доход от клиента за всё время. CLV = (Average monthly revenue per user) × (Average customer lifetime in months)
Примеры задач, решённых с помощью SQL
SQL — это мой основной инструмент. За 10+ лет я использовал его для решения сотен аналитических задач. Выберу несколько ярких примеров, которые показывают разные аспекты работы Data Analyst.
Задача 1: Анализ поведения пользователей (Cohort Analysis)
Контекст: Нужно было понять, какой процент пользователей, зарегистрировавшихся в разные месяцы, совершил покупку через N дней.