Портфолио Обо мне Блог Инструменты Услуги Вопрос-ответ 🎮 BattleTech Arena Войти Регистрация
Аналитические отчеты

Карта пересечений аудиторий: анализ музыкальных сообществ г. Кемерово через открытые данные ВКонтакте

← Ко всем проектам

Карта пересечений аудиторий: анализ музыкальных сообществ г. Кемерово через открытые данные ВКонтакте

О проекте

Анализ 41 музыкального сообщества г. Кемерово через открытые данные ВКонтакте: сбор подписчиков, приведение к множествам, поиск пересечений и визуализация связей на графе. Node-размер — численность аудитории, расстояние между узлами — мера схожести аудиторий, цвет — музыкальный жанр. На графе прояви

Аналитический кейс на стыке работы с открытыми данными, теории множеств и визуализации графов. Я собрал через открытый API ВКонтакте подписчиков 41 музыкального сообщества г. Кемерово, привёл их к множествам и посчитал попарные пересечения аудиторий. Результат визуализирован в виде графа, где размер узла отражает численность подписчиков, расстояние между узлами — степень схожести аудиторий, а цвет — музыкальный жанр.

Интересный эффект: граф сам, без ручной разметки, разложил группы по условной шкале тяжести — от метала через хард-н-хэви и панк-рок к русскому року и кавер-группам. Кавер-коллективы, работающие с поп-материалом на праздниках и в кафе, ушли в отдельный кластер — их аудитория почти не пересекается с поклонниками тяжёлой музыки. Это подтверждает гипотезу, что группы играют для разных сегментов слушателей, а значит, формировать лайн-апы нужно с учётом этой разницы.

Проект целиком построен на открытых данных, без соцопросов и прямого контакта с музыкантами. Внутри — сбор через VK API с пагинацией, кэширование результатов в словаре, оптимизация подсчёта пересечений через множества, автоматический обход всех пар групп и визуализация через NetworkX + Matplotlib. Код разбит на модули: сбор, обработка, анализ, отрисовка — каждый можно запустить отдельно.

Кейс интересен не только технической частью, но и прикладным выводом: такой подход даёт организаторам мероприятий и продюсерам объективную основу для подбора составов. Хочешь охватить новую аудиторию — объединяй группы из разных кластеров. Хочешь удержать «своих» — из одного.

Если развивать идею дальше — логично сделать интерактивный веб-дашборд, где заказчик сам загружает список групп и видит граф в браузере. Это уже задел на следующий этап.

Стек и ссылки

Python · VK API · NetworkX · Matplotlib · Pandas
GitHub

Статус: Завершён · 08.2019 — 02.2020

Задача

Оценить реальную аудиторную близость музыкальных коллективов г. Кемерово — без соцопросов, без прямого контакта с группами, только на основе открытых данных. Понять:

насколько пересекаются аудитории разных групп;

какие коллективы имеют общих слушателей, а какие работают на разные сегменты;

можно ли на основе только этих данных автоматически сгруппировать группы по стилям.

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

Решение

1. Сбор данных

Через открытый API ВКонтакте (сервисный ключ + vk.API) собрал списки подписчиков 41 сообщества — от sedmoy_rayon до a_simmetria. Для каждого сообщества:

первичный запрос groups.getMembers с v=5.124 возвращает первую тысячу и общее количество;

циклом по offset (шаг 1000) выбираются все остальные подписчики;

результат сохраняется в текстовый файл в формате vk.com/id<число> — на случай повторного анализа без обращения к API.

2. Обработка и кэширование

Списки подписчиков приводятся к множествам (set) — это позволяет мгновенно считать пересечения и объединения.

Результаты по каждому сообществу кэшируются в словаре my_dict_group_members. Повторные запросы к одной и той же группе не бьют по API — если группа уже встречалась, берётся сохранённый набор.

3. Поиск пересечений

Для каждой пары сообществ:

пересечение = set(group1) & set(group2);

процент пересечения относительно объединения аудиторий: len(intersection) / (len(g1) + len(g2) − len(intersection)) × 100%;

результат сохраняется в словарь groups_dictionary под ключом "<group1> <group2>".

Например, для fflycom и musicbandinmyhands пересечение составило 1.58% при 356 и 1123 подписчиках соответственно.

4. Автоматизированный обход пар

Функция group_list_automatic_processor рекурсивно перебирает все пары групп: берёт первую группу, считает её пересечения со всеми остальными, удаляет её из списка, переходит к следующей. Такой подход даёт полный граф без двойного счёта пар.

5. Визуализация графа

Строится граф через networkx.

Размер узла — численность подписчиков сообщества: чем больше у группы аудитория, тем крупнее узел.

Расстояние между узлами — мера схожести аудиторий: чем ближе две группы, тем больше у них общих подписчиков.

Цвет узла — музыкальный жанр:

красный — метал (death, black, post, pagan);

оранжевый — хард-н-хэви и панк (altern_rock, hard_rock, punk);

циан — русский рок и фолк;

фиолетовый — кавер-группы;

оливковый — направления без чёткого жанра.

6. Кластеризация на графе

В двумерном пространстве граф сам «разложил» группы по условной шкале тяжести:

метал → хард-н-хэви → панк-рок → русский рок → кавер-группы

Кавер-коллективы (играющие поп-материал на праздниках и в кафе) ушли в отдельный кластер — их аудитория почти не пересекается с металлической. Это подтверждает, что группы работают на разные сегменты слушателей.

Результаты

Собраны и обработаны данные по 41 сообществу г. Кемерово — это сотни тысяч строк, сведённых в множества подписчиков.

Построена матрица пересечений всех пар сообществ — полный граф связей.

Визуализация графа автоматически сгруппировала коллективы по жанрам — без ручной разметки и без опроса аудитории.

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

Получена практическая база для формирования лайн-апов: если цель — охватить новую аудиторию, нужно объединять группы из разных кластеров; если удержать «своих» — из одного.

Инструмент кэширует данные — повторный запуск без изменений в сообществах не обращается к API ВКонтакте.

Мой вклад

Проектирование архитектуры: разбиение на модули сбора, обработки, анализа и визуализации.

Работа с открытым API ВКонтакте: авторизация через сервисный ключ, пагинация при выборке >1000 записей, обработка ошибок.

Приведение данных к множествам и оптимизация подсчёта пересечений — сложность O(N) вместо O(N²) на больших списках.

Реализация автоматического обхода всех пар групп через group_list_automatic_processor.

Кэширование результатов в словаре my_dict_group_members — повторные запросы к API не выполняются.

Разработка системы визуального кодирования: размер узла, расстояние, цвет.

Классификация жанров и привязка цветов к музыкальным направлениям.

Интерпретация результатов: выявление кластеров и формулировка практических выводов.

Скриншоты