**Данные:** CSV-файл с колонками: `date`, `category`, `views`, `clicks`.
**Задание:**
1. Загрузите данные и посчитайте CTR = clicks / views по каждой категории
2. Определите категории с CTR выше и ниже среднего
3. Визуализируйте CTR по категориям (bar chart) с горизонтальной линией среднего CTR
Структура для ориентира — реальные значения из эталонного решения.
import pandas as pd
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
# Генерация данных (имитация CSV)
np.random.seed(42)
categories = ['Электроника', 'Одежда', 'Продукты', 'Книги',
'Спорт', 'Красота', 'Дом', 'Авто']
dates = pd.date_range('2024-01-01', '2024-03-31', freq='D')
rows = []
for date in dates:
for cat in categories:
views = np.random.randint(500, 5000)
# Разный CTR для категорий
base_ctr = {'Электроника': 0.035, 'Одежда': 0.045,
'Продукты': 0.02, 'Книги': 0.055,
'Спорт': 0.04, 'Красота': 0.05,
'Дом': 0.025, 'Авто': 0.03}
clicks = np.random.binomial(views, base_ctr[cat])
rows.append({'date': date, 'category': cat,
'views': views, 'clicks': clicks})
df = pd.DataFrame(rows)
# Агрегация по категориям
summary = df.groupby('category').agg(
total_views=('views', 'sum'),
total_clicks=('clicks', 'sum'),
).reset_index()
summary['ctr'] = (summary['total_clicks'] / summary['total_views'] * 100).round(2)
summary = summary.sort_values('ctr', ascending=False)
avg_ctr = summary['total_clicks'].sum() / summary['total_views'].sum() * 100
print("CTR по категориям:")
print(summary.to_string(index=False))
print(f"\nСредний CTR: {avg_ctr:.2f}%")
# Категории выше/ниже среднего
above = summary[summary['ctr'] > avg_ctr]['category'].tolist()
below = summary[summary['ctr'] <= avg_ctr]['category'].tolist()
print(f"Выше среднего: {', '.join(above)}")
print(f"Ниже среднего: {', '.join(below)}")
# Визуализация
fig, ax = plt.subplots(figsize=(10, 6))
colors = ['#2ecc71' if c > avg_ctr else '#e74c3c' for c in summary['ctr']]
ax.bar(summary['category'], summary['ctr'], color=colors)
ax.axhline(y=avg_ctr, color='#3498db', linestyle='--',
linewidth=2, label=f'Средний CTR: {avg_ctr:.2f}%')
ax.set_ylabel('CTR, %')
ax.set_title('CTR по категориям товаров')
ax.legend()
plt.xticks(rotation=45, ha='right')
plt.tight_layout()
plt.savefig('ctr_analysis.png', dpi=100)
print("\nГрафик сохранён: ctr_analysis.png")
pandas matplotlib CTR визуализация агрегация
Это задание для уровня Junior. Подходит для начинающих аналитиков, проверяет базовые знания SQL/Python/статистики.
Подобные задания в категории «Python» регулярно дают на собеседованиях аналитика данных в Яндекс, Сбер, Ozon, Авито, Тинькофф, Wildberries, T-Bank, X5, ВТБ и других крупных IT-компаниях. Тематика: pandas, matplotlib, CTR, визуализация, агрегация.
На реальном собеседовании на подобную задачу отводится 5-10 минут — проверяется скорость и базовая грамотность. Для тренировки рекомендуем сначала решить самостоятельно, потом сверить с эталонным решением и подсказками.
На zasqlpython.ru есть 482 Python задачи с проверкой через Pyodide, конспекты Python и pandas, AI мок-собеседование с разбором ваших ответов.
← Все задания