«Скажи мне кто твой друг и я скажу, кто ты.»
Еврипид 480—406 до н. э.
Долгое время я смотрел на API VK как кот на стиральную машину — меня гипнотизировала возможность провести какое-нибудь исследование в одной из крупнейших социальных сетей, которая проникла во многие сферы нашей жизни. И вот однажды родился вопрос, а можно ли по кругу общения пользователя социальной сети определить его возраст?
Для желающих узнать скрытый возраст и раньше был небольшой хак. Надо лишь воспользоваться поиском по людям, указать узкие параметры, чтобы искомый профиль попадал в выдачу, а затем бинарным поиском определить возрастной диапазон. Или окажется, что в контактной информации вдруг указан год окончания школы. И никаких скриптов писать не надо. Но скрытый возраст и косвенная информация могут быть искажены, а главное статья всё-таки не о том, как добыть побольше персональной информации. В статье предлагается проанализировать один из аспектов социального графа.
Одно из первых, что приходит на ум при рассмотрении связей профиля: давайте посмотрим возраст одноклассников и одногруппников, в подавляющем большинстве у данного пользователя будет возраст +- 1 год. За это спасибо всеобщему среднему образованию. Есть только один нюанс: выявить одноклассников. Чем больше проходит времени с выпускного, тем в более разношёрстных по возрасту кругах мы начинаем вращаться. Школьные друзья словно оказываются в прошлой жизни, и вот их уже почти незаметно среди большого количества новых знакомых. Можно ли для профилей людей зрелого возраста как-то понять в какой поток они учились и, следовательно, примерный возраст?
Итак, давайте рассмотрим задачу определения возраста пользователя как определение подмножества одноклассников и одногруппников. То есть мы взяли за допущение, что у него в друзьях есть некоторое количество одноклассников, возраст которых примерно соответствует возрасту профиля. Конечно же бывают исключения, но они редки. Человек ходит в школу от звонка до звонка 10 лет, за такой срок успевают установиться множество перекрёстных социальных связей. Короче говоря, все друг друга знают, при этом разброс возраста в этом социальном клубке минимален. В дальнейшем, когда человек вливается в другие коллективы, как правило, разброс возраста в них значителен, будь это работа, спортивная активность или клуб по интересам. Попробуем, опираясь на такое различие, выявить нужные социальные группы.
Давайте для наглядности рассмотрим один из профилей ВК с большим количеством друзей. Получим список друзей пользователя с помощью запроса friends.get. Рассмотрим профили только с указанным возрастом и расположим их на временной шкале в виде гистограммы по годам. Есть небольшой нюанс с тем как разбивать множество друзей на годовые интервалы. Мы ведь хотим добиться, чтобы одноклассники вошли в один интервал, а не размазались по двум соседним. Опытным путём было установлено, что разбивать год лучше всего осенью, причём чтобы пользователи с датами рождения в жёлтое время года вошли сразу в два смежных интервала. То есть получаются 15 месячные интервалы с сентября по ноябрь с шагом 12 месяцев.
oX — возраст пользователей, оY — количество пользователей, попавших в заданный интервал.
Мы наблюдаем пятилетнее плато с максимальным годовым количеством друзей. Совсем не очевидно найти группу одногодок среди этого 5 летнего отрезка. По правде говоря, такая картина нетипична. Чаще год рождения одноклассников/одногруппников значительно выделяется среди других по большему количеству друзей. Но давайте в сложном случае для каждого пользователя найдём отношение дружеских связей внутри годовой группы к количеству связей с другими друзьями изначального пользователя, для кого мы определяем возраст; далее усредним этот показатель по каждому году. Назовём это нормированный коэффициент связности.
oX — возраст пользователей, оY — нормированный коэффициент связности для заданного интервала.
Картина изменилась, и в лидерах имеется единственный год. В нём большую долю имеет коллектив с однородным возрастом, следовательно имеем право ожидать, что раз пользователь является его частью, то имеет схожий возраст. А что, если человек в этом коллективе играет какую-то особенную роль, например, не одноклассник, а учитель? И вправду, для случая учителей/тренеров, могут существовать подгруппы с большой плотностью связей в узком возрастном промежутке. Частично такой случай удается обработать, если при выбирать группу не с самой высокой связностью, а с самым большим возрастом среди групп с достаточно большой связностью. Иными словами использовать логику, что человек на своем жизненном пути сначала должен побывать рядовым учеником, а уж потом играть выделенную роль в “коллективах с однородным возрастом”.
Сy — ненормированный коэффициент связности в интервале у по всем профилям:
И наконец искомый год рождения:
Ещё была идея рассматривать к какому типу относится та или иная связь. Если тип связи школьные или университетские друзья, то учитывать их с повышенным весом. А если тип коллеги, родственники и всё остальное, то не учитывать такие связи вообще. Однако, если использовать запросы, загружающие такую информацию, то время ожидания увеличивается раз в 5. К тому же, указывать тип связи — не популярная практика, поэтому было принято решение запрашивать такую информацию только для профилей с малым количеством друзей.
Из вышеобозначенного алгоритма вытекают естественные границы применимости подхода к определению возраста. Если пользователь не страдает ностальгией по школьным годам, и у него в друзьях отсутствуют его одноклассники/одногруппники, то надо использовать другой метод.
Как насчёт попробовать это безобразие в деле? Был реализован шуточный сервис в ВК группе «Гадалка возраста». Там дружелюбный бот погадает на возраст, если скинуть ему ссылку на незакрытый профиль ВК, используя вышеупомянутый алгоритм.
Что касается улучшения самого алгоритма, ничего не мешает пойти ещё дальше, собрать обучающий датасет из профилей с указанным возрастом и натренировать регрессионную модель на основе, скажем, матрицы смежности возрастного графа среди друзей профиля. Уверен, при достаточно большой выборке результаты окажутся точнее эвристик. Как уже упомянул выше, мне было любопытно проверить принципиальную идею, поэтому развивать это направление не планирую.
В заключении хочется затронуть аспект этичности. На мой взгляд “Гадалка возраста” находится на границе частной жизни, но всё-таки не переступает её, потому что использует для анализа открытые данные. Собственно поэтому для пользователей со скрытым профилем сервис работать не будет.
Есть ощущение, что всякие «гадалки возраста», поисковики лайков, SearchFace – это лишь первые ласточки социально-прозрачного мира. В некоторой степени это можно назвать возвращением к истокам. Человек долгое время существовал в небольших социумах, где все друг у друга были на виду. Открытая репутация являлась неотъемлемой частью механизма социального регулирования. Да, новые инструменты постепенно позволят вновь сделать социальные взаимодействия человека как на ладони, только теперь уже на глобальном уровне. Да, как и любой инструмент, это можно использовать во вред. Нужно ли делать их доступными для каждого? Не знаю. Но я уверен, что если такие инструменты будут доступны лишь ограниченному кругу лиц, то баланс в сторону конструктивного использования точно не сместится.
Комментарии (28)
Reason89
14.04.2019 00:31Лет 5 назад наверно часто пользовался приложением «Раскрыватель» в том же ВК. Выполняет несколько шагов, один из которых как я понял тот, что вы описали. Во всяком случае полученный результат меня всегда радовал.
antitak Автор
14.04.2019 14:42Если я не путаю название приложения, то я им тоже пользовался. И то, что он не смог правильно определить возраст некоторых «сложных» пользователей, возраст которых я знал заранее, меня сподвигло оформить свои наработки в сервис, доступный другим людям.
dobergroup
14.04.2019 01:03Как насчёт попробовать это безобразие в деле?
Прекрасно справился с возрастной группой 28-33. И 100% промахов в возрастной группе 45+ — алгоритм настойчиво относит их к той-же 28-30
Vinchi
14.04.2019 01:27+1Если есть дамп профилей, могу сделать регрессионную модель. Потому что то что написано — это гадание на кофейной гуще. Например еще один способ — это определение географии друзей и второго круга, FE на этой фиче, например города в такой-то области. Еще общие интересы. И в конце концов — фото.
MotoDruG
14.04.2019 06:32это если человек скрупулёзно отбирает друзей, одно время увлекался играми в моёммире, а там без сотен-тысяч друзей как-то грустно, так что выборка может показать всё что угодно, хоть температуру на Марсе
mikelavr
14.04.2019 09:42Я учился в шести разных школах, в двух группах вуза (спасибо армии), не поддерживаю связи со школы и вуза, и не имею аккаунта в vk. :-).
Ваш алгоритм работает примерно до 30-ти лет. Эти люди уже застали соцсети, и ими пользовались. Старшее поколение выпадает полностью.Playa
14.04.2019 11:27Хотел написать, что существует соц.сеть "Одноклассники", но позже понял, что там и так всё как на ладони :)
cyberly
14.04.2019 13:12+1Ну как бы предсказуемо, хороший результат на хороших данных, и плохой — на плохих.
Эти люди уже застали соцсети, и ими пользовались.
Те кто постарше, скорее, просто успели закончить учебу до того, как появились соцсети (ну или конкретно им стал доступен адекватный интернет). Ну и как бы, смысл добавлять одноклассников/одногруппников, которых ты 10-20 лет не видел? Так, из любопытства посмотреть, как они теперь выглядят… так почти никто из них ничего не выкладывает годами. Логично, что граф в этом направлении не растет. Ну и получается dedlock — у меня есть мертвый аккаунт, я туда ничего не пишу, потому что не для кого. А друзей у меня там нет, потому что у них аккаунты такие же мертвые.
Но бывает и наоборот, когда люди, в том числе гораздо старше, образуют связную группу, но уже за счет связей по части места работы или общих увлечений.
Sunny-s
14.04.2019 16:47+2интересно мнение, что «старшее поколение не застало соцсетей». Мне 41, я застал еще фидо, юзнет, аську и прочие древности, и в соцсети в целом просто наигрался еще 10 лет назад, и почти все мои знакомые моего возраста — тоже. Аккаунты есть, но давно заброшены.
Я думаю, что соцсеть — это в принципе нечто, ориентированное на подростков. Не будет через 10 лет алгоритм лучше работать на 45+, социальный граф так и будет развиваться до 30 :)tyomitch
14.04.2019 19:02Я слышал противоположное мнение — «в фб остаётся только старшее поколение, молодёжь общается и организуется в вотсапе».
mikelavr
14.04.2019 19:40Мне 50, fb пользуюсь активно, но вычислить возраст по fb friends будет сложно. Там, вероятно, будет горка вокруг 50 (костяк Fidonet:5020), но в целом возраст френдов размазан в интервале 25-60, что дает мало информации.
torbasow
14.04.2019 12:46Хи-хи: «В профиле Олега Торбасова указан возраст 41. Но в волшебном шаре вижу, что 38».
Но нет, я пишу в профиле правду. Секрет прост: у меня нет одноклассников и однокурсников во френдах.Zalechi
14.04.2019 14:49Потому что алгоритм мягко говоря не идеален — «хороший результат на хороших данных и плохой результат на плохих данных». Получается такая гадалка годная в случае хороших данных и когда у цели много друзей. А если друзей не много, то легче в ручную поставить результат.
sumanai
14.04.2019 15:12Есть ощущение, что всякие «гадалки возраста», поисковики лайков, SearchFace – это лишь первые ласточки социально-прозрачного мира.
Видимо мне в этом мире места нет. Не знаю радоваться этому или грустить.cyberly
14.04.2019 15:20Кому нужно, просто ставят нужные галочки в настройках приватности :)
sumanai
14.04.2019 15:23Мне ставить негде, вот к чему я.
SantaCluster
17.04.2019 10:17раньше говорили "на нём клеймо уже негде ставить" :) сейчас можно "ему галочку поставить негде" ;)) o tempora o mores
APLe
14.04.2019 15:16Нашёл знакомую, которой возраст завышает почти вдвое, до 35 лет.
Правда, друзей ВК у неё немного, и девушка она и правда очень серьёзная.
RigelNM
14.04.2019 15:59Проверил «гадалку», предварительно изменил в пределах 5 лет свой возраст в профиле, выдала возраст именно тот который указан…
antitak Автор
14.04.2019 16:49+1Если указанный возраст расходится с расчётным не более чем на 2 года, то такой случай считается погрешностью алгоритма, и приоритет остаётся за указанным самим пользователем.
abmanimenja
14.04.2019 17:51Ну вот у меня VK уже более 10 лет.
Многие «друзья выросли и состарились», как бы.
Делал и бизнес — целевая группа — молодежь.
Делал бизнес лет 6 — там все размазано про «друзей».antitak Автор
14.04.2019 20:59Если не секрет, сколько лет даёт Вам гадалка, и на сколько она ошибается?
pallada92
Спасибо большое за материал, поставил плюс. Но мне кажется есть две вещи, которые можно относительно быстро добавить в статью, чтобы сделать ее лучше:
antitak Автор
Согласен, сравнение разных способов вычисления возраста — вот чего не хватает работе, чтобы быть полноценным исследованием. Однако, отсутствие доступа к датасету с истинным возрастом демотивирует. Было обнаружено некоторое количество профилей с искажённым возрастом, и я не представляю как с разумными усилиями очистить датасет от них.
За ссылку на Estimating Age Facebook спасибо! Я постараюсь разобраться с приведёнными там алгоритмами в обозримом будущем и отписаться сюда.
IgnisNoir
А почепму бы не натренировать на реальных данных с открытым возрастом? Ведь по сути скрытие возраста это всего лишь скрытие. А открытый возраст будет как величина для сравнения правильности исследования
tyomitch
Потому что открытый возраст может не соответствовать действительности.
IgnisNoir
Но выборку сделать гораздо проще. Да и если показывают возраст то обычно его показывают правильно. Т.Е, крайне редко можно найти неверно указаный возраст.
Т.Е. даже так можно набрать много данных и часть заранее заложить на небольшой процент ошибки. Или вообще вручную отобрать правдоподобные даныне