Cómo detectar opiniones polarizadas de los usuarios (calificaciones de estrellas altas y bajas)

15

Si tengo un sistema de clasificación por estrellas donde los usuarios pueden expresar su preferencia por un producto o artículo, ¿cómo puedo detectar estadísticamente si los votos están altamente "divididos"? Es decir, incluso si el promedio es 3 de 5, para un producto dado, ¿cómo puedo detectar si se trata de una división de 1 a 5 versus un consenso 3, utilizando solo los datos (sin métodos gráficos)

David Williams
fuente
3
¿Qué tiene de malo usar una desviación estándar?
Spork
1
No es una respuesta, pero es relevante: evanmiller.org/how-not-to-sort-by-average-rating.html
Fraccional el
1
¿Estás tratando de detectar la "distribución bimodal"? Ver stats.stackexchange.com/q/5960/29552
Ben Voigt
1
En la ciencia política existe una literatura sobre la medición de la polarización política que ha examinado varias formas diferentes de definir lo que se entiende por "polarización". Un buen artículo que analiza en detalle 4 formas simples diferentes de definir la polarización es el siguiente (ver págs. 692-699): educ.jmu.edu/~brysonbp/pubs/PBJ.pdf
Jake Westfall

Respuestas:

12

Se podría construir un índice de polarización; exactamente cómo se define depende de lo que constituye estar más polarizado (es decir, ¿qué quiere decir exactamente, en casos extremos, con más o menos polarizado?):

Por ejemplo, si la media es '4', ¿se divide 50-50 entre '3' y '5' más o menos polarizado que 25% '1' y 75% '5'?

De todos modos, en ausencia de ese tipo de definición específica de lo que quiere decir, sugeriré una medida basada en la varianza:

Dada una media particular, defina la división más polarizada posible como la que maximiza la varianza *.

* (NB que diría que el 25% '1' y el 75% '5' está sustancialmente más polarizado que la división 50-50 de '3 y' 5; si eso no coincide con su intuición, no use la varianza)

Entonces, este índice de polarización es la proporción de la mayor varianza posible ( con la media observada ) en la varianza observada.

Llame a la calificación promedio ( m = ˉ xmm=x¯ ).

La varianza máxima ocurre cuando una proporción está en5y1-pestá en1; esto tiene una varianza de (m-1)(5-m)np=m1451p1(m1)(5m)nn1 .

Entonces, simplemente tome la varianza de la muestra y divida por ; esto le da un número entre(m1)(5m)nn1 (acuerdo perfecto) y 1 (completamente polarizado).01

Para varios casos donde la calificación media es 4, esto daría lo siguiente:

ingrese la descripción de la imagen aquí


En su lugar, puede preferir no calcularlos en relación con la mayor varianza posible con la misma media, sino como un porcentaje de la mayor varianza posible para cualquier calificación promedio . Eso implicaría dividir en su lugar por , y nuevamente produce un valor entre 0 (acuerdo perfecto) y1(polarizado en los extremos en una relación de 50-50). Esto produciría las mismas relatividades que el diagrama anterior, pero todos los valores serían 3/4 tan grandes (es decir, de izquierda a derecha, de arriba a abajo serían 0, 16.5%, 25%, 25%, 50 % y 75%).4 4nortenorte-11

Cualquiera de las dos es una opción perfectamente válida, como lo es cualquier otro número de formas alternativas de construir dicho índice.

Glen_b -Reinstate a Monica
fuente
Pero entonces cuando m = 1consigues 1 - 1 = 0y 0 / 0. ¿Cómo corriges eso?
Francesco
metro=1metro=5 5
8

"Sin métodos gráficos" es una gran desventaja, pero ... aquí hay un par de ideas extrañas. Ambos tratan las calificaciones como continuas, lo cual es una especie de debilidad conceptual, y probablemente no sea la única ...

Curtosis

  • La curtosis de {1,1,1,5,5,5} = 1. No obtendrá una curtosis más baja con ningún combo de 1–5 calificaciones.
  • La curtosis de {1,2,3,4,5} = 1.7. Menor significa valores más extremos; más alto significa más medio.
  • Esto no funcionará si la distribución no es más o menos simétrica. Lo demostraré a continuación.

Regresión binomial negativa.

Con un marco de datos como este:

RuntyonortesolFrmiqtuminorteCy13121537 74 49 95 537
Ajustar el modelo FrequencyRating+Rating using negative binomial regression. The Rating coefficient should be near zero if ratings are uniformly distributed, positive if there are proportionally more middle-range values (cf. binomial distribution), or negative with polarized distributions like the one above, for which the coefficient is -11.8.

