Big Data исследование: Снимали ли кино раньше лучше, чем сейчас?

Полагаю что вы согласитесь со мной, что сегодня найти хороший фильм гораздо сложнее, чем это было лет 10-20 назад. Это связано с тем, что сегодня киноиндустрия выпускает тысячи фильмов в год. Это в десятки раз больше, чем в 90-е, и в сотни раз больше, чем в 50-е.

Безусловно, огромное количество сказывается на качестве. Точнее, на среднем качестве фильмов. Именно поэтому многие сегодня говорят, что сегодняшние фильмы несравнимо хуже тех, что снимались в 60-е, 70-е годы, не говоря уже о «золотом веке» кинематографа.

Однако можно ли сказать, что это утверждение справедливо? Чтобы понять, когда и в какие годы фильмы снимались лучше, нужно провести исследование.

Для этой цели я выгрузил данные из 25 миллионов пользовательских оценок от 162 500 пользователей по почти 60 000 фильмам, снятых за все время. Да, вы не ослышались – 25 миллионов, то есть самая что ни на есть big data. Затем, используя Python и Pandas, я обработал эти данные и заметил множество интересных закономерностей.

Анализ пользовательских рейтингов всех фильмов XX и XXI века

Итак, давайте приступим к исследованию. Традиционно начнем с загрузки библиотек и самих данных. Сначала загрузим датасет с рейтингами фильмов.

import pandas as pd
df = pd.read_csv('ratings.csv')
df.head()

Содержимое датасета ratings

Рис. 1: Содержимое датасета ratings

Посмотрим корректно ли все прогрузилось (датасет большой).

df.shape

(25000095, 4)

Ок. теперь загружаем датасет с фильмами.

df2 = pd.read_csv('movies.csv')
df2.head()

Содержимое датасета movies

Рис. 2: Содержимое датасета movies

Теперь давайте объединими эти датасеты в один, по ключу movieId.

df3 = df.merge(df2, on='movieId', how='left')
df3.head()

Содержимое датафрейма df3 с объединенными данными

Рис. 3: Содержимое датафрейма df3 с объединенными данными

Отсеим лишние столбцы.

df3 = df3[['title', 'rating']]
df3.head(10)

Сокращенный датафрейм со столбцами только "Название" и "Рейтинг фильма"

Рис. 4: Сокращенный датафрейм со столбцами только “Название” и “Рейтинг фильма”

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

av_rating = df3[['title', 'rating']]
av_rating = av_rating.groupby('title').mean()
av_rating

Таблица с расчетами среднего рейтинга каждого фильма

Рис. 5: Таблица с расчетами среднего рейтинга каждого фильма

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

av_rating = av_rating.reset_index()
av_rating

Таблица с созданным инкрементным индексом

Рис. 6: Таблица с созданным инкрементным индексом

Отлично! Теперь посмотрим как можно вытащить год из названия фильма.

av_rating['title']

Вывод значений столбца "title" из датафрейма

Рис. 7: Вывод значений столбца “title” из датафрейма

string = 'Pulp Fiction (1994)'
string.split()

[‘Pulp’, ‘Fiction’, ‘(1994)’]

string.split()[-1]

(1994)

string.split()[-1][1:-1]

1994

Читайте также:  Анализ поездок в такси с помощью статистических методов

Эврика! Напишем функцию которая вытаскивает год фильма из его названия.

def get_year(row):
    return (row.split()[-1][1:-1])

av_rating['year'] = av_rating['title'].apply(get_year) 
av_rating

Датафрейм с добавленным столбцом "year" - годом выхода фильма

Рис. 8: Датафрейм с добавленным столбцом “year” – годом выхода фильма

Теперь у каждого фильма у нас есть столбцы со средним рейтингом и годом.

Однако не все значения в столбец year подтянулись корректно. В нем есть данные с NaN (пропусками). Более того анализировать фильмы в разбросе 150 лет – не оптимальное решение. В какие-то года могли выходить бестселлеры (напр. Титаник, Аватар), но это не значит что в эти же года кино снимали лучше. Оптимально считать качество работы киноиндустрии в диапазонах, скажем каждые 10 лет (декады). И ограничить все это диапазоном от 1900 года до сегодняшних дней.

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

def assignDecade(x):
    if x.isdigit():
        decade = int(x)
        decade = decade/10
        decade = int(decade)
        decade = decade*10
        return str(decade) + "-" + str(decade+10)
    else:
        return float('NaN')
av_rating['decade'] = av_rating['year'].apply(assignDecade)

Посмотрим, что получилось.

av_rating

