¿Cómo encontrar los puntos de muestra que tienen proporciones atípicas grandes estadísticamente significativas entre dos valores del punto?

12

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.datque 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:

ingrese la descripción de la imagen aquí

script de gnuplot .

¡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.pyrá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:

ingrese la descripción de la imagen aquí

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:

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

Probado en Ubuntu 18.10, VisIt 2.13.3.

Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
fuente
1
Soy nuevo en esto, así que siéntase libre de editar el título / pregunta para que la terminología sea más correcta. Gracias.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
Parece que estás buscando valores atípicos. Usaría una técnica en este espacio
probabilidadislogical
1
@probabilityislogic por cierto, he actualizado la pregunta con algunos datos concretos fáciles de usar.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
1
Solo me gustaría decir que esta no es solo una pregunta interesante, sino también muy concreta y bien formateada. Un ejemplo para admirar. Buen trabajo @Ciro!
Julio Cezar Silva
1
@JulioCezarSilva gracias !! Esta vez no esperaba aprender sobre el trazado interactivo de alto rendimiento, pero lo hice. Clásico.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

Respuestas:

4

Creo que el intervalo de confianza de la puntuación de Wilson se puede aplicar directamente a su problema. La puntuación utilizada en el blog fue un límite inferior del intervalo de confianza en lugar de un valor esperado.

Otro método para tal problema es corregir (sesgar) nuestra estimación hacia algún conocimiento previo que tengamos, por ejemplo, la relación visión / representación general.

vN(μ,σ)μ

μp(μ)

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


Para comparar los dos métodos (intervalo de confianza de puntaje de Wilson, límite inferior y MAP), ambos dan una estimación precisa cuando hay suficientes datos (repeticiones), cuando el número de repeticiones es pequeño, el método de límite inferior de Wilson sesgará hacia cero y MAP sesgo hacia la media.

dontloo
fuente
1
¡Gracias por su respuesta! He actualizado la pregunta con datos concretos y fáciles de usar, veamos si alguien logra hacer algunos hallazgos divertidos.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
1
@CiroSantilli 新疆 改造 中心 996ICU 六四 事件 ¡buen trabajo!
dontloo