Original size 1140x1600

Проект анализ данных

PROTECT STATUS: not protected

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

Более содержательно можно посмотреть в самом ноутбуке :)

Теперь перейдем к графикам!

Вот наши розовенькие графики нормализованных данных:

Original size 1280x422
Original size 1280x285

По гистограммам нормализованных данных можно сделать несколько наблюдений:

duration_ms: Распределение длительности треков имеет два пика, что может свидетельствовать о наличии двух разных типов треков с различной средней длительностью.

popularity: Большинство треков имеет низкий уровень популярности, но распределение постепенно снижается по мере увеличения популярности.

danceability: Распределение «танцевальности» треков показывает, что большинство треков имеют умеренно высокий уровень танцевальности, с пиком около среднего значения.

energy: Распределение энергии треков сдвинуто к более высоким значениям, что указывает на преобладание треков с высокой энергией.

key: Распределение ключей треков довольно равномерно, что указывает на разнообразие в использовании музыкальных ключей.

loudness: Большинство треков имеет уровень громкости выше среднего, что указывает на тенденцию к более громким трекам.

mode: Распределение модов показывает, что больше треков в мажорном режиме (mode=1) по сравнению с минорным (mode=0).

speechiness: Большинство треков имеет низкий уровень «разговорности», что характерно для музыки, где преобладает пение над речью.

acousticness: Большинство треков имеет низкий уровень акустичности, что может свидетельствовать о преобладании электронных или электрических инструментов.

instrumentalness: Большинство треков имеют низкий уровень инструментальности, что указывает на то, что большинство треков содержат вокал.

Работа с выбросами:

Визуализируем выбросы через boxplot-графики для дальнейшего анализа

Original size 1280x454
Original size 1280x260

Анализ выбросов

По boxplot-графикам можно сделать следующие наблюдения о выбросах в нормализованных числовых переменных:

duration_ms: Имеются выбросы на высоких значениях длительности треков. popularity: Выбросов нет, данные распределены равномерно. danceability: Имеются выбросы на низких значениях танцевальности. energy: Имеются выбросы на низких значениях энергии. key: Выбросов нет, данные распределены равномерно. loudness: Имеются выбросы на низких значениях громкости. mode: Выбросов нет, данные распределены равномерно. speechiness: Имеются выбросы на высоких значениях речевитости. acousticness: Имеются выбросы на высоких значениях акустичности. instrumentalness: Имеются выбросы на высоких значениях инструментальности.

Для обработки выбросов используем коректировку:

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

Original size 1280x445
Original size 1280x280

Результат:

Новые boxplot-графики показывают, что выбросы были успешно скорректированы. Теперь данные выглядят более сбалансированными и менее искажёнными из-за экстремальных значений.

Гистограмма для распределения энергии по жанрам

Original size 1280x479

Самые энергичные жанры :)

Original size 596x164

Гистограмма для распределения энергии по топ-10 артистам

Original size 1280x468

Самые энергичные группы

Original size 513x148

Тепловая карта корреляций:

Original size 1280x514

Выводы: Популярность и танцевальность:

Корреляция: 0.56 (умеренная положительная корреляция). Вывод: Танцевальные песни, как правило, более популярны. Танцевальность и энергия:

Корреляция: 0.76 (сильная положительная корреляция). Вывод: Более энергичные песни часто обладают высокой танцевальностью. Энергия и громкость:

Корреляция: 0.70 (сильная положительная корреляция). Вывод: Более энергичные песни обычно имеют большую громкость. Популярность и громкость:

Корреляция: 0.35 (слабая положительная корреляция). Вывод: Слабая связь указывает на то, что громкость может влиять на популярность, но не является основным фактором.

Original size 1280x514

Energy vs. Danceability: Наблюдается положительная корреляция. Это означает, что с увеличением энергии песни танцевальность также имеет тенденцию увеличиваться. Линия регрессии показывает, что существует линейная связь между энергией и танцевальностью, хотя разброс данных все еще велик.

Energy vs. Acousticness: Наблюдается отрицательная корреляция. Это означает, что с увеличением энергии песни акустичность уменьшается. Линия регрессии подтверждает, что более энергичные песни менее акустичны.

Energy vs. Speechiness: Взаимосвязь между энергией и речитативностью (speechiness) не так сильно выражена. Линия регрессии почти горизонтальная, указывая на слабую или отсутствующую корреляцию между этими переменными.

Energy vs. Valence: Наблюдается положительная корреляция. Это означает, что более энергичные песни имеют тенденцию быть более позитивными (valence). Линия регрессии подтверждает наличие линейной зависимости между энергией и позитивностью песни.

Original size 1280x464

Жанры на 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