Original size 564x796

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

PROTECT STATUS: not protected

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

Я решила проанализировать данные 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
We use cookies to improve the operation of the website and to enhance its usability. More detailed information on the use of cookies can be fo...
Show more