Исходный размер 564x796

Анализ данных Spotify

PROTECT STATUS: not protected

Вводная часть

Я решила проанализировать данные Spotify, мне показалось это очень интересным и актуальным в целом и для меня так как я люблю музыку и все что с ней связано.

Причины выбора:

1.Популярность платформы: Spotify — одна из самых популярных стриминговых сервисов в мире. Анализ данных этой платформы позволяет получить представление о текущих музыкальных трендах и предпочтениях слушателей.

2.Разнообразие метрик: Данные Spotify включают множество метрик, таких как количество прослушиваний, популярность треков, характеристики аудио (темп, тональность, громкость и т.д.), что позволяет проводить комплексный анализ.

3.Социальные аспекты: Платформа активно использует социальные функции, такие как создание плейлистов и возможность делиться музыкой, что открывает возможности для исследования социальных взаимодействий и влияния на музыкальные предпочтения.

4.Интересные инсайты: Данные Spotify могут раскрыть неожиданные паттерны и связи между различными жанрами, исполнителями и слушателями, что делает проект более увлекательным и информативным.

блокнот с кодом https://colab.research.google.com/drive/1C705I3sghxMV5fAEMMkhtGFpPaXIyfl7#scrollTo=U5jqlOFQeeJ6

файл для анализа https://drive.google.com/file/d/1XRcWYuX8rvFrhLRSg1fTQRHZ9uRkJrlb/view?usp=sharing

Ссылка на используемые данные—https://www.kaggle.com/datasets/nelgiriyewithana/top-spotify-songs-2023?resource=download

Вид графиков—Столбчатые и многомерный (3d)

Основные этапы анализа:

1.Загрузка и предобработка данных. 2.Общий статистический анализ. 3.Визуализация ключевых параметров. 4.Анализ зависимости между характеристиками треков.

import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import plotly.express as px

pd.set_option («display.max_columns», None)

file_path = «spotify-2023.csv» df = pd.read_csv (file_path, encoding='latin1')

percentage_columns = [ «danceability_%», «valence_%», «energy_%», «acousticness_%», «instrumentalness_%», «liveness_%», «speechiness_%» ] df[percentage_columns] = df[percentage_columns].apply (pd.to_numeric, errors='coerce') df.head ()

Код выполняет несколько ключевых шагов для работы с данными из CSV-файла, содержащего информацию о песнях Spotify.

  1. Импорт библиотек: Здесь импортирую необходимые библиотеки для работы с данными (pandas), визуализации (matplotlib, seaborn, plotly.express).

  2. Настройка отображения: Эта строка устанавливает опцию в pandas, чтобы отображать все столбцы DataFrame при выводе, что полезно для анализа данных.

  3. Чтение данных: Задаю путь к файлу CSV и загружаете его в DataFrame df с помощью функции pd.read_csv(). Параметр encoding='latin1' используется для корректного чтения файла с определенной кодировкой.

  1. Определение процентных столбцов: Создаю список percentage_columns, который содержит названия столбцов, представляющих процентные значения различных характеристик песен.

  2. Преобразование данных: Применяю метод apply() к указанным столбцам, чтобы преобразовать их в числовой формат. Параметр errors='coerce' означает, что если преобразование не удастся (например, если в ячейках будут некорректные данные), то соответствующие значения будут заменены на NaN.

(сама таблица представлена в файле блокнота)

Статистическое описание данных

numeric_columns = [ "released_year", "bpm", "danceability_%", "valence_%", "energy_%", "acousticness_%", "instrumentalness_%", "liveness_%", "speechiness_%" ]

colors = ["#FFADAD", "#FFD6A5", "#FDFFB6", "#CAFFBF", "#9BF6FF", "#A0C4FF", "#BDB2FF"]

background_color = "#2C2C2C" spine_color = "#E0E0E0" label_color = "#E0E0E0" figure_background = "#1E1E1E"

fig = plt.figure(figsize=(14, 9)) fig.patch.set_facecolor(figure_background)

for i, col in enumerate(numeric_columns): ax = plt.subplot(3, 3, i + 1) sns.histplot(df[col], kde=True, bins=30, color=colors[i % len(colors)])

ax.set_facecolor(background_color)
ax.spines["top"].set_color(spine_color)
ax.spines["right"].set_color(spine_color)
ax.set_xlabel(col, color=label_color)
ax.set_ylabel(col, color=label_color)


ax.spines["left"].set_color(spine_color)
ax.spines["bottom"].set_color(spine_color)
ax.set_title(f"Распределение {col}", color=label_color)
ax.tick_params(axis='x', colors=label_color)
ax.tick_params(axis='y', colors=label_color)

plt.tight_layout() plt.show()

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

Исходный размер 1388x889

На графиках можно заметить следующее:

-Год выпуска: большинство треков выпущены после 2015 года. -BPM: распределение почти равномерное, с пиками около 100-140 BPM -Танцевальность: большая часть треков имеет высокую танцевальность (60–80%). -Энергия: большинство треков энергичные (50–80%). -Инструментальность: почти все треки вокальные. -Акустичность: есть как полностью электронные треки, так и с высокой акустичностью. -Speechiness: большинство треков содержат мало речевых элементов.

