Около месяца назад я опубликовал статью о хабракотах на хабре. Побочным продуктом этой статьи оказался дамп страниц хабрапользователей, и мне захотелось извлечь ещё какую-нибудь информацию из него. На хабре регулярно появляются статьи об анализе пользователей, статей, комментариев, кармы, но я не нашёл ни одной статьи, в которой анализировались бы хабраинвайты. Поэтому я построил граф хабраинвайтов и посмотрел на некоторые его характеристики.
Напомню, что страницы были скачаны в январе 2016-го года, поэтому всё что произошло после (регистрация новых пользователей, удаление старых пользователей, изменения кармы) не учтено. Убрав из списка скачанных пользоватей всех read-only и деактивированных, получаем 79870. Насколько я знаю, это число примерно соответствует фактическому числу хабрапользователей (плюс-минус тысяча). Далее, чтобы получить граф без дырок пришлось добавить 955 read-only пользователей и 382 деактивированных (это те пользователи, которые кого-либо приглашали или были приглашены, но были выпилены с хабра или переведены в RO по тем или иным причинам). В итоге получаем граф на 81207 вершинах.
Тут стоит отметить, что получить список пользователей хабра непросто. Большая часть была получена пару лет назад, когда ещё были доступны списки подписчиков хабов. Но сейчас таких списков нет, поэтому имена пользователей за 2015 и 2016 год были извлечены из статей, комментариев, страниц уже известных пользователей, списков подписчиков, списков пользователей из заданных городов, стран, а также я нарезал часто встречаемые префиксы имён пользователей (вида Alex*, admin*, Captain* и т. п.) и сделал несколько тысяч запросов на странице поиска хабра. Ещё я добавил пользователей активных на гиктаймсе и мегамозге, поэтому, если вас нет в моём списке, вы хорошо шифруетесь.
Итак, у нас есть направленый граф с 81207 вершинами и 20195 дугами. Как видим только около 20 тыс. пользователей были зарегистрированы по инвайтам от других пользователей, остальные либо зарегистрировались до инвайтов (более 40 тыс.) или были приглашены НЛО.
Назовём хабракланом компоненту слабой связности этого ориентированного графа. Стоит заметить, что эти компоненты, вообще говоря, не являются деревьями, так как один человек может несколько раз получать инвайты. Поэтому у нас есть циклы: например, @tangro пригласил @Milla, а @Milla пригласила @tangro; петли: например, @aavezel пригласил сам себя; вершины, в которую входит несколько дуг: пользователя @shara приглашали 6 раз (@Deeman, @myagi, @homm, @Azya, @veveve, @shifttstas). Хотя всё это скорее исключения, в целом граф похож на лес.
В нашем графе имеется 61021 хабраклан. Распределение размеров следующее:
Размер компоненты | Число компонент |
---|---|
больше 1001 | 1 |
101–1000 | 6 |
11–100 | 436 |
2–10 | 3110 |
1 | 57468 |
Давайте посмотрим на самые большие компоненты.
№ | Размер | «Корневые» вершины |
---|---|---|
1 | 1027 | @davekeinz (выслал 412 инвайта — больше, чем кто-либо ещё на хабре, также в этой компоненте @Mithgol, который выслал 78 инвайтов) |
2 | 584 | @mudhoney (выслал 242 инвайта) @valemak |
3 | 316 | @XaocCPS (выслал 65 ивайтов) |
4 | 272 | @Alaunquirie (пригласил @BarsMonster, который пригласил 73 пользователей) @kip |
5 | 189 | @Deeman @homm @DorBer @myagi @Azya @maovrn @fil9 @yoihj |
6 | 106 | @rossomachin |
7 | 104 | @Garyan |
8 | 97 | @kukutz (Яндекс.Компонента) |
9 | 90 | @eosunknown |
10 | 85 | @cigulev @tyr |
11 | 80 | @mdevils |
12 | 80 | @nuzgul |
13 | 77 | @ni404 @tronix286 @Rembish |
14 | 77 | @Tigger |
15 | 76 | @gaidar |
16 | 70 | @Auren |
17 | 69 | @saltommeister |
18 | 68 | @Kalan |
19 | 68 | @alisadenisova |
20 | 67 | @horsev |
Ниже приведены картинки этих 20 графов. Зелёные кружки — пользователи с положительной кармой, красные — с отрицательной, синие — с нулевой, серые — read-only или деактивированые пользователи. Площадь кружка пропорциональна модулю кармы (если это число больше 1). Все картинки являются ссылками на большую версию.
Посмотрим также на «высоты» хабракланов. Если выбросить пренебрежимое число графов с циклами, то dag_longest_path_length(G) даёт следующий результат.
Длина самой длинной цепи | Число компонент |
---|---|
9 | 1 |
7 | 2 |
6 | 11 |
5 | 39 |
4 | 125 |
3 | 479 |
2 | 2888 |
1 | 57468 |
Самая длинная цепь такова: @Garyan пригласил @Andrey_Rogovsky, который пригласил @DmitryGushin, который пригласил @Uncle_Sam, который заинвайтил @RootHell, который прислал инвайт @alexey_qwe, который пригласил @Doom2, который позвал на хабр @Odnoklassniki_ru и который, наконец, пригласил @DarkDefender.
Анализ совпадает с ожиданием, что в большинство хабракланов небольшие и с небольшой «высотой».
Теперь вспомним, что у пользователей есть карма. Насложное суммирование даёт, что всего на хабре как минимум 450323.4 единиц положительной кармы. (Кстати, у 10579 хабрапользователей карма больше или равна 10, поэтому теоретически эта статья может набрать 10578 плюсов.)
Посмотрим какие хабракланы обладают самым наибольшими запасами кармы.
№ | Суммарная карма | «Корневые» вершины |
---|---|---|
1 | 6184.4 | @mudhoney @valemak |
2 | 5333.7 | @davekeinz |
3 | 4720.8 | @XaocCPS |
4 | 3587.1 | @Alaunquirie @kip (@BarsMonster здесь) |
5 | 2464.5 | @Deeman @homm @DorBer @myagi @Azya @maovrn @fil9 @yoihj |
6 | 2390.1 | @horsev (@PapaBubaDiop и @Milfgard здесь) |
7 | 1984.9 | @cigulev @tyr (@Zelenyikot здесь) |
8 | 1780.2 | @ni404 @tronix286 @Rembish |
9 | 1606.1 | @eosunknown |
10 | 1526.9 | Здесь нет корня, и всё начинается с цикла @tangro — @Milla |
11 | 1319.3 | @kit |
12 | 1304.1 | @Ocelot |
13 | 1299.5, | @Auren |
14 | 1104.5 | @Kalan |
15 | 1009.1 | @rossomachin |
16 | 985.5 | @easy_john |
17 | 932.3 | @Assuri |
18 | 871.7 | @sourcerer |
19 | 845.2 | @LukaSafonov |
20 | 838.6 | @mdevils |
Ниже приведены картинки графов, которые не встретились ранее.
Также у некоторых пользователей на странице в поле «Откуда» указана страна. Топ стран по пользователям можно найти на самом хабре, мне же было интересно посмотреть на инвайты, в которых приглашающий и приглашаемый находятся в разных странах. Такие инвайты характеризуют «географическую» связность хабрасообщества.
Сначала я хотел построить т. н. chord diagram, но не нашёл простого способа сделать это на питоне, поэтому привожу левых верхний угол соответсвующей матрицы. (Если кто-то подскажет как всё-таки построить диаграмму буду признателен.) Чем синее клетка на картинке, тем больше логарифм числа инвайтов из страны 1 в страну 2.
Заметным является связность России, Украины, Беларусии, США и Германии.
Ещё одним кусочком информации, который не связан с инвайтами, но легко извлекается из страниц пользователей — это дата регистрации и дата последнего появления. Следующая таблица показывает сколько пользователей зарегистрировалось в данный год и сколько из них появлялось на хабре с 1 января 2015 года (иначе считаем, что пользователь перестал быть хабраактивным).
2006 | 3091 | 909 |
2007 | 19433 | 5511 |
2008 | 22031 | 6348 |
2009 | 6032 | 3094 |
2010 | 6826 | 3345 |
2011 | 9341 | 6355 |
2012 | 5841 | 4160 |
2013 | 4029 | 2819 |
2014 | 2684 | 2100 |
2015 | 1473 | 1473 |
Всего | 80781 | 36114 |
То же самое в виде диаграммы.
Видим, что половина пользователей зарегистрировалась в 2007 и 2008 годах, а также много старожилов являются активными.
На этом всё. Таблица с исходными данными и скрипт для рисования графов доступны на гитхабе. Архив с сырыми данными доступен по запросу.
Автор: mkot