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