Датафрейм av_rating с добавленным столбцом decade - десятилетием, в котором был выпущен фильм

Рис. 9: Датафрейм av_rating с добавленным столбцом decade – десятилетием, в котором был выпущен фильм

Теперь проверим гипотезу, что раньше фильмы снимали лучше. Отсортируем фильмы по рейтингу и году и посмотрим топ-10 лидеров и аутсайдеров.

av_rating.sort_values('rating', ascending=False).head(10)

Лучшие 10 фильмов по среднему рейтингу

Рис. 10: Лучшие 10 фильмов по среднему рейтингу

av_rating.sort_values('rating', ascending=False).tail(10)

Худшие 10 фильмов по среднему рейтингу

Рис. 11: Худшие 10 фильмов по среднему рейтингу

По этим таблицам мы видим что и в ТОП и в АУТСАЙДЕРЫ рейтинга попадают как старые, так и новые фильмы.

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

df4 = av_rating[av_rating['rating'] == 5.0]
df4['decade'].value_counts()

Количество фильмов со средним рейтингом 5.0 по десятилетиям, в порядке убывания

Рис. 12: Количество фильмов со средним рейтингом 5.0 по десятилетиям, в порядке убывания

А больше 4.0 баллов?

df5 = av_rating[av_rating['rating'] >= 4.0]
df5['decade'].value_counts()

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

Рис. 13: Количество фильмов со средним рейтингом больше 4.0 по десятилетиям, в порядке убывания

Видим, что гипотеза о том, что раньше фильмы снимали лучше в целом неверна.

Читайте также:  RFM-анализ с помощью Python

Но какие декады для кинематографа были лучшими? Был ли золотой век раньше? Или золотой век кино происходит именно сейчас?

Чтобы ответить на этот вопрос, сгруппируем все фильмы по декадам и посчитаем процент фильмов с рейтингом 5.0 от общего числа фильмов.

grouped = av_rating.groupby('decade')
result = {}
for decade, group in grouped:
    result[decade] = round((group.rating == 5.0).sum() / len(group), 5)
result

Процент фильмов с рейтингом 5.0 от общего числа фильмов по десятилетиям выхода

Рис. 14: Процент фильмов с рейтингом 5.0 от общего числа фильмов по десятилетиям выхода

Итак, если исходить из числа фильмов со средним рейтингом 5.0, то лучшими декадами мирового кинематографа являются:

total = pd.DataFrame({'place':[1, 2, 3, 4, 5], 
                      'decade':['2010-2020', '1900-1910', '1970-1980', '2000-2010', '1960-1970'],
                      'perc_of_5star':[2.3, 1.379, 1.179, 1.176, 1.133]})
total

Топ-5 лучших десятилетий мирового кинематографа по количеству выпущенных фильмов со средним рейтингом 5.0

Рис. 15: Топ-5 лучших десятилетий мирового кинематографа по количеству выпущенных фильмов со средним рейтингом 5.0

Для большей наглядности построим график “золотых декад” кино.

import matplotlib.pyplot as plt
total.sort_values('perc_of_5star', inplace=True)
plt.barh(total['decade'], total['perc_of_5star'])
plt.title('Percentage of 5 star movie reviews by decade')
plt.show()

Диаграмма сравнения топ-5 десятилетий по выпуску фильмов со средней оценкой 5.0

Рис. 16: Диаграмма сравнения топ-5 десятилетий по выпуску фильмов со средней оценкой 5.0

Вывод

Субъективно может казаться, что фильмы сегодня стали снимать хуже, чем раньше. Однако, как мы убедились выше – объективная оценка говорит об обратном.

Вероятно, ощущение, что фильмы – сегодня “уже не те” возникает именно потому, что вот уже много лет на киноэкраны не выходят уж совершенно невероятные по своим качествам (и для своего времени) фильмы, такие как Титаник, Аватар, Властелин Колец и проч. Многие сегодняшние фильмы прекрасны, но уже не вызывают WOW эффекта. Плюс, не будем забывать о ностальгии по прошлому – она может сильно искажать восприятие действительности.

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

Читайте также:  Как находить точки роста онлайн-бизнеса с помощью Python

О потенциальном искажении статистики говорит многое: и несбалансированность количества оцененных фильмов по декадам, и совершенно другое распределение топ декад при оценке не только 5-звездочных фильмов, но и просто хороших фильмов – с оценкой 4.0 и выше.

Поэтому это исследование я не считаю на 100% корректным в плане рейтингов декад. А вот поставленную задачу (ответ на вопрос: “Снимают ли кино сегодня хуже, чем раньше”) я полагаю оно решило полностью.