«Скажи мне кто твой друг и я скажу, кто ты.»
Еврипид 480—406 до н. э.

Долгое время я смотрел на API VK как кот на стиральную машину — меня гипнотизировала возможность провести какое-нибудь исследование в одной из крупнейших социальных сетей, которая проникла во многие сферы нашей жизни. И вот однажды родился вопрос, а можно ли по кругу общения пользователя социальной сети определить его возраст?




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

Одно из первых, что приходит на ум при рассмотрении связей профиля: давайте посмотрим возраст одноклассников и одногруппников, в подавляющем большинстве у данного пользователя будет возраст +- 1 год. За это спасибо всеобщему среднему образованию. Есть только один нюанс: выявить одноклассников. Чем больше проходит времени с выпускного, тем в более разношёрстных по возрасту кругах мы начинаем вращаться. Школьные друзья словно оказываются в прошлой жизни, и вот их уже почти незаметно среди большого количества новых знакомых. Можно ли для профилей людей зрелого возраста как-то понять в какой поток они учились и, следовательно, примерный возраст?

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

Давайте для наглядности рассмотрим один из профилей ВК с большим количеством друзей. Получим список друзей пользователя с помощью запроса friends.get. Рассмотрим профили только с указанным возрастом и расположим их на временной шкале в виде гистограммы по годам. Есть небольшой нюанс с тем как разбивать множество друзей на годовые интервалы. Мы ведь хотим добиться, чтобы одноклассники вошли в один интервал, а не размазались по двум соседним. Опытным путём было установлено, что разбивать год лучше всего осенью, причём чтобы пользователи с датами рождения в жёлтое время года вошли сразу в два смежных интервала. То есть получаются 15 месячные интервалы с сентября по ноябрь с шагом 12 месяцев.

oX — возраст пользователей, оY — количество пользователей, попавших в заданный интервал.

Мы наблюдаем пятилетнее плато с максимальным годовым количеством друзей. Совсем не очевидно найти группу одногодок среди этого 5 летнего отрезка. По правде говоря, такая картина нетипична. Чаще год рождения одноклассников/одногруппников значительно выделяется среди других по большему количеству друзей. Но давайте в сложном случае для каждого пользователя найдём отношение дружеских связей внутри годовой группы к количеству связей с другими друзьями изначального пользователя, для кого мы определяем возраст; далее усредним этот показатель по каждому году. Назовём это нормированный коэффициент связности.

oX — возраст пользователей, оY — нормированный коэффициент связности для заданного интервала.

Картина изменилась, и в лидерах имеется единственный год. В нём большую долю имеет коллектив с однородным возрастом, следовательно имеем право ожидать, что раз пользователь является его частью, то имеет схожий возраст. А что, если человек в этом коллективе играет какую-то особенную роль, например, не одноклассник, а учитель? И вправду, для случая учителей/тренеров, могут существовать подгруппы с большой плотностью связей в узком возрастном промежутке. Частично такой случай удается обработать, если при выбирать группу не с самой высокой связностью, а с самым большим возрастом среди групп с достаточно большой связностью. Иными словами использовать логику, что человек на своем жизненном пути сначала должен побывать рядовым учеником, а уж потом играть выделенную роль в “коллективах с однородным возрастом”.

Более подробное описание и немного формул
Выразим численно обнаруженное на графике явление. Обозначим за F0 — множество друзей пользователя, для которого вычисляется возраст. Fi — множество друзей произвольного профиля. Fi,y — множество друзей профиля, имеющих указанную дату рождения в годовом интервале y. Тогда Сi,y — связность профиля i в интервале у:

$C_{i,y} = \frac{|F_0 \cap F_{i,y}|}{|F_0 \cap F_i|}$


Сy — ненормированный коэффициент связности в интервале у по всем профилям:

$C_y = \sum_i^{F_{0,y}} C_{i,y}$


И наконец искомый год рождения:

$\DeclareMathOperator*{\argmax}{argmax} year\_of\_birth= \argmax_y(\frac {C_y} {|F_{0,y}|}) : C_y \geq 0.7\max_{y\in Y}(C_y)$



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

Из вышеобозначенного алгоритма вытекают естественные границы применимости подхода к определению возраста. Если пользователь не страдает ностальгией по школьным годам, и у него в друзьях отсутствуют его одноклассники/одногруппники, то надо использовать другой метод.

Как насчёт попробовать это безобразие в деле? Был реализован шуточный сервис в ВК группе «Гадалка возраста». Там дружелюбный бот погадает на возраст, если скинуть ему ссылку на незакрытый профиль ВК, используя вышеупомянутый алгоритм.

