Введение
Анализ рынка, в котором вы хотите запустить продукт — одна из ключевых задач для запуска успешного бизнеса. В анализ рынка входит анализ конкурентов и поведения конечного потребителя вашего продукта, будь то импорт товаров или запуск своего продукта.
В данной статье я вам предлагаю рассмотреть пример аналитического подхода к созданию фильма, на котором вы сможете заработать максимальное количество денег, популярности или респекта от аудитории.
Данные
Данные взяты из Top-1000 фильмов IMDB, которые заботливо собраны на Kaggle: Kaggle Dataset of IMDB Movies.
Давайте посмотрим что есть в этих данных:
-
Rank — номер фильма в рейтинге топ-1000. Чем выше — тем круче фильм.
-
Title — название.
-
Genre — жанры фильма, перечисленные через запятую.
-
Description — короткое описание фильма, синопсис.
-
Director — режисер фильма.
-
Actor — актеры, принимавшие участие в фильме, так же перечислены через запятую.
-
Year — год выпуска фильма.
-
Runtime — длина фильма в минутах.
-
Rating — рейтинг.
-
Votes — количество пользователей, которые оставили отзыв об этом фильме на сайте IMDB.
-
Revenue — сколько фильм заработал денег, без затрат на производство.
-
Metascore — средняя оценка критиков.
Исследование каждого параметра, который представлен в datasetе
-
Rank. Его мы использовать не будем, так как ранг является прямым отражением номера по рейтингу, то есть он нам бесполезен и является просто дублирующей информацией уже существующей метрики.
-
Title. Его мы будем использовать на втором этапе для создания сюжета и продающего заголовка.
-
Genre. Жанры фильма являются самой простой и ключевой фичей для классификации фильмов. У нас их 20 штук уникальных, поэтому именно их мы и возьмем за основу.
-
Description. Описание мы так же будем использовать для создания продающего синопсиса и сюжета, на основе этого синопсиса.
-
Director. В dataset на 1000 записей их 640 штук, поэтому кажется что это не будет являться фичей, которая может как-то повлиять на успешность фильма. Она возможно и влияет, но в данном контексте она нам мало чего сможет подсказать.
-
Actor. Актерский состав так же более 2500 уникальных человек, отметаем.
-
Year. По графику ниже можно заметить, что в целом заработок у фильмов идет по своеобразному куполу. Будем считать, что некоторые года были более успешны для кинематографа, а некоторые — менее успешные. Так как машину времени мы изобрести не можем и успешность года зависит от многих параметров, как внешних, так и внутренних, то мы не будем принимать год во внимание.
-
Runtime. Единственное, что мы можем точно сказать на счет Runtime — не надо делать слишком короткие фильмы (то есть меньше 1.5 часов) и слишком длинные фильмы (то есть больше 3 часов). В остальном нет какой-то взаимосвязи.
-
Rating. Будем использовать как метрику, по которой будем оценивать качество фильма.
-
Revenue. Будет нашей главной метрикой для оценки успешности фильма.
-
Votes. Будем ее использовать как метрику охвата аудитории, предполагая, что в среднем конверсия из просмотра в оставление отзыва +- одинаковая для всех фильмов.
-
Metascore. Будем использовать вместе с метрикой Rating.
Итого мы получили следующие типы данных:
-
Классификационные данные: Title, Genre, Description. Это данные, на основе которых мы будем строить нашу модель и делать с помощью этой модели наш фильм.
-
Метрики успешности: Revenue (главная метрика), Rating, Metascore, Votes. Это метрики, с помощью которых мы будем определять, насколько фильм оказался успешным или неуспешным.
Подготовка данных
Что нам нужно сделать с данными, чтобы в дальнейшем мы могли их использовать в контексте методов статистического анализа?
Превратим строку с жанрами через запятую в 20 колонок с помощью One-Hot Encoding Метода.
One Hot Encoding
One Hot Encoding — это метод преобразования категориальных переменных в двоичный формат. Он создает новые двоичные столбцы (0 и 1) для каждой категории в исходной переменной. Каждая категория в исходном столбце представлена как отдельный столбец, где значение 1 указывает на наличие этой категории, а 0 указывает на ее отсутствие.
Все остальные данные уже итак достаточно хорошие, либо мы их не используем.
Анализ
Первичный анализ
В первую очередь посмотрим медианные значения Revenue, Rating, Metascore и Votes по каждому жанру и посмотрим, какие из жанров находятся выше общей медианы, а какие ниже.
Графики построены с помощью этого кода:
melted_df = df.melt( id_vars='revenue', value_vars=[ 'Sci-Fi', 'Western', 'Action', 'Horror', 'History', 'Fantasy', 'Adventure', 'Music', 'War', 'Biography', 'Animation', 'Sport', 'Family', 'Drama', 'Musical', 'Romance', 'Crime', 'Comedy', 'Thriller', 'Mystery' ], var_name='Genre', value_name='Value' ) pivot_df = melted_df.pivot_table(index='Genre', columns='Value', values='revenue', aggfunc='median') pivot_df.columns = ['Average_Revenue_0', 'Average_Revenue_1'] result_df = pivot_df.reset_index() result_df['diff'] = (result_df['Average_Revenue_1']/result_df['Average_Revenue_0'] - 1).apply(lambda x: round(100 * x, 2)) median_revenue = df['revenue'].median() plt.figure(figsize=(16, 9)) sns.barplot(data=result_df.sort_values(by='Average_Revenue_1', ascending=False), x='Genre', y='Average_Revenue_1') plt.xticks(rotation=90) plt.axhline(y=median_revenue, color='red', linestyle='--', linewidth=1.5) plt.ylabel("Median Revenue") plt.xlabel("Genre of Movie") plt.show()
В этих графиках нам нужно найти пересечения по жанрам, то есть нам нужны такие жанры, чтобы они присутствовали во всех графиках (или почти во всех):
Давайте отсортируем их по частоте использования (1 — везде, 2 — в трех и т.д.)
-
Animation
-
Нет таких
-
Adventure, Western, Action, Sci-Fi, Fantasy, History, War, Drama, Sport, Musical
-
Family, Music, Mystery
Как видно, в топе у нас анимация. На втором месте другие жанры, но давайте мы не будем делать никаких выводов, а просто посмотрим на матрицу корреляций, а именно на то, какие жанры чаще всего встречаются вместе с Анимационными фильмами.
Исходя из этой матрицы нет какой-то сильной корреляции с каким-то другим жанром, но в целом больше всего коррелируют Adventure и Comedy, однако Adventure и Comedy не коррелируют между собой, поэтому у нас уже целых два набора жанров, которые мы можем выбрать:
-
Animation, Adventure. И так же исходя из матрицы можно добавить Action и Sci-Fi.
-
Animation, Comedy. И так же исходя из матрицы можно добавить Romance.
То есть у нас на выбор есть два фильма: Анимационный научно-фантастический приключенчистский фильм, либо анимационная романтическая комедия.
Исходя из положения их на графиках выше, видно, что анимационный научно-фантастический фильм успешнее, чем романтическая комедия, поэтому если мы хотим создать успешный фильм, то нам нужно идти по первой дорожке. Причем исходя из анализа votes, что может свидетельствовать об объеме потенциальной аудитории фильма, Sci-Fi — самый популярный жанр, вероятнее всего его смотрят и дети и взрослые, что нам на руку, так как это может стать семейным фильмом, который объединяет несколько поколений.
Вторичный анализ
В данном разделе попробуем составить синопсис и продающий заголовок.
Для этого отфильтруем данные по наличию в фильме жанров Анимации, Приключений или Научной Фантастики.
Получили 331 фильм, то есть 1/3 выборки.
Теперь воспользуемся методом TF-IDF для векторизации описания фильмов, а затем KMeans для кластеризации фильмов на основе их векторов.
Код выглядит следующим образом:
ddf['text'] = ddf['title'] + ' ' + ddf['description'] vectorizer = TfidfVectorizer(stop_words='english') tfidf_matrix = vectorizer.fit_transform(ddf['text']) tfidf_matrix = normalize(tfidf_matrix) n_clusters = 10 kmeans = KMeans(n_clusters=n_clusters, random_state=0) kmeans.fit(tfidf_matrix) ddf['Cluster'] = kmeans.labels_
Теперь посмотрим в каждом кластере среднее по каждому из параметров успеха фильма, чтобы понять, какой кластер самый успешный, у меня это восьмой.
Теперь давайте объединим все описания и еще раз применим алогоритм TF-IDF, чтобы посмотреть на топ слов во всех этих описаниях:
descriptions = list(ddf.loc[ddf['Cluster'] == 8]['text']) vectorizer = TfidfVectorizer(stop_words='english', max_features=100) tfidf_matrix = vectorizer.fit_transform(descriptions) # Используем TruncatedSVD для снижения размерности и выявления основных тем svd = TruncatedSVD(n_components=1, random_state=0) svd.fit(tfidf_matrix) terms = vectorizer.get_feature_names_out() # Извлекаем слова с наибольшими весами top_terms = [terms[i] for i in svd.components_[0].argsort()[-20:][::-1]] average_plot = " ".join(top_terms) top_terms
Как итог мы получили следующие слова:
[ 'man', 'world', 'spider', 'new', 'iron', 'life', 'stark', 'tony', 'save', 'peter', 'girl', 'inner', 'causes', 'strange', 'revenge', 'villains', 'apart', 'black', 'hero', 'suit' ]
Я думаю ни для кого не будет секретом, что мы получили типичный набор слов в описании любого фильма Marvel. Вот и думайте зачем они их продолжают клепать)))
Вывод
В целом мы получили ожидаемый эффект, а именно: супергеройское кино лучше всего продается за счет зрелещности и наличия огромного количества спецэффектов, из-за чего их смотрят как и молодое поколение, так и более взрослое.
То есть для того, чтобы сделать фильм, который заработает миллиарды, нужно лишь получить права от популярной вселенной, и сделать на ее основе фильм.
А если вы хотите еще больше аналитического контента, то подписывайтесь на мой телеграм канал: Аналитик в джунглях
ссылка на оригинал статьи https://habr.com/ru/articles/857722/
Добавить комментарий