Como aplicación de ejemplo, considere las siguientes dos propiedades de los usuarios de Stack Overflow: reputación y recuentos de vistas de perfil .
Se espera que para la mayoría de los usuarios esos dos valores sean proporcionales: los usuarios de alta reputación atraen más atención y, por lo tanto, obtienen más vistas de perfil.
Por lo tanto, es interesante buscar usuarios que tengan muchas vistas de perfil en comparación con su reputación total.
Esto podría indicar que ese usuario tiene una fuente externa de fama. O tal vez solo porque tienen nombres y fotos de perfil extravagantes interesantes.
Más matemáticamente, cada punto de muestra bidimensional es un usuario, y cada usuario tiene dos valores integrales que van desde 0 hasta + infinito:
- reputación
- cantidad de vistas de perfil
Se espera que esos dos parámetros sean linealmente dependientes, y nos gustaría encontrar puntos de muestra que sean los valores atípicos más grandes de esa suposición.
La solución ingenua sería, por supuesto, simplemente tomar vistas de perfil, dividir por reputación y clasificar.
Sin embargo, esto daría resultados que no son estadísticamente significativos. Por ejemplo, si un usuario respondió a una pregunta, obtuvo 1 voto a favor y, por alguna razón, tuvo 10 vistas de perfil, lo que es fácil de falsificar, ese usuario aparecería frente a un candidato mucho más interesante que tiene 1000 votos a favor y 5000 vistas de perfil .
En un caso de uso más del "mundo real", podríamos intentar responder, por ejemplo, "¿qué startups son los unicornios más significativos?". Por ejemplo, si invierte 1 dólar con un capital pequeño, crea un unicornio: https://www.linkedin.com/feed/update/urn:li:activity:6362648516858310656
Hormigón limpio fácil de usar datos del mundo real
Para probar su solución a este problema, puede usar este pequeño archivo preprocesado (75M comprimido, ~ 10M usuarios) extraído del volcado de datos de desbordamiento de pila 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
que produce el archivo codificado UTF-8 users_rep_view.dat
que tiene un formato separado de espacio de texto plano muy simple:
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
Así es como se ven los datos en una escala logarítmica:
¡Entonces sería interesante ver si su solución realmente nos ayuda a descubrir nuevos usuarios extraños y desconocidos!
Los datos iniciales se obtuvieron del volcado de datos 2019-03 de la siguiente manera:
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
Fuente parausers_xml_to_rep_view_dat.py
.
Después de seleccionar sus valores atípicos reordenando users_rep_view.dat
, puede obtener una lista HTML con hipervínculos para ver rápidamente las mejores opciones 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
Fuente parausers_rep_view_dat_to_html.py
.
Este script también puede servir como una referencia rápida de cómo leer los datos en Python.
Análisis manual de datos
Inmediatamente al mirar el gráfico gnuplot vemos que como se esperaba:
- los datos son aproximadamente proporcionales, con mayores variaciones para los usuarios con bajo número de reproducciones o bajo recuento de vistas
- los usuarios de baja representación o baja cantidad de visitas son más claros, lo que significa que tienen ID de cuenta más altos, lo que significa que sus cuentas son más nuevas
Para tener alguna intuición sobre los datos, quería profundizar en algunos puntos lejanos en algún software de trazado interactivo.
Gnuplot y Matplotlib no pudieron manejar un conjunto de datos tan grande, así que le di una oportunidad a VisIt por primera vez y funcionó. Aquí hay una descripción detallada de todo el software de trazado que he probado: /programming/5854515/large-plot-20-million-samples-gigabytes-of-data/55967461#55967461
OMG que fue difícil de ejecutar. Tuve que:
- descargue el ejecutable manualmente, no hay paquete de Ubuntu
- convertir los datos a CSV hackeando
users_xml_to_rep_view_dat.py
rápidamente porque no pude encontrar fácilmente cómo alimentarlo con archivos separados por espacios (lección aprendida, la próxima vez iré directamente a CSV) - luchar durante 3 horas con la interfaz de usuario
- El tamaño de punto predeterminado es un píxel, que se confunde con el polvo en mi pantalla. Mover a esferas de 10 píxeles
- había un usuario con 0 vistas de perfil, y Vis se negó correctamente a hacer el diagrama de logaritmo, por lo que utilicé los límites de datos para deshacerme de ese punto. Esto me recordó que gnuplot es muy permisivo y felizmente tramará todo lo que le arrojes.
- agregue títulos de eje, elimine nombre de usuario y otras cosas en "Controles"> "Anotaciones"
Así es como se veía mi ventana VisIt después de que me cansé de este trabajo manual:
Las letras son puntos que seleccioné manualmente con la increíble función de selección:
- puede ver el ID exacto de cada punto al aumentar la precisión del punto flotante en la ventana Picks> "Formato flotante" para
%.10g
- luego puede volcar todos los puntos seleccionados a mano en un archivo txt con "Guardar selecciones como". Esto nos permite producir una lista de URL de perfil interesantes con un procesamiento de texto básico.
TODOS, aprenda cómo:
- ver las cadenas de nombre de perfil, se convierten a 0 de forma predeterminada. Acabo de pegar Ids de perfil en el navegador
- elige todos los puntos de un rectángulo de una vez
Y finalmente, aquí hay algunos usuarios que probablemente deberían mostrarse altos en su pedido:
usuarios de muy bajo representante con gran cantidad de visitas y bajos perfiles de información.
Es probable que estos usuarios redirijan el tráfico desde algún lugar de alguna manera.
Relacionado: había un metahilo para la famosa manipulación de la insignia de oro de la pregunta por un usuario, pero no puedo encontrarlo ahora.
Si hay demasiados de esos usuarios, nuestro análisis será difícil y deberíamos tratar de considerar otros parámetros para evitar tal "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
- Este grupo de usuarios me parece interesante, todo muy cerca en el gráfico:
- 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 externa:
- O 29799 170854 2274694 https://stackoverflow.com/users/2274694/lyndsey-scottex Modelo de Victoria's Secret: https://en.wikipedia.org/wiki/Lyndsey_Scott
- P 45742 454747 1 https://stackoverflow.com/users/1/jeff-atwood SO cofundador
- Y 29230 75102 4 https://stackoverflow.com/users/4/joel-spolsky SO cofundador
- los usuarios de mayor reputación tienden a obtener más vistas de perfil porque aparecen en las consultas / listados de Google de "usuarios con mayor reputación":
- U 542861 401220 88656 https://stackoverflow.com/users/88656/eric-lippert involucrado en el diseño de C #
- V 852319 396830 157882 https://stackoverflow.com/users/157882/balusc usuario número 2, cantidad increíble de respuestas
Perfiles extravagantes:
- N 13690 108073 63550 https://stackoverflow.com/users/63550/peter-mortensen ¡ Esa propia imagen! También creo que fue moderador anteriormente.
- 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
usuarios de alta reputación que fueron suspendidos en ese momento. Ah, lo tonto que sea tu representante va a la regla 1:
- B 1 77456 285587 https://stackoverflow.com/users/285587/your-common-sense
No estoy seguro, estoy tentado a decir manipulación de la 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
Soluciones posibles
Escuché sobre el intervalo de confianza de puntaje de Wilson en https://www.evanmiller.org/how-not-to-sort-by-average-rating.html que "equilibra [s] la proporción de calificaciones positivas con la incertidumbre de un pequeño número de observaciones ", pero no estoy seguro de cómo asignar eso a este problema.
En esa publicación de blog, el autor recomienda que el algoritmo encuentre elementos que tengan muchos más votos a favor que votos negativos, pero no estoy seguro de si la misma idea se aplica al problema de la vista de perfil / voto positivo. Estaba pensando en tomar:
- vistas de perfil == votos a favor allí
- votos positivos aquí == votos negativos allí (ambos "malos")
pero no estoy seguro si tiene sentido porque en el problema de votación positiva / negativa, cada elemento que se ordena tiene N 0/1 eventos de votación. Pero en mi problema, cada elemento tiene dos eventos asociados: obtener el voto a favor y obtener la vista de perfil.
¿Existe un algoritmo bien conocido que dé buenos resultados para este tipo de problema? Incluso conocer el nombre exacto del problema me ayudaría a encontrar literatura existente.
Bibliografía
- https://meta.stackoverflow.com/questions/307117/are-profile-views-on-stack-overflow-positively-correlated-to-the-level-of-reputa
- Prueba de valores atípicos bivariados
- /programming/41462073/multivariate-outlier-detection-using-r-with-probability
- ¿Hay una manera simple de detectar valores atípicos?
- ¿Cómo deben abordarse los valores atípicos en el análisis de regresión lineal?
- https://math.meta.stackexchange.com/questions/26137/who-maximizes-the-ratio-of-people-reached-to-questions-answered
Probado en Ubuntu 18.10, VisIt 2.13.3.