Wie finde ich die Stichprobenpunkte, die statistisch bedeutsame große Ausreißerverhältnisse zwischen zwei Punktwerten aufweisen?

12

Berücksichtigen Sie als Beispielanwendung die folgenden zwei Eigenschaften von Stack Overflow-Benutzern: Anzahl der Reputations- und Profilansichten .

Es wird erwartet, dass diese beiden Werte für die meisten Benutzer proportional sind: Benutzer mit hohen Wiederholungszahlen ziehen mehr Aufmerksamkeit auf sich und erhalten daher mehr Profilansichten.

Daher ist es interessant, nach Benutzern zu suchen, die im Vergleich zu ihrer allgemeinen Reputation viele Profilansichten haben.

Dies könnte darauf hinweisen, dass dieser Benutzer eine externe Quelle des Ruhms hat. Oder vielleicht nur, dass sie interessante, schrullige Profilbilder und Namen haben.

Mathematischer ausgedrückt ist jeder zweidimensionale Abtastpunkt ein Benutzer, und jeder Benutzer hat zwei Integralwerte im Bereich von 0 bis + unendlich:

  • Ruf
  • Anzahl der Profilansichten

Es wird erwartet, dass diese beiden Parameter linear abhängig sind, und wir möchten Stichprobenpunkte finden, die die größten Ausreißer dieser Annahme sind.

Die naive Lösung wäre natürlich, nur Profilansichten zu vertreten, nach Ruf zu teilen und zu sortieren.

Dies würde jedoch zu Ergebnissen führen, die statistisch nicht aussagekräftig sind. Wenn ein Benutzer beispielsweise auf eine Frage geantwortet hat, 1 Upvote erhalten hat und aus irgendeinem Grund 10 Profilansichten hat, die leicht zu fälschen sind, wird dieser Benutzer vor einem viel interessanteren Kandidaten mit 1000 Upvotes und 5000 Profilansichten angezeigt .

In einem eher "realen" Anwendungsfall könnten wir versuchen zu antworten, zum Beispiel "Welche Startups sind die aussagekräftigsten Einhörner?". Wenn Sie beispielsweise 1 Dollar mit winzigem Eigenkapital investieren, erstellen Sie ein Einhorn: https://www.linkedin.com/feed/update/urn:li:activity:6362648516858310656

Konkrete saubere, benutzerfreundliche Daten aus der realen Welt

Um Ihre Lösung für dieses Problem zu testen, können Sie einfach diese kleine (75 Millionen komprimierte, ~ 10 Millionen Benutzer) vorverarbeitete Datei verwenden, die aus dem Stack Overflow-Datendump 2019-03 extrahiert wurde :

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

Dadurch wird die UTF-8-codierte Datei erstellt, users_rep_view.datdie ein sehr einfaches, durch Leerzeichen getrenntes Format aufweist:

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

So sehen die Daten auf einer Protokollskala aus:

Geben Sie hier die Bildbeschreibung ein

Gnuplot-Skript .

Es wäre dann interessant zu sehen, ob Ihre Lösung uns tatsächlich hilft, neue unbekannte, skurrile Benutzer zu entdecken!

Die anfänglichen Daten wurden aus dem Datendump 2019-03 wie folgt erhalten:

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

Quelle fürusers_xml_to_rep_view_dat.py .

Nachdem Sie Ihre Ausreißer durch Neuordnung ausgewählt haben users_rep_view.dat, können Sie eine HTML-Liste mit Hyperlinks abrufen, um schnell die Top-Picks anzuzeigen mit:

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

Quelle fürusers_rep_view_dat_to_html.py .

Dieses Skript kann auch als Kurzreferenz zum Einlesen der Daten in Python dienen.

Manuelle Datenanalyse

