Original size 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, позволяя визуально оценить распределение этих характеристик. Каждая гистограмма будет отображать частоту значений в указанных диапазонах, а линия плотности поможет понять, как данные распределены по сравнению с нормальным распределением.

Original size 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 ()

Original size 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 ()

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

Original size 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 ()

Original size 923x496

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

Анализ данных Spotify
Project created at 02.04.2025
We use cookies to improve the operation of the HSE website and to enhance its usability. More detailed information on the use of cookies can be fou...
Show more