В якості прикладу програми розглянемо наступні два властивості користувачів переповнення стека: кількість репутації та перегляду профілю .
Очікується, що для більшості користувачів ці два значення будуть пропорційними: користувачі з високою кількістю представників привертають більше уваги і, отже, отримують більше переглядів профілю.
Тому цікаво шукати користувачів, які мають багато переглядів профілю порівняно із загальною репутацією.
Це може означати, що у цього користувача є зовнішнє джерело слави. А може просто те, що вони мають цікаві вигадливі фотографії та назви.
Більш математично, кожна двовимірна точка вибірки є користувачем, і кожен користувач має два інтегральних значення, що варіюються від 0 до + нескінченності:
- репутація
- кількість переглядів профілю
Очікується, що ці два параметри будуть лінійно залежними, і ми хотіли б знайти вибіркові точки, які є найбільшими переживцями цього припущення.
Наївним рішенням було б, звичайно, просто взяти профільний погляд, розділити за репутацією та сортувати.
Однак це дало б результати, які не мають статистичного значення. Наприклад, якщо користувач відповів на запитання, отримав 1 підсумок і чомусь мав 10 переглядів профілів, що легко підробити, тоді цей користувач з’явиться перед набагато цікавішим кандидатом, який має 1000 оновлених результатів і 5000 переглядів профілю .
У випадку більш "реального" використання, ми могли б спробувати відповісти, наприклад, "які стартапи є найбільш значущими єдинорогами?". Наприклад, якщо ви інвестуєте 1 долар з крихітним капіталом, ви створюєте єдиноріг: https://www.linkedin.com/feed/update/urn:li:activity:6362648516858310656
Бетонні чисті прості у використанні дані реального світу
Щоб перевірити своє вирішення цієї проблеми, ви можете просто скористатися цим невеликим попередньо обробленим файлом ( стислий 75M , ~ 10М користувачів), витягнутим із дамп-дату переповнення стека 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
OMG, який важко було бігти. Мені довелося:
- завантажуйте виконуваний файл вручну, немає пакета Ubuntu
- конвертувати дані в CSV шляхом
users_xml_to_rep_view_dat.py
швидкого злому, тому що я не міг легко знайти, як подати на нього файли, розділені між собою. - боротися 3 години з інтерфейсом
- Типовий розмір точки - піксель, який плутається з пилом на моєму екрані. Переміщення до 10 піксельних сфер
- був користувач з 0 переглядами профілів, і VisIt він правильно відмовився робити графік логарифму, тому я використав обмеження даних, щоб позбутися цієї точки. Це нагадало мені, що gnuplot дуже вседозволений і з радістю зможе зробити все, що ви на нього кинете.
- додайте заголовки осей, видаліть ім’я користувача та інші речі в розділі "Керування"> "Анотації"
Ось як виглядало моє вікно VisIt після того, як я втомився від цієї ручної роботи:
Листи - це пункти, які я вибрав вручну за допомогою дивовижної функції "Вибір":
- Ви можете побачити точний Id для кожної точки, збільшивши точність плаваючої точки у вікні Вибору> "Формат поплавця" до
%.10g
- ви можете скинути всі вибрані вручну точки до файлу txt із "Зберегти вибір як". Це дозволяє нам скласти список цікавих URL-адрес профілю, який можна легко отримати, з базовою обробкою тексту
TODO, дізнайтеся, як:
- див. рядки імен профілю, вони за замовчуванням перетворюються на 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
- I 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://uk.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 SO співзасновник
- Користувачі з найвищою репутацією, як правило, отримують більше переглядів профілю, оскільки вони відображаються в запитах / списках 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% ad% e5% 9b% 9b% e4% ba% 8b% e4% bb% b6
- T 291742 161929 560648 https://stackoverflow.com/users/560648/lightness-races-in-orbit
високопоставлених користувачів, які на той час були призупинені. Ах, дурний твій представник відповідає одному правилу:
- 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, який "врівноважує частку позитивних оцінок з невизначеністю невеликої кількості спостережень ", але я не впевнений, як це віднести до цієї проблеми.
У цій публікації в блозі автор рекомендує алгоритму знайти елементи, які мають набагато більше результатів, ніж загальнодоступні, але я не впевнений, чи застосовується така ж проблема і до проблеми перегляду upvote / profile. Я думав взяти:
- перегляди профілю == оновлення там
- upvotes here == downvotes там (обидва "погані")
але я не впевнений, чи є це сенсом, оскільки в проблемі "вгору / знизу" кожен сортований пункт має N 0/1 подій голосування. Але в моїй проблемі кожен елемент пов’язаний з цим двома подіями: отримання резюме та отримання перегляду профілю.
Чи існує добре відомий алгоритм, який дає хороші результати для подібної проблеми? Навіть знання точної назви проблеми допомогло б мені знайти існуючу літературу.
Бібліографія
- 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.