15 Factores

15.1 Introducción

En R, los factores se usan para trabajar con variables categóricas, es decir, variables que tienen un conjunto fijo y conocido de valores posibles. También son útiles cuando quieres mostrar vectores de caracteres en un orden no alfabético.

Históricamente, los factores eran más sencillos de trabajar que los caracteres. Como resultado, muchas de las funciones de R base automáticamente convierten los caracteres a factores. Esto significa que, a menudo, los factores aparecen en lugares donde no son realmente útiles. Afortunadamente, no tienes que preocuparte de eso en el tidyverse y puedes concentrarte en situaciones en las que los factores son genuinamente útiles.

15.1.1 Prerrequisitos

Para trabajar con factores, vamos a usar el paquete forcats, que provee herramientas para lidiar con variables categóricas (¡y es un anagrama de factores!). Este paquete ofrece un amplio rango de ayudas para trabajar con factores. forcats no es parte de los paquetes centrales de tidyverse, así que necesitamos cargarlo de forma explícita.

15.1.2 Aprendiendo más

Si quieres aprender más sobre los factores, te recomendamos leer el artículo de Amelia McNamara y Nicholas Horton, Wrangling categorical data in R (el nombre significa Domando Datos Categóricos en R). Este artículo cuenta parte de la historia discutida en stringsAsFactors: An unauthorized biography (del inglés cadenasComoFactores: Una Biografía No Autorizada) y stringsAsFactors = <sigh> (del inglés cadenasComoFactores = <suspiro>), y compara las propuestas tidy para los datos categóricos demostrados en este libro, contra los métodos de R base. Una versión temprana de este artículo ayudó a motivar y definir el alcance del paquete forcats; ¡Gracias Amelia y Nick!

15.2 Creando factores

Imagina que tienes una variable que registra meses:

Usar una cadena de caracteres (o string, en inglés) para guardar esta variable tiene dos problemas:

  1. Solo hay doce meses posibles y no hay nada que te resguarde de errores de tipeo:
  1. No se ordena de una forma útil:

Puedes solucionar ambos problemas con un factor. Para crearlo debes empezar definiendo una lista de los niveles válidos:

Ahora puedes crear un factor:

Y cualquier valor no fijado en el conjunto, será convertido a NA de forma silenciosa:

Si quieres una advertencia, puedes usar readr::parse_factor() (del inglés segmentar un factor):

Si omites los niveles, se van a definir a partir de los datos en orden alfabético:

A veces es preferible que el orden de los niveles se corresponda con su primera aparición en los datos. Puedes hacer esto cuando creas el factor, al definir los niveles con unique(x) (del inglés único), o después del hecho, con fct_inorder() (del inglés factores en orden):

Si alguna vez necesitas acceso directo al conjunto de niveles válidos, puedes hacerlo con levels() (del inglés niveles):

15.3 Encuesta Social General

Por el resto del capítulo, nos vamos a concentrar en datos::encuesta. Esta es la versión traducida al español de un conjunto de datos de ejemplo de la General Social Survey; esta es una encuesta realizada en Estados Unidos desde hace mucho tiempo, conducida por la organización de investigación independiente llamada NORC, en la Universidad de Chicago. La encuesta tiene miles de preguntas, así que en el conjunto de datos hemos seleccionado aquellas que ilustran algunos de los desafíos comunes que encontrarás al trabajar con factores.

(Recuerda que como este conjunto de datos está provisto por un paquete, puedes obtener más información de las variables con ?encuesta.)

Cuando los factores están almacenados en un tibble no puedes ver sus niveles tan fácilmente. Una forma de verlos es con count() (del inglés contar):

O con un gráfico de barras:

Por defecto, ggplot2 retira los niveles que no tienen valores. Puedes forzarlos para que se visualicen con:

Estos niveles representan valores válidos que simplemente no ocurren en este conjunto de datos. Desafortunadamente, dplyr no tiene una opción de drop (del inglés descartar, eliminar), pero la tendrá en el futuro.

Cuando se trabaja con factores, las dos operaciones más comunes son cambiar el orden de los niveles y cambiar los valores de los niveles. Estas operaciones se describen en las siguientes secciones.

15.3.1 Ejercicios

  1. Explora la distribución de ingreso. ¿Qué hace que el gráfico de barras por defecto sea tan difícil de comprender? ¿Cómo podrías mejorarlo?

  2. ¿Cuál es la religion más común en esta encuesta? ¿Cuál es el partido más común?

  3. ¿A qué religion se aplica cada denominacion? ¿Cómo puedes descubrirlo con una tabla? ¿Cómo lo puedes descubrir con una visualización?

15.4 Modificar el orden de los factores

