Анализ песен рейтинга Billboard Top-100 с 1958 по 2023 гг

Честно говоря, я не очень верю в рейтинги песен. Потому что музыка сегодня – это, в основном, дело вкуса. И то, что популярно в одних сообществах, не обязательно популярно в других. Однако надо признать, что такие рейтинги существуют, за ними следят, их изучают, и артисты стараются попасть в них любой ценой. Особенно если такие рейтинги имеют престижный лейбл 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()

Датасет с позициями песен в рейтинге Billboard Top 100

Рис. 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% точны, так как некоторые артисты записывали хиты помногу раз, иногда в коллаборациях друг с другом, в составах групп итд.

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

Как же понять кому из исполнителей удалось дольше всего пробыть в рейтингах 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)

Рейтинг лучших песен Billboard Top-100 по длительности пребывания в чарте в порядке убывания

Рис. 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)

Рейтинг лучших певцов, певиц, групп чарта Billboard и их песен декады 2010-2020

Рис. 9: Рейтинг лучших певцов, певиц, групп чарта Billboard и их песен декады 2010-2020

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

dfp[dfp['decade'] == '2000-2010'].sort_values(by='time_on_chart', ascending=False).head(10)

Рейтинг лучших исполнителей песен чарта Billboard и их песен декады 2000-2010

Рис. 10: Рейтинг лучших исполнителей песен чарта Billboard и их песен декады 2000-2010

Вас еще не настигла ностальгия? 🙂 Многие треки вспомнили? А как насчет “девяностых”?

dfp[dfp['decade'] == '1990-2000'].sort_values(by='time_on_chart', ascending=False).head(10)

Рейтинг лучших певцов, певиц, групп чарта Billboard и их песен декады 1990-2000

Рис. 11: Рейтинг лучших певцов, певиц, групп чарта Billboard и их песен декады 1990-2000

Ну, и как же можно не включить в наше исследование “золотой век” MTV – расцвета эпохи видеоклипов и поп-музыки?

dfp[dfp['decade'] == '1980-1990'].sort_values(by='time_on_chart', ascending=False).head(10)

Рейтинг лучших исполнителей песен чарта Billboard и их песен декады 1980-1990

Рис. 12: Рейтинг лучших исполнителей песен чарта Billboard и их песен декады 1980-1990

И, разумеется, очень интересно еще так же посмотреть что было популярно в 70х годах прошлого столетия. Ведь именно многие звезды и звездные группы 80х зародились именно тогда.

dfp[dfp['decade'] == '1970-1980'].sort_values(by='time_on_chart', ascending=False).head(10)

Рейтинг лучших певцов, певиц, групп чарта Billboard и их песен в 70х годах прошлого века

Рис. 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)

Рейтинг лучших певцов, певиц, групп по количеству их песен, которыли попали в чарт Billboard за все время

Рис. 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()

Диаграмма по количеству песен артистов, которыли попали в чарт Billboard за все время

Рис. 15: Диаграмма по количеству песен артистов, которыли попали в чарт Billboard за все время

Видим, что тут особенно отличились из современных артистов Тейлор Свифт, Дрейк, Канье Уэст, The Weeknd, Мадонна, Джастин Бибер, Бейонсе и другие.

Как видите, простора с такими данными для исследований открывается довольно много. И, разумеется, можно поискать и посравнивать любимых исполнителей.

dfp[dfp['performer'].isin(['The Beatles',
                           'Genesis',
                           'Dire Straits',
                           'Michael Jackson',
                           'Queen',
                           'Pink Floyd'])]

Таблица сравнения групп The Beatles, Genesis, Queen, Pink Floyd и Michael Jackson по количеству хитов, попавших в чарт Billboard

Рис. 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

Лучшие музыкальные исполнители 2013-2023 по версии Billboard (по числу хитов, попавших в чарт)

Рис. 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

Лучшие музыкальные исполнители 2013-2023 по версии Billboard (по продолжительности нахождения хитов в чарте [недель])

Рис. 18: Лучшие музыкальные исполнители 2013-2023 по версии Billboard (по продолжительности нахождения хитов в чарте [недель])

Хорошо. С авторами песен и исполнителями разобрались. Давайте теперь взглянем на еще одну интересную метрику – лучшие хиты.

df[df['peak_position'] == 1].drop_duplicates(subset='song', keep='first')

Все хиты Биллборда, которые занимали 1-ую позицию в период с 1958 по 2023 гг

Рис. 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)

Лучшие песни десятилетия 2020-2030 по версии Billboard

Рис. 20: Лучшие песни десятилетия 2020-2030 по версии Billboard

dfs[dfs['decade'] == '2010-2020'].sort_values(by='time_on_chart', ascending=False).head(10)

Лучшие песни десятилетия 2010-2020 по версии Billboard

Рис. 21: Лучшие песни десятилетия 2010-2020 по версии Billboard

dfs[dfs['decade'] == '2000-2010'].sort_values(by='time_on_chart', ascending=False).head(10)

Лучшие песни десятилетия 2000-2010 по версии Billboard

Рис. 22: Лучшие песни десятилетия 2000-2010 по версии Billboard

dfs[dfs['decade'] == '1990-2000'].sort_values(by='time_on_chart', ascending=False).head(10)

Лучшие песни десятилетия 1990-2000 по версии Billboard

Рис. 23: Лучшие песни десятилетия 1990-2000 по версии Billboard

dfs[dfs['decade'] == '1980-1990'].sort_values(by='time_on_chart', ascending=False).head(10)

Лучшие песни десятилетия 1980-1990 по версии Billboard

Рис. 24: Лучшие песни десятилетия 1980-1990 по версии Billboard

dfs[dfs['decade'] == '1970-1980'].sort_values(by='time_on_chart', ascending=False).head(10)

Лучшие песни десятилетия 1970-1980 по версии Billboard

Рис. 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

Лучшие хиты Billboard по числу недель в чарте по каждому году

Рис. 28: Лучшие хиты Billboard по числу недель в чарте по каждому году

Видим, что в 2022 году это был трек Bad Habit от Steve Lacy, в 2021 году – Heat Waves от Glass Animals, в 2020 – Positions от Ariana Grande, в 2019 – Someone You Loved от Lewis Capaldi. Уверен что многие из этих хитов вам хорошо знакомы. На этом наш анализ завершен. Благодарю за внимание!