Честно говоря, я не очень верю в рейтинги песен. Потому что музыка сегодня – это, в основном, дело вкуса. И то, что популярно в одних сообществах, не обязательно популярно в других. Однако надо признать, что такие рейтинги существуют, за ними следят, их изучают, и артисты стараются попасть в них любой ценой. Особенно если такие рейтинги имеют престижный лейбл Billboard.
Billboard – один из старейших песенных рейтингов в западном мире. Это американский медиабренд в сфере развлечений, принадлежащий Billboard-Hollywood Reporter Media Group.
Этот медиабренд публикует статьи, включая новости, видео, мнения, обзоры, события, а также известен своими музыкальными чартами, включая Hot 100, Billboard 200 и Global 200, в которых отслеживаются самые популярные песни и альбомы в различных жанрах. Этот бренд также проводит мероприятия, владеет издательской компанией и ведет несколько телевизионных шоу. Влияние этих рейтингов трудно переоценить. Многие артисты и их песни стали известны только благодаря появлению в чартах Billboard.
Когда я нашел набор данных с топ-100 рейтингов Billboard с 1958 года, я не смог устоять. Несмотря на мое скептическое отношение ко многим музыкальным композициям в этих чартах, мой интерес как специалиста по науке о данных все же взял свое. В этом посте я поделюсь с вами своим исследованием этих данных с помощью языка программирования Python и библиотеки Pandas.
Итак, давайте приступим. Загрузим необходимые библиотеки и датасет с данными.
import pandas as pd
#А также сам датасет
df = pd.read_csv('hot_100.csv')
df.head()
Рис. 1: Датасет с позициями песен в рейтинге Billboard Top 100
Посмотрим сколько у нас таких накопленных данных.
print('В датасете строк/колонок:', df.shape)
В датасете строк/колонок: (336295, 13)
В биллборде топ-100 за все время побывало более 300 тыс. песен. Этого более чем достаточно для анализа.
Давайте теперь посмотрим на структуру данных.
df.info()
Рис. 2: Наименования столбцов, их типов данных и количества строк
В целом данные заполнены хорошо. Однако есть много лишнего. Оставим только полезные для анализа столбцы.
df = df[['song', 'performer', 'chart_debut', 'peak_position', 'worst_position',
'time_on_chart', 'consecutive_weeks']].sort_values(by='chart_debut')
df
Рис. 3: Урезанный датасет со столбцами “Название песни”, “Исполнитель”, “Время дебюта в чарте”, “Пиковая позиция”, “Худшая позиция”, “Длительность нахождения в чарте”, “Недель подряд”
Посмотрим сколько пустых строк осталось в таблице.
df.isna().mean().sort_values(ascending=False)
consecutive_weeks 0.099044
song 0.000000
performer 0.000000
chart_debut 0.000000
peak_position 0.000000
worst_position 0.000000
time_on_chart 0.000000
dtype: float64
Что-ж. Их немного, порядка 10% и все в столбце consecutive_weeks. Очевидно что это не ошибка в данных, а просто некоторые песни буквально “залетали” и “вылетали” с чарта, не пробыв там и 2х недель.
И здесь невольно хочется глянуть а сколько же в среднем песни находились в Биллборде топ-100 за всю его историю.
df['consecutive_weeks'].mean()
8.805952070550882
Меньше 9 недель! Недолог путь хитов.
Может быть они часто “залетали” в чарт не раз? Уже после “вылета”?
df['time_on_chart'].mean()
9.223732139936663
Видим что это не так. Фокус с “вылетом” и “залетом обратно” удался очень и очень немногим.
Для наглядности давайте построим таблицу по исполнителям, и посмотрим на разброс их пребывания в биллборде.
df[['performer', 'time_on_chart']].groupby('performer').agg({'min', 'max'})
Рис. 4: Сводная таблица артистов с указанием их максимальной и минимальной длительности пребывания в чарте
Видим что за все время в Биллборде побывало более 10000 исполнителей. Однако эта таблица получилась слишком большой. Кроме того, эти данные не 100% точны, так как некоторые артисты записывали хиты помногу раз, иногда в коллаборациях друг с другом, в составах групп итд.
Как же понять кому из исполнителей удалось дольше всего пробыть в рейтингах 100 лучших хитов? Это делается очень просто.
df['performer'].value_counts().head(20)
Taylor Swift 1180
Elton John 889
Madonna 857
Drake 832
Kenny Chesney 777
Tim McGraw 739
Keith Urban 674
Stevie Wonder 659
Rod Stewart 657
Mariah Carey 635
Michael Jackson 613
Chicago 607
Rascal Flatts 604
Jason Aldean 592
Billy Joel 588
The Beatles 585
The Rolling Stones 585
Rihanna 575
Aretha Franklin 569
P!nk 564
Name: performer, dtype: int64
Но как понять какие песни обеспечили им такой результат? Можно конечно сделать аналогичную группировку по песням.
df[['performer', 'song']].value_counts().head(20)
Рис. 5: Сводная таблица песен (композиций) с указанием их максимальной и минимальной длительности пребывания в чарте
Но, как мы видим, в таком случае строки будут дублироваться. Так как же понять кто из исполнителей действительно топового класса?
Для этого нам нужно сделать преобразование нашей таблицы через функцию.
#Создадим копию датафрейма и назоваем ее dfp (сокр. df_performers)
dfp = df.copy()
#Отсортируем ее по столбцу исполнителей
dfp.sort_values(by='performer', inplace=True)
#Напишем функцию для группировки
def group_by_performer(data):
#сгруппируем датафрейм по исполнителям и вытащим уникальные названия
#песен в новый столбец hits. Названия будут идти через запятую.
dfp['hits'] = dfp.groupby('performer')['song'].transform(lambda x: ', '.join(x.unique()))
#просуммируем все недели в чарте и недели подряд при совпадениях исполнителей
dfp['time_on_chart'] = dfp.groupby('performer')['time_on_chart'].transform(lambda x: x.sum())
dfp['consecutive_weeks'] = dfp.groupby('performer')['consecutive_weeks'].transform(lambda x: x.sum())
#Поменяем формат даты в столбце chart_debut просто на год
data['chart_debut'] = pd.to_datetime(data['chart_debut'], format='%Y-%m-%d').dt.year
#Удалим дубликаты и сбросим индекс
dfp.drop_duplicates(subset='performer', inplace=True)
dfp.reset_index(inplace=True)
return dfp
#Вызовем функцию
group_by_performer(dfp)
#И оставим только нужные столбцы
dfp = dfp[['performer', 'hits', 'chart_debut', 'time_on_chart', 'consecutive_weeks']]
Теперь у нас есть таблица со сгруппированными хитами по исполнителям.
dfp
Рис. 6: Сводная таблица со столбцами “Артист / Группа”, “Хиты (песни)”, “Год дебюта хита”, “Длительность нахождения в чарте”, “Недель подряд”
Давайте посмотрим насколько корректно сформировались данные по фильтру предыдущей тройки лидеров.
dfp[dfp['performer'].isin(['Taylor Swift','Elton John', 'Madonna'])]
Рис. 7: Применение фильтра к таблице по именам конкретных артистов
Видим что теперь изменился и топ лидеров и число недель в чарте. И это более корректные данные, так как они учитывают уникальные названия песен исполнителей.
Как же теперь выглядит топ исполнителей Billboard-100? Давайте взглянем.
dfp.sort_values(by='time_on_chart', ascending=False).head(20)
Рис. 8: Рейтинг лучших песен Billboard Top-100 по длительности пребывания в чарте в порядке убывания
Намного нагляднее, не правда-ли? Сразу видно и топ исполнителей, и названия их хитов, и год попадания в чарт, а также время нахождения в нем.
Такие преобразованные данные уже намного интереснее для проведения дальнейшего анализа. Например, можно перевести годы в декады и создать новый столбец с ними.
def assignDecade(x):
decade = int(x)
decade = decade/10
decade = int(decade)
decade = decade*10
return str(decade) + "-" + str(decade+10)
dfp['decade'] = dfp['chart_debut'].apply(assignDecade)
Теперь можно посмотреть топ исполнителей песен по десятилетиям.
dfp[dfp['decade'] == '2010-2020'].sort_values(by='time_on_chart', ascending=False).head(10)
Рис. 9: Рейтинг лучших певцов, певиц, групп чарта Billboard и их песен декады 2010-2020
Выше мы рассмотрели рейтинг по последнему полному десятилетию. Давайте теперь взглянем какие песни были наиболее популярны в “нулевые” годы.
dfp[dfp['decade'] == '2000-2010'].sort_values(by='time_on_chart', ascending=False).head(10)
Рис. 10: Рейтинг лучших исполнителей песен чарта Billboard и их песен декады 2000-2010
Вас еще не настигла ностальгия? 🙂 Многие треки вспомнили? А как насчет “девяностых”?
dfp[dfp['decade'] == '1990-2000'].sort_values(by='time_on_chart', ascending=False).head(10)
Рис. 11: Рейтинг лучших певцов, певиц, групп чарта Billboard и их песен декады 1990-2000
Ну, и как же можно не включить в наше исследование “золотой век” MTV – расцвета эпохи видеоклипов и поп-музыки?
dfp[dfp['decade'] == '1980-1990'].sort_values(by='time_on_chart', ascending=False).head(10)
Рис. 12: Рейтинг лучших исполнителей песен чарта Billboard и их песен декады 1980-1990
И, разумеется, очень интересно еще так же посмотреть что было популярно в 70х годах прошлого столетия. Ведь именно многие звезды и звездные группы 80х зародились именно тогда.
dfp[dfp['decade'] == '1970-1980'].sort_values(by='time_on_chart', ascending=False).head(10)
Рис. 13: Рейтинг лучших певцов, певиц, групп чарта Billboard и их песен в 70х годах прошлого века
Обратите внимание, что первая пятерка лучших по числу хитов исполнителей (Michael Jackson, Bee Gees, Rolling Stones, Prince, Genesis) достигла своего пика славы вовсе не в 70х, а в 80х годах. То есть в ту декаду они только искали свой уникальный, феноменальный путь, а уже в 80х гг раскрылись во всей красе.
Также можно посмотреть у кого из исполнителей было больше всего хитов в чарте Billboard. Для этого посчитаем длину столбца hits и отсортируем по ней.
dfp['num_of_hits'] = dfp.hits.apply(lambda x: len(x.split(', ')))
dfp.sort_values(by='num_of_hits', ascending=False).head(20)
Рис. 14: Рейтинг лучших певцов, певиц, групп по количеству их песен, которыли попали в чарт Billboard за все время
Для наглядности можно также построить график.
dfp_chart = dfp.sort_values("num_of_hits", ascending=False).head(30)
import matplotlib.pyplot as plt
dfp_chart.plot(kind='bar', x='performer', y='num_of_hits')
plt.show()
Рис. 15: Диаграмма по количеству песен артистов, которыли попали в чарт Billboard за все время
Видим, что тут особенно отличились из современных артистов Тейлор Свифт, Дрейк, Канье Уэст, The Weeknd, Мадонна, Джастин Бибер, Бейонсе и другие.
Как видите, простора с такими данными для исследований открывается довольно много. И, разумеется, можно поискать и посравнивать любимых исполнителей.
dfp[dfp['performer'].isin(['The Beatles',
'Genesis',
'Dire Straits',
'Michael Jackson',
'Queen',
'Pink Floyd'])]
Рис. 16: Таблица сравнения групп The Beatles, Genesis, Queen, Pink Floyd и Michael Jackson по количеству хитов, попавших в чарт Billboard
Из таблицы выше видно, что чаще всего на вершины Биллборда попадали песни The Beatles и Майкла Джексона. Песни групп Genesis и Queen попадали в чарт тоже довольно часто – более 20 раз.
Ну и, наконец, мы можем построить таблицы исполнителей-лидеров по годам. Сначала по числу выпущенных хитов.
def year_leaders(dfp):
dfp_copy = dfp.copy()
dfp_copy.sort_values(by=['chart_debut','num_of_hits'], ascending=False, inplace=True)
dfp_copy.drop_duplicates(subset='chart_debut', keep='first', inplace=True)
dfp_copy.set_index('chart_debut', inplace=True)
return dfp_copy
ylead = year_leaders(dfp)
pd.set_option('display.max_rows', 66)
ylead
Рис. 17: Лучшие музыкальные исполнители 2013-2023 по версии Billboard (по числу хитов, попавших в чарт)
Затем мы можем посчитать такую же статистику по количеству недель в топ-100 Billboard.
def year_leaders2(dfp):
dfp_copy2 = dfp.copy()
dfp_copy2.sort_values(by=['chart_debut','time_on_chart'], ascending=False, inplace=True)
dfp_copy2.drop_duplicates(subset='chart_debut', keep='first', inplace=True)
dfp_copy2.set_index('chart_debut', inplace=True)
return dfp_copy2
ylead2 = year_leaders2(dfp)
ylead2
Рис. 18: Лучшие музыкальные исполнители 2013-2023 по версии Billboard (по продолжительности нахождения хитов в чарте [недель])
Хорошо. С авторами песен и исполнителями разобрались. Давайте теперь взглянем на еще одну интересную метрику – лучшие хиты.
df[df['peak_position'] == 1].drop_duplicates(subset='song', keep='first')
Рис. 19: Все хиты Биллборда, которые занимали 1-ую позицию в период с 1958 по 2023 гг
Как мы видим, за все время существования чарта 1117 песен побывали на его 1й строчке. Всего лишь 1117 из 300 с лишним тысяч! Просто вдумайтесь в эти цифры. А теперь умножьте на количество создаваемой музыки сегодня. Какова вероятность что она займет первую строчку топового чарта в мире?
Но ведь мы не музыканты, а исследователи, верно? Давайте продолжим наше путешествие и, также как и с исполнителями, сгруппируем их по годам и создадим отдельный датафрейм для этого.
dfs = df[df['peak_position'] == 1].drop_duplicates(subset='song', keep='first')
dfs['chart_debut'] = dfs['chart_debut'].apply(lambda x: str(x)[:4])
Добавим также столбец с декадами.
def assignDecade(x):
decade = int(x)
decade = decade/10
decade = int(decade)
decade = decade*10
return str(decade) + "-" + str(decade+10)
dfs['decade'] = dfs['chart_debut'].apply(assignDecade)
Для чего мы делали эти преобразования? Теперь можно посмотреть лучшие песни по десятилетиям.
dfs[dfs['decade'] == '2020-2030'].sort_values(by='time_on_chart', ascending=False).head(10)
Рис. 20: Лучшие песни десятилетия 2020-2030 по версии Billboard
dfs[dfs['decade'] == '2010-2020'].sort_values(by='time_on_chart', ascending=False).head(10)
Рис. 21: Лучшие песни десятилетия 2010-2020 по версии Billboard
dfs[dfs['decade'] == '2000-2010'].sort_values(by='time_on_chart', ascending=False).head(10)
Рис. 22: Лучшие песни десятилетия 2000-2010 по версии Billboard
dfs[dfs['decade'] == '1990-2000'].sort_values(by='time_on_chart', ascending=False).head(10)
Рис. 23: Лучшие песни десятилетия 1990-2000 по версии Billboard
dfs[dfs['decade'] == '1980-1990'].sort_values(by='time_on_chart', ascending=False).head(10)
Рис. 24: Лучшие песни десятилетия 1980-1990 по версии Billboard
dfs[dfs['decade'] == '1970-1980'].sort_values(by='time_on_chart', ascending=False).head(10)
Рис. 25: Лучшие песни десятилетия 1970-1980 по версии Billboard
Занятно, не правда-ли? Многие ли их этих хитов вам снова вспомнились? Уверен, что да. 🙂
Также мы можем сравнить все хиты всех времен по времени нахождения в чартах.
dfs.sort_values(by='time_on_chart', ascending=False).head(20)
Рис. 26: Лучшие хиты Биллборда по общей длительности присутствия в чартах
И здесь возникает идея: а почему бы не посмотреть еще статистику по времени сколько недель подряд хиты были в топе.
dfs.sort_values(by='consecutive_weeks', ascending=False).head(20)
Рис. 27: Лучшие хиты Биллборда по непрерывному времени присутствия в чартах (в неделях)
Видим что и там, и там преобладают в основном современные хиты. То есть, очевидно, что сейчас пробиться на 1 строчку Billboard стало намного труднее чем в 70-80х или 90х гг. И еще сложнее ее удержать. Конкуренция значительно выросла.
На этом мы завершаем наше интересное путешествие в экскурс лучших песен-хитов своих десятилетий (по версии Billboard). И, в заключение этой статьи, давайте построим таблицы песен-лидеров по годам.
def year_leaders(dfs):
dfs_copy = dfs.copy()
dfs_copy.sort_values(by=['chart_debut','time_on_chart'], ascending=False, inplace=True)
dfs_copy.drop_duplicates(subset='chart_debut', keep='first', inplace=True)
dfs_copy.set_index('chart_debut', inplace=True)
return dfs_copy
ylead2 = year_leaders(dfs)
ylead2
Рис. 28: Лучшие хиты Billboard по числу недель в чарте по каждому году
Видим, что в 2022 году это был трек Bad Habit от Steve Lacy, в 2021 году – Heat Waves от Glass Animals, в 2020 – Positions от Ariana Grande, в 2019 – Someone You Loved от Lewis Capaldi. Уверен что многие из этих хитов вам хорошо знакомы. На этом наш анализ завершен. Благодарю за внимание!