
Вводная часть
Я решила проанализировать данные Spotify, мне показалось это очень интересным и актуальным в целом и для меня так как я люблю музыку и все что с ней связано.
Причины выбора:
1.Популярность платформы: Spotify — одна из самых популярных стриминговых сервисов в мире. Анализ данных этой платформы позволяет получить представление о текущих музыкальных трендах и предпочтениях слушателей.
2.Разнообразие метрик: Данные Spotify включают множество метрик, таких как количество прослушиваний, популярность треков, характеристики аудио (темп, тональность, громкость и т. д.), что позволяет проводить комплексный анализ.
3.Социальные аспекты: Платформа активно использует социальные функции, такие как создание плейлистов и возможность делиться музыкой, что открывает возможности для исследования социальных взаимодействий и влияния на музыкальные предпочтения.
4.Интересные инсайты: Данные Spotify могут раскрыть неожиданные паттерны и связи между различными жанрами, исполнителями и слушателями, что делает проект более увлекательным и информативным.
Ссылка на используемые данные—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' используется для корректного чтения файла с определенной кодировкой.
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, позволяя визуально оценить распределение этих характеристик. Каждая гистограмма будет отображать частоту значений в указанных диапазонах, а линия плотности поможет понять, как данные распределены по сравнению с нормальным распределением.
На графиках можно заметить следующее:
-Год выпуска: большинство треков выпущены после 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 ()
Этот код создает тепловую карту, которая визуализирует корреляцию между различными аудиохарактеристиками, указанными в 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 ()
Этот код создает столбчатую диаграмму, которая показывает средний процент танцевальности по годам. Это позволяет визуально оценить, как менялась танцевальность музыки в зависимости от года выпуска, что может быть полезно для анализа трендов в музыкальной индустрии.
Средняя энергичность по годам
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 ()
Этот код создает линейный график, который позволяет визуально оценить, как менялась энергичность музыкальных треков в зависимости от года их выпуска. Это может помочь в анализе тенденций в музыке и понимании того, как изменялись предпочтения слушателей с течением времени. Если у вас есть дополнительные вопросы или нужно внести изменения в код, дайте знать!
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 ()
Этот код создает горизонтальный столбчатый график, который позволяет визуально оценить, какие исполнители имеют наибольшее количество стримов. Это может помочь в анализе популярности различных артистов и понимании музыкальных тенденций.
Средняя акустичность по годам
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 ()
Этот код создает линейный график, который позволяет визуально оценить изменения в средней акустичности треков с течением времени. Это может помочь в анализе музыкальных тенденций и изменений в стиле музыки по годам.
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 ()
Ось 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 ()
Ось X: Темп трека в ударах в минуту (BPM) Ось Y: Настроение трека — насколько трек звучит радостно или грустно Ось Z: Уровень энергии Цвет точек: Танцевальность Размер точек: Количество речевых элементов в треке
Что показывает этот график?
BPM (темп) не всегда связан с энергией. Можно найти треки с низким BPM, но высокой энергией (например, рок-баллады) и высоким BPM, но низкой энергией (например, медленные электронные композиции). Веселые (высокий Valence) и грустные (низкий Valence) треки могут встречаться при любом BPM. Но в целом можно заметить, что энергичные и танцевальные треки (яркие точки) чаще имеют более высокий BPM. Речевые элементы (размер точек Speechiness): Хип-хоп и рэп треки (большие точки) чаще имеют низкий Valence (то есть более агрессивный или эмоциональный характер) и различные уровни энергии. Поп-музыка обычно имеет средний уровень речевых элементов и высокие значения Valence и Energy.
Выводы из 3D-анализа
Высокая энергия и высокая танцевальность чаще всего идут вместе. Акустичные треки менее энергичны. BPM (темп) не всегда связан с энергией, но влияет на танцевальность. Речевые элементы чаще встречаются в менее позитивных треках (рэп, хип-хоп).
Заключение
В ходе анализа были рассмотрены характеристики треков из топа Spotify. Основные выводы:
-Количество стримов подчиняется распределению с длинным хвостом: у большинства песен небольшое число стримов, но есть и явные хиты. -Танцевальность треков варьируется по годам, но сохраняется в пределах 50-80%. -Энергичность музыки имеет тенденцию к увеличению. -Акустичность постепенно снижается, что говорит о популярности более «электронного» звучания. -Топ-исполнители сильно различаются по числу стримов, но в лидерах остаются наиболее популярные мировые звезды.
Этот анализ может быть полезен для изучения трендов в музыке и предпочтений слушателей.
Описание применения генеративной модели
Midjourney — генерация обложки Chat GPT - обращения с целью генерации инструкций и рекомендаций по улучшению кода, вопросы по тому, как правильно имплементировать те или иные функции, библиотеки и т.д