Введение
В исследовании были выбраны данные о фильмах с 2000 по 2020 год из IMDB Movies Dataset на сайте Kaggle.
Кино всегда являлось важной частью культуры и экономики. Мне было интересно проанализировать тренды киноиндустрии, увидеть связь бюджета, оценок и кассовых сборов, а также сравнить разные страны и жанры.
В проекте были созданы такие графики, как столбчатая диаграмма, иллюстрирующая средние сборы по жанрам, пузырьковая диаграмма, показывающая связь бюджета и кассовых сборов, линейная диаграмма, демонстрирующая динамику бюджета и сборов по годам, а также радарная диаграмма, сравнивающая страны по ключевым показателям.
Визуализация данных
Подготовка данных в Google Colab
Был проведён анализ данных в Google Colab и выделены основные аспекты из таблицы на основе CSV-файла, после чего были созданы коды и построены диаграммы. В коде также описываются цвета и шрифты, использованные для графиков. В ходе работы иногда была использована нейросеть Google Gemini для более точного построения диаграмм и уточнения некоторых дополнительных функций кода.
Средние сборы по жанрам
avg_sales = df.groupby ('Жанр')['Сборы'].mean () / 1e6
fig, ax = plt.subplots (figsize=(10, 5)) ax.bar (avg_sales.index, avg_sales.values, color=COLORS, edgecolor='white', linewidth=2)
ax.set_title ('Средние сборы по жанрам', fontsize=14, fontweight='bold', pad=15) ax.set_ylabel ('Сборы (млн $)', fontsize=12) ax.set_facecolor (BACKGROUND) ax.grid (axis='y', color=GRID_COLOR, linestyle='--', alpha=0.7)
ax.spines['top'].set_visible (False) ax.spines['right'].set_visible (False)
plt.xticks (rotation=45) plt.tight_layout () plt.show ()
— Боевики зарабатывают больше всех — в среднем 90-100 млн $ — Фантастика на втором месте — около 80-85 млн $ — Драмы и комедии в середине — 60-70 млн $ — Мультфильмы и триллеры зарабатывают меньше — 50-60 млн $. Зрители предпочитают зрелищное кино (боевики, фантастику). Этим жанрам можно давать большие бюджеты, так как они окупятся.
Связь бюджета и кассовых сборов
sample = df.sample (100) budget_m = sample['Бюджет'] / 1e6 sales_m = sample['Сборы'] / 1e6
fig, ax = plt.subplots (figsize=(10, 5))
scatter = ax.scatter (budget_m, sales_m, alpha=0.7, s=60, color=COLORS[2])
z = np.polyfit (budget_m, sales_m, 1) p = np.poly1d (z) ax.plot (budget_m, p (budget_m), color=COLORS[3], linewidth=2, linestyle='--', label=f’Тренд: y = {z[0]:.2f}x + {z[1]:.2f}')
ax.set_title ('Связь бюджета и кассовых сборов', fontsize=14, fontweight='bold', pad=15) ax.set_xlabel ('Бюджет (млн $)', fontsize=12) ax.set_ylabel ('Сборы (млн $)', fontsize=12) ax.set_facecolor (BACKGROUND) ax.grid (color=GRID_COLOR, linestyle='--', alpha=0.7)
ax.spines['top'].set_visible (False) ax.spines['right'].set_visible (False) ax.legend ()
plt.tight_layout () plt.show ()
— Большинство точек выше красной линии, что говорит о прибыльности фильмов — Чем больше бюджет, тем выше сборы, но есть исключения — Некоторые дорогие фильмы провалились.
Динамика бюджета и сборов по годам
yearly = df.groupby ('Год').agg ({ 'Бюджет': 'mean', 'Сборы': 'mean' }) / 1e6
fig, ax = plt.subplots (figsize=(10, 5))
ax.plot (yearly.index, yearly['Бюджет'], label='Средний бюджет', color=COLORS[0], linewidth=3, marker='o')
ax.plot (yearly.index, yearly['Сборы'], label='Средние сборы', color=COLORS[3], linewidth=3, marker='s')
ax.set_title ('Динамика бюджета и сборов по годам', fontsize=14, fontweight='bold', pad=15) ax.set_xlabel ('Год', fontsize=12) ax.set_ylabel ('Млн $', fontsize=12) ax.set_facecolor (BACKGROUND) ax.grid (color=GRID_COLOR, linestyle='--', alpha=0.7)
ax.spines['top'].set_visible (False) ax.spines['right'].set_visible (False) ax.legend ()
plt.tight_layout () plt.show ()
— Бюджеты и сборы растут каждый год, но сборы опережают бюджеты, кино становится прибыльнее — Самые успешные годы: 2018-2020 — В среднем фильм приносит на 80-100% больше, чем стоит. Киноиндустрия процветает.
Сравнение стран по ключевым показателям: сборы, бюджет, ROI
country_stats = df.groupby ('Страна').agg ({ 'Бюджет': 'mean', 'Сборы': 'mean', 'ROI': 'mean' })
normalized = country_stats.apply (lambda x: (x — x.min ()) / (x.max () — x.min ()))
categories = list (normalized.columns) N = len (categories) angles = [n / float (N) * 2 * np.pi for n in range (N)] angles += angles[: 1]
fig, ax = plt.subplots (figsize=(8, 8), subplot_kw=dict (projection='polar'))
for i, country in enumerate (normalized.index[: 4]): values = normalized.loc[country].values.tolist () values += values[: 1]
ax.plot (angles, values,
linewidth=2,
label=country,
color=COLORS[i])
ax.fill (angles, values,
alpha=0.1,
color=COLORS[i])
ax.set_xticks (angles[: -1]) ax.set_xticklabels (categories, fontsize=11) ax.set_title ('Сравнение стран по ключевым показателям', fontsize=14, fontweight='bold', pad=20) ax.legend (loc='upper right', bbox_to_anchor=(1.3, 1))
plt.tight_layout () plt.show ()
— США: самые большие бюджеты и сборы — Корея: маленькие бюджеты, но хорошая отдача — Великобритания: средние бюджеты, стабильные результаты — Франция: маленькие бюджеты, но хорошая прибыль. У каждой страны своя стратегия.



