Come trovare i punti campione che hanno rapporti anomali di grandi dimensioni statisticamente significativi tra due valori del punto?


12

Come applicazione di esempio, considerare le seguenti due proprietà degli utenti Stack Overflow: conteggi delle visualizzazioni di reputazione e profilo .

Si prevede che per la maggior parte degli utenti questi due valori saranno proporzionali: gli utenti con un alto rappresentante attirano più attenzione e quindi ottengono più visualizzazioni del profilo.

Pertanto, è interessante cercare utenti con molte visualizzazioni del profilo rispetto alla loro reputazione totale.

Ciò potrebbe indicare che l'utente ha una fonte di fama esterna. O forse solo per il fatto che hanno foto e nomi di profilo interessanti e bizzarri.

Più matematicamente, ogni punto di campionamento bidimensionale è un utente e ogni utente ha due valori integrali che vanno da 0 a + infinito:

  • reputazione
  • numero di visualizzazioni del profilo

Si prevede che questi due parametri siano linearmente dipendenti e vorremmo trovare punti campione che rappresentino i maggiori valori anomali di tale ipotesi.

La soluzione ingenua sarebbe ovviamente quella di prendere semplicemente le viste del profilo, dividere per reputazione e ordinare.

Tuttavia, ciò darebbe risultati non statisticamente significativi. Ad esempio, se un utente ha risposto alla domanda, ha ottenuto 1 voto e per qualche motivo aveva 10 visualizzazioni del profilo, che sono facili da falsificare, quell'utente apparirebbe di fronte a un candidato molto più interessante che ha 1000 voti e 5000 visualizzazioni del profilo .

In un caso d'uso più "reale", potremmo provare a rispondere ad esempio "quali startup sono gli unicorni più significativi?". Ad esempio, se investi 1 dollaro con un capitale proprio ridotto, crei un unicorno: https://www.linkedin.com/feed/update/urn:li:activity:6362648516858310656

Dati reali puliti e facili da usare concreti

Per testare la tua soluzione a questo problema, puoi semplicemente utilizzare questo piccolo file (75 M compresso, ~ 10 M utenti) preelaborato estratto dal dump di dati StackTranslate 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

che produce il file codificato UTF-8 users_rep_view.datche ha un formato separato da uno spazio di testo molto semplice:

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

Ecco come appaiono i dati su una scala di registro:

inserisci qui la descrizione dell'immagine

script gnuplot .

Sarebbe quindi interessante vedere se la tua soluzione ci aiuta davvero a scoprire nuovi utenti strani sconosciuti!

I dati iniziali sono stati ottenuti dal dump dei dati 2019-03 come segue:

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

Fonte perusers_xml_to_rep_view_dat.py .

Dopo aver selezionato i valori anomali riordinando users_rep_view.dat, è possibile ottenere un elenco HTML con collegamenti ipertestuali per visualizzare rapidamente le scelte migliori con:

./users_rep_view_dat_to_html.py users_rep_view.dat | head -n 1000 > users_rep_view.html
xdg-open users_rep_view.html

Fonte perusers_rep_view_dat_to_html.py .

Questo script può anche servire da rapido riferimento su come leggere i dati in Python.

Analisi manuale dei dati

Immediatamente guardando il grafico di gnuplot vediamo che come previsto:

  • i dati sono approssimativamente proporzionali, con varianze maggiori per gli utenti con un numero di visualizzazioni basso o basso
  • gli utenti con un numero di visualizzazioni basso o con un numero di visualizzazioni basso sono più chiari, il che significa che hanno ID account più alti, il che significa che i loro account sono più recenti

Al fine di ottenere alcune intuizioni sui dati, volevo approfondire alcuni punti molto lontani in alcuni software di stampa interattivi.

Gnuplot e Matplotlib non erano in grado di gestire un set di dati così grande, quindi ho dato a VisIt una possibilità per la prima volta e ha funzionato. Ecco una panoramica dettagliata di tutti i software di stampa che ho provato: /programming/5854515/large-plot-20-million-samples-gigabytes-of-data/55967461#55967461

OMG che è stato difficile iniziare a correre. Dovevo:

  • scarica manualmente l'eseguibile, non esiste un pacchetto Ubuntu
  • converti i dati in CSV hackerando users_xml_to_rep_view_dat.pyrapidamente perché non sono riuscito a trovare facilmente come alimentare file separati da spazio (lezione appresa, la prossima volta andrò dritto per CSV)
  • combattere per 3 ore con l'interfaccia utente
    • la dimensione in punti predefinita è un pixel, che viene confuso con la polvere sul mio schermo. Passa a sfere di 10 pixel
    • c'era un utente con 0 visualizzazioni del profilo e VisIt si rifiutava correttamente di fare il diagramma del logaritmo, quindi ho usato i limiti di dati per sbarazzarmi di quel punto. Questo mi ha ricordato che lo gnuplot è molto permissivo, e traccerà felicemente tutto ciò che gli lanci.
    • aggiungi titoli degli assi, rimuovi nome utente e altre cose in "Controlli"> "Annotazioni"

