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.dat
che 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:
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.py
rapidamente 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:
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:
utenti con una reputazione molto bassa con un numero elevato di visualizzazioni e profili di informazioni bassi.
Questi utenti stanno probabilmente reindirizzando il traffico da qualche parte in qualche modo.
Correlati: c'era un meta thread per la famosa manipolazione di badge oro domanda da parte di un utente, ma non riesco a trovarlo ora.
Se ci sono troppi di tali utenti, la nostra analisi sarà difficile e dovremmo provare a considerare altri parametri per evitare tale "frode":
- 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
- Trovo questo gruppo di utenti interessante, tutto così vicino nel grafico:
- 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
fama esterna:
- O 29799 170854 2274694 https://stackoverflow.com/users/2274694/lyndsey-scottex Modello Victoria's Secret: https://en.wikipedia.org/wiki/Lyndsey_Scott
- P 45742 454747 1 https://stackoverflow.com/users/1/jeff-atwood cofondatore
- Y 29230 75102 4 https://stackoverflow.com/users/4/joel-spolsky SO cofondatore
- gli utenti con la più alta reputazione tendono a ottenere più visualizzazioni del profilo perché compaiono nelle query / schede "utenti con la più alta reputazione":
- U 542861 401220 88656 https://stackoverflow.com/users/88656/eric-lippert coinvolti nella progettazione di C #
- V 852319 396830 157882 https://stackoverflow.com/users/157882/balusc top # 2 utente, quantità folle di risposte
profili eccentrici:
- N 13690 108073 63550 https://stackoverflow.com/users/63550/peter-mortensen Quella propria immagine! Penso anche che prima fosse un moderatore.
- 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
utenti di alto livello che erano stati sospesi in quel momento. Ah, lo sciocco che il tuo rappresentante passa a 1 regola:
- B 1 77456 285587 https://stackoverflow.com/users/285587/your-common-sense
non sono sicuro, sono tentato di dire manipolazione vista:
- 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
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
- https://meta.stackoverflow.com/questions/307117/are-profile-views-on-stack-overflow-positively-correlated-to-the-level-of-reputa
- Test per valori anomali bivariati
- /programming/41462073/multivariate-outlier-detection-using-r-with-probability
- Esiste un modo semplice per rilevare i valori anomali?
- Come devono essere trattati i valori anomali nell'analisi della regressione lineare?
- https://math.meta.stackexchange.com/questions/26137/who-maximizes-the-ratio-of-people-reached-to-questions-answered
Testato in Ubuntu 18.10, VisIt 2.13.3.