Как устроен сервис
Первым звеном в работе гадалки является механизм сообщений группы ВК. В настройках группы подключается callback API на собственный сервер. В качестве отправляемых типов событий надо выбрать “Входящее сообщение”. Таким способом сообщение группы превращается в запрос на нашем сервере. Если вы также как и я не дружите с фронтендом, то это супер вариант. Далее с сервера происходит обращение к VK API с запросами users.get для рассматриваемого профиля и friends.get для друзей профиля с известной датой рождения. Для их осуществления требуется access token приложения ВК. Я не использовал запросов, требующих подтверждения прав от пользователя, чтобы не грузить людей запросами на разрешение доступа. После того как произведён расчёт предполагаемого возраста, формируется ответ на запрос из группы, и пользователь гадалки видит ответ в диалогах. Дёшево и сердито.

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

В заключении хочется затронуть аспект этичности. На мой взгляд “Гадалка возраста” находится на границе частной жизни, но всё-таки не переступает её, потому что использует для анализа открытые данные. Собственно поэтому для пользователей со скрытым профилем сервис работать не будет.

Есть ощущение, что всякие «гадалки возраста», поисковики лайков, SearchFace – это лишь первые ласточки социально-прозрачного мира. В некоторой степени это можно назвать возвращением к истокам. Человек долгое время существовал в небольших социумах, где все друг у друга были на виду. Открытая репутация являлась неотъемлемой частью механизма социального регулирования. Да, новые инструменты постепенно позволят вновь сделать социальные взаимодействия человека как на ладони, только теперь уже на глобальном уровне. Да, как и любой инструмент, это можно использовать во вред. Нужно ли делать их доступными для каждого? Не знаю. Но я уверен, что если такие инструменты будут доступны лишь ограниченному кругу лиц, то баланс в сторону конструктивного использования точно не сместится.

