Карта пересечений аудиторий: анализ музыкальных сообществ г. Кемерово через открытые данные ВКонтакте
О проекте
Анализ 41 музыкального сообщества г. Кемерово через открытые данные ВКонтакте: сбор подписчиков, приведение к множествам, поиск пересечений и визуализация связей на графе. Node-размер — численность аудитории, расстояние между узлами — мера схожести аудиторий, цвет — музыкальный жанр. На графе прояви
Аналитический кейс на стыке работы с открытыми данными, теории множеств и визуализации графов. Я собрал через открытый API ВКонтакте подписчиков 41 музыкального сообщества г. Кемерово, привёл их к множествам и посчитал попарные пересечения аудиторий. Результат визуализирован в виде графа, где размер узла отражает численность подписчиков, расстояние между узлами — степень схожести аудиторий, а цвет — музыкальный жанр.
Интересный эффект: граф сам, без ручной разметки, разложил группы по условной шкале тяжести — от метала через хард-н-хэви и панк-рок к русскому року и кавер-группам. Кавер-коллективы, работающие с поп-материалом на праздниках и в кафе, ушли в отдельный кластер — их аудитория почти не пересекается с поклонниками тяжёлой музыки. Это подтверждает гипотезу, что группы играют для разных сегментов слушателей, а значит, формировать лайн-апы нужно с учётом этой разницы.
Проект целиком построен на открытых данных, без соцопросов и прямого контакта с музыкантами. Внутри — сбор через VK API с пагинацией, кэширование результатов в словаре, оптимизация подсчёта пересечений через множества, автоматический обход всех пар групп и визуализация через NetworkX + Matplotlib. Код разбит на модули: сбор, обработка, анализ, отрисовка — каждый можно запустить отдельно.
Кейс интересен не только технической частью, но и прикладным выводом: такой подход даёт организаторам мероприятий и продюсерам объективную основу для подбора составов. Хочешь охватить новую аудиторию — объединяй группы из разных кластеров. Хочешь удержать «своих» — из одного.
Если развивать идею дальше — логично сделать интерактивный веб-дашборд, где заказчик сам загружает список групп и видит граф в браузере. Это уже задел на следующий этап.
Стек и ссылки
Статус: Завершён · 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 не выполняются.
Разработка системы визуального кодирования: размер узла, расстояние, цвет.
Классификация жанров и привязка цветов к музыкальным направлениям.
Интерпретация результатов: выявление кластеров и формулировка практических выводов.