Comment trouver les points d'échantillonnage qui ont des ratios aberrants statistiquement significatifs importants entre deux valeurs du point?


12

À titre d'exemple d'application, envisagez de suivre deux propriétés des utilisateurs de Stack Overflow: la réputation et le nombre de vues de profil .

On s'attend à ce que pour la plupart des utilisateurs, ces deux valeurs soient proportionnelles: les utilisateurs à haute réputation attirent plus d'attention et obtiennent donc plus de vues de profil.

Par conséquent, il est intéressant de rechercher des utilisateurs qui ont beaucoup de vues de profil par rapport à leur réputation totale.

Cela pourrait indiquer que cet utilisateur a une source externe de renommée. Ou peut-être juste qu'ils ont des photos et des noms de profils intéressants.

Plus mathématiquement, chaque point d'échantillonnage bidimensionnel est un utilisateur, et chaque utilisateur a deux valeurs intégrales allant de 0 à + infini:

  • réputation
  • nombre de vues de profil

Ces deux paramètres devraient être linéairement dépendants, et nous aimerions trouver des points d'échantillonnage qui sont les plus grandes valeurs aberrantes à cette hypothèse.

La solution naïve serait bien sûr de simplement prendre des vues de profil, de diviser par réputation et de trier.

Cependant, cela donnerait des résultats qui ne sont pas statistiquement significatifs. Par exemple, si un utilisateur a répondu à la question, a obtenu 1 vote positif et, pour une raison quelconque, a eu 10 vues de profil, ce qui est facile à simuler, cet utilisateur apparaîtrait devant un candidat beaucoup plus intéressant qui a 1000 votes positifs et 5000 vues de profil. .

Dans un cas d'utilisation plus "réel", nous pourrions essayer de répondre par exemple "quelles startups sont les licornes les plus significatives?". Par exemple, si vous investissez 1 dollar avec de minuscules capitaux propres, vous créez une licorne: https://www.linkedin.com/feed/update/urn:li:activity:6362648516858310656

Données du monde réel, propres et faciles à utiliser