Комментарии (28)


  1. pallada92
    13.04.2019 21:13
    +1

    Спасибо большое за материал, поставил плюс. Но мне кажется есть две вещи, которые можно относительно быстро добавить в статью, чтобы сделать ее лучше:

    • Было бы интересно сравнить точность разных формул (например, медиану, моду, среднее и вашу эвристику) на небольшом датасете, хотя бы 1000 человек. Или теперь ВК не разрешает парсить много профилей за раз?
    • Также хочется минимальный обзор стандартных подходов к решению этой задачи. Например: cis.poly.edu/~ross/papers/EstimatingAgeFacebook_extended.pdf.


    1. antitak Автор
      14.04.2019 14:37

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

      За ссылку на Estimating Age Facebook спасибо! Я постараюсь разобраться с приведёнными там алгоритмами в обозримом будущем и отписаться сюда.


      1. IgnisNoir
        15.04.2019 08:10

        А почепму бы не натренировать на реальных данных с открытым возрастом? Ведь по сути скрытие возраста это всего лишь скрытие. А открытый возраст будет как величина для сравнения правильности исследования


        1. tyomitch
          15.04.2019 15:43

          Потому что открытый возраст может не соответствовать действительности.


          1. IgnisNoir
            15.04.2019 15:50

            Но выборку сделать гораздо проще. Да и если показывают возраст то обычно его показывают правильно. Т.Е, крайне редко можно найти неверно указаный возраст.

            Т.Е. даже так можно набрать много данных и часть заранее заложить на небольшой процент ошибки. Или вообще вручную отобрать правдоподобные даныне


  1. Reason89
    14.04.2019 00:31

    Лет 5 назад наверно часто пользовался приложением «Раскрыватель» в том же ВК. Выполняет несколько шагов, один из которых как я понял тот, что вы описали. Во всяком случае полученный результат меня всегда радовал.


    1. antitak Автор
      14.04.2019 14:42

      Если я не путаю название приложения, то я им тоже пользовался. И то, что он не смог правильно определить возраст некоторых «сложных» пользователей, возраст которых я знал заранее, меня сподвигло оформить свои наработки в сервис, доступный другим людям.


  1. dobergroup
    14.04.2019 01:03

    Как насчёт попробовать это безобразие в деле?

    Прекрасно справился с возрастной группой 28-33. И 100% промахов в возрастной группе 45+ — алгоритм настойчиво относит их к той-же 28-30


    1. antitak Автор
      14.04.2019 14:54

      На старшей возрастной группе полно промахов, причём на значительное количество лет, это правда. Как ниже заметил в комментариях cyberly, это из-за низкого проникновения ВК в ту подгруппу. Думаю, что через 10 лет и среди 45 летних алгоритм станет хорошо применимым.


  1. Vinchi
    14.04.2019 01:27
    +1

    Если есть дамп профилей, могу сделать регрессионную модель. Потому что то что написано — это гадание на кофейной гуще. Например еще один способ — это определение географии друзей и второго круга, FE на этой фиче, например города в такой-то области. Еще общие интересы. И в конце концов — фото.


  1. MotoDruG
    14.04.2019 06:32

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


  1. mikelavr
    14.04.2019 09:42

    Я учился в шести разных школах, в двух группах вуза (спасибо армии), не поддерживаю связи со школы и вуза, и не имею аккаунта в vk. :-).

    Ваш алгоритм работает примерно до 30-ти лет. Эти люди уже застали соцсети, и ими пользовались. Старшее поколение выпадает полностью.


    1. Playa
      14.04.2019 11:27

      Хотел написать, что существует соц.сеть "Одноклассники", но позже понял, что там и так всё как на ладони :)


    1. cyberly
      14.04.2019 13:12
      +1

      Ну как бы предсказуемо, хороший результат на хороших данных, и плохой — на плохих.

      Эти люди уже застали соцсети, и ими пользовались.
      Те кто постарше, скорее, просто успели закончить учебу до того, как появились соцсети (ну или конкретно им стал доступен адекватный интернет). Ну и как бы, смысл добавлять одноклассников/одногруппников, которых ты 10-20 лет не видел? Так, из любопытства посмотреть, как они теперь выглядят… так почти никто из них ничего не выкладывает годами. Логично, что граф в этом направлении не растет. Ну и получается dedlock — у меня есть мертвый аккаунт, я туда ничего не пишу, потому что не для кого. А друзей у меня там нет, потому что у них аккаунты такие же мертвые.

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


    1. Sunny-s
      14.04.2019 16:47
      +2

      интересно мнение, что «старшее поколение не застало соцсетей». Мне 41, я застал еще фидо, юзнет, аську и прочие древности, и в соцсети в целом просто наигрался еще 10 лет назад, и почти все мои знакомые моего возраста — тоже. Аккаунты есть, но давно заброшены.
      Я думаю, что соцсеть — это в принципе нечто, ориентированное на подростков. Не будет через 10 лет алгоритм лучше работать на 45+, социальный граф так и будет развиваться до 30 :)


      1. tyomitch
        14.04.2019 19:02

        Я слышал противоположное мнение — «в фб остаётся только старшее поколение, молодёжь общается и организуется в вотсапе».


      1. mikelavr
        14.04.2019 19:40

        Мне 50, fb пользуюсь активно, но вычислить возраст по fb friends будет сложно. Там, вероятно, будет горка вокруг 50 (костяк Fidonet:5020), но в целом возраст френдов размазан в интервале 25-60, что дает мало информации.


  1. torbasow
    14.04.2019 12:46

    Хи-хи: «В профиле Олега Торбасова указан возраст 41. Но в волшебном шаре вижу, что 38».
    Но нет, я пишу в профиле правду. Секрет прост: у меня нет одноклассников и однокурсников во френдах.


    1. Zalechi
      14.04.2019 14:49

      Потому что алгоритм мягко говоря не идеален — «хороший результат на хороших данных и плохой результат на плохих данных». Получается такая гадалка годная в случае хороших данных и когда у цели много друзей. А если друзей не много, то легче в ручную поставить результат.


  1. sumanai
    14.04.2019 15:12

    Есть ощущение, что всякие «гадалки возраста», поисковики лайков, SearchFace – это лишь первые ласточки социально-прозрачного мира.

    Видимо мне в этом мире места нет. Не знаю радоваться этому или грустить.


    1. cyberly
      14.04.2019 15:20

      Кому нужно, просто ставят нужные галочки в настройках приватности :)


      1. sumanai
        14.04.2019 15:23

        Мне ставить негде, вот к чему я.


        1. SantaCluster
          17.04.2019 10:17

          раньше говорили "на нём клеймо уже негде ставить" :) сейчас можно "ему галочку поставить негде" ;)) o tempora o mores


  1. APLe
    14.04.2019 15:16

    Нашёл знакомую, которой возраст завышает почти вдвое, до 35 лет.
    Правда, друзей ВК у неё немного, и девушка она и правда очень серьёзная.


  1. RigelNM
    14.04.2019 15:59

    Проверил «гадалку», предварительно изменил в пределах 5 лет свой возраст в профиле, выдала возраст именно тот который указан…


    1. antitak Автор
      14.04.2019 16:49
      +1

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


  1. abmanimenja
    14.04.2019 17:51

    Ну вот у меня VK уже более 10 лет.

    Многие «друзья выросли и состарились», как бы.
    Делал и бизнес — целевая группа — молодежь.

    Делал бизнес лет 6 — там все размазано про «друзей».


    1. antitak Автор
      14.04.2019 20:59

      Если не секрет, сколько лет даёт Вам гадалка, и на сколько она ошибается?