FWIW, aquí está el código con el que he estado jugando:

x=rbinom(99,4,c(.1,.9))+1;y=sample(0:4,99,replace=T)+1 #Some polarized & uniform rating data
table(x);table(y)                                                         #Frequencies
require(moments);kurtosis(x);kurtosis(y)                                  #Kurtosis

Y=data.frame(n=as.numeric(table(y)),rating=as.numeric(levels(factor(y)))) #Data frame setup
X=data.frame(n=as.numeric(table(x)),rating=as.numeric(levels(factor(x)))) #Data frame setup
require(MASS);summary(glm.nb(n~rating+sqrt(rating),X))  #Negative binomial of polarized data
summary(glm.nb(n~rating+sqrt(rating),Y))                #Negative binomial of uniform data

No puedo resistir lanzar una trama ...

require(ggplot2);ggplot(X,aes(x=rating,y=n))+geom_point()+stat_smooth(formula=y~x+I(sqrt(x)),method='glm',family='poisson')

los RuntyonortesolEl término determina la curvatura (concavidad en este caso) de la línea de regresión. Como ya estoy haciendo trampa usando gráficos, califico esto con la regresión de Poisson en lugar del binomio negativo porque es más fácil de codificar que hacerlo de la manera correcta .



Editar: acabo de ver esta pregunta anunciada en la barra lateral: y cuando hice clic, la vi en las Preguntas de la red activa que se vincula a sí misma, como a veces sucede ,

Así que pensé que esto podría merecer una nueva visita de una manera más útil en general. Decidí probar mis métodos en las reseñas de clientes de Amazon para la camiseta de manga corta The Mountain Three Wolf Moon :

Runtyonortesol1234 45 5FrmiqtuminorteCy20854891982273
Como puedes ver, esta es una camiseta increíble. George Takei lo dijo. De todos modos ...
La curtosis de esta distribución es bastante alta (7.1), por lo que ese método no es tan simple como parece.
¡El modelo de regresión binomial negativa todavía funciona!βRuntyonortesol=-19,1.

Por cierto, @ Duncan's σFrmiqtuminorteCyThe Mountain Three Wolf Moon camiseta de manga corta2=1,31...
y con x=rep(5:1,c(2273,198,89,54,208))el índice de polarización de @ Glen_b var(x)/(4*length(x)/(length(x)-1))= .33 ... solo digo.

Nick Stauner
fuente
Se trata de 0,77 para la primera versión del índice de polarización (es decir, en relación con el más polarizado dada la calificación media), pero sí, como usted dice, 0,33 para la segunda versión (en relación con la distribución más polarizada posible).
Glen_b -Reinstate Monica
@Glen_b: ¿Y no es la primera versión menos apropiada cuando la media no se fija en varios conjuntos de clasificaciones que deben compararse? ¿O he entendido mal tu respuesta?
Nick Stauner
Depende de cuál sea el objetivo. A juzgar por el título "cómo detectar opiniones polarizadas", me inclino hacia la primera ( dada la calificación promedio, ¿qué tan polarizada es la opinión al respecto? ). Si el objetivo era comparar diferentes conjuntos de calificaciones, puede tener más sentido trabajar con el segundo enfoque, como sugiere. Es por eso que hice las dos cosas. Mi comentario no fue en ningún sentido como crítica; Me halaga que lo hayas mencionado.
Glen_b -Reinstate Monica
@Glen_b: Entendido :) TBH, sugiero que el enfoque de modelado de regresión binomial negativa es mejor, pero admito que apenas lo he probado a fondo. Tengo la sensación de que la mayoría de los conjuntos de clasificación polarizados reales no estarán polarizados de manera uniforme, por lo que creo que la robustez contra la asimetría será importante para los futuros lectores.
Nick Stauner
5

Creo que una manera fácil es calcular la varianza. En un sistema simple como ese, una varianza más alta significaría más 1s / 5s. EDITAR Ejemplo rápido: si sus valores son 1,3,3,5 su varianza será:

(1-3)2+(3-3)2+(3-3)2+(5 5-3)24 4=1
Si sus números son 1,1,5,5 su varianza será:
(1-3)2+(1-3)2+(5 5-3)2+(5 5-3)24 4=2
Duncan
fuente
2

Dudo que pueda agregar algo valioso a las respuestas inteligentes ya dadas. En particular, a la buena idea de @ Glen_b de evaluar cómo la varianza observada es relativamente cercana a la varianza máxima posible bajo la media observada. Mi propia propuesta contundente y directa desde el hombro es, en cambio, una medida robusta de dispersión basada no en desviaciones de algún centro sino directamente en distancias entre puntos de datos.

Calcule distancias por pares (diferencias absolutas) entre todos los puntos de datos. Abandonarreyoyodistancias cero Calcule una tendencia central en la distribución de las distancias (la elección es suya; puede ser, por ejemplo, media, mediana o centro de Hodges-Lehmann ).

Rating scale                   Distances      Mean     Median    Hodges-Lehmann
1  2  3  4  5

Frequency distributions:

1     2     1                 0 2 2 2 2 4      2          2          2

2           2                 0 0 4 4 4 4      2.7        4          2

1        2  1                 0 1 1 3 3 4      2          2          2

1  1  1     1                 1 1 2 2 3 4      2.2        2          2

1  1     1  1                 1 1 2 3 3 4      2.3        2.5        2.5

1           3                 0 0 0 4 4 4      2          2          2

Como puede ver, las 3 estadísticas pueden ser muy diferentes como medidas de "polarización" (si tuviera que medir el "desacuerdo" en lugar de la confrontación bipolar, probablemente elegiría HL). La decisión es tuya. Una noción: si calcula distancias cuadradas , su media estará directamente relacionada con la varianza habitual en los datos (y así llegará a la sugerencia de @ Duncan para calcular la varianza). El cálculo de distancias no será demasiado difícil incluso con grandesnorte aquí porque la escala de calificación es discreta y con relativamente pocos grados, por lo que el algoritmo de ponderación de frecuencia para calcular distancias se ofrece naturalmente.

ttnphns
fuente
La media de las distancias al cuadrado por pares está relacionada con la varianza.
Glen_b -Reinstate Monica
0

¿Qué tal si la calificación de 3 estrellas es menor que el promedio de 5 y 4, y también menor que el promedio de 1 y 2:

if (number_of_ratings > 6)      // kind of meaningless unless there's enough ratings
{
    if ( ((rating(5)+rating(4))*0.5 > rating(3)) &&
         ((rating(1)+rating(2))*0.5 > rating(3))
       )    
    {
        // Opinion divided
    }
    else
    {
        // Opinion not divided
    }
}
else
{
    // Hard to tell yet if opinion is divided
}

No puedo pensar en ninguna situación en la que eso no funcione. Usando el ejemplo anterior: Comentarios de clientes de Amazon para la camiseta de manga corta The Mountain Three Wolf Moon :

Runtyonortesol1234 45 5FrmiqtuminorteCy20854891982273

En este caso:

Runtyonortesolunvmirunsolmi(1,2)3unvmirunsolmi(4 4,5 5)FrmiqtuminorteCy131891235

Esto pasaría la prueba y se consideraría una opinión dividida.

Rocketmagnet
fuente
1
¿Qué pasaría si hubiera muchos 2s y 4s, y relativamente pocas otras clasificaciones? Es difícil imaginar que esto suceda en realidad, pero ¿uno realmente querría llamar a eso polarizado?
Nick Stauner
Ahora que lo pienso, uno podría encontrar más fácilmente casos con muchos 1s y 5s, muy pocos 2s y 4s, y una cantidad moderada de 3s. Por ejemplo,
Runtyonortesol1234 45 5FrmiqtuminorteCy255 5155 525
Eso está bastante polarizado, ¿no? Sin embargo, su método produciría el mismo resultado para esto que para una distribución uniforme de 15 de cada calificación.
Nick Stauner
0

Creo que lo que estás buscando es una desviación estándar:

σ=yo=0 0norte(Xyo-μ)2nortedónde σ es la desviación estándar norte es la cantidad de puntos de datos,X representa todos los puntos de datos yμ es la media

No sé qué lenguaje de programación es este, pero aquí hay un método de Java que le dará la desviación estándar:

public static double standardDeviation(double[] data) {
            //find the mean
    double sum = 0;
    for(double x:data) {
        sum+=x;
    }
    double mean = sum/data.length;

            //find standard deviation
    Double sd;
    sd=0.0;
    for(double x:data) {
        sd+=Math.pow((x-mean),2);
    }
    sd=sd/data.length;
    sd=Math.sqrt(sd);

    return sd;
}
anónimo
fuente