Pour tester votre solution à ce problème, vous pouvez simplement utiliser ce petit fichier prétraité (75 millions compressés, ~ 10 millions d'utilisateurs) extrait du vidage de données de débordement de pile 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

qui produit le fichier encodé UTF-8 users_rep_view.datqui a un format très simple séparé par un espace de texte brut:

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

Voici à quoi ressemblent les données sur une échelle logarithmique:

entrez la description de l'image ici

script gnuplot .

Il serait alors intéressant de voir si votre solution nous aide réellement à découvrir de nouveaux utilisateurs bizarres inconnus!

Les données initiales ont été obtenues à partir du vidage de données 2019-03 comme suit:

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

Source pourusers_xml_to_rep_view_dat.py .

Après avoir sélectionné vos valeurs aberrantes par réorganisation users_rep_view.dat, vous pouvez obtenir une liste HTML avec des hyperliens pour afficher rapidement les meilleurs choix avec:

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

Source pourusers_rep_view_dat_to_html.py .

Ce script peut également servir de référence rapide sur la façon de lire les données dans Python.

Analyse manuelle des données

Immédiatement en regardant le graphique gnuplot, nous voyons que comme prévu:

  • les données sont approximativement proportionnelles, avec de plus grandes variances pour les utilisateurs à faible répétition ou à faible nombre de vues
  • les utilisateurs à faible répétition ou à faible nombre de vues sont plus clairs, ce qui signifie qu'ils ont des ID de compte plus élevés, ce qui signifie que leurs comptes sont plus récents

Afin d'obtenir une certaine intuition sur les données, je voulais explorer certains points très avancés dans un logiciel de traçage interactif.

Gnuplot et Matplotlib ne pouvaient pas gérer un ensemble de données aussi volumineux, j'ai donc essayé VisIt pour la première fois et cela a fonctionné. Voici un aperçu détaillé de tous les logiciels de traçage que j'ai essayés: /programming/5854515/large-plot-20-million-samples-gigabytes-of-data/55967461#55967461

OMG qui était difficile à exécuter. J'ai dû:

  • télécharger l'exécutable manuellement, il n'y a pas de package Ubuntu
  • convertir les données en CSV en piratant users_xml_to_rep_view_dat.pyrapidement parce que je ne pouvais pas facilement trouver comment l'alimenter en fichiers séparés par des espaces (leçon apprise, la prochaine fois je vais directement pour CSV)
  • combattre pendant 3 heures avec l'interface utilisateur
    • la taille par défaut des points est un pixel, qui se confond avec la poussière sur mon écran. Passer à des sphères de 10 pixels
    • il y avait un utilisateur avec 0 vues de profil, et VisIt a correctement refusé de faire le tracé du logarithme, j'ai donc utilisé des limites de données pour me débarrasser de ce point. Cela m'a rappelé que gnuplot est très permissif et tracera volontiers tout ce que vous lui lancerez.
    • ajouter des titres d'axe, supprimer un nom d'utilisateur et d'autres choses sous "Contrôles"> "Annotations"

Voici à quoi ressemblait ma fenêtre VisIt après avoir été fatigué de ce travail manuel:

entrez la description de l'image ici

Les lettres sont des points que j'ai sélectionnés manuellement avec la fonction impressionnante de choix:

  • vous pouvez voir l'ID exact de chaque point en augmentant la précision en virgule flottante dans la fenêtre Choix> "Format flottant" pour %.10g
  • vous pouvez ensuite vider tous les points sélectionnés à la main dans un fichier txt avec "Enregistrer les choix sous". Cela nous permet de produire une liste cliquable d'URL de profil intéressantes avec un traitement de texte de base

TODO, apprenez à:

  • voir les chaînes de nom de profil, elles sont converties en 0 par défaut. Je viens de coller des identifiants de profil dans le navigateur
  • sélectionner tous les points d'un rectangle en une seule fois

Et enfin, voici quelques utilisateurs qui devraient probablement apparaître en haut de votre commande:

Solutions possibles

J'ai entendu parler de l' intervalle de confiance du score de Wilson sur https://www.evanmiller.org/how-not-to-sort-by-average-rating.html qui "équilibre [s] la proportion de notes positives avec l'incertitude d'un petit nombre d'observations ", mais je ne sais pas comment faire correspondre cela à ce problème.

Dans ce billet de blog, l'auteur recommande cet algorithme pour trouver des éléments qui ont beaucoup plus de votes positifs que de votes négatifs, mais je ne suis pas sûr que la même idée s'applique au problème de vote positif / vue de profil. Je pensais prendre:

  • vues de profil == votes positifs
  • votes positifs ici == votes négatifs là-bas (tous deux "mauvais")

mais je ne sais pas si cela a du sens, car en ce qui concerne le problème de montée / descente, chaque élément trié a N / 1 vote. Mais sur mon problème, chaque élément a deux événements qui lui sont associés: obtenir le vote positif et obtenir la vue de profil.

Existe-t-il un algorithme bien connu qui donne de bons résultats pour ce type de problème? Même connaître le nom précis du problème m'aiderait à trouver la littérature existante.

Bibliographie

Testé dans Ubuntu 18.10, VisIt 2.13.3.


1
Je suis nouveau dans ce domaine, alors n'hésitez pas à modifier le titre / la question pour rendre la terminologie plus correcte. Merci.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

il semble que vous recherchiez des valeurs aberrantes. J'utiliserais une technique dans cet espace
probabilitéislogique

1
@probabilityislogic btw, j'ai mis à jour la question avec des données concrètes faciles à utiliser.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

1
Je voudrais juste dire que ce n'est pas seulement une question intéressante, mais aussi très concrète et bien formatée. Un exemple à regarder. Bon travail @Ciro!
Julio Cezar Silva

1
@JulioCezarSilva merci !! Je ne m'attendais pas à en apprendre davantage sur le tracé interactif de haute performance cette fois, mais je l'ai fait. Classique.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

Réponses:


4

Je pense que l'intervalle de confiance du score de Wilson peut être appliqué directement à votre problème. Le score utilisé dans le blog était une borne inférieure de l'intervalle de confiance au lieu d'une valeur attendue.

Une autre méthode pour un tel problème consiste à corriger (biaiser) notre estimation par rapport à certaines connaissances antérieures que nous avons, par exemple le rapport global vue / répétition.

vN(μ,σ)μ

μp(μ)

Dans la pratique, il s'agit essentiellement d'une moyenne pondérée du rapport global vue / répétition et du rapport utilisateur vue / répétition, où est le nombre de répétitions d'un utilisateur, est une constante, est le rapport vue / répétition de l'utilisateur et le rapport global vue / répétition.

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


Pour comparer les deux méthodes (intervalle de confiance du score de Wilson, borne inférieure et MAP), elles donnent toutes deux une estimation précise lorsque les données sont suffisantes (répétitions), lorsque le nombre de répétitions est petit, la méthode de la borne inférieure de Wilson biaisera vers zéro et MAP biais vers la moyenne.


1
Merci pour votre réponse! J'ai mis à jour la question avec des données concrètes et faciles à utiliser, voyons si quelqu'un parvient à faire des découvertes amusantes.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

1
@CiroSantilli 心 改造 中心 996ICU 六四 事件 bon travail!
dontloo
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.