Корреляция аудиохарактеристик

import matplotlib.pyplot as plt import seaborn as sns

background_color = "#2C2C2C" spine_color = "#E0E0E0" label_color = "#E0E0E0" figure_background = "#1E1E1E"

cmap_colors = ["#FFADAD", "#FFD6A5", "#FDFFB6", "#CAFFBF", "#9BF6FF", "#A0C4FF", "#BDB2FF"]

fig, ax = plt.subplots(figsize=(10, 8)) fig.patch.set_facecolor(figure_background) ax.set_facecolor(background_color)

heatmap = sns.heatmap( df[percentage_columns].corr(), annot=True, cmap=cmap_colors, fmt=".2f", linewidths=0.5,

)

plt.title("Корреляция аудиохарактеристик", fontsize=14, color=label_color)

plt.xticks(color=label_color, rotation=45, ha="right") plt.yticks(color=label_color, rotation=0)

cbar = heatmap.collections[0].colorbar cbar.ax.yaxis.label.set_color(label_color) cbar.ax.tick_params(colors=label_color)

plt.show()

Исходный размер 902x778

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

Выводы из корреляционного анализа:

-BPM слабо коррелирует с другими параметрами, что означает, что темп трека не сильно влияет на его танцевальность или энергию. -Энергия и танцевальность имеют положительную корреляцию (0.54), что ожидаемо: чем энергичнее трек, тем выше его танцевальность. -Акустичность и энергия имеют сильную отрицательную корреляцию (-0.73), что логично — акустические треки часто менее энергичные. -Инструментальность и танцевальность почти не связаны, что подтверждает наличие танцевальной инструментальной музыки. -Speechiness (наличие речи в треке) не сильно зависит от других параметров, но слабо коррелирует с акустичностью.

Средняя танцевальность по годам

background_color = "#2C2C2C" spine_color = "#E0E0E0" label_color = "#E0E0E0" figure_background = "#1E1E1E"

bar_colors = ["#FFADAD", "#FFD6A5", "#FDFFB6", "#CAFFBF", "#9BF6FF", "#A0C4FF", "#BDB2FF"]

yearly_danceability = df.groupby("released_year")["danceability_%"].mean()

fig, ax = plt.subplots(figsize=(10, 5)) fig.patch.set_facecolor(figure_background) ax.set_facecolor(background_color)

sns.barplot( x=yearly_danceability.index, y=yearly_danceability.values, palette=bar_colors, ax=ax )

ax.set_title("Средний процент танцевальности по годам", fontsize=14, color=label_color) ax.set_xlabel("Год выпуска", fontsize=12, color=label_color) ax.set_ylabel("Танцевальность (%)", fontsize=12, color=label_color)

ax.spines["top"].set_color(spine_color) ax.spines["right"].set_color(spine_color) ax.spines["left"].set_color(spine_color) ax.spines["bottom"].set_color(spine_color) ax.tick_params(axis='x', colors=label_color, rotation=45) ax.tick_params(axis='y', colors=label_color)

plt.show()

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

Исходный размер 855x496

Средняя энергичность по годам

background_color = "#2C2C2C" spine_color = "#E0E0E0" label_color = "#E0E0E0" figure_background = "#1E1E1E" line_color = "#FF5733" marker_color = "#FFD700"

yearly_energy = df.groupby("released_year")["energy_%"].mean()

fig, ax = plt.subplots(figsize=(11, 5)) fig.patch.set_facecolor(figure_background) ax.set_facecolor(background_color)

sns.lineplot( x=yearly_energy.index, y=yearly_energy.values, marker="o", markersize=8, markerfacecolor=marker_color, markeredgecolor=spine_color, color=line_color, linewidth=2, ax=ax )

ax.set_title("Средняя энергичность треков по годам", fontsize=14, color=label_color) ax.set_xlabel("Год выпуска", fontsize=12, color=label_color) ax.set_ylabel("Энергичность (%)", fontsize=12, color=label_color)

ax.spines["top"].set_color(spine_color) ax.spines["right"].set_color(spine_color) ax.spines["left"].set_color(spine_color) ax.spines["bottom"].set_color(spine_color) ax.tick_params(axis='x', colors=label_color, rotation=45) ax.tick_params(axis='y', colors=label_color)

plt.show()

Исходный размер 923x496

Этот код создает линейный график, который позволяет визуально оценить, как менялась энергичность музыкальных треков в зависимости от года их выпуска. Это может помочь в анализе тенденций в музыке и понимании того, как изменялись предпочтения слушателей с течением времени. Если у вас есть дополнительные вопросы или нужно внести изменения в код, дайте знать!

Анализ данных Spotify
Проект создан 02.04.2025
Мы используем файлы cookies для улучшения работы сайта НИУ ВШЭ и большего удобства его использования. Более подробную...
Показать больше