A menudo resulta útil cambiar el orden de los niveles de factores en una visualización. Por ejemplo, imagina que quieres explorar el número promedio de horas consumidas mirando televisión por día, para cada religión:

Este gráfico resulta dificil de interpretar porque no hay un patrón general. Podemos mejorarlo al ordenar los niveles de religion usando fct_reorder() (del inglés, reordenar factores). fct_reorder() requiere tres argumentos:

  • f, el factor cuyos niveles quieres modificar.
  • x, un vector numérico que quieres usar para reordenar los niveles.
  • Opcionalmente, fun, una función que se usa si hay múltiples valores de x para cada valor de f. El valor por defecto es median (mediana).

Reordenar la columna religión (religion) hace que sea más sencillo ver que las personas en la categoría “No sabe” ven más televisión, mientras que “Hinduismo” y “Otra religión oriental” ven mucho menos.

Cuando haces transformaciones más complicadas, recomendamos que las remuevas de aes() hacia un paso de transformación separado usando mutate(). Por ejemplo, puedes reescribir el gráfico anterior de la siguiente forma:

¿Qué sucede si creamos un gráfico para observar cómo varía la edad promedio para cada ingreso reportado?

En ete caso, ¡reordenar los niveles arbitrariamente no es una buena idea! Eso es porque ingreso ya tiene un orden basado en un principio determinado, con el cual no deberíamos meternos. Reserva fct_reorder() para factores cuyos niveles están ordenados arbitrariamente.

Sin embargo, sí tiene sentido mover “No Aplica” al frente, junto a los otros niveles especiales. Puedes usar fct_relevel() (del inglés cambiar niveles). Esta función recibe como argumento un factor, f, y luego cualquier número de niveles que quieras mover al principio de la línea.

¿Por qué crees que la edad promedio para “No aplica” es tan alta?

Otro tipo de reordenamiento es útil cuando estás coloreando las líneas de un gráfico. fct_reorder2() reordena el factor mediante los valores y asociados con los valores x más grandes. Esto hace que el gráfico sea más sencillo de leer, porque los colores de líneas se ajustan con la leyenda.

Finalmente, para los gráficos de barra puedes usar fct_infreq() (del inglés, frecuencia incremental de factores) para ordenar los niveles incrementalmente según su frecuencia: este es el ordenamiento más sencillo porque no requiere de variables adicionales. Puedes querer combinarlo con fct_rev() (del inglés, invertir factores).

15.4.1 Ejercicios

  1. Hay algunos números sospechosamente grandes en horas_tv. ¿Es la media un buen resumen?

  2. Identifica para cada factor en encuesta si el orden de los niveles es arbitrario o responde a algún principio.

  3. ¿Por qué mover “No aplica” al inicio de los niveles lo llevó al final del gráfico?

15.5 Modificar los niveles de los factores

Más poderoso que cambiar el orden de los niveles es cambiar sus valores. Esto te permite clarificar etiquetas para publicación y colapsar niveles para visualizaciones de alto nivel. La herramienta más general y más poderosa es fct_recode() (del inglés, recodificar factores). Esta función te permite recodificar o cambiar el valor de cada nivel. Por ejemplo, toma la columna encuesta$partido:

Los niveles son concisos e inconsistentes. Hay que correjirlos un poco para que sean más largos, y poder usar una construcción paralela.

fct_recode() no modificará los niveles que no han sido mencionados explícitamente y te advertirá si accidentalmente te refieres a un nivel que no existe.

Para combinar grupos, puedes asignar múltiples niveles viejos al mismo nivel nuevo:

Debes usar esta técnica con cuidado: si agrupas categorías que son realmente diferentes, obtendrás resultados confusos y/o engañosos.

Si quieres colapsar muchos niveles, fct_collapse() (del inglés, colapsar factores) es una variante muy útil de fct_recode(). Para cada nueva variable, puedes proveer un vector de niveles viejos:

A veces, simplemente quieres agrupar todos los grupos pequeños para simplificar un gráfico o tabla. Ese es un trabajo para fct_lump() (del inglés, agrupar factores):

El comportamiento por defecto es agrupar los grupos pequeños de forma progresiva, asegurando que la agregación continúa siendo el grupo más pequeño. En este caso, esto no resulta demasiado útil: es cierto que la mayoría de los estadounidenses en esta encuesta son protestantes, pero probablemente hemos colapsado en exceso.

En cambio, podemos usar el parámetro n para especificar cuántos grupos (excluyendo otros) queremos colapsar:

15.5.1 Ejercicios

  1. ¿Cómo han cambiado en el tiempo las proporciones de personas que se identifican como demócratas, republicanas e independientes?

  2. ¿Cómo podrías colapsar ingreso en un grupo más pequeño de categorías?