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_blue
y 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).
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) = 1
cuando 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"?
count_red
,count_blue
ycount_green
y los datos son conteos. ¿Derecho? ¿Cuáles son las filas entonces - artículos? ¿Y vas a agrupar los artículos?Respuestas:
@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
).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.
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.
fuente
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:
Considere emparejar
c0
yc1
calcular la estadística Chi-cuadrado para su2x3
tabla 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
c0
conc1
vsc0
conc2
. Luego calcule la (raíz de) la distancia Phi-cuadrado :Phi-sq = Chi-sq/N
dondeN
está el recuento total combinado en las dos filas (clientes) actualmente consideradas. Por lo tanto, se normaliza la distancia wrt a los recuentos generales.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 p
tabla de frecuencias (p
es el número de columnas en los datos). Si alguna columna (s) en la2 x p
tabla 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.fuente