Ecco come appare la mia finestra di VisIt dopo che mi sono stancato di questo lavoro manuale:

inserisci qui la descrizione dell'immagine

Le lettere sono punti che ho selezionato manualmente con la fantastica funzione Scelte:

  • puoi vedere l'ID esatto per ciascun punto aumentando la precisione in virgola mobile nella finestra Scelte> "Formato float" a %.10g
  • è quindi possibile scaricare tutti i punti selezionati manualmente in un file txt con "Salva scelte come". Questo ci consente di produrre un elenco cliccabile di URL di profili interessanti con alcune elaborazioni di base del testo

TODOs, impara come:

  • vedere le stringhe del nome profilo, vengono convertite in 0 per impostazione predefinita. Ho appena incollato gli ID profilo nel browser
  • seleziona tutti i punti in un rettangolo in una volta sola

E così, finalmente, ecco alcuni utenti che probabilmente dovrebbero apparire in alto sul tuo ordine:

Possibili soluzioni

Ho sentito dell'intervallo di confidenza del punteggio Wilson da https://www.evanmiller.org/how-not-to-sort-by-average-rating.html che "bilancia [s] la proporzione di valutazioni positive con l'incertezza di un piccolo numero di osservazioni ", ma non sono sicuro di come mapparlo a questo problema.

In quel post sul blog, l'autore raccomanda a quell'algoritmo di trovare elementi che hanno molti più voti rispetto ai voti negativi, ma non sono sicuro che la stessa idea si applichi al problema di visualizzazione di voti positivi / profilo. Stavo pensando di prendere:

  • visualizzazioni profilo == voti lì
  • voti qui == voti lì (entrambi "cattivi")

ma non sono sicuro che abbia senso perché sul problema in alto / in basso, ogni elemento che viene ordinato ha eventi di voto N 0/1. Ma sul mio problema, ogni articolo ha due eventi associati: ottenere il voto e ottenere la vista del profilo.

Esiste un algoritmo ben noto che dà buoni risultati per questo tipo di problema? Anche conoscere il nome preciso del problema mi aiuterebbe a trovare la letteratura esistente.

Bibliografia

Testato in Ubuntu 18.10, VisIt 2.13.3.


1
Sono nuovo di questo, quindi non esitare a modificare il titolo / la domanda per rendere la terminologia più corretta. Grazie.
Ciro Santilli 10 病毒 审查 六四 事件 法轮功

sembra che tu stia cercando dei valori anomali. Vorrei usare una tecnica in questo spazio
probabilityislogic

1
@probabilityislogic a proposito, ho aggiornato la domanda con alcuni dati concreti e facili da usare.
Ciro Santilli 28 病毒 审查 六四 事件 法轮功

1
Vorrei solo dire che questa non è solo una domanda interessante, ma anche molto concreta e ben formattata. Un esempio da guardare. Ottimo lavoro @Ciro!
Julio Cezar Silva,

1
@JulioCezarSilva grazie !! Questa volta non mi aspettavo di conoscere la trama interattiva ad alta perf, ma l'ho fatto. Classico.
Ciro Santilli 3 病毒 审查 六四 事件 法轮功

Risposte:


4

Penso che l'intervallo di confidenza del punteggio Wilson possa essere applicato direttamente al tuo problema. Il punteggio utilizzato nel blog era un limite inferiore dell'intervallo di confidenza anziché un valore previsto.

Un altro metodo per tale problema è correggere (parziare) la nostra stima verso alcune conoscenze precedenti che abbiamo, ad esempio il rapporto vista / rep globale.

vN(μ,σ)μ

μp(μ)

In pratica, si tratta essenzialmente di una media ponderata del rapporto vista / rep complessivo e del rapporto vista / rep utente, dove è il numero di ripetizioni di un utente, è una costante, è il rapporto view / rep dell'utente e il rapporto view / rep generale.

μMAP=nμMLE+cμ0n+c
ncμMLEμ0


Per confrontare i due metodi (limite inferiore dell'intervallo di confidenza del punteggio di Wilson e MAP), entrambi forniscono una stima accurata quando vi sono dati sufficienti (ripetizioni), quando il numero di ripetizioni è piccolo, il metodo del limite inferiore di Wilson tenderà allo zero e MAP farà inclinazione verso la media.


1
Grazie per la tua risposta! Ho aggiornato la domanda con alcuni dati concreti e facili da usare, vediamo se qualcuno riesce a fare dei risultati divertenti.
Ciro Santilli 28 病毒 审查 六四 事件 法轮功

1
@CiroSantilli 新疆 改造 中心 996ICU 六四 事件 buon lavoro!
dontloo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.