Как найти причину падения конверсии на 10%?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Как найти причину падения конверсии на 10%
1. Определи точку падения
Первое — когда именно произошло падение. Проанализируй график конверсии по дням:
-- Дневная конверсия
SELECT
DATE(order_date) as date,
COUNT(DISTINCT user_id) as users,
COUNT(*) as orders,
ROUND(COUNT(*) * 100.0 / COUNT(DISTINCT user_id), 2) as conversion_pct
FROM events
WHERE event_type IN ('view_product', 'order')
GROUP BY DATE(order_date)
ORDER BY date DESC
LIMIT 60;
Если конверсия упала 10% в конкретный день → проверь, что произошло в тот день (деплой, маркетинг, внешние факторы).
Если падение градуальное → ищи дренаж через разные каналы.
2. Разбей по каналам (cohort analysis)
Конверсия может быть разной для разных групп пользователей:
-- Конверсия по источнику трафика
SELECT
traffic_source,
DATE(order_date) as date,
COUNT(DISTINCT user_id) as users,
COUNT(*) as orders,
ROUND(COUNT(*) * 100.0 / COUNT(DISTINCT user_id), 2) as conversion_pct
FROM events e
JOIN users u ON e.user_id = u.id
WHERE event_type IN ('view_product', 'order')
GROUP BY traffic_source, DATE(order_date)
ORDER BY traffic_source, date DESC;
Возможные находки:
- Organic поддержал конверсию, а Paid упал → проблема с рекламной кампанией
- Mobile упал, desktop OK → проблема с мобильным фронтом
- EU упал, US OK → проблема с платежами (GDPR, карты)
3. Разбей по этапам воронки (Funnel Analysis)
Падение конверсии может быть на разных этапах:
-- Воронка покупок
WITH funnel AS (
SELECT
DATE(event_date) as date,
COUNT(DISTINCT CASE WHEN event_type = 'view_product' THEN user_id END) as viewed,
COUNT(DISTINCT CASE WHEN event_type = 'add_to_cart' THEN user_id END) as carted,
COUNT(DISTINCT CASE WHEN event_type = 'checkout' THEN user_id END) as checkout,
COUNT(DISTINCT CASE WHEN event_type = 'order' THEN user_id END) as ordered
FROM events
GROUP BY DATE(event_date)
)
SELECT
date,
viewed,
carted,
ROUND(carted * 100.0 / viewed, 2) as view_to_cart_pct,
checkout,
ROUND(checkout * 100.0 / carted, 2) as cart_to_checkout_pct,
ordered,
ROUND(ordered * 100.0 / checkout, 2) as checkout_to_order_pct
FROM funnel
ORDER BY date DESC;
Где произошло падение?
- View → Add to cart (70% → 60%): проблема с UX или ценообразованием
- Add to cart → Checkout (90% → 70%): проблема с доставкой/способами оплаты
- Checkout → Order (85% → 60%): проблема с платежом или безопасностью
4. Технические причины
A. Проверь скорость загрузки
# Проанализировать медленные страницы
import pandas as pd
from sqlalchemy import create_engine
engine = create_engine('postgresql://...')
df = pd.read_sql("""
SELECT
page_url,
AVG(load_time_ms) as avg_load_time,
COUNT(*) as visits
FROM page_metrics
WHERE date >= NOW() - INTERVAL 7 DAY
GROUP BY page_url
ORDER BY avg_load_time DESC;
""", engine)
# Если load_time вырос > 3сек → может быть причина
print(df[df['avg_load_time'] > 3000])
B. Проверь ошибки приложения
-- Ошибки по дням
SELECT
DATE(timestamp) as date,
error_type,
COUNT(*) as error_count
FROM error_logs
WHERE timestamp >= NOW() - INTERVAL 14 DAY
GROUP BY DATE(timestamp), error_type
ORDER BY date DESC, error_count DESC;
Если вырос payment_error → проблема с платежным шлюзом.
C. Проверь выброс в логах
# Поиск аномалий в application logs
grep -i "payment failed\|timeout\|503" logs/app.log | \
awk '{print $1}' | sort | uniq -c | sort -rn | head -20
5. Бизнес-причины
A. Изменения в ценах/промо
-- Проверь цены и скидки
SELECT
DATE(effective_date) as date,
AVG(price) as avg_price,
AVG(discount_pct) as avg_discount
FROM products_price_history
WHERE date >= NOW() - INTERVAL 14 DAY
GROUP BY DATE(effective_date)
ORDER BY date DESC;
Если цена выросла или скидка упала → может быть причина падения конверсии.
B. Сезонность / Внешние события
# Сравнить с прошлым годом
this_year = pd.read_sql("""
SELECT DATE(order_date) as date, COUNT(*) as orders
FROM orders
WHERE YEAR(order_date) = YEAR(NOW())
GROUP BY DATE(order_date)
""", engine)
last_year = pd.read_sql("""
SELECT DATE(order_date) as date, COUNT(*) as orders
FROM orders
WHERE YEAR(order_date) = YEAR(NOW()) - 1
GROUP BY DATE(order_date)
""", engine)
# Нормализуй по дням недели
print("Это сезонное падение или аномалия?")
6. Систематический анализ (Root Cause Analysis)
Python: Попытка автоматизировать поиск
import pandas as pd
from sqlalchemy import create_engine
from datetime import datetime, timedelta
engine = create_engine('postgresql://...')
def analyze_conversion_drop():
# Получи конверсии за последние 30 дней
df = pd.read_sql("""
SELECT
DATE(order_date) as date,
COUNT(DISTINCT user_id) as users,
COUNT(*) as orders,
ROUND(COUNT(*) * 100.0 / COUNT(DISTINCT user_id), 2) as conv_pct
FROM events
WHERE order_date >= NOW() - INTERVAL 30 DAY
GROUP BY DATE(order_date)
""", engine)
# Найди день падения
df['conv_change'] = df['conv_pct'].pct_change() * 100
drop_date = df[df['conv_change'] <= -10]
if len(drop_date) > 0:
print(f"Drop detected on {drop_date.iloc[0]['date']}")
print(f"Previous conversion: {drop_date.iloc[0]['conv_pct']:.2f}%")
# Проверь метрики в тот день
queries = [
("Mobile vs Desktop", """
SELECT device_type, COUNT(*) as orders
FROM events
WHERE DATE(order_date) = %s AND event_type = 'order'
GROUP BY device_type
"""),
("Traffic source", """
SELECT traffic_source, COUNT(*) as orders
FROM events
WHERE DATE(order_date) = %s AND event_type = 'order'
GROUP BY traffic_source
"""),
("Errors", """
SELECT COUNT(*) as errors
FROM error_logs
WHERE DATE(timestamp) = %s
""")
]
for name, query in queries:
result = pd.read_sql(query, engine, params=[drop_date.iloc[0]['date']])
print(f"\n{name}:")
print(result)
analyze_conversion_drop()
7. Чеклист исследования
Технические факторы:
- Скорость загрузки страницы (% > 3сек)
- Ошибки приложения (500, timeout, payment fails)
- Доступность платежного шлюза
- Проверена ли SSL/TLS (потеря сертификата?)
Бизнес-факторы:
- Изменения в ценах
- Скидки / промо-код (закончился?)
- Изменение способов доставки / оплаты
- Конкуренты запустили акцию?
- Сезонность (праздники, день недели)
Данные об аудитории:
- Mobile конверсия vs Desktop
- Географический спад (только один регион?)
- Источник трафика (Organic, Paid, Direct)
- Новые vs возвращающиеся пользователи
- Когорта пользователей (старые vs новые)
Маркетинг:
- Новая рекламная кампания запущена?
- Бюджет переместили?
- Отрицательный PR/отзывы?
Итоговый процесс
- Определи тренд — когда и насколько упала конверсия
- Разбей по когортам — где упала (мобиль, регион, источник)
- Разбей по воронке — на каком этапе (cart abandonment, payment fail)
- Проверь логи — технические ошибки
- Проверь данные — цены, скидки, промо
- Исключай гипотезы — не это, не то, осталось одно
- Валидируй — потвердизи гипотезу A/B тестом или откатом
Основной принцип: данные не врут, нужно правильно их смотреть и разбивать по переменным.