Jako przykładową aplikację rozważ następujące dwie właściwości użytkowników stosu przepełnienia stosu: liczy się reputacja i widok profilu .
Oczekuje się, że dla większości użytkowników te dwie wartości będą proporcjonalne: użytkownicy o wysokiej liczbie powtórzeń przyciągają więcej uwagi, a tym samym uzyskują więcej widoków profilu.
Dlatego interesujące jest wyszukiwanie użytkowników, którzy mają wiele wyświetleń profilu w porównaniu do ich ogólnej reputacji.
Może to oznaczać, że ten użytkownik ma zewnętrzne źródło sławy. A może po prostu mają ciekawe dziwaczne zdjęcia profilowe i nazwiska.
Mówiąc bardziej matematycznie, każdy dwuwymiarowy punkt próbki jest użytkownikiem, a każdy użytkownik ma dwie wartości całkowite od 0 do + nieskończoności:
- reputacja
- liczba wyświetleń profilu
Oczekuje się, że te dwa parametry będą liniowo zależne i chcielibyśmy znaleźć punkty próbne, które są największymi wartościami odstającymi od tego założenia.
Naiwnym rozwiązaniem byłoby oczywiście po prostu przeglądanie profilu, dzielenie według reputacji i sortowanie.
Dałoby to jednak wyniki, które nie są istotne statystycznie. Na przykład, jeśli użytkownik odpowiedział na pytanie, otrzymał 1 opinię, a z jakiegoś powodu miał 10 widoków profilu, które można łatwo sfałszować, to ten użytkownik pojawiłby się przed znacznie bardziej interesującym kandydatem, który ma 1000 głosów pozytywnych i 5000 wyświetleń profilu .
W przypadku bardziej „rzeczywistego świata” moglibyśmy spróbować na przykład odpowiedzieć „które startupy są najbardziej znaczącymi jednorożcami?”. Np. Jeśli zainwestujesz 1 dolar z niewielkim kapitałem własnym, stworzysz jednorożca: https://www.linkedin.com/feed/update/urn:li:activity:6362648516858310656
Konkretnie czyste, łatwe w użyciu dane ze świata rzeczywistego
Aby przetestować rozwiązanie tego problemu, możesz po prostu użyć tego małego (skompresowanego 75M, ~ 10M użytkowników) wstępnie przetworzonego pliku wyodrębnionego ze zrzutu danych Przepełnienie stosu 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
który tworzy plik zakodowany w formacie UTF-8, users_rep_view.dat
który ma bardzo prosty format oddzielony zwykłym tekstem:
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
Tak wyglądają dane w skali dziennika:
Byłoby zatem interesujące sprawdzić, czy Twoje rozwiązanie naprawdę pomaga nam odkrywać nowych nieznanych dziwacznych użytkowników!
Początkowe dane uzyskano ze zrzutu danych 2019-03 w następujący sposób:
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
Źródło dlausers_xml_to_rep_view_dat.py
.
Po wybraniu wartości odstających przez zmianę kolejności users_rep_view.dat
możesz uzyskać listę HTML z hiperłączami, aby szybko przeglądać najlepsze typy za pomocą:
./users_rep_view_dat_to_html.py users_rep_view.dat | head -n 1000 > users_rep_view.html
xdg-open users_rep_view.html
Źródło dlausers_rep_view_dat_to_html.py
.
Ten skrypt może również służyć jako szybki przegląd sposobu odczytu danych w Pythonie.
Ręczna analiza danych
Natychmiast, patrząc na wykres gnuplot, widzimy, że zgodnie z oczekiwaniami:
- dane są w przybliżeniu proporcjonalne, z większymi odchyleniami dla użytkowników o niskiej liczbie powtórzeń lub niskiej liczbie wyświetleń
- użytkownicy o niskiej liczbie powtórzeń lub niskiej liczbie wyświetleń są wyraźniejsi, co oznacza, że mają wyższe identyfikatory kont, co oznacza, że ich konta są nowsze
Aby uzyskać intuicję na temat danych, chciałem zgłębić pewne daleko idące punkty w interaktywnym oprogramowaniu do drukowania.
Gnuplot i Matplotlib nie poradziły sobie z tak dużym zestawem danych, więc po raz pierwszy dałem VisIt szansę i zadziałało. Oto szczegółowy przegląd oprogramowania, które wypróbowałem: /programming/5854515/large-plot-20-million-samples-gigabytes-of-data/55967461#55967461
OMG, którego ciężko było uruchomić. Musiałem:
- pobierz plik wykonywalny ręcznie, nie ma pakietu Ubuntu
- przekonwertować dane do
users_xml_to_rep_view_dat.py
pliku CSV, szybko się hakując, ponieważ nie mogłem łatwo znaleźć sposobu, aby go przesłać oddzielone spacjami pliki (wyciągnięta lekcja, następnym razem przejdę prosto do pliku CSV) - walcz przez 3 godziny z interfejsem użytkownika
- domyślny rozmiar punktu to piksel, który myli się z kurzem na moim ekranie. Przejdź do 10 kulek pikseli
- był użytkownik z 0 widokami profilu i VisIt poprawnie odmówił wykonania logarytmu, więc użyłem limitów danych, aby pozbyć się tego punktu. Przypomniało mi to, że gnuplot jest bardzo liberalny i chętnie knuje wszystko, co na niego rzucisz.
- dodaj tytuły osi, usuń nazwę użytkownika i inne rzeczy w „Sterowanie”> „Adnotacje”
Oto jak wyglądało moje okno VisIt po tym, jak zmęczyłem się tą ręczną pracą:
Listy są punktami, które wybrałem ręcznie za pomocą niesamowitej funkcji wyborów:
- możesz zobaczyć dokładny identyfikator każdego punktu, zwiększając precyzję liczb zmiennoprzecinkowych w oknie Wybór> „Format zmiennoprzecinkowy” do
%.10g
- następnie możesz zrzucić wszystkie ręcznie wybrane punkty do pliku txt za pomocą opcji „Zapisz typy jako”. To pozwala nam stworzyć klikalną listę interesujących adresów URL profili z podstawowymi przetwarzaniami tekstu
DO ZROBIENIA, dowiedz się, jak:
- zobacz ciągi nazw profili, domyślnie są konwertowane na 0. Właśnie wkleiłem Ids profilu do przeglądarki
- wybierz wszystkie punkty w prostokącie za jednym razem
I w końcu oto kilku użytkowników, którzy prawdopodobnie powinni wykazać się wysokim poziomem zamówień:
bardzo niska liczba użytkowników z dużą liczbą wyświetleń i niskim profilem informacyjnym.
Ci użytkownicy prawdopodobnie skądś przekierowują ruch.
Powiązane: istniał meta wątek do słynnej manipulacji złotym znaczkiem pytania przez użytkownika, ale nie mogę go teraz znaleźć.
Jeśli takich użytkowników jest zbyt wielu, nasza analiza będzie trudna i będziemy musieli rozważyć inne parametry, aby uniknąć takich „oszustw”:
- 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
- Uważam tę grupę użytkowników za interesującą, a wszystko to w pobliżu na wykresie:
- 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
zewnętrzna sława:
- O 29799 170854 2274694 https://stackoverflow.com/users/2274694/lyndsey-scottex Victoria's Secret model: https://en.wikipedia.org/wiki/Lyndsey_Scott
- P 45742 454747 1 https://stackoverflow.com/users/1/jeff-atwood Współzałożyciel SO
- Y 29230 75102 4 https://stackoverflow.com/users/4/joel-spolsky Współzałożyciel SO
- użytkownicy o najwyższej reputacji mają zwykle więcej wyświetleń profilu, ponieważ pojawiają się w zapytaniach / listach Google „użytkownicy o najwyższej reputacji”:
- U 542861 401220 88656 https://stackoverflow.com/users/88656/eric-lippert zaangażowany w projektowanie w C #
- V 852319 396830 157882 https://stackoverflow.com/users/157882/balusc top # 2 użytkownik, szalona ilość odpowiedzi
dziwaczne profile:
- N 13690 108073 63550 https://stackoverflow.com/users/63550/peter-mortensen To własne zdjęcie! Myślę też, że wcześniej był moderatorem.
- 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
użytkownicy o wysokich przedstawicielach, którzy zostali wówczas zawieszeni. Ach, głupie jest to, że twój przedstawiciel stosuje 1 zasadę:
- B 1 77456 285587 https://stackoverflow.com/users/285587/your-common-sense
nie jestem pewien, mam ochotę powiedzieć, że manipulowanie widokiem:
- 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
Możliwe rozwiązania
Słyszałem o przedziale ufności wyniku Wilsona z https://www.evanmiller.org/how-not-to-sort-by-average-rating.html który „równoważy odsetek pozytywnych ocen z niepewnością niewielkiej liczby obserwacji ”, ale nie jestem pewien, jak odwzorować to na ten problem.
W tym wpisie na blogu autor zaleca algorytmowi znalezienie elementów, które mają o wiele więcej ocen pozytywnych niż ocen negatywnych, ale nie jestem pewien, czy ten sam pomysł dotyczy problemu widoku opinii / profilu. Myślałem o przyjęciu:
- odsłon profilu == głosuje tam
- głosuje tutaj == głosuje tam (oba „złe”)
ale nie jestem pewien, czy ma to sens, ponieważ w przypadku problemu w górę / w dół każdy sortowany element ma N głosów w głosowaniu 0/1. Ale w moim problemie z każdym elementem są powiązane dwa zdarzenia: uzyskanie opinii i uzyskanie widoku profilu.
Czy istnieje dobrze znany algorytm, który daje dobre wyniki w tego rodzaju problemach? Nawet znajomość dokładnej nazwy problemu pomoże mi znaleźć istniejącą literaturę.
Bibliografia
- https://meta.stackoverflow.com/questions/307117/are-profile-views-on-stack-overflow-positively-correlated-to-the-level-of-reputa
- Test na dwuwymiarowe wartości odstające
- /programming/41462073/multivariate-outlier-detection-using-r-with-probability
- Czy istnieje prosty sposób wykrywania wartości odstających?
- Jak należy sobie radzić z wartościami odstającymi w analizie regresji liniowej?
- https://math.meta.stackexchange.com/questions/26137/who-maximizes-the-ratio-of-people-reached-to-questions-ans Odpowiedzi
Testowane w Ubuntu 18.10, VisIt 2.13.3.