Original size 564x796

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

PROTECT STATUS: not protected
5

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

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

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

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

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

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

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

Вид графиков—Столбчатые и многомерный (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' используется для корректного чтения файла с определенной кодировкой.

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

5. Преобразование данных: Применяю метод 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

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

1. Создание фигуры для графика: plt.figure (figsize=(10, 5) Эта строка создает новую фигуру с размерами 10 на 5 дюймов.

2. Создание линейного графика: sns.lineplot (x=df.groupby («released_year»)[«energy_%»].mean ().index, y=df.groupby («released_year»)[«energy_%»].mean ().values, marker="o», color="red») Здесь вы используете функцию sns.lineplot () из библиотеки Seaborn для создания линейного графика: • x=df.groupby («released_year»)[«energy_%»].mean ().index: вы группируете данные по году выпуска и берете индексы (годы), которые будут по оси X. • y=df.groupby («released_year»)[«energy_%»].mean ().values: получаете средние значения энергичности треков для каждого года, которые будут по оси Y. • marker="o»: добавляет маркеры в виде кругов на линии, чтобы подчеркнуть каждую точку данных. •color="red»: устанавливает цвет линии и маркеров на красный.

3. Настройка меток по оси X: plt.xticks (rotation=45) Эта строка поворачивает метки на оси X на 45 градусов для улучшения читаемости.

4. Заголовок графика: plt.title ('Средняя энергичность треков по годам', fontsize=14) Устанавливает заголовок графика с размером шрифта 14.

5. Подписи осей: plt.xlabel ('Год выпуска', fontsize=12) plt.ylabel ('Энергичность (%)', fontsize=12) Эти строки задают подписи для осей X и Y соответственно с размером шрифта 12.

6. Сетка на графике: plt.grid (True) Включает сетку на графике для лучшей визуализации.

7. Отображение графика: plt.show () Эта строка отображает созданный график на экране.

Топ-10 исполнителей по общему числу стримов

background_color = «#2C2C2C» spine_color = «#E0E0E0» label_color = «#E0E0E0» figure_background = «#1E1E1E»

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

df[«streams»] = pd.to_numeric (df[«streams»], errors="coerce»)

top_artists = df.groupby («artist (s)_name»)[«streams»].sum ().nlargest (10)

fig, ax = plt.subplots (figsize=(12, 6)) fig.patch.set_facecolor (figure_background) ax.set_facecolor (background_color)

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

ax.set_title («Топ-10 исполнителей по общему числу стримов», 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) ax.tick_params (axis='y', colors=label_color)

plt.show ()

Original size 1102x553

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

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

spine_color = «#E0E0E0» label_color = «#E0E0E0» figure_background = «#1E1E1E» line_color = «#A0C4FF» marker_color = «#BDB2FF»

yearly_acousticness = df.groupby («released_year»)[«acousticness_%»].mean ()

fig, ax = plt.subplots (figsize=(10, 5)) fig.patch.set_facecolor (figure_background) ax.set_facecolor (»#2C2C2C»)

sns.lineplot ( x=yearly_acousticness.index, y=yearly_acousticness.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 845x496

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

3D графики зависимостей

Энергия\танцевальность\акустичность

background_color = «#000000» grid_color = «#2C2C2C» label_color = «#E0E0E0»

fig = px.scatter_3d ( df, x="energy_%», y="danceability_%», z="acousticness_%», color="valence_%», size="bpm», hover_data=[«track_name», «artist (s)_name»], title="3D график зависимости Энергия | Танцевальность | Акустичность», color_continuous_scale=[»#FFADAD», «#FFD6A5», «#FDFFB6», «#CAFFBF», «#9BF6FF», «#A0C4FF», «#BDB2FF»] )

fig.update_traces (marker=dict (line=dict (width=0)))

fig.update_layout ( paper_bgcolor=background_color, plot_bgcolor=background_color, title_font=dict (color=label_color, size=16), scene=dict ( xaxis=dict ( title="Энергия (%)», titlefont=dict (color=label_color), tickfont=dict (color=label_color), showgrid=True, gridcolor=grid_color, showbackground=True, backgroundcolor=grid_color, showspikes=False ), yaxis=dict ( title="Танцевальность (%)», titlefont=dict (color=label_color), tickfont=dict (color=label_color), showgrid=True, gridcolor=grid_color, showbackground=True, backgroundcolor=grid_color, showspikes=False ), zaxis=dict ( title="Акустичность (%)», titlefont=dict (color=label_color), tickfont=dict (color=label_color), showgrid=True, gridcolor=grid_color, showbackground=True, backgroundcolor=grid_color, showspikes=False ), bgcolor=background_color ), coloraxis_colorbar=dict (title="Валентность (%)», tickfont=dict (color=label_color), titlefont=dict (color=label_color)) )

fig.show ()

Original size 1687x453

Ось X: Уровень энергии Ось Y: Танцевальность Ось Z: Акустичность Цвет точек: Уровень позитивности трека Размер точек: Темп трека в ударах в минуту (BPM)

Что показывает этот график?

Высокая энергия часто связана с высокой танцевальностью, что логично для поп-музыки и танцевальных жанров. Высокая акустичность наблюдается у треков с низкой энергией, что указывает на то, что акустические композиции чаще менее энергичны. Цветовая гамма показывает настроение треков: позитивные треки (более теплые цвета, например, желтый) чаще имеют высокую танцевальность и энергию. Грустные треки (холодные цвета, например, синий) могут быть как низкоэнергичными, так и танцевальными.

Темп\настроение трека\энергия

background_color = «#000000» grid_color = «#2C2C2C» label_color = «#E0E0E0»

fig2 = px.scatter_3d ( df, x="bpm», y="valence_%», z="energy_%», color="danceability_%», size="speechiness_%», hover_data=[«track_name», «artist (s)_name»], title="3D график зависимости: Темп | Настроение трека | Энергия», color_continuous_scale=[»#FFADAD», «#FFD6A5», «#FDFFB6», «#CAFFBF», «#9BF6FF», «#A0C4FF», «#BDB2FF»], )

fig2.update_traces (marker=dict (line=dict (width=0)))

fig2.update_layout ( paper_bgcolor=background_color, plot_bgcolor=background_color, title_font=dict (color=label_color, size=16), scene=dict ( xaxis=dict ( title="Темп (BPM)», titlefont=dict (color=label_color), tickfont=dict (color=label_color), showgrid=True, gridcolor=grid_color, showbackground=True, backgroundcolor=grid_color, showspikes=False ), yaxis=dict ( title="Настроение трека (%)», titlefont=dict (color=label_color), tickfont=dict (color=label_color), showgrid=True, gridcolor=grid_color, showbackground=True, backgroundcolor=grid_color, showspikes=False ), zaxis=dict ( title="Энергия (%)», titlefont=dict (color=label_color), tickfont=dict (color=label_color), showgrid=True, gridcolor=grid_color, showbackground=True, backgroundcolor=grid_color, showspikes=False ), bgcolor=background_color ), coloraxis_colorbar=dict (title="Танцевальность (%)», tickfont=dict (color=label_color), titlefont=dict (color=label_color)) )

fig2.show ()

Original size 1690x456

Ось X: Темп трека в ударах в минуту (BPM) Ось Y: Настроение трека — насколько трек звучит радостно или грустно Ось Z: Уровень энергии Цвет точек: Танцевальность Размер точек: Количество речевых элементов в треке

Что показывает этот график?

BPM (темп) не всегда связан с энергией. Можно найти треки с низким BPM, но высокой энергией (например, рок-баллады) и высоким BPM, но низкой энергией (например, медленные электронные композиции). Веселые (высокий Valence) и грустные (низкий Valence) треки могут встречаться при любом BPM. Но в целом можно заметить, что энергичные и танцевальные треки (яркие точки) чаще имеют более высокий BPM. Речевые элементы (размер точек Speechiness): Хип-хоп и рэп треки (большие точки) чаще имеют низкий Valence (то есть более агрессивный или эмоциональный характер) и различные уровни энергии. Поп-музыка обычно имеет средний уровень речевых элементов и высокие значения Valence и Energy.

Выводы из 3D-анализа

Высокая энергия и высокая танцевальность чаще всего идут вместе. Акустичные треки менее энергичны. BPM (темп) не всегда связан с энергией, но влияет на танцевальность. Речевые элементы чаще встречаются в менее позитивных треках (рэп, хип-хоп).

Заключение

В ходе анализа были рассмотрены характеристики треков из топа Spotify. Основные выводы:

-Количество стримов подчиняется распределению с длинным хвостом: у большинства песен небольшое число стримов, но есть и явные хиты. -Танцевальность треков варьируется по годам, но сохраняется в пределах 50-80%. -Энергичность музыки имеет тенденцию к увеличению. -Акустичность постепенно снижается, что говорит о популярности более «электронного» звучания. -Топ-исполнители сильно различаются по числу стримов, но в лидерах остаются наиболее популярные мировые звезды.

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

Описание применения генеративной модели

Midjourney — генерация обложки Chat GPT - обращения с целью генерации инструкций и рекомендаций по улучшению кода, вопросы по тому, как правильно имплементировать те или иные функции, библиотеки и т.д

Анализ данных Spotify
5
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