Wenn wir uns das Gnuplot-Diagramm ansehen, sehen wir das wie erwartet:

  • Die Daten sind ungefähr proportional, mit größeren Abweichungen für Benutzer mit geringer Wiederholungszahl oder geringer Anzahl von Ansichten
  • Benutzer mit geringer Wiederholungszahl oder geringer Anzahl von Ansichten sind klarer, was bedeutet, dass sie höhere Konto-IDs haben, was bedeutet, dass ihre Konten neuer sind

Um ein Gefühl für die Daten zu bekommen, wollte ich einige weit oben liegende Punkte in einer interaktiven Plotsoftware aufschlüsseln.

Gnuplot und Matplotlib konnten mit einem so großen Datensatz nicht umgehen, also habe ich VisIt zum ersten Mal getestet und es hat funktioniert. Hier ist eine detaillierte Übersicht aller Plot-Software, die ich ausprobiert habe: /programming/5854515/large-plot-20-million-samples-gigabytes-of-data/55967461#55967461

Oh mein Gott, das war schwer zum Laufen zu bringen. Ich musste:

  • Laden Sie die ausführbare Datei manuell herunter, es gibt kein Ubuntu-Paket
  • Konvertieren Sie die Daten in CSV, indem Sie sie users_xml_to_rep_view_dat.pyschnell hacken, da ich nicht leicht herausfinden konnte, wie ich sie durch durch Leerzeichen getrennte Dateien füttern kann (Lektion gelernt, das nächste Mal gehe ich direkt zu CSV).
  • Kämpfe 3 Stunden lang mit der Benutzeroberfläche
    • Die Standardpunktgröße ist ein Pixel, das mit dem Staub auf meinem Bildschirm verwechselt wird. Bewegen Sie sich zu 10-Pixel-Kugeln
    • Es gab einen Benutzer mit 0 Profilansichten, und VisIt weigerte sich korrekt, das Logarithmusdiagramm zu erstellen. Daher habe ich Datenlimits verwendet, um diesen Punkt zu entfernen. Dies erinnerte mich daran, dass Gnuplot sehr freizügig ist und gerne alles plant, was Sie darauf werfen.
    • Fügen Sie unter "Steuerelemente"> "Anmerkungen" Achsentitel hinzu, entfernen Sie den Benutzernamen und andere Dinge.

So sah mein VisIt-Fenster aus, nachdem ich diese manuelle Arbeit satt hatte:

Geben Sie hier die Bildbeschreibung ein

Die Buchstaben sind Punkte, die ich manuell mit der fantastischen Auswahl ausgewählt habe:

  • Sie können die genaue ID für jeden Punkt anzeigen, indem Sie die Gleitkommapräzision im Auswahlfenster> "Gleitkommaformat" auf erhöhen %.10g
  • Sie können dann alle handverlesenen Punkte mit "Picks speichern unter" in eine txt-Datei kopieren. Auf diese Weise können wir eine anklickbare Liste interessanter Profil-URLs mit einigen grundlegenden Textverarbeitungen erstellen

TODOs lernen, wie man:

  • Siehe die Profilnamenzeichenfolgen. Sie werden standardmäßig in 0 konvertiert. Ich habe gerade Profil-IDs in den Browser eingefügt
  • Wählen Sie alle Punkte in einem Rechteck auf einmal aus

Und zum Schluss noch ein paar Benutzer, die bei Ihrer Bestellung wahrscheinlich ganz oben stehen sollten:

Mögliche Lösungen

Ich habe von https://www.evanmiller.org/how-not-to-sort-by-average-rating.html über das Wilson-Konfidenzintervall gehört, das den Anteil positiver Bewertungen mit der Unsicherheit in Einklang bringt einer kleinen Anzahl von Beobachtungen ", aber ich bin nicht sicher, wie ich das auf dieses Problem abbilden soll.

