Как найти точки выборки, которые имеют статистически значимые большие значения выбросов между двумя значениями точки?

12

В качестве примера приложения рассмотрим следующие два свойства пользователей переполнения стека: репутация и количество просмотров профиля .

Ожидается, что для большинства пользователей эти два значения будут пропорциональны: пользователи с высоким уровнем репутации привлекают больше внимания и, следовательно, получают больше просмотров профиля.

Поэтому интересно искать пользователей, которые имеют много просмотров профиля по сравнению с их общей репутацией.

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

Более математически, каждая двумерная точка выборки является пользователем, и у каждого пользователя есть два интегральных значения в диапазоне от 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

Вот как данные выглядят в масштабе журнала:

введите описание изображения здесь

скрипт gnuplot .

Тогда было бы интересно узнать, действительно ли ваше решение помогает нам находить новых неизвестных изворотливых пользователей!

Исходные данные были получены из дампа данных 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. Я просто вставил идентификаторы профиля в браузер
  • выбрать все точки в прямоугольнике за один раз

И, наконец, вот несколько пользователей, которые, скорее всего, должны показаться высоко на вашем заказе:

Возможные решения

Я слышал об доверительном интервале оценок Уилсона из https://www.evanmiller.org/how-not-to-sort-by-average-rating.html, который «уравновешивает соотношение положительных оценок с неопределенностью небольшого количества наблюдений ", но я не уверен, как сопоставить это с этой проблемой.

В этом сообщении в блоге автор рекомендует этот алгоритм для поиска элементов, которые имеют гораздо больше отрицательных голосов, чем отрицательных, но я не уверен, применима ли та же идея к проблеме просмотра повышенных голосов / профиля. Я думал о том, чтобы взять:

  • просмотры профиля
  • положительные отзывы здесь == отрицательные ответы здесь (оба "плохие")

но я не уверен, имеет ли это смысл, потому что в случае проблемы с повышением / понижением голосов каждый сортируемый элемент имеет N 0/1 событий голосования. Но по моей проблеме с каждым элементом связаны два события: получение upvote и просмотр профиля.

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

Список используемой литературы

Протестировано в Ubuntu 18.10, VisIt 2.13.3.

Сиро Сантилли 冠状 病毒 审查 六四 事件 法轮功
источник
1
Я новичок в этом, поэтому, пожалуйста, не стесняйтесь редактировать заголовок / вопрос, чтобы сделать терминологию более правильной. Спасибо.
Сиро Сантилли 冠状 病毒 审查 六四 事件 法轮功
похоже, вы ищете выбросы. Я бы использовал технику в этом пространстве
вероятностная
1
@probabilityislogic Кстати, я обновил вопрос с некоторыми конкретными простыми в использовании данными.
Чиро Сантилли 冠状 病毒 审查 六四 事件 法轮功
1
Я просто хотел бы сказать, что это не только интересный вопрос, но и очень конкретный и хорошо отформатированный. Пример, чтобы смотреть до. Хорошая работа @Ciro!
Хулио Цезарь Сильва
1
@JulioCezarSilva спасибо !! В этот раз я не ожидал узнать об интерактивных черчениях с высокими характеристиками, но узнал. Классический.
Сиро Сантилли 冠状 病毒 审查 六四 事件 法轮功

Ответы:

4

Я думаю, что доверительный интервал Уилсона может быть применен непосредственно к вашей проблеме. Оценка, использованная в блоге, была нижней границей доверительного интервала вместо ожидаемого значения.

Другой метод решения этой проблемы - исправить (сместить) нашу оценку по отношению к некоторым имеющимся у нас предварительным знаниям, например, к общему количеству просмотров / повторений.

v~N(μ,σ)μ

μп(μ)

μMAпзнак равноNμMLЕ+сμ0N+с
NсμMLЕμ0


Чтобы сравнить два метода (нижняя граница доверительного интервала оценки Уилсона и MAP), они оба дают точную оценку, когда имеется достаточно данных (повторений), когда число повторений мало, метод нижней границы Уилсона сместит в сторону нуля, а MAP будет уклон в сторону среднего.

dontloo
источник
1
Спасибо за ответ! Я обновил вопрос некоторыми конкретными и простыми в использовании данными, посмотрим, удастся ли кому-нибудь сделать забавные выводы.
Чиро Сантилли 冠状 病毒 审查 六四 事件 法轮功
1
@CiroSantilli 新疆 改造 中心 996ICU 六四 事件 хорошая работа!
dontloo