Полагаю что вы согласитесь со мной, что сегодня найти хороший фильм гораздо сложнее, чем это было лет 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()
Рис. 1: Содержимое датасета ratings
Посмотрим корректно ли все прогрузилось (датасет большой).
df.shape
(25000095, 4)
Ок. теперь загружаем датасет с фильмами.
df2 = pd.read_csv('movies.csv')
df2.head()
Рис. 2: Содержимое датасета movies
Теперь давайте объединими эти датасеты в один, по ключу movieId.
df3 = df.merge(df2, on='movieId', how='left')
df3.head()
Рис. 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']
Рис. 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
Рис. 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
Рис. 9: Датафрейм av_rating с добавленным столбцом decade – десятилетием, в котором был выпущен фильм
Теперь проверим гипотезу, что раньше фильмы снимали лучше. Отсортируем фильмы по рейтингу и году и посмотрим топ-10 лидеров и аутсайдеров.
av_rating.sort_values('rating', ascending=False).head(10)
Рис. 10: Лучшие 10 фильмов по среднему рейтингу
av_rating.sort_values('rating', ascending=False).tail(10)
Рис. 11: Худшие 10 фильмов по среднему рейтингу
По этим таблицам мы видим что и в ТОП и в АУТСАЙДЕРЫ рейтинга попадают как старые, так и новые фильмы.
Чтобы получить более точную картину, нужно посчитать количество значений. Давайте посмотрим в каких декадах было больше всего фильмов со средним рейтингом 5.0 баллов.
df4 = av_rating[av_rating['rating'] == 5.0]
df4['decade'].value_counts()
Рис. 12: Количество фильмов со средним рейтингом 5.0 по десятилетиям, в порядке убывания
А больше 4.0 баллов?
df5 = av_rating[av_rating['rating'] >= 4.0]
df5['decade'].value_counts()
Рис. 13: Количество фильмов со средним рейтингом больше 4.0 по десятилетиям, в порядке убывания
Видим, что гипотеза о том, что раньше фильмы снимали лучше в целом неверна.
Но какие декады для кинематографа были лучшими? Был ли золотой век раньше? Или золотой век кино происходит именно сейчас?
Чтобы ответить на этот вопрос, сгруппируем все фильмы по декадам и посчитаем процент фильмов с рейтингом 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
Рис. 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
Рис. 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()
Рис. 16: Диаграмма сравнения топ-5 десятилетий по выпуску фильмов со средней оценкой 5.0
Вывод
Субъективно может казаться, что фильмы сегодня стали снимать хуже, чем раньше. Однако, как мы убедились выше – объективная оценка говорит об обратном.
Вероятно, ощущение, что фильмы – сегодня “уже не те” возникает именно потому, что вот уже много лет на киноэкраны не выходят уж совершенно невероятные по своим качествам (и для своего времени) фильмы, такие как Титаник, Аватар, Властелин Колец и проч. Многие сегодняшние фильмы прекрасны, но уже не вызывают WOW эффекта. Плюс, не будем забывать о ностальгии по прошлому – она может сильно искажать восприятие действительности.
И еще один момент – возраст активной аудитории сайтов рейтингов фильмов. Очевидно, что превалирующая аудитория таких сайтов – молодые люди. А эти люди, скорее всего, не смотрят уж откровенно старые фильмы. А если не смотрят, то значит и не оценивают их. Соответственно, здесь происходит искажение статистики.
О потенциальном искажении статистики говорит многое: и несбалансированность количества оцененных фильмов по декадам, и совершенно другое распределение топ декад при оценке не только 5-звездочных фильмов, но и просто хороших фильмов – с оценкой 4.0 и выше.
Поэтому это исследование я не считаю на 100% корректным в плане рейтингов декад. А вот поставленную задачу (ответ на вопрос: “Снимают ли кино сегодня хуже, чем раньше”) я полагаю оно решило полностью.