
Для данного проекта мы будем использовать датасет треков со стримингового сервиса Spotify. Я выбрала именно его потому что регулярно пользуюсь сервисом и мне интересно посмотреть на эту компанию «изнутри». Нашла я эти данные на kaggle.
Для анализа данных мы будем использовать pandas.
Для постройки графиков matplotlib и seaborn.
Ссылка на диск: https://disk.yandex.ru/d/g0kUqb2pr6lCXw
Для моего проекта по анализу данных и визуализации я выбрала разные графики, каждый из которых был использован для определенной цели: Гистограммы разного формата: Применялись для анализа распределения данных. Гистограммы помогают визуализировать частотное распределение значений и выявить аномалии или особенности в данных. Круговые диаграммы: Использовались для представления долей и пропорций в данных. Они помогают визуализировать, как различные части составляют целое, и полезны для анализа категориальных данных с небольшим количеством категорий. Обнаружение выбросов: Ящичковая диаграмма позволяет легко выявить выбросы в данных. Выбросы часто представляют собой аномальные значения, которые могут существенно влиять на результаты анализа. Тепловая карта корреляций: Для того чтобы показать кор
Каждый из этих типов графиков был выбран в зависимости от характера данных и целей анализа, чтобы обеспечить наиболее ясное и информативное представление информации.
Перед тем как начать анализ данных, датасет нужно подготовить. Я заполнила пустые значения и убрала дубликаты.
missing_values = data.isnull ().sum () # Проверка на наличие пропущенных значений
data['artists'].fillna ('', inplace=True) # Обработка пропущенных значений data['album_name'].fillna ('', inplace=True) # Заполним пропущенные значения пустыми строками или средним значением, в зависимости от типа данных data['track_name'].fillna ('', inplace=True)
duplicates = data.duplicated ().sum () # Проверка на наличие дубликатов
data_cleaned = data.drop_duplicates () # Удаление дубликатов
cleaned_missing_values = data_cleaned.isnull ().sum () # Проверка результатов очистки cleaned_duplicates = data_cleaned.duplicated ().sum ()
missing_values, duplicates, cleaned_missing_values, cleaned_duplicates
Затем я сделала график нормализованных данных — чтобы более глубоко понять структуру данных и принять обоснованные решения на следующих этапах анализа и моделирования.
import matplotlib.pyplot as plt
selected_columns = [ 'duration_ms', 'popularity', 'danceability', 'energy', 'key', 'loudness', 'mode', 'speechiness', 'acousticness', 'instrumentalness' ] # Выбор первых 10 числовых переменных для визуализации
plt.figure (figsize=(20, 15)) # Построение гистограмм для нормализованных данных for i, column in enumerate (selected_columns, 1): plt.subplot (5, 2, i) plt.hist (data_cleaned[column], bins=50, alpha=0.7, color='pink') plt.title (column) plt.xlabel ('Значение') plt.ylabel ('Частота')
plt.tight_layout () plt.show ()
Затем нам нужно проанализировать выбросы для дальнейшего анализа. Мы сделаем график выбросов с помощью boxplot
import seaborn as sns
plt.figure (figsize=(20, 15)) # Анализ выбросов с помощью boxplot для выбранных числовых переменных for i, column in enumerate (selected_columns, 1): plt.subplot (5, 2, i) sns.boxplot (data_cleaned[column]) plt.title (column)
plt.tight_layout () plt.show ()
Почистим выбросы — для обработки выбросов используем коректировку:
Заменим выбросы на ближайшие допустимые значения. И посмотрим как изменился график
def replace_outliers_with_boundaries (df, columns): # Функция для замены выбросов на ближайшие допустимые значения for column in columns: Q1 = df[column].quantile (0.25) Q3 = df[column].quantile (0.75) IQR = Q3 — Q1 lower_bound = Q1 — 1.5 * IQR upper_bound = Q3 + 1.5 * IQR
df[column] = df[column].apply (lambda x: lower_bound if x < lower_bound else upper_bound if x > upper_bound else x)
return df
data_cleaned_no_outliers = replace_outliers_with_boundaries (data_cleaned.copy (), selected_columns) # Замена выбросов на ближайшие допустимые значения
plt.figure (figsize=(20, 15)) for i, column in enumerate (selected_columns, 1): plt.subplot (5, 2, i) sns.boxplot (data_cleaned_no_outliers[column]) plt.title (column)
plt.tight_layout () plt.show ()
Теперь мы добрались до самого интересного! До анализа данных.
Меры центральной тенденциия вляются основными инструментами для анализа данных, которые позволяют быстро и эффективно получать обобщенную информацию о распределении значений.
Дальше мы сгруппируем данные:
Группировать данные по жанрам треков (track_genre) и артистам (artists), чтобы увидеть различия между группами. Группировка данных по жанрам и артистам показывает характерные особенности и различия между группами. Жанры треков и исполнители имеют свои уникальные профили по популярности, танцевальности, энергетике и другим характеристикам. Это помогает лучше понимать и сегментировать музыкальные данные для дальнейшего анализа.
Подсчет корреляции
между energy и другими числовыми признаками:
Эти корреляции помогают понять взаимосвязь между энергией треков и другими характеристиками, что может быть полезно для дальнейшего анализа.
Линейная регрессия:
написание модели линейной регрессии для предсказания energy на основе других признаков оценка качества метрики
Оценка качества модели:
Mean Squared Error (MSE): 0.0138 R² (коэффициент детерминации): 0.7804 Эти метрики показывают, что модель линейной регрессии объясняет около 78% дисперсии в данных. MSE указывает на среднее квадратичное отклонение предсказанных значений от фактических значений.
Энергичность по жанрам треков
Топ-5 жанров с наибольшей энергией:
Death Metal: 0.931 Grindcore: 0.924 Metalcore: 0.914 Happy: 0.911 Hardstyle: 0.901 Топ-5 жанров с наименьшей энергией:
Classical: 0.195 New Age: 0.214 Ambient: 0.237 Romance: 0.299 Disney: 0.303 Энергичность по артистам Топ-10 артистов с наибольшей энергией:
Linkin Park: 0.857 Chuck Berry: 0.850 OneRepublic: 0.695 Håkan Hellström: 0.683 Feid: 0.601 Stevie Wonder: 0.562 The Beatles: 0.540 Prateek Kuhad: 0.377 Ella Fitzgerald: 0.364 George Jones: 0.357 Анализ энергичности треков по жанрам и артистам показывает, как различные стили музыки и отдельные исполнители влияют на восприятие энергии в музыке.
Более содержательно можно посмотреть в самом ноутбуке :)
Теперь перейдем к графикам!
Вот наши розовенькие графики нормализованных данных:
По гистограммам нормализованных данных можно сделать несколько наблюдений:
duration_ms: Распределение длительности треков имеет два пика, что может свидетельствовать о наличии двух разных типов треков с различной средней длительностью.
popularity: Большинство треков имеет низкий уровень популярности, но распределение постепенно снижается по мере увеличения популярности.
danceability: Распределение «танцевальности» треков показывает, что большинство треков имеют умеренно высокий уровень танцевальности, с пиком около среднего значения.
energy: Распределение энергии треков сдвинуто к более высоким значениям, что указывает на преобладание треков с высокой энергией.
key: Распределение ключей треков довольно равномерно, что указывает на разнообразие в использовании музыкальных ключей.
loudness: Большинство треков имеет уровень громкости выше среднего, что указывает на тенденцию к более громким трекам.
mode: Распределение модов показывает, что больше треков в мажорном режиме (mode=1) по сравнению с минорным (mode=0).
speechiness: Большинство треков имеет низкий уровень «разговорности», что характерно для музыки, где преобладает пение над речью.
acousticness: Большинство треков имеет низкий уровень акустичности, что может свидетельствовать о преобладании электронных или электрических инструментов.
instrumentalness: Большинство треков имеют низкий уровень инструментальности, что указывает на то, что большинство треков содержат вокал.
Работа с выбросами:
Визуализируем выбросы через boxplot-графики для дальнейшего анализа
Анализ выбросов
По boxplot-графикам можно сделать следующие наблюдения о выбросах в нормализованных числовых переменных:
duration_ms: Имеются выбросы на высоких значениях длительности треков. popularity: Выбросов нет, данные распределены равномерно. danceability: Имеются выбросы на низких значениях танцевальности. energy: Имеются выбросы на низких значениях энергии. key: Выбросов нет, данные распределены равномерно. loudness: Имеются выбросы на низких значениях громкости. mode: Выбросов нет, данные распределены равномерно. speechiness: Имеются выбросы на высоких значениях речевитости. acousticness: Имеются выбросы на высоких значениях акустичности. instrumentalness: Имеются выбросы на высоких значениях инструментальности.
Для обработки выбросов используем коректировку:
Заменим выбросы на ближайшие допустимые значения
Результат:
Новые boxplot-графики показывают, что выбросы были успешно скорректированы. Теперь данные выглядят более сбалансированными и менее искажёнными из-за экстремальных значений.
Гистограмма для распределения энергии по жанрам
Самые энергичные жанры :)
Гистограмма для распределения энергии по топ-10 артистам
Самые энергичные группы
Тепловая карта корреляций:
Выводы: Популярность и танцевальность:
Корреляция: 0.56 (умеренная положительная корреляция). Вывод: Танцевальные песни, как правило, более популярны. Танцевальность и энергия:
Корреляция: 0.76 (сильная положительная корреляция). Вывод: Более энергичные песни часто обладают высокой танцевальностью. Энергия и громкость:
Корреляция: 0.70 (сильная положительная корреляция). Вывод: Более энергичные песни обычно имеют большую громкость. Популярность и громкость:
Корреляция: 0.35 (слабая положительная корреляция). Вывод: Слабая связь указывает на то, что громкость может влиять на популярность, но не является основным фактором.
Energy vs. Danceability: Наблюдается положительная корреляция. Это означает, что с увеличением энергии песни танцевальность также имеет тенденцию увеличиваться. Линия регрессии показывает, что существует линейная связь между энергией и танцевальностью, хотя разброс данных все еще велик.
Energy vs. Acousticness: Наблюдается отрицательная корреляция. Это означает, что с увеличением энергии песни акустичность уменьшается. Линия регрессии подтверждает, что более энергичные песни менее акустичны.
Energy vs. Speechiness: Взаимосвязь между энергией и речитативностью (speechiness) не так сильно выражена. Линия регрессии почти горизонтальная, указывая на слабую или отсутствующую корреляцию между этими переменными.
Energy vs. Valence: Наблюдается положительная корреляция. Это означает, что более энергичные песни имеют тенденцию быть более позитивными (valence). Линия регрессии подтверждает наличие линейной зависимости между энергией и позитивностью песни.
Жанры на spotify очень разнообразны и равномерно распределены
Еще больше графиков и выводов можно найти в ноутбуке :) Я постаралась делать графики разных цветов и с разными шрифтами. Надеюсь получилось интересно.