Концепция

Для своего проекта по анализу данных я выбрал датасет "Most Streamed Spotify Songs 2024". Нашел я его на Kaggle.
Честно говоря, я выбрал этот датасет, потому что сам постоянно пользуюсь Spotify и мне реально интересно, какие песни сейчас в тренде и почему. Когда я увидел, что в данных есть не только информация о популярности треков, но и подробности о плейлистах, датах релиза и даже пометки о содержании контента — сразу решил, что это классный материал для анализа.
О датасете
В датасете содержится много полезной информации:
-Названия треков -Имена исполнителей -Даты релиза -Количество прослушиваний -Рейтинги популярности -Пометки "Explicit" для треков с ненормативной лексикой -Другие статистические данные
Датасет включает 4600 записей и 29 столбцов, что дает огромный простор для анализа. Хотя в данных есть некоторые пропуски, большинство ключевых метрик хорошо заполнены.
Визуализация данных
Для анализа и визуализации я создал следующие графики:
1.Столбчатая диаграмма — топ-10 исполнителей по количеству стримов, чтобы сразу понять, кто сейчас рулит на платформе.
2.Круговая диаграмма — распределение треков по году выпуска, чтобы узнать, насколько новые треки доминируют в стримах и какая доля приходится на каждый год.
3.Диаграмма рассеяния — зависимость количества прослушиваний от количества плейлистов, с линией тренда и расчетом коэффициента корреляции, чтобы проверить связь между включением в плейлисты и популярностью трека.
4.Гистограмма — распределение треков по рейтингу популярности на Spotify, чтобы понять, как распределяется популярность контента на платформе.
5.Круговая диаграмма — доля треков с пометкой "Explicit" на Spotify, чтобы оценить, какой процент популярного контента содержит ненормативную лексику.
6.Линейный график — процент "Explicit" треков по годам выпуска, чтобы проследить, как менялась доля такого контента со временем.
Оформил я всё в фирменном стиле Spotify — черно-зеленая цветовая схема с использованием фирменного зеленого цвета Spotify (#1DB954), что придало визуализациям аутентичный вид и связало их с брендом, который я исследовал.
Импорт библиотек и загрузка данных
Начал я с подготовки окружения и импорта всех нужных библиотек:
Импорт необходимых библиотек import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from datetime import datetime
Настройка стиля Spotify (черно-зеленый) plt.style.use('dark_background') # Черный фон spotify_green = '#1DB954' # Фирменный зеленый цвет Spotify spotify_black = '#191414' # Черный цвет Spotify
Установка параметров шрифта plt.rcParams['font.size'] = 12
Затем загрузил данные и провел первичный анализ:
Загрузка данных df = pd.read_csv('Most Streamed Spotify Songs 2024.csv', encoding='latin1')
Получение базовой информации о датасете print("Информация о датасете Spotify:") print(f"Количество строк: {df.shape[0]}") print(f"Количество столбцов: {df.shape[1]}")
Просмотр первых 5 строк print("\nПример данных:") display(df.head())
Проверка типов данных и пропущенных значений print("\nИнформация о типах данных:") df.info()
Количество пропущенных значений print("\nПропущенные значения:") print(df.isnull().sum())
Информация о датасете Spotify
Информация о типах данных: <class 'pandas.core.frame.DataFrame'> RangeIndex: 4600 entries, 0 to 4599 Data columns (total 29 columns):
Оказалось, что в датасете 4600 строк и 29 столбцов! Но при этом много пропусков в различных колонках. Например, столбец TIDAL Popularity полностью пустой, а в SoundCloud Streams пропущено больше половины данных.
Предобработка данных
Здесь пришлось потрудиться, так как данные требовали серьезной очистки:
Преобразование даты релиза в формат datetime df['Release Date'] = pd.to_datetime(df['Release Date'], errors='coerce')
Извлечение года из даты релиза df['Release Year'] = df['Release Date'].dt.year
Преобразование строковых числовых данных в числовой формат Для Spotify Streams, удаляем запятые и конвертируем в числа df['Spotify Streams'] = df['Spotify Streams'].str.replace(',', '').astype(float)
Аналогично для других числовых столбцов представленных как строки columns_to_convert = ['Spotify Playlist Count', 'Spotify Playlist Reach', 'YouTube Views', 'YouTube Likes'] for col in columns_to_convert: df[col] = df[col].str.replace(',', '').astype(float)
Заполнение пропущенных значений df['Artist'].fillna('Unknown Artist', inplace=True) df['Spotify Streams'].fillna(df['Spotify Streams'].median(), inplace=True) df['Spotify Playlist Count'].fillna(df['Spotify Playlist Count'].median(), inplace=True) df['Spotify Playlist Reach'].fillna(df['Spotify Playlist Reach'].median(), inplace=True)
Удаление полностью пустой колонки df.drop('TIDAL Popularity', axis=1, inplace=True)
На этом этапе возникла еще одна проблема — числовые данные часто хранились в виде строк с запятыми (например, "1,234,567"). Пришлось удалять запятые и преобразовывать в числовой формат. Также в столбце с датами были разные форматы, что затрудняло их обработку.
Анализ топ-исполнителей по стримам
Теперь я мог приступить к визуализации. Начал с самого интересного — кто же самые популярные исполнители:
Группировка данных по исполнителям и суммирование стримов artist_streams = df.groupby('Artist')['Spotify Streams'].sum().sort_values(ascending=False) top_artists = artist_streams.head(10)
Создание столбчатой диаграммы plt.figure(figsize=(14, 8)) bars = plt.bar(top_artists.index, top_artists.values / 1e9, color=spotify_green)
Добавление значений над столбцами for bar in bars: height = bar.get_height() plt.text(bar.get_x() + bar.get_width()/2, height + 0.05 * max(top_artists) / 1e9, f'{height:.1f}B', ha='center', va='bottom', color='white')
Оформление графика plt.title('Топ-10 исполнителей по количеству прослушиваний на Spotify', fontsize=16, color='white') plt.xlabel('Исполнитель', fontsize=14, color='white') plt.ylabel('Количество прослушиваний (млрд)', fontsize=14, color='white') plt.xticks(rotation=45, ha='right') plt.grid(True, axis='y', alpha=0.3) plt.tight_layout() plt.show()
Глядя на график топ-10 исполнителей, можно увидеть, что абсолютными лидерами стриминга являются The Weeknd (37.2B) и Bad Bunny (37.1B), которые идут практически вровень. Далее следуют Drake (35.2B) и Taylor Swift (34.5B). Интересно отметить, что между четверкой лидеров и остальными артистами существует значительный разрыв — у Post Malone (5-е место) уже 26.1B прослушиваний, что на 8.4 миллиарда меньше, чем у Taylor Swift. Это говорит о том, что в музыкальной индустрии существует явная "большая четверка" исполнителей, которые значительно опережают всех остальных по популярности.
Анализ распределения треков по году выпуска
Далее я хотел понять, насколько "свежие" треки доминируют в стримах:
Группировка треков по году выпуска year_counts = df['Release Year'].value_counts().sort_index() recent_years = year_counts[year_counts.index >= 2015] # Фокусируемся на недавних годах
Создание круговой диаграммы plt.figure(figsize=(12, 8)) plt.pie(recent_years, labels=recent_years.index, autopct='%1.1f%%', colors=[spotify_green, '#1ed760', '#1aa34a', '#166d3b', '#11492b', '#0d2e1f', '#0a1f16'], wedgeprops={'edgecolor': 'black', 'linewidth': 1})
plt.title('Распределение популярных треков по году выпуска (с 2015)', fontsize=16, color='white') plt.axis('equal') plt.tight_layout() plt.show()
Круговая диаграмма демонстрирует, что больше всего популярных треков (27%) выпущено в 2023 году. Годы 2022 и 2024 делят второе место с одинаковой долей в 16.2%. В целом, треки последних трех лет (2022-2024) составляют почти 60% от всего популярного контента на платформе. Однако примечательно, что даже треки 2015-2019 годов (в сумме около 28%) до сих пор сохраняют высокую популярность, что говорит о "долгоиграющем" характере некоторых хитов.
Анализ связи между стримами и включением в плейлисты
Здесь я хотел проверить, связаны ли напрямую количество плейлистов и количество стримов:
Создание диаграммы рассеяния plt.figure(figsize=(10, 8)) plt.scatter(df['Spotify Playlist Count'], df['Spotify Streams'] / 1e6, color=spotify_green, alpha=0.7, edgecolor='white', s=50)
Добавление линии тренда z = np.polyfit(df['Spotify Playlist Count'], df['Spotify Streams'] / 1e6, 1) p = np.poly1d(z) plt.plot(df['Spotify Playlist Count'], p(df['Spotify Playlist Count']), linestyle='--', color='white', linewidth=2)
Оформление графика plt.title('Зависимость количества прослушиваний от количества плейлистов', fontsize=16, color='white') plt.xlabel('Количество плейлистов', fontsize=14, color='white') plt.ylabel('Количество прослушиваний (млн)', fontsize=14, color='white') plt.grid(True, alpha=0.3) plt.tight_layout() plt.show()
Расчет коэффициента корреляции Пирсона correlation = df['Spotify Playlist Count'].corr(df['Spotify Streams']) print(f"Коэффициент корреляции между количеством плейлистов и прослушиваний: {correlation:.2f}")
Результаты были потрясающими — коэффициент корреляции составил 0.8! Это очень сильная зависимость, которая подтверждает, что количество плейлистов действительно сильно влияет на популярность трека (или наоборот — популярные треки чаще добавляют в плейлисты).
Анализ распределения по рейтингу популярности
Чтобы понять, как распределяются треки по популярности, я создал гистограмму:
Гистограмма распределения по рейтингу популярности plt.figure(figsize=(12, 7)) plt.hist(df['Spotify Popularity'].dropna(), bins=20, color=spotify_green, edgecolor='black') plt.title('Распределение треков по рейтингу популярности на Spotify', fontsize=16, color='white') plt.xlabel('Рейтинг популярности', fontsize=14, color='white') plt.ylabel('Количество треков', fontsize=14, color='white') plt.grid(True, alpha=0.3) plt.tight_layout() plt.show()




