https://habrahabr.ru/company/semrush/blog/337216/- Визуализация данных
- Python
- Блог компании SEMrush
Я очень давно пользуюсь яндекс музыкой для поиска «что послушать». Чаще всего, я просто хожу по похожим исполнителям приятных мне групп, однако, этот метод уже давно не даёт результатов. Какое-то время мои потребности закрывало я.радио с фильтром по жанру, но и его репертуар на удивление скуп. Настало время решать проблему глобально, и вот что из этого получилось =)
Что хотелось
Сразу замечу, что я не ставил целью узнать, как и хорошо ли работают рекомендации, или провести кластерный анализ. Над полученными данными можно поработать в очень разные стороны, но для моей конечной цели это не нужно.
А хотелось, в первую очередь, найти тех рок и метал исполнителей, о которых все знают, а я, ввиду своей неопытности, нет.
Проблема ерундовая, скажете вы, возьми ТОП100 по версии какого-либо издания и радуйся, но оно так не работает: все топы, что я видел, либо слишком “новомодные” и мне не по нраву, либо очень классические и я всё это уже слышал.
Вообще, мои путешествия по музыке — это отдельная история: смешно было лицезреть друзей-металлистов, когда я рассказывал им про новых для себя
Black Sabbath в контексте "
вы только послушайте как звучат!" =)
В общем, решено было собрать всех рок и метал исполнителей, и ссылки на других исполнителей с их страниц, посчитать входящие степени и построить свой топ. Ну, и раз уж у меня есть явно сетевая структура, не визуализировать её в виде графа было выше моих сил.
Как собирал
Не раз и не два садился я за этот проект, но каждый раз интерес затухал раньше значимого результата (прямо по книжке). В этот раз я решил послушаться идеологов хакатонов и постарался напилить минимальный рабочий продукт за минимальное же время. По этой причине остановился на сборе наиболее близких мне жанрах рока и метала вместо сбора всей музыки.
Сам парсинг написан на питоне и селениуме плюс Postgree для данных, поскольку под рукой был готовый проект на этом стеке. Селениум для продакшена решение конечно спорное, но у нас и не продакшен.
Для начала я собрал данные по рок исполнителям, их оказалось около шести тысяч.
Когда стал собирать ссылки на похожих, оказалось, что рокеров на самом деле сильно больше и только небольшая их часть представлена в индексе по жанру. Отдельно собирал поджанры (русский рок и другие) — они с основным индексом совсем слабо пересекаются. С металом сюрпризов уже не было, разве что на середине парсинга у него появились поджанры и пришлось собирать всё заново.
В общем, трижды всё пересобрав я понял, что всё, что мог сделал и нужно рисовать.
Хотелось бы отдельно попросить не ругаться ребят из яндекса на мои паразитные запросы, пусть их было не так много — парни, всё ради науки =)
Как рисовал
Хотел я наконец отказаться от ручного рисования в пользу
Gephi, чтоб только ползуночки двигать между
красиво и
понятно, но не срослось — небольшие графы на тысячу вершин он отлично рисует, а в десять раз больше молча отказывается. Ни ошибок, ни приветов, у коллег на винде работает, а у меня белый лист =( Сделал себе зарубку к нему вернуться (и вам рекомендую), и пошёл рисовать привычными средствами.
Поднял довольно
старенькое сравнение питонячих либ для распасовки графов и выбрал
Igraph с FR алгоритмом за итоговую картинку и удовлетворительную производительность.
Что получилось
Немного вводных, которые могут показаться неочевидными:
- вершина — исполнитель;
- рёбра — ссылки на похожих;
- граф направленный, но стрелки увидеть можно не всегда;
- вес вершины — величина входящей степени (ссылки на исполнителя как похожего у других исполнителей);
- в легенде у большинства графов записаны размер в формате вершины х рёбра, коэффициент кластеризации и средняя близость вершин.
Все графы построены без учёта одиночек — тех артистов, на которых никто не ссылается и которые сами ни на кого не ссылаются. Они только создают шум и не дают никакой дополнительной информации. Можно было отсечь и вершины с небольшими степенями дабы не засоряли изображение, но мне показалось, я смог без этого обойтись на итоговом графе.
Некоторые графы представлены в двух вариантах — основном и полном. Отличаются они тем, что в первом варианте участвуют только исполнители, входящие в индекс я.музыки по какому либо жанру (условно primary исполнители).
Метал
Начнём с поджанров. Графы небольшие, поэтому строил сразу полные.
Поджанры метала на момент сбора только появились, думаю сейчас они значительно выросли.
А вот так выглядит суммарный граф метала со всеми поджанрами в двух вариантах — основной и полный.
Рок
Заметьте насколько прогрессив и рок-н-ролл опережают своих собратьев. Рок исполнителей вообще сильно больше металистов (25 тысяч против 8,5), возможно это особенности я.музыки или относительная молодость метала.
Суммарный граф рока со всеми поджанрами, тоже в двух вариантах.
На основном графе отлично виден маленький и гордый кластер русского рока, столь далёкий от остальных.
Пересечение рок + метал
Наконец, начнём пересекать оба жанра. Тут уже только полные графы.
Красным отмечены рок исполнители, синим — метал, фиолетовым — оба жанра одновременно (это когда исполнитель одновременно и рок и метал). В таком виде удобно смотреть насколько близки эти жанры в принципе. Издалека это выглядит конечно интересно, но мне хотелось большей наглядности.
Изменив размер каждой вершины пропорционально её входящей степени я получил наконец ту картинку, которую буду долго изучать в поисках интересного.
На этой превьюшке ничего не разглядеть, но она кликабельна и за ней карта в
10х10 килопикселей с легендой для вершин весом 30 и более. Эта же карта есть в другом разрешении (
10к,
20к,
32к). В конце статьи есть ссылки на
более детальные варианты этой карты и на исходники (на случай если вам захочется свой вариант цвета/размера/etc).
Интересное
Сердце рока — Элвис непобедим!
Перешеек между роком и металом. Фиолетовые, напомню, исполнители которые входят в оба жанра.
Сердце метала. В отличии от рока тут фиолетовые есть и имеют приличный вес.
Русский рок стоит очень особняком и почти не связан с металом, даже русским.
Забавный кластер рокеров — немногочисленный, очень плотный и увесистый.
Кусочек русского метала очень далеко от всех.
Топы
Интересно было посмотреть топов по входящей степени
Рок
Исполнитель |
Степень |
Elvis Presley |
185 |
Deep Purple |
133 |
Paul McCartney |
97 |
Eric Clapton |
93 |
Whitesnake |
73 |
ЧайФ |
73 |
David Bowie |
72 |
The Rolling Stones |
70 |
The Ventures |
67 |
Би-2 |
67 |
|
Метал
Исполнитель |
Степень |
Black Sabbath |
78 |
Edguy |
62 |
Sonata Arctica |
60 |
In Flames |
58 |
Therion |
58 |
Judas Priest |
57 |
Glenn Hughes |
56 |
Eluveitie |
55 |
Of Mice & Men |
54 |
Doro Pesch |
54 |
|
Интересно, что исполнители ссылаются не только на своих коллег по стилю. Топ по входящим ссылкам вне жанров рока и метала.
Другие жанры
Исполнитель |
Степень |
Dr |
114 |
Bob Dylan |
87 |
Ryan Tedder |
61 |
Pharrell |
58 |
John Frusciante |
48 |
Rihanna |
47 |
Frank Sinatra |
47 |
Lana Del Rey |
46 |
Ray Charles |
44 |
NOFX |
43 |
Обратите внимание на самого первого исполнителя
Dr. Его страничка весьма скудна, при этом вес и сейчас не маленький (шутка ли, почти deep purple и это среди рокеров/металлистов), а до весеннего апдейта был и вовсе огромным. Может его добавляли как похожего когда никого более подходящего не нашлось, а ссылок нужно было добрать до девяти? Это могут сказать только ребята из яндекса.
Заключение
Надеюсь, вы почерпнули для себя что-нибудь интересное из статьи. Лично я составил себе большой список исполнителей на ознакомление и надеюсь найти новых любимчиков.
Попрошу также не забывать, что всё представленное есть результат работы рекомендаций я.музыки, так что граф может быть очень далек от аналогов с зарубежных агрегаторов.
Буду рад аргументированной критике и фидбеку по проделанной работе.
→
Исходники
→
Варианты итогового графаПослесловие
- Будьте аккуратны с запуском скриптов на локальной машине. За парсинг яндекса вас могут на нём забанить, а рендер картинок может съесть всю память, особенно если её меньше 16гб.
- Аналогично рассчитывайте производительность своего ноутбука, прежде чем открывать карту в 32 килопикселя.
- Cairo, которая под капотом рисовальщика Igraph-а, падает в кору на генерации больших картинок в не последних версиях, а в последней загоняет нас в рамки 32к пикселей. Если вам нужно больше
золота — генерируйте .ps файл и конвертируйте его сторонними средствами.
- Насколько я заметил, вопрос количества л в названии жанра метала является очень болезненным, поэтому я придерживаюсь стороны я.музыки, раз уж все данные с неё. Очень прошу не разжигать на эту тему =)