À 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.dat
qui 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:
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.py
rapidement 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:
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:
utilisateurs très peu représentatifs avec un nombre de vues énorme et de faibles profils d'information.
Ces utilisateurs redirigent probablement le trafic de quelque part.
Connexes: il y avait un fil de méta pour la manipulation de badges d'or de question célèbre par un utilisateur, mais je ne le trouve pas maintenant.
S'il y a trop de ces utilisateurs, alors notre analyse sera difficile, et nous devrons essayer de considérer d'autres paramètres pour éviter une telle "fraude":
- 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
- Je trouve ce groupe d'utilisateurs intéressant, tous si proches dans le graphique:
- 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
renommée externe:
- O 29799 170854 2274694 https://stackoverflow.com/users/2274694/lyndsey-scottex Victoria's Secret model: https://en.wikipedia.org/wiki/Lyndsey_Scott
- P 45742 454747 1 https://stackoverflow.com/users/1/jeff-atwood SO co-fondateur
- Y 29230 75102 4 https://stackoverflow.com/users/4/joel-spolsky SO co-fondateur
- les utilisateurs dont la réputation est la plus élevée ont tendance à obtenir plus de vues de profil, car ils apparaissent dans les requêtes / listes Google "utilisateurs avec la plus haute réputation":
- U 542861 401220 88656 https://stackoverflow.com/users/88656/eric-lippert impliqué dans la conception C #
- V 852319 396830 157882 https://stackoverflow.com/users/157882/balusc top n ° 2, nombre fou de réponses
profils originaux:
- N 13690 108073 63550 https://stackoverflow.com/users/63550/peter-mortensen Cette propre image! Je pense aussi qu'il était modérateur auparavant.
- 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
utilisateurs de haut représentant qui ont été suspendus à l'époque. Ah, le stupide votre représentant va à 1 règle:
- B 1 77456 285587 https://stackoverflow.com/users/285587/your-common-sense
pas sûr, je suis tenté de dire manipulation de vue:
- 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
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
- https://meta.stackoverflow.com/questions/307117/are-profile-views-on-stack-overflow-positively-correlated-to-the-level-of-reputa
- Test des valeurs aberrantes bivariées
- /programming/41462073/multivariate-outlier-detection-using-r-with-probability
- Existe-t-il un moyen simple de détecter les valeurs aberrantes?
- Comment les valeurs aberrantes devraient-elles être traitées dans l'analyse de régression linéaire?
- https://math.meta.stackexchange.com/questions/26137/who-maximizes-the-ratio-of-people-reached-to-questions-answered
Testé dans Ubuntu 18.10, VisIt 2.13.3.