23 Oct 2018
Variables cíclicas
Lectura: 6 mins.
|
Dificultad:

¿Qué son las variables cíclicas y cómo tratarlas?

Seguramente todos aquellos quienes hayan participado en un proyecto de data mining o hayan tratado de encontrar patrones y comportamientos en un set de datos en algún momento de su vida, se hayan topado con variables cíclicas. No es nada raro encontrarse con una variable de estas en una colección de datos y, aunque esto no se suele dar en los cursos o másteres, es muy importante detectarlas y saber cómo tratar con ellas.

¿Qué son las variables cíclicas?

El mes, las horas, la dirección del viento o las coordenadas cartesianas geográficas son solo algunos ejemplos de variables cíclicas. ¿Qué  es lo que tienen todas en común? Eso es: todas, al crecer, vuelven de nuevo a un punto de origen.

¿Por qué tengo que saber esto?

Porque si no se tratan de una forma adecuada, estaríamos trabajando con datos que no son fieles a la realidad y, por tanto, estaríamos trabajando con basura.

Por ejemplo, el mes de diciembre (12) está tan cerca de enero (1) como lo está de noviembre (11) y esto es un problema, porque los números no están reflejando la realidad. En consecuencia, si metemos está variable así tal cual a un modelo de machine learning, el algoritmo no tiene forma de saber que diciembre y enero van juntos, y esto puede afectar a los resultados.

Planteamiento de ejemplo práctico

Vamos a demostrarlo con un ejemplo muy sencillo. Primero, aplicaré un algoritmo de aprendizaje automático no supervisado a unos datos con una variable cíclica no tratada y luego haré lo mismo con la variable tratada debidamente. Veremos los resultados de ambos experimentos y podremos compararlos.

Nota:
Para quienes no sepáis de qué va el aprendizaje no supervisado o de clusterización, no os preocupéis. Para seguir este artículo, solo tenéis que entender que es una especie de varita mágica que agrupa datos según lo parecidos que son entre sí. Pero si queréis profundizar más en el tema recomiendo este post.

Vamos a partir con una tabla de datos bastante sencilla, de dos dimensiones. Contiene una línea por cada mes del año y las horas de luz de media por día en la zona Norte de España.

Día del mesHoras de luz
19.5
210.5
312
413.5
514.5
615.5
715
814
912.5
1011
1110
129

 

Para resolver el ejercicio se va a usar el lenguaje de programación R, muy utilizado en este ámbito.

Prueba A: Clustering sin tratar variable cíclica

Voy a pedirle al algoritmo de clusterización kmeans que me divida el año en dos, teniendo en cuenta la información de la tabla. Lo que podemos esperar del resultado es que nos divida el año en meses de días largos y en meses de días cortos. ¡Vamos a ver qué pasa!

Clustering sin tratar variable cíclica

Código:

x

result <- kmeans(scale(x), centers=2)

x$cluster <- result$cluster

x

Clustering sin tratar variable cíclica

El algoritmo ha metido en el mismo saco los meses desde enero a agosto. Y ha dejado septiembre, octubre, noviembre y diciembre para el segundo grupo. A pesar de que enero y diciembre solo se diferencian por media hora de diferencia de horas de luz, los ha asignado a diferentes grupos (o clusters). ¿Porque ocurre esto? ¡Exacto! El algoritmo cree que enero y diciembre están muy alejados entre sí, porque no sabe que se trata de una variable cíclica.

Código:

library('ggplot2')

ggplot(x, aes(x=mes, y=h_luz, col=cluster)) + geom_point(size=5) + scale_y_continuous(limits = c(0, 20))

Solución al problema

Enseguida veremos qué pasa cuando tratamos las variables cíclicas como debe ser. Pero primero, vamos a aprender cómo se hace esto. Y sintiéndolo mucho, vamos a tener que repasar un poco de teoría de trigonometría.

Recordad que el problema que tenemos es que los meses 1-12 no representan la realidad, porque el 1 y el 12 deben de tener una diferencia de 1 y no de 11.

Bien, lo que tenemos ahora es una línea de números enteros del 1 al 12, que podemos representar así:

línea de números enteros

¿Cómo hacemos para qué el 1 y el 12 estén contiguos? ¡Pues haciendo una circunferencia!

Círculo de números enteros

¡Listo! ¡Ya lo tenemos!

Ahora solo tenemos que meter esta misma información, ligeramente transformada, a nuestra tabla de datos y para esto hacemos uso de la trigonometría.

Cada punto de la circunferencia está definido por un seno y un coseno. Tiene sentido que sean dos variables las que necesitemos, ya que hemos pasado de tener la información en una dimensión (una línea) a tenerla en dos dimensiones (un plano). Entonces, también tiene sentido que si cambiamos la columna “mes” de nuestra tabla por las columnas “mes_sen” y “mes_cos”, estaremos obteniendo una nueva tabla con una información equivalente, excepto por los meses enero y diciembre, que ahora sí que reflejan contigüidad.

Trigonometría y variables cíclicas

 

Lo primero que hay que hallar es el ángulo α, que sin entrar en detalles de cómo se calcula, diré que corresponde a esta fórmula:

Fórmula

Y entonces solo queda calcular el seno y coseno de cada α de cada mes.

Seno y coseno de cada mes

Código:

x_prep <- x

alfa <- (x_prep['mes']-1)*2*pi/12

x_prep['mes_sin'] = sin(alfa)

x_prep['mes_cos'] = cos(alfa)

x_prep

Prueba B: Clustering tratando la variable cíclica

Bien, pues ya tenemos todo preparado para volver a aplicar el algoritmo kmeans, pero esta vez con la variable “mes” tratada como se merece. ¡Vamos a ello!

Clustering tratando la variable cíclica

Código:

result_prep <- kmeans(scale(x_prep), centers=2)

result_data_prep <- x

result_data_prep$cluster <- result_prep$cluster

Result_data_prep

Clustering tratando la variable cíclica

Código:

library('ggplot2')

ggplot(result_data_prep, aes(x=mes, y=h_luz, col=cluster)) + geom_point(size=5) + scale_y_continuous(limits = c(0, 20))

¡Ahora sí! Parece que ha hecho mejor trabajo dividiendo el año en meses de días cortos y meses de días largos. Esta vez no ha tenido reparo en meter diciembre y enero en el mismo saco, ya que el algoritmo sí sabía que son meses contiguos.

¿Echarías gasolina a una bicicleta?

Al igual que no utilizas igual cualquier medio de transporte (no echamos gasolina a las bicicletas), tampoco debemos tratar de la misma manera todas las variables. La próxima vez que vayas a tratar con datos, visualízalos y pregúntate si realmente representan la realidad. Si tú fueras un algoritmo, ¿los interpretarías de forma diferente?