В качестве примера приложения рассмотрим следующие два свойства пользователей переполнения стека: репутация и количество просмотров профиля .
Ожидается, что для большинства пользователей эти два значения будут пропорциональны: пользователи с высоким уровнем репутации привлекают больше внимания и, следовательно, получают больше просмотров профиля.
Поэтому интересно искать пользователей, которые имеют много просмотров профиля по сравнению с их общей репутацией.
Это может указывать на то, что у этого пользователя есть внешний источник славы. Или, может быть, просто у них есть интересные причудливые картинки и имена.
Более математически, каждая двумерная точка выборки является пользователем, и у каждого пользователя есть два интегральных значения в диапазоне от 0 до + бесконечности:
- репутации
- количество просмотров профиля
Предполагается, что эти два параметра будут линейно зависимыми, и мы хотели бы найти точки выборки, которые являются самыми большими выбросами для этого предположения.
Конечно, наивным решением было бы просто взять профиль, разделить его по репутации и отсортировать.
Однако это дало бы результаты, которые не являются статистически значимыми. Например, если пользователь ответил на вопрос, получил 1 ответ и по какой-то причине имел 10 просмотров профиля, которые легко подделать, то этот пользователь появился бы перед гораздо более интересным кандидатом, у которого было 1000 просмотров и 5000 просмотров профиля. ,
В более «реальном» случае использования мы могли бы попытаться ответить, например, «какие стартапы являются наиболее значимыми единорогами?». Например, если вы вкладываете 1 доллар с небольшим капиталом, вы создаете единорога: https://www.linkedin.com/feed/update/urn:li:activity:6362648516858310656
Конкретные чистые, простые в использовании данные реального мира
Чтобы проверить решение этой проблемы, вы можете просто использовать этот небольшой (75M сжатый, ~ 10M пользователей) предварительно обработанный файл, извлеченный из дампа данных переполнения стека 2019-03 :
wget https://github.com/cirosantilli/media/raw/master/stack-overflow-data-dump/2019-03/users_rep_view.dat.7z
7z x users_rep_view.dat.7z
который создает файл в кодировке UTF-8, users_rep_view.dat
который имеет очень простой текстовый формат с разделением пробелами:
Id Reputation Views DisplayName
-1 1 649 Community
1 45742 454747 Jeff_Atwood
2 3582 24787 Geoff_Dalgas
3 13591 24985 Jarrod_Dixon
4 29230 75102 Joel_Spolsky
5 39973 12147 Jon_Galloway
8 942 6661 Eggs_McLaren
9 15163 5215 Kevin_Dente
10 101 3862 Sneakers_O'Toole
Вот как данные выглядят в масштабе журнала:
Тогда было бы интересно узнать, действительно ли ваше решение помогает нам находить новых неизвестных изворотливых пользователей!
Исходные данные были получены из дампа данных 2019-03 следующим образом:
wget https://archive.org/download/stackexchange/stackoverflow.com-Users.7z
# Produces Users.xml
7z x stackoverflow.com-Users.7z
# Preprocess data to minimize it.
./users_xml_to_rep_view_dat.py Users.xml > users_rep_view.dat
7z a users_rep_view.dat.7z users_rep_view.dat
sha256sum stackoverflow.com-Users.7z users_rep_view.dat.7z > checksums
Источник дляusers_xml_to_rep_view_dat.py
.
Выбрав свои выбросы путем переупорядочения users_rep_view.dat
, вы можете получить список HTML с гиперссылками, чтобы быстро просмотреть самые популярные предложения с помощью:
./users_rep_view_dat_to_html.py users_rep_view.dat | head -n 1000 > users_rep_view.html
xdg-open users_rep_view.html
Источник дляusers_rep_view_dat_to_html.py
.
Этот скрипт также может служить кратким справочником о том, как читать данные в Python.
Ручной анализ данных
Сразу же, посмотрев на график gnuplot, мы увидим, что, как и ожидалось:
- данные приблизительно пропорциональны, с большими отклонениями для пользователей с низким числом повторений или с низким количеством просмотров
- Пользователи с низким числом повторений или с низким числом просмотров более понятны, что означает, что у них более высокие идентификаторы учетных записей, что означает, что их учетные записи являются более новыми
Чтобы получить некоторую интуицию в отношении данных, я хотел углубиться в некоторые детали программного обеспечения для интерактивного построения графиков.
Gnuplot и Matplotlib не смогли обработать такой большой набор данных, поэтому я впервые попробовал VisIt, и это сработало. Вот подробный обзор всего программного обеспечения для печати, которое я пробовал: /programming/5854515/large-plot-20-million-samples-gigabytes-of-data/55967461#55967461
О боже, это было трудно запустить. Мне пришлось:
- скачайте исполняемый файл вручную, пакет Ubuntu отсутствует
- преобразовать данные в CSV, взломав их
users_xml_to_rep_view_dat.py
быстро, потому что я не мог легко найти способ подачи файлов, разделенных пробелами (урок, в следующий раз я пойду прямо к CSV) - бороться за 3 часа с пользовательским интерфейсом
- размер точки по умолчанию - пиксель, который путается с пылью на моем экране. Переместить в 10 пиксельных сфер
- был пользователь с 0 просмотрами профиля, и VisIt правильно отказался от построения логарифмического графика, поэтому я использовал ограничения данных, чтобы избавиться от этой точки. Это напомнило мне, что gnuplot очень разрешительный, и с радостью подготовит все, что вы на него бросите.
- добавьте заголовки осей, удалите имя пользователя и другие элементы в разделе «Элементы управления»> «Аннотации»
Вот как выглядело мое окно VisIt после того, как я устал от этой ручной работы:
Буквы - это точки, которые я выбрал вручную с помощью потрясающей функции Picks:
- Вы можете увидеть точный идентификатор для каждой точки, увеличив точность с плавающей запятой в окне «Выборки»> «Формат с плавающей запятой» до
%.10g
- Затем вы можете сбросить все выбранные вручную точки в текстовый файл с помощью команды «Сохранить выбор как». Это позволяет нам создавать интерактивный список URL-адресов интересных профилей с некоторой базовой обработкой текста.
TODOs, научитесь:
- посмотрите строки имени профиля, по умолчанию они конвертируются в 0. Я просто вставил идентификаторы профиля в браузер
- выбрать все точки в прямоугольнике за один раз
И, наконец, вот несколько пользователей, которые, скорее всего, должны показаться высоко на вашем заказе:
пользователи с очень низким числом повторений, с огромным количеством просмотров и низким информационным профилем.
Эти пользователи скорее всего перенаправляют откуда-то трафик.
Связанный: была мета-нить для манипуляции со знаменитым вопросом золотым пользователем, но я не могу найти его сейчас.
Если таких пользователей будет слишком много, то наш анализ будет сложным, и мы должны попытаться рассмотреть другие параметры, чтобы избежать такого «мошенничества»:
- A 1 143100 2445750 https://stackoverflow.com/users/2445750/muhammad-mahtab-saleem
- D 60 51111 2139869 https://stackoverflow.com/users/2139869/xxn
- E 40 23067 5740196 https://stackoverflow.com/users/5740196/listcrawler
- F 11 7738 3313079 https://stackoverflow.com/users/3313079/rikitikitaco
- G 136 11123 4102129 https://stackoverflow.com/users/4102129/abhishek-deshpande
- K 377 24453 1012351 https://stackoverflow.com/users/1012351/overstack
- L 1489 57515 1249338 https://stackoverflow.com/users/1249338/frosty
- M 1767 40986 2578799 https://stackoverflow.com/users/2578799/naresh-walia
- Я нахожу этот кластер пользователей интересным, все это так близко к графику:
- H 58 4331 1818755 https://stackoverflow.com/users/1818755/eerongal
- Я 103 4366 1816274 https://stackoverflow.com/users/1816274/angelov
- J 157 4688 688552 https://stackoverflow.com/users/688552/oylex
внешняя слава:
- O 29799 170854 2274694 https://stackoverflow.com/users/2274694/lyndsey-scottex Модель Victoria's Secret: https://en.wikipedia.org/wiki/Lyndsey_Scott
- P 45742 454747 1 https://stackoverflow.com/users/1/jeff-atwood SO соучредитель
- Y 29230 75102 4 https://stackoverflow.com/users/4/joel-spolsky СО соучредитель
- пользователи с самой высокой репутацией имеют тенденцию получать больше просмотров профиля, потому что они отображаются в запросах / списках Google "пользователи с самой высокой репутацией":
- U 542861 401220 88656 https://stackoverflow.com/users/88656/eric-lippert, участвующий в разработке C #
- V 852319 396830 157882 https://stackoverflow.com/users/157882/balusc top # 2 пользователь, безумное количество ответов
необычные профили:
- N 13690 108073 63550 https://stackoverflow.com/users/63550/peter-mortensen Это собственная картинка! Я также думаю, что он был модератором ранее.
- R 143904 144287 895245 https://stackoverflow.com/users/895245/ciro-santilli-%e6%96%b0%e7%96%86%e6%94%b9%e9%80%a0%e4%b8%ad % E5% BF% 83996icu% E5% 85% объявления% E5% 9b% 9b% е4% Ьа% 8b% е4% бб% b6
- T 291742 161929 560648 https://stackoverflow.com/users/560648/lightness-races-in-orbit
пользователи с высокими репутациями, которые были приостановлены в то время. Ах, глупый твой представитель идет к 1 правилу:
- B 1 77456 285587 https://stackoverflow.com/users/285587/your-common-sense
не уверен, я испытываю соблазн сказать вид манипулирования
- Q 65788 126085 50776 https://stackoverflow.com/users/50776/casperone
- S 15655 81541 293594 https://stackoverflow.com/users/293594/xnx
- W 12019 37047 2227834 https://stackoverflow.com/users/2227834/unheilig
- X 1421 27963 1255427 https://stackoverflow.com/users/1255427/jack-nicholson
Возможные решения
Я слышал об доверительном интервале оценок Уилсона из https://www.evanmiller.org/how-not-to-sort-by-average-rating.html, который «уравновешивает соотношение положительных оценок с неопределенностью небольшого количества наблюдений ", но я не уверен, как сопоставить это с этой проблемой.
В этом сообщении в блоге автор рекомендует этот алгоритм для поиска элементов, которые имеют гораздо больше отрицательных голосов, чем отрицательных, но я не уверен, применима ли та же идея к проблеме просмотра повышенных голосов / профиля. Я думал о том, чтобы взять:
- просмотры профиля
- положительные отзывы здесь == отрицательные ответы здесь (оба "плохие")
но я не уверен, имеет ли это смысл, потому что в случае проблемы с повышением / понижением голосов каждый сортируемый элемент имеет N 0/1 событий голосования. Но по моей проблеме с каждым элементом связаны два события: получение upvote и просмотр профиля.
Есть ли хорошо известный алгоритм, который дает хорошие результаты для такого рода проблем? Даже знание точного названия проблемы поможет мне найти существующую литературу.
Список используемой литературы
- https://meta.stackoverflow.com/questions/307117/are-profile-views-on-stack-overflow-positively-correlated-to-the-level-of-reputa
- Тест на двумерные выбросы
- /programming/41462073/multivariate-outlier-detection-using-r-with-probability
- Есть ли простой способ обнаружения выбросов?
- Как следует учитывать выбросы в линейном регрессионном анализе?
- https://math.meta.stackexchange.com/questions/26137/who-maximizes-the-ratio-of-people-reached-to-questions-answered
Протестировано в Ubuntu 18.10, VisIt 2.13.3.
Ответы:
Я думаю, что доверительный интервал Уилсона может быть применен непосредственно к вашей проблеме. Оценка, использованная в блоге, была нижней границей доверительного интервала вместо ожидаемого значения.
Другой метод решения этой проблемы - исправить (сместить) нашу оценку по отношению к некоторым имеющимся у нас предварительным знаниям, например, к общему количеству просмотров / повторений.
Чтобы сравнить два метода (нижняя граница доверительного интервала оценки Уилсона и MAP), они оба дают точную оценку, когда имеется достаточно данных (повторений), когда число повторений мало, метод нижней границы Уилсона сместит в сторону нуля, а MAP будет уклон в сторону среднего.
источник