In diesem Blog-Beitrag empfiehlt der Autor diesen Algorithmus, um Elemente zu finden, die viel mehr Upvotes als Downvotes haben, aber ich bin mir nicht sicher, ob dieselbe Idee für das Upvote- / Profilansichtsproblem gilt. Ich dachte daran zu nehmen:

  • Profilansichten == Upvotes dort
  • Upvotes hier == Downvotes dort (beide "schlecht")

Ich bin mir jedoch nicht sicher, ob dies sinnvoll ist, da beim Auf- / Ab-Abstimmungsproblem jedes zu sortierende Element N 0/1 Abstimmungsereignisse aufweist. Bei meinem Problem sind jedem Element zwei Ereignisse zugeordnet: das Abrufen der Upvote und das Abrufen der Profilansicht.

Gibt es einen bekannten Algorithmus, der für diese Art von Problem gute Ergebnisse liefert? Selbst wenn ich den genauen Problemnamen kenne, kann ich vorhandene Literatur finden.

Literaturverzeichnis

Getestet in Ubuntu 18.10, VisIt 2.13.3.

Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
quelle
1
Ich bin neu in diesem Bereich. Bitte bearbeiten Sie den Titel / die Frage, um die Terminologie korrekter zu gestalten. Vielen Dank.
Ciro Santilli 法轮功 病毒 审查 六四 事件 法轮功
Es sieht so aus, als würden Sie nach Ausreißern suchen. Ich würde eine Technik in diesem Raum verwenden
Wahrscheinlichkeitslogik
1
@probabilityislogic Übrigens habe ich die Frage mit einigen konkreten, einfach zu verwendenden Daten aktualisiert.
Ciro Santilli 法轮功 病毒 审查 六四 事件 28
1
Ich möchte nur sagen, dass dies nicht nur eine interessante Frage ist, sondern auch sehr konkret und gut formatiert. Ein Beispiel, zu dem man aufschauen kann. Gute Arbeit @Ciro!
Julio Cezar Silva
1
@ JulioCezarSilva danke !! Ich hatte diesmal nicht erwartet, etwas über interaktives Plotten mit hoher Leistung zu lernen, aber ich tat es. Klassisch.
Ciro Santilli 3 病毒 审查 六四 事件 3

Antworten:

4

Ich denke, das Wilson-Score-Konfidenzintervall kann direkt auf Ihr Problem angewendet werden. Die im Blog verwendete Punktzahl war eine Untergrenze des Konfidenzintervalls anstelle eines erwarteten Werts.

Eine andere Methode für ein solches Problem besteht darin, unsere Schätzung in Bezug auf einige Vorkenntnisse, die wir haben, zu korrigieren (zu verzerren), beispielsweise das Verhältnis von Gesamtansicht zu Wiederholung.

vN(μ,σ)μ

μp(μ)

In der Praxis ist dies im Wesentlichen ein gewichteter Durchschnitt des Verhältnisses von Gesamtansicht zu und des Verhältnisses von Benutzeransicht zu , wobei ist die Anzahl der Wiederholungen, die ein Benutzer hat, ist eine Konstante, ist das Verhältnis von Ansicht zu Wiederholung des Benutzers und das Gesamtverhältnis von Ansicht zu Wiederholung.

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


Um die beiden Methoden zu vergleichen (Wilson-Score-Konfidenzintervall untere Grenze und MAP), geben beide eine genaue Schätzung, wenn genügend Daten (Wiederholungen) vorhanden sind. Wenn die Anzahl der Wiederholungen gering ist, wird die Wilson-Methode der unteren Grenze gegen Null tendieren und MAP wird Voreingenommenheit gegenüber dem Mittelwert.

dontloo
quelle
1
Danke für deine Antwort! Ich habe die Frage mit einigen konkreten und benutzerfreundlichen Daten aktualisiert. Mal sehen, ob es jemandem gelingt, lustige Ergebnisse zu erzielen.
Ciro Santilli 法轮功 病毒 审查 六四 事件 28
1
@CiroSantilli 中心 改造 6 996ICU 六四 事件 gute Arbeit!
Dontloo