
В своём исследовании я анализирую данные с сайта Kaggle о более чем двухтысячах кинокартин, чтобы выявить секрет успешного фильма.
Эта тема очень мне интересна, потому что меня всегда волновало, почему одни фильмы обретают большую популярность, а другие, даже великолепно снятые, остаются навсегда в тени, так и не добравшись до большой аудитории.
Я хочу проанализировать данные и выявить параметры, которые могут предопределять успех фильма.
Цвета для графиков подобраны, основываясь на основных оттенках RGB палитры, из которых состоит экран мониторов, с которых зрители смотрят фильмы.
Градиент и цвета составлялись с помощью Adobe Color.

Первым делом мне захотелось узнать в каком году фильмы получали наивысшие рейтинговые показатели.
Для этого я использовала линейный график. Я считаю, что он отлично подходит для иллюстрации информации о зависимости рейтинга от года. Он четко и понятно отражает информацию, с его помощью удобно подмечать изменения средних значений.
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns df['premiere_date'] = pd.to_datetime (df['premiere_date']) df['year'] = df['premiere_date'].dt.year avg_rating_by_year = df.groupby ('year')['rating'].mean ().reset_index () plt.figure (figsize=(12, 6)) sns.lineplot (x='year', y='rating', data=avg_rating_by_year, linewidth=3, color='red')
plt.title ('Зависимость рейтинга от года') plt.xlabel ('Год') plt.ylabel ('Средний рейтинг') plt.grid (True) plt.show ()
В самом конце 1970-х годов средний рейтинг фильмов составлял 8.4, что является самым высшим показателем в сравнении с другими временными промежуткам
Далее я проанализировала средний рейтинг фильмов по стране их производства. Для визуализации я использовала тепловую карту, которую легко воспринимать визуально и которая помогает находить корреляции между переменными.
import numpy as np import matplotlib.pyplot as plt import seaborn as sns
colors = [ (1, 0, 0), (0, 1, 0), (0, 0, 1) ]
gradient_colors = [] for i in range (len (colors) — 1): start_color = np.array (colors[i]) end_color = np.array (colors[i + 1]) for t in np.linspace (0, 1, 100): interp_color = start_color * (1 — t) + end_color * t gradient_colors.append (interp_color)
custom_cmap = plt.cm.colors.ListedColormap (gradient_colors)
plt.figure (figsize=(10, 8)) sns.heatmap ( heatmap_data, annot=True, cmap=custom_cmap, fmt=».2f», cbar_kws={'label': 'Средний рейтинг'} ) plt.title ('Средний рейтинг по стране производства (Топ-20)') plt.ylabel ('Страна производства') plt.xlabel ('') plt.yticks (rotation=0) plt.show ()
Самый высокий рейтинг среди стран имеют фильмы произведённые в Тайланде.
Помимо рейтинга, также очень важным показателем является популярность фильма, которую я также проанализировала исходя из страны производства кинокартины. Для визуализации я использовала линейчатую диаграмму.
import numpy as np import matplotlib.pyplot as plt import seaborn as sns
colors = [ (1, 0, 0), (0, 1, 0), (0, 0, 1) ]
num_bars = len (top_countries_popularity)
gradient_colors = []
for i in range (len (colors) — 1): start_color = np.array (colors[i]) end_color = np.array (colors[i + 1]) for t in np.linspace (0, 1, 100): interp_color = start_color * (1 — t) + end_color * t gradient_colors.append (interp_color)
bar_colors = [] for i in range (num_bars): idx = int (i * (len (gradient_colors) — 1) / (num_bars — 1)) bar_colors.append (gradient_colors[idx])
plt.figure (figsize=(12, 7)) sns.barplot ( x='popularity', y='country_origin', data=top_countries_popularity, palette=bar_colors, hue='country_origin', legend=False ) plt.title ('Средняя популярность по стране производства (Топ-20)') plt.xlabel ('Средняя популярность') plt.ylabel ('Страна производства') plt.show ()
Самые популярные фильмы были произведены в США.
Далее я проанализировала самый популярный жанр. Я отобразила его с помощью линейчатой диаграммы объясняющим графиком. Зеленой обводкой с помощью программы фотошоп — я выделила столбцы, которые относятся к жанрам фильмов из всего датасета. Чёрной обводкой я выделила самый популярный жанр, относящийся к фильмам.
import numpy as np import matplotlib.pyplot as plt import seaborn as sns
num_genres = len (top_genres_popularity)
colors = np.array ([ [1, 0, 0], [0, 1, 0], [0, 0, 1] ])
gradient_palette = [] for i in range (num_genres): t = i / (num_genres — 1) color1 = colors[0] * (1 — t) + colors[1] * t color2 = colors[1] * (1 — t) + colors[2] * t final_color = color1 * (1 — t) + color2 * t gradient_palette.append (tuple (final_color))
plt.figure (figsize=(12, 7)) sns.barplot ( x='popularity', y='genre', data=top_genres_popularity, palette=gradient_palette, legend=False ) plt.title ('Средняя популярность по жанрам (Топ-20)') plt.xlabel ('Средняя популярность') plt.ylabel ('Жанр') plt.show ()
С большим отрывом от других жанров победили «Новости». Далее идут «Обсуждения», а жанр, который ближе всего находится к киноискусству — это «Преступления». Он и выделен чёрной обводкой, как самый популярный.
Чтобы снять успешный фильм и получить признание нужно представить его миру в правильный момент. Именно поэтому я проанализировала в какой месяц выходили фильмы обладающие самой большой популярностью. Я использовала объясняющий столбчатый тип графика, чтобы наглядно показать разницу между самым высоким месяцем по показателям и вторым по средней попуряности. Разницу я показывала двумя ярко-зелеными пунктирными линиями, которые дорисовала к графику с помощью программы фотошоп.
import numpy as np import matplotlib.pyplot as plt import seaborn as sns
num_months = 12
colors = np.array ([ [1, 0, 0], [0, 1, 0], [0, 0, 1] ])
gradient_palette = [] for i in range (num_months): t = i / (num_months — 1)
color1 = colors[0] * (1 — t) \+ colors[1] * t
color2 = colors[1] * (1 — t) \+ colors[2] * t
final_color = color1 * (1 — t) \+ color2 * t
gradient_palette.append (tuple (final_color))
plt.figure (figsize=(12, 7)) sns.barplot ( x='month_name', y='popularity', data=avg_popularity_by_month, palette=gradient_palette, hue='month_name', legend=False ) plt.title ('Средняя популярность по месяцу выхода фильма') plt.xlabel ('Месяц выхода') plt.ylabel ('Средняя популярность') plt.xticks (rotation=45, ha='right') plt.show ()
Фильмы, вышедшие в Сентябре, имеют самый высокий показатель популярности. Также у них достаточно большой отрыв от второго по попуряности месяца — Ноября. Это означает, что фильмы, вышедшие в Сентябре, имеют намного большую вероятность стать успешными, чем фильмы вышедшие в другие месяцы.
Правильное название очень важно для создания успешного фильма, поэтому я проанализировала слова, которе чаще всего встречаются в названиях рейтинговых кинокартин. Я визуализировала результат с помощью точечной диаграммы, которая ясно и структурированно отражает популярность слов в названиях.
import matplotlib.pyplot as plt import matplotlib.colors as mcolors
colors = ['blue', 'green', 'red'] cmap = mcolors.LinearSegmentedColormap.from_list ('blue_green_red', colors)
norm = mcolors.Normalize (vmin=top_words_df['frequency'].min (), vmax=top_words_df['frequency'].max ())
colors_mapped = [cmap (norm (val)) for val in top_words_df['frequency']]
plt.figure (figsize=(12, 8))
plt.scatter ( x=top_words_df['frequency'], y=top_words_df['word'], c=colors_mapped, s=300 ) plt.gca ().invert_yaxis ()
plt.title ('Топ-20 самых частых слов в названиях фильмов') plt.xlabel ('Частота') plt.ylabel ('Слово') plt.grid (axis='x', linestyle='--', alpha=0.7) plt.show ()
Самое часто употребляемое слово в названиях фильмов — «Любовь»
Чтобы охватить большую аудиторию, которая сможет посмотреть фильм, я проанализировала среднюю популярность фильма взависимости от языка оригинала. Для визуализации результата, я использовала линейчатую диаграмму, которая очень удобна для ранжирования информации.
import matplotlib.pyplot as plt import seaborn as sns import numpy as np from matplotlib.colors import LinearSegmentedColormap
colors = ['blue', 'green', 'red'] n_bins = 100 cmap_name = 'blue_green_red' cm = LinearSegmentedColormap.from_list (cmap_name, colors, N=n_bins)
norm = plt.Normalize ( vmin=top_languages_popularity['popularity'].min (), vmax=top_languages_popularity['popularity'].max () )
gradient_colors = [cm (norm (val)) for val in top_languages_popularity['popularity']]
plt.figure (figsize=(12, 7)) sns.barplot ( x='popularity', y='original_language', data=top_languages_popularity, palette=gradient_colors ) plt.title ('Средняя популярность по языку оригинала (Топ-20)') plt.xlabel ('Средняя популярность') plt.ylabel ('Язык оригинала') plt.tight_layout () plt.show ()
Фильмы на английском языке являются самыми популярными.
Вывод:
Таким образом, с помощью анализа датасета, я могу сделать вывод, что залогом успешного фильма является:
-Его производство его в конце 1970-х годов. -Фильм должен быть произведен в Тайланде (для самых высоких показателей рейтинга) или в Америке (для самых высоких показателей популярности). -Жанром фильма должен быть криминал. -Фильм должен обязательно выйти в Сентябре -В названии фильма должно присуствовать слово любовь. -Фильм должен быть снят на английском языке.
С помощью Chat GPT я сгенерировала постер к идеальному и гарантированно успешному фильму.
Описание применение генеративной модели и вспомогательных инструментов:
1. Kaggle. Платформа была использована для поиска и загрузки датасета.
2. Google Colab. Весь процесс работы бы произведёен там. Обработка данных, написание кода, визуализация, использование библиотек Python: pandas, matplotlib, numpy, seaborn.
3. Gemini и ChatGPT. Нейросети применялись для оптимизации кода и исправления ошибок в нём. Также ChatGPT использовался для генерции постера к фильму.
4. Adobe Color. Подбор цветовой палитры проекта.