Original size 853x1280

Секрет успешного фильма

PROTECT STATUS: not protected
The project is taking part in the competition

В своём исследовании я анализирую данные с сайта Kaggle о более чем двухтысячах кинокартин, чтобы выявить секрет успешного фильма.

Эта тема очень мне интересна, потому что меня всегда волновало, почему одни фильмы обретают большую популярность, а другие, даже великолепно снятые, остаются навсегда в тени, так и не добравшись до большой аудитории.

Я хочу проанализировать данные и выявить параметры, которые могут предопределять успех фильма.

Цвета для графиков подобраны, основываясь на основных оттенках RGB палитры, из которых состоит экран мониторов, с которых зрители смотрят фильмы.

Градиент и цвета составлялись с помощью Adobe Color.

big
Original size 1762x645

Первым делом мне захотелось узнать в каком году фильмы получали наивысшие рейтинговые показатели.

Для этого я использовала линейный график. Я считаю, что он отлично подходит для иллюстрации информации о зависимости рейтинга от года. Он четко и понятно отражает информацию, с его помощью удобно подмечать изменения средних значений.

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 ()

Original size 1001x547

В самом конце 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 ()

Original size 901x682

Самый высокий рейтинг среди стран имеют фильмы произведённые в Тайланде.

Помимо рейтинга, также очень важным показателем является популярность фильма, которую я также проанализировала исходя из страны производства кинокартины. Для визуализации я использовала линейчатую диаграмму.

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 ()

Original size 1613x874

Самые популярные фильмы были произведены в США.

Далее я проанализировала самый популярный жанр. Я отобразила его с помощью линейчатой диаграммы объясняющим графиком. Зеленой обводкой с помощью программы фотошоп — я выделила столбцы, которые относятся к жанрам фильмов из всего датасета. Чёрной обводкой я выделила самый популярный жанр, относящийся к фильмам.

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 ()

Original size 3499x1961

С большим отрывом от других жанров победили «Новости». Далее идут «Обсуждения», а жанр, который ближе всего находится к киноискусству — это «Преступления». Он и выделен чёрной обводкой, как самый популярный.

Чтобы снять успешный фильм и получить признание нужно представить его миру в правильный момент. Именно поэтому я проанализировала в какой месяц выходили фильмы обладающие самой большой популярностью. Я использовала объясняющий столбчатый тип графика, чтобы наглядно показать разницу между самым высоким месяцем по показателям и вторым по средней попуряности. Разницу я показывала двумя ярко-зелеными пунктирными линиями, которые дорисовала к графику с помощью программы фотошоп.

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 ()

Original size 3457x2290

Фильмы, вышедшие в Сентябре, имеют самый высокий показатель популярности. Также у них достаточно большой отрыв от второго по попуряности месяца — Ноября. Это означает, что фильмы, вышедшие в Сентябре, имеют намного большую вероятность стать успешными, чем фильмы вышедшие в другие месяцы.

Правильное название очень важно для создания успешного фильма, поэтому я проанализировала слова, которе чаще всего встречаются в названиях рейтинговых кинокартин. Я визуализировала результат с помощью точечной диаграммы, которая ясно и структурированно отражает популярность слов в названиях.

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 ()

Original size 1028x701

Самое часто употребляемое слово в названиях фильмов — «Любовь»

Чтобы охватить большую аудиторию, которая сможет посмотреть фильм, я проанализировала среднюю популярность фильма взависимости от языка оригинала. Для визуализации результата, я использовала линейчатую диаграмму, которая очень удобна для ранжирования информации.

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 ()

Original size 1189x690

Фильмы на английском языке являются самыми популярными.

Вывод:

Таким образом, с помощью анализа датасета, я могу сделать вывод, что залогом успешного фильма является:

-Его производство его в конце 1970-х годов. -Фильм должен быть произведен в Тайланде (для самых высоких показателей рейтинга) или в Америке (для самых высоких показателей популярности). -Жанром фильма должен быть криминал. -Фильм должен обязательно выйти в Сентябре -В названии фильма должно присуствовать слово любовь. -Фильм должен быть снят на английском языке.

Original size 853x1280

С помощью Chat GPT я сгенерировала постер к идеальному и гарантированно успешному фильму.

Описание применение генеративной модели и вспомогательных инструментов:

1. Kaggle. Платформа была использована для поиска и загрузки датасета.

2. Google Colab. Весь процесс работы бы произведёен там. Обработка данных, написание кода, визуализация, использование библиотек Python: pandas, matplotlib, numpy, seaborn.

3. Gemini и ChatGPT. Нейросети применялись для оптимизации кода и исправления ошибок в нём. Также ChatGPT использовался для генерции постера к фильму.

4. Adobe Color. Подбор цветовой палитры проекта.