Original size 1140x1600

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

PROTECT STATUS: not protected
6

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

Еще больше графиков и выводов можно найти в ноутбуке :) Я постаралась делать графики разных цветов и с разными шрифтами. Надеюсь получилось интересно.

Проект анализ данных
6
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