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. Подбор цветовой палитры проекта.

We use cookies to improve the operation of the website and to enhance its usability. More detailed information on the use of cookies can be fo...
Show more