Jak znaleźć punkty próbne, które mają statystycznie znaczące stosunki wartości odstających między dwiema wartościami punktu?

12

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.datktó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:

wprowadź opis zdjęcia tutaj

skrypt gnuplot .

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.datmoż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.pypliku 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ą:

wprowadź opis zdjęcia tutaj

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ń:

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

Testowane w Ubuntu 18.10, VisIt 2.13.3.

Ciro Santilli
źródło
1
Jestem nowy w tym, więc proszę edytować tytuł / pytanie, aby poprawić terminologię. Dzięki.
Ciro Santilli 10 病毒 审查 六四 事件 法轮功
wygląda na to, że szukasz wartości odstających.
prawdopodobieństwo jest
1
@probabilityislogic btw, zaktualizowałem pytanie o konkretne, łatwe w użyciu dane.
Ciro Santilli 28 病毒 审查 六四 事件 法轮功
1
Chciałbym tylko powiedzieć, że jest to nie tylko interesujące pytanie, ale także bardzo konkretne i dobrze sformatowane. Przykład do obejrzenia. Dobra robota @Ciro!
Julio Cezar Silva
1
@JulioCezarSilva dzięki !! Tym razem nie spodziewałem się dowiedzieć o wysokiej jakości interaktywnym spiskowaniu, ale tak zrobiłem. Klasyczny.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

Odpowiedzi:

4

Myślę, że przedział ufności wyniku Wilsona można zastosować bezpośrednio do problemu. Wynik zastosowany w blogu był niższą granicą przedziału ufności zamiast oczekiwanej wartości.

Inną metodą takiego problemu jest skorygowanie (odchylenie) naszych szacunków w stosunku do naszej wcześniejszej wiedzy, jaką posiadamy, na przykład ogólny współczynnik wyświetleń / powtórzeń.

vN.(μ,σ)μ

μp(μ) może być innym rozkładem normalnym oszacowanym na podstawie wszystkich próbek, które mamy.

μM.ZAP.=nμM.L.mi+doμ0n+do
ndoμM.L.miμ0


Aby porównać dwie metody (dolna granica przedziału ufności wyniku Wilsona i MAP), obie dają dokładne oszacowanie, gdy są wystarczające dane (powtórzenia), gdy liczba powtórzeń jest niewielka, metoda dolnego limitu Wilsona będzie odchylać się do zera, a MAP będzie uprzedzenie do średniej.

dontloo
źródło
1
Dzięki za odpowiedź! Zaktualizowałem pytanie o konkretne i łatwe w użyciu dane, zobaczmy, czy komuś uda się dokonać zabawnych ustaleń.
Ciro Santilli 28 病毒 审查 六四 事件 法轮功
1
@CiroSantilli 新疆 改造 中心 996ICU 六四 事件 dobra robota!
dontloo