Agrupación de datos de recuento muy sesgados: ¿alguna sugerencia para realizar (transformar, etc.)?

11

Problema básico

Aquí está mi problema básico: estoy tratando de agrupar un conjunto de datos que contiene algunas variables muy sesgadas con recuentos. Las variables contienen muchos ceros y, por lo tanto, no son muy informativas para mi procedimiento de agrupación, que probablemente sea el algoritmo k-means.

Bien, dices, simplemente transforma las variables usando raíz cuadrada, caja cox o logaritmo. Pero dado que mis variables se basan en variables categóricas, me temo que podría introducir un sesgo al manejar una variable (basada en un valor de la variable categórica), mientras dejo otras (basadas en otros valores de la variable categórica) como están. .

Vamos a entrar en más detalles.

El conjunto de datos

Mi conjunto de datos representa compras de artículos. Los artículos tienen diferentes categorías, por ejemplo, color: azul, rojo y verde. Las compras se agrupan, por ejemplo, por clientes. Cada uno de estos clientes está representado por una fila de mi conjunto de datos, por lo que de alguna manera tengo que agregar las compras a los clientes.

La forma en que hago esto es contando el número de compras, donde el artículo es de un color determinado. Así que en lugar de una sola variable color, termino con tres variables count_red, count_bluey count_green.

Aquí hay un ejemplo de ilustración:

-----------------------------------------------------------
customer | count_red  |    count_blue   | count_green     |
-----------------------------------------------------------
c0       |    12      |        5        |       0         |
-----------------------------------------------------------
c1       |     3      |        4        |       0         |
-----------------------------------------------------------
c2       |     2      |       21        |       0         |
-----------------------------------------------------------
c3       |     4      |        8        |       1         |
-----------------------------------------------------------

En realidad, al final no uso recuentos absolutos, uso proporciones (fracción de artículos verdes de todos los artículos comprados por cliente).

-----------------------------------------------------------
customer | count_red  |    count_blue   | count_green     |
-----------------------------------------------------------
c0       |    0.71    |        0.29     |       0.00      |
-----------------------------------------------------------
c1       |    0.43    |        0.57     |       0.00      |
-----------------------------------------------------------
c2       |    0.09    |        0.91     |       0.00      |
-----------------------------------------------------------
c3       |    0.31    |        0.62     |       0.08      |
-----------------------------------------------------------

El resultado es el mismo: para uno de mis colores, por ejemplo, verde (a nadie le gusta el verde), obtengo una variable sesgada a la izquierda que contiene muchos ceros. En consecuencia, k-means no puede encontrar una buena partición para esta variable.

Por otro lado, si estandarizo mis variables (restar media, dividir por desviación estándar), la variable verde "explota" debido a su pequeña varianza y toma valores de un rango mucho mayor que las otras variables, lo que hace que se vea más importante para k-means de lo que realmente es

La siguiente idea es transformar la variable verde sk (r) ewed.

Transformando la variable sesgada

Si transformo la variable verde aplicando la raíz cuadrada, se ve un poco menos sesgada. (Aquí la variable verde se traza en rojo y verde para garantizar la confusión).

ingrese la descripción de la imagen aquí

Rojo: variable original; azul: transformado por raíz cuadrada.

Digamos que estoy satisfecho con el resultado de esta transformación (que no lo estoy, ya que los ceros todavía sesgan fuertemente la distribución). ¿Debería ahora también escalar las variables rojo y azul, aunque sus distribuciones se ven bien?

Línea de fondo

En otras palabras, ¿distorsiono los resultados de la agrupación al manejar el color verde de una manera, pero sin manejar el rojo y el azul? Al final, las tres variables pertenecen juntas, entonces, ¿no deberían tratarse de la misma manera?

EDITAR

Para aclarar: soy consciente de que k-means probablemente no sea el camino a seguir para los datos basados en conteo . Sin embargo, mi pregunta es realmente sobre el tratamiento de variables dependientes. Elegir el método correcto es una cuestión aparte.

La restricción inherente en mis variables es que

count_red(i) + count_blue(i) + count_green(i) = n(i), donde n(i)está el número total de compras del cliente i.

(O, de manera equivalente, count_red(i) + count_blue(i) + count_green(i) = 1cuando se utilizan recuentos relativos).

Si transformo mis variables de manera diferente, esto corresponde a dar diferentes pesos a los tres términos en la restricción. Si mi objetivo es separar de manera óptima grupos de clientes, ¿debo preocuparme por violar esta restricción? ¿O "el fin justifica los medios"?

Pederpansen
fuente
Bienvenido a CV! Gracias por hacer su primera pregunta tan clara y bien escrita.
Silverfish
No entendí bien tu conjunto de datos. Las variables (atributos) son count_red, count_bluey count_greeny los datos son conteos. ¿Derecho? ¿Cuáles son las filas entonces - artículos? ¿Y vas a agrupar los artículos?
ttnphns
Las filas generalmente representan grupos de compras agregadas. Puede pensar en ellos como clientes que compraron varios artículos. He actualizado mi pregunta con un conjunto de datos de muestra para aclarar esto.
pederpansen
¿Quieres agrupar "clientes"?
ttnphns
Si. Tengo la intención de agrupar las compras por intervalos de tiempo también y, en consecuencia, agrupar los intervalos de tiempo, pero por ahora: clientes.
pederpansen

Respuestas:

7

@ttnphns ha proporcionado una buena respuesta.

Hacer un buen agrupamiento a menudo implica pensar mucho en sus datos, así que hagamos algo de eso. En mi opinión, el aspecto más fundamental de sus datos es que son de composición .

Por otro lado, su principal preocupación parece ser que tiene muchos ceros para los productos ecológicos y se pregunta específicamente si puede transformar solo los valores ecológicos para hacerlo más similar al resto. Pero debido a que estos son datos de composición, no puede pensar en un conjunto de recuentos independientemente del resto. Además, parece que lo que realmente le interesa son las probabilidades de los clientes de comprar productos de diferentes colores, pero debido a que muchos no han comprado ninguno verde, le preocupa que no pueda estimar esas probabilidades. Una forma de abordar esto es utilizar un enfoque algo bayesiano en el que empujemos las proporciones estimadas de los clientes hacia una proporción media, con la cantidad del cambio influenciada por lo lejos que están de la media y la cantidad de datos que tiene para estimar su verdadera probabilidades

A continuación utilizo su conjunto de datos de ejemplo para ilustrar (en R) una forma de abordar su situación. Leo los datos y los convierto en proporciones rowwise, y luego calculo las proporciones medias por columna. Agrego los medios a cada recuento para obtener recuentos ajustados y nuevas proporciones de rowwise. Esto empuja la proporción estimada de cada cliente hacia la proporción media de cada producto. Si quisieras un empujón más fuerte, podrías usar un múltiplo de los medios (como, por ejemplo 15*mean.props).

d = read.table(text="id  red    blue    green
...
c3  4   8   1", header=TRUE)
tab = as.table(as.matrix(d[,-1]))
rownames(tab) = paste0("c", 0:3)
tab
#    red blue green
# c0  12    5     0
# c1   3    4     0
# c2   2   21     0
# c3   4    8     1
props = prop.table(tab, 1)
props
#           red       blue      green
# c0 0.70588235 0.29411765 0.00000000
# c1 0.42857143 0.57142857 0.00000000
# c2 0.08695652 0.91304348 0.00000000
# c3 0.30769231 0.61538462 0.07692308
mean.props = apply(props, 2, FUN=function(x){ weighted.mean(x, rowSums(tab)) })
mean.props
#        red       blue      green 
# 0.35000000 0.63333333 0.01666667 
adj.counts = sweep(tab, 2, mean.props, FUN="+");  adj.counts
#            red        blue       green
# c0 12.35000000  5.63333333  0.01666667
# c1  3.35000000  4.63333333  0.01666667
# c2  2.35000000 21.63333333  0.01666667
# c3  4.35000000  8.63333333  1.01666667
adj.props = prop.table(adj.counts, 1);  adj.props
#             red         blue        green
# c0 0.6861111111 0.3129629630 0.0009259259
# c1 0.4187500000 0.5791666667 0.0020833333
# c2 0.0979166667 0.9013888889 0.0006944444
# c3 0.3107142857 0.6166666667 0.0726190476

Hay varios resultados de esto. Una de ellas es que ahora tiene estimaciones distintas de cero de las probabilidades subyacentes de comprar productos ecológicos, incluso cuando un cliente aún no tiene ningún registro de haber comprado productos ecológicos. Otra consecuencia es que ahora tiene valores algo continuos, mientras que las proporciones originales eran más discretas; es decir, el conjunto de estimaciones posibles está menos restringido, por lo que una medida de distancia como la distancia euclidiana al cuadrado podría tener más sentido ahora.

Podemos visualizar los datos para ver qué sucedió. Debido a que estos son datos de composición, en realidad solo tenemos dos datos, y podemos trazarlos en un solo diagrama de dispersión. Con la mayoría de la información en las categorías roja y azul, tiene sentido usarlas como ejes. Puede ver que las proporciones ajustadas (los números rojos) se desplazan un poco desde sus posiciones originales.

windows()
  plot(props[,1], props[,2], pch=as.character(0:3),
       xlab="Proportion Red", ylab="Proportion Blue", xlim=c(0,1), ylim=c(0,1))
  points(adj.props[,1], adj.props[,2], pch=as.character(0:3), col="red")

ingrese la descripción de la imagen aquí

En este punto, tiene datos y mucha gente comenzaría estandarizándolos. Nuevamente, debido a que estos son datos de composición, realizaría análisis de conglomerados sin realizar ninguna estandarización; estos valores ya son proporcionales y la estandarización destruiría parte de la información relacional. De hecho, al mirar la trama, creo que aquí solo tienes una dimensión de información. (Al menos en el conjunto de datos de muestra; su conjunto de datos real puede ser muy diferente). A menos que, desde el punto de vista comercial, piense que es importante reconocer a las personas que tienen alguna probabilidad sustancial de comprar productos ecológicos como un grupo distinto de clientes, yo extraería puntajes en el primer componente principal (que representa el 99.5% de la varianza en este conjunto de datos) y simplemente agruparía eso.

pc.a.props = prcomp(adj.props[,1:2], center=T, scale=T)
cumsum(pc.a.props$sdev^2)/sum(pc.a.props$sdev^2)
# [1] 0.9946557 1.000000
pc.a.props$x
#           PC1         PC2
# c0 -1.7398975 -0.03897251
# c1 -0.1853614 -0.04803648
# c2  1.6882400 -0.06707115
# c3  0.2370189  0.15408015
library(mclust)
mc = Mclust(pc.a.props$x[,1])
summary(mc)
# ----------------------------------------------------
# Gaussian finite mixture model fitted by EM algorithm 
# ----------------------------------------------------
# 
# Mclust E (univariate, equal variance) model with 3 components:
# 
#  log.likelihood n df       BIC       ICL
#       -2.228357 4  6 -12.77448 -12.77448
# 
# Clustering table:
# 1 2 3 
# 1 2 1 
gung - Restablece a Monica
fuente
+1 porque reconoció que se trata de datos de composición, pero ¿por qué no utilizaría técnicas de transformación estándar para la composición? datos en lugar de esta extraña idea de "recuentos ajustados medios"? Me parece ad-hoc, ¿hay alguna referencia particular para esto o algo similar? ¿Por qué es mejor que una simple transformación de relación logarítmica centrada y luego agrupar la primera puntuación de PC de los datos transformados? (que sería lo que pediría cualquier revisor razonable de una aplicación de análisis de datos de
composición
Gracias, @ usεr11852. Cuenta de> 2, pero las opciones finitas son multinomiales. Este es (1 forma de un análisis bayesiano empírico) con un Dirichlet anterior (el conjugado). Estoy seguro de que otras opciones son posibles. Sin embargo, no veo de inmediato cómo tomar proporciones funcionaría con los ceros.
gung - Restablece a Monica
2
Gracias por el enlace Si tiene una única dimensión de componente que no sea cero, puede usarla para una transformación de relación logarítmica aditiva (excluyendo la idea obvia de imputación; vea los comentarios aquí ). El CLR estaría desactivado porque usa una media geométrica. Se ha trabajado en "datos de composición inflados a cero"; ver por ejemplo aquí , aquí y aquí .
usεr11852
1
Parece que sabes mucho más sobre este tema que yo, @ usεr11852. Mi respuesta fue simplemente tratar de hacer explícitos estos hechos sobre la naturaleza de la situación / plantear el problema y proporcionar una sugerencia preliminar. ¿Por qué no aportar su propia respuesta (mejor informada)?
gung - Restablece a Monica
7

No es aconsejable transformar las variables individualmente porque van juntas (como notó) y hacer k-means porque los datos son recuentos (es posible, pero k-means es mejor hacerlo en atributos continuos como la longitud, por ejemplo) .

En su lugar, calcularía la distancia chi-cuadrado (perfecta para conteos) entre cada par de clientes, en función de las variables que contienen conteos. Luego, haga un agrupamiento jerárquico (por ejemplo, un método de enlace promedio o un método de enlace completo; no calculan los centroides y, por lo tanto, no requieren una distancia euclidiana) o algún otro grupo que trabaje con matrices de distancia arbitrarias.

Copiando datos de ejemplo de la pregunta:

-----------------------------------------------------------
customer | count_red  |    count_blue   | count_green     |
-----------------------------------------------------------
c0       |    12      |        5        |       0         |
-----------------------------------------------------------
c1       |     3      |        4        |       0         |
-----------------------------------------------------------
c2       |     2      |       21        |       0         |
-----------------------------------------------------------
c3       |     4      |        8        |       1         |
-----------------------------------------------------------

Considere emparejar c0y c1calcular la estadística Chi-cuadrado para su 2x3tabla de frecuencias. Tome la raíz cuadrada de la misma (como la toma cuando calcula la distancia euclidiana habitual). Esa es tu distancia. Si la distancia es cercana a 0, los dos clientes son similares.

Puede molestarle que las sumas en filas en su tabla difieran y, por lo tanto, afecta la distancia de chi-cuadrado cuando compara c0con c1vs c0con c2. Luego calcule la (raíz de) la distancia Phi-cuadrado : Phi-sq = Chi-sq/Ndonde Nestá el recuento total combinado en las dos filas (clientes) actualmente consideradas. Por lo tanto, se normaliza la distancia wrt a los recuentos generales.

Here is the matrix of sqrt(Chi-sq) distance between your four customers
 .000   1.275   4.057   2.292
1.275    .000   2.124    .862
4.057   2.124    .000   2.261
2.292    .862   2.261    .000

And here is the matrix of sqrt(Phi-sq) distance 
.000    .260    .641    .418
.260    .000    .388    .193
.641    .388    .000    .377
.418    .193    .377    .000

Entonces, la distancia entre dos filas de datos es la (raíz cuadrada de) la estadística chi-cuadrado o phi-cuadrado de la 2 x ptabla de frecuencias ( pes el número de columnas en los datos). Si alguna columna (s) en la 2 x ptabla actual es cero completo, corte esa columna y calcule la distancia en función de las columnas restantes distintas de cero (está bien y así es, por ejemplo, SPSS cuando calcula la distancia). La distancia chi-cuadrado es en realidad una distancia euclidiana ponderada.

ttnphns
fuente
Gracias por esta elaborada respuesta. Le agradezco que haya dado consejos sobre algo que no era mi pregunta original: ¿Es K-means (con la distancia euclidiana implícita) la elección correcta para este caso de uso? Sospeché que no, y lo confirmaste. Sin embargo, todavía no entiendo por qué . ¿Podría razonar 1) por qué la distancia chi-cuadrado (o phi-cuadrado) es una buena opción para los datos de conteo? 2) volviendo a mi pregunta original: ¿hay un buen argumento (matemático / empírico) por qué todas las variables deben tratarse de la misma manera que no sean "pertenecen juntas"?
pederpansen
Un cliente elige entre los tres colores cuando realiza una sola compra: los tres colores no son "variables" conceptualmente independientes. Además, sus datos son recuentos. Me quedó claro de inmediato que una medida basada en chi-cuadrado debería ser óptima. Con respecto a su último punto, podría preguntarle de nuevo: ¿por qué deberían ser tratados de manera diferente? A te dio una solución para hacer el trabajo de agrupamiento. ¿Hay algo en él que no te gusta o que te hace dudar?
ttnphns
2
Tampoco creo que k-means (¡minimización de varianza!) Sea el camino a seguir: k-means usa medias . Sus datos son enteros y tienen muchos ceros. Los centros de clúster no serán enteros y tendrán pocos ceros. Son totalmente diferentes a sus puntos de datos, ¿cómo pueden ser representativos? En pocas palabras: no luches por transformar tus datos para que se ajusten a k-means. Comprenda el problema y ajuste los algoritmos a su problema, no al revés. Si se ajustan a sus datos para el problema de k-medias, todavía puede ser un problema equivocado ...
Ha dejado de fumar - Anony-Mousse
1
Cuando estandariza sus variables para igualar sus variaciones, es más o menos equivalente a igualar los totales en las columnas de su tabla de datos. Cuando transforma el sesgo, es más o menos equivalente a aumentar los recuentos más grandes pero no más pequeños en su tabla. Puede hacerlo (e incluso después puede calcular chi o phi como he sugerido), pero tenga en cuenta que ha torcido los datos originales. ¿Estaba justificado, descubriste y no ocultaste información valiosa? ¿Fue innecesaria la tortura de los datos? Al final, eres el único que decide sobre estas reflexiones.
ttnphns
2
Es fácil destruir propiedades fundamentales mediante una normalización inapropiada. Por ejemplo, si sus datos suman 1 en cada fila, la normalización de cada columna destruirá esta propiedad. En tales datos, debe considerar, por ejemplo, medidas de divergencia (distancias para distribuciones) en su lugar. Al contar datos, establecer medidas de intersección como Jaccard puede ser más informativo; pero necesitan vectores binarios. etc.
HA SALIDO - Anony-Mousse