Clase práctica Semana 11

Autor/a

Santiago Sotelo y Nadia Duffó

Material para el ejercicio

Descarga la carpeta .zip para acceder al material de esta sesión. Haga click en el siguiente enlace. No olvides unzipear el archivo.

Gráficar en R

Usaremos el paquete ggplot 2 para generar distintos tipos de gráficos: - Gráfico de barras - Histograma - Boxplot

Primero, preparamos todos los insumos que necesitaremos y ya conocemos (carga de paquetes, importación de data y tabulación de resultados)

Cargar paquetes

pacman::p_load(rio, dplyr, ggplot2)

Importación de data

df <- import("data/filmaffinity_dataset_limpio.xlsx")

Exploración de data

str(df)
'data.frame':   119003 obs. of  9 variables:
 $ index     : num  0 1 2 3 4 5 6 7 8 9 ...
 $ Título    : chr  "'49-'17" "10,000 Years B.C. (C)" "1812" "20.000 leguas de viaje submarino (C)" ...
 $ Año       : num  1917 1916 1912 1907 1909 ...
 $ País      : chr  "Estados Unidos" "Estados Unidos" "Rusia" "Francia" ...
 $ Dirección : chr  "Ruth Ann Baldwin" "Willis H. O'Brien" "Vasili Goncharov, Kai Hansen, Aleksandr Uralsky" "Georges Méliès" ...
 $ Reparto   : chr  "Joseph W. Girard, Leo Pierson, William Dyer, Mattie Witting, George C. Pearce, Jean Hersholt, Donna Drew" NA "Pavel Knorr, Vasili Goncharov, Aleksandra Goncharova, Andrej Gromov, V. Serjozhinikov, A. Veskov" "Georges Méliès" ...
 $ Nota      : num  NA 5.1 NA 6 5.3 NA 5.4 NA 4.6 NA ...
 $ Tipo filme: chr  "Película" "Cortometraje" "Película" "Cortometraje" ...
 $ Género    : chr  "Western" "Comedia" "Drama" "Fantástico" ...

Gráfico de barras

¿Qué variable podemos representar con un gráfico de barras?

Antes de graficar, vamos a crear una tabla de frecuencias y porcentajes usando count y mutate, como ya hemos aprendido. Esta tabla se usará como base para construir los gráficos con el paquete {ggplot2}.

Este paquete funciona por capas: cada capa agrega elementos o configuraciones al gráfico. Empezaremos con una estructura básica para generar gráficos de barras, uniendo las capas con el símbolo +.

tab_bars <- df %>%
  count(`Tipo filme`) %>% 
  mutate(pct = n / sum(n) * 100)

ggplot(tab_bars, aes(x = `Tipo filme`, y = pct)) +
  geom_col()
1
En la función ggplot existe el argumento data donde ingresamos nuestro objeto tab_bars. Los elementos que deseamos graficar van en la función aes.
2
Indicamos el tipo de gráfico con geom_col().

Probemos añadir más capas para personalizar el gráfico y hacerlo más visualmente claro y llamativo

ggplot(tab_bars, aes(x = `Tipo filme`, y = pct)) +
  geom_col(fill = "steelblue") +
  labs(title = "Gráfico 1: Tipo de filme (%)",
       x = "Tipo de filme",
       y = "Porcentaje") +
  theme_minimal()
1
Dentro de la función ggplot, ingresamos en el argumento data nuestro objeto tab_bars. Los elementos que deseamos graficar van en la función aes.
2
Indicamos el tipo de gráfico con geom_col(). Agregamos el argumento fill para indicar el color que rellenará las barras.
3
Con labs (abreviatura de labels), indicamos etiquetas para el título y ejes x e y.
4
theme_minimal nos da una visualización más limpia quitando el fondo gris.

La versatilidad de {ggplot2} nos permite personalizar distintas combinaciones.

ggplot(tab_bars, aes(x = `Tipo filme`, y = pct, fill = `Tipo filme`)) +
  geom_col() +
  labs(title = "Gráfico 1: Tipo de filme (%)",
       x = "Tipo de filme",
       y = "Porcentaje") +
  coord_flip() +
  theme_minimal() +
  scale_fill_brewer(palette = "Set3")
1
Dentro de la función ggplot, ingresamos en el argumento data nuestro objeto tab_bars. Los elementos que deseamos graficar van en la función aes.
2
Indicamos el tipo de gráfico con geom_col().
3
Con labs (abreviatura de labels), indicamos etiquetas para el título y ejes x e y.
4
coord_flip gira los ejes para darnos barras horizontales.
5
theme_minimal nos da una visualización más limpia quitando el fondo gris.
6
En scale_fill_brewer indicamos una paleta de colores para usar.

También podemos cruzar variables.

df2 <- df %>% 
  mutate(Nota_cat =
           case_when(Nota < 5 ~ "Menos de 5",
                     Nota >= 5 ~ "5 a más",
                     is.na(Nota) ~ "Sin nota"),
         Nota_cat =
           factor(Nota_cat, 
                  levels = c("Sin nota", "5 a más", "Menos de 5"),
                  ordered = TRUE))

tab_bars2 <- df2 %>%
  group_by(`Tipo filme`) %>%
  count(Nota_cat) %>% 
  mutate(pct = round(n / sum(n) * 100, 0))

ggplot(tab_bars2, aes(x = `Tipo filme`, y = pct, fill = Nota_cat)) +
  geom_col() +
  labs(title = "Gráfico 1: Tipo de filme (%)",
       x = "Tipo de filme",
       y = "Porcentaje") +
  geom_text(aes(label = pct), position = position_stack(vjust = 0.5)) +
  theme_minimal() +
  scale_fill_brewer(palette = "Set3")
1
Creamos una variable categórica a partir de Nota con mutate y case_when.
2
Volvemos nuestra variable Nota_cat un factor ordenado para ordenar las categorías.
3
Creamos nuestra tabla y añadimos la función group_by para calcular las frecuencias de Nota_cat dentro de cada tipo de filme.
4
Dentro de la función ggplot, ingresamos en el argumento data nuestro objeto tab_bars2. Los elementos que deseamos graficar van en la función aes. Añadimos en aes el argumento fill para colorear individualmente cada categoría de Nota_cat.
5
Indicamos el tipo de gráfico con geom_col().
6
Con labs (abreviatura de labels), indicamos etiquetas para el título y ejes x e y.
7
geom_text sirve para colocar las etiquetas de los valores.
8
theme_minimal nos da una visualización más limpia quitando el fondo gris.
9
En scale_fill_brewer indicamos una paleta de colores para usar.

Histograma

¿Qué variable podemos representar con un histograma?

ggplot(df, aes(x = Año)) +
  geom_histogram(fill = "steelblue") +
  labs(title = "Gráfico 2: Año de estreño de filmes",
       x = "Año",
       y = "Frecuencia") +
  theme_minimal()
1
Dentro de la función ggplot, ingresamos en el argumento data nuestro objeto df y los elementos que deseamos graficar en la función aes (solamente usamos el argumento x en este caso).
2
Indicamos el tipo de gráfico con geom_histogram(). Agregamos el argumento fill para indicar el color que rellenará las barras.
3
Con labs (abreviatura de labels), indicamos etiquetas para el título y ejes x e y.
4
theme_minimal nos da una visualización más limpia quitando el fondo gris.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Una capa que nos permite cruzar la información para una visualización desagregada es facet_wrap.

ggplot(df, aes(x = Año)) +
  geom_histogram(fill = "steelblue") +
  facet_wrap(~ `Tipo filme`, scales = "free") +
  labs(title = "Gráfico 2: Año de estreño de filmes",
       x = "Año",
       y = "Cantidad") +
  theme_minimal()
1
Dentro de la función ggplot, ingresamos en el argumento data nuestro objeto df y los elementos que deseamos graficar en la función aes (solamente usamos el argumento x en este caso).
2
Indicamos el tipo de gráfico con geom_histogram(). Agregamos el argumento fill para indicar el color que rellenará las barras.
3
Esta función divide en facetas por grupo. Colocamos la variable de grupos después del símbolo ~.
4
Con labs (abreviatura de labels), indicamos etiquetas para el título y ejes x e y.
5
theme_minimal nos da una visualización más limpia quitando el fondo gris.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Box Plot

¿Qué variable podemos representar con un box plot?

ggplot(df, aes(y = Nota, x = `Tipo filme`, fill = `Tipo filme`)) +
  geom_boxplot(show.legend = F) +
  scale_fill_brewer(palette = "Set3")
1
Dentro de la función ggplot, ingresamos en el argumento data nuestro objeto df. Los elementos que deseamos graficar van en la función aes.
2
Indicamos el tipo de gráfico con geom_boxplot(). Ocultamos la leyenda con F en el argumento show.legend.
3
En scale_fill_brewer indicamos una paleta de colores para usar.

Exportación de gráficos

Finalmente, para exportar gráficos, se puede utilizar la siguiente función también en {ggplot2}:

plot <- ggplot(df, aes(y = Nota, x = `Tipo filme`)) +
  geom_boxplot()

ggsave("outputs/boxplot.png", plot)
1
Asignamos el gráfico al objeto plot.
2
Exportamos el plot.
Saving 7 x 5 in image

Ejercicio final

Responde las siguientes preguntas a partir de gráficos generados con {ggplot2}:

  1. ¿Cómo ha evolucionado la producción de filmes franceses a lo largo del tiempo? ¿Existen diferncias según tipo de filme? Representa visualmente la información y comenta la tendencia observada.
  2. ¿Cómo ha evolucionado la producción de filmes peruanos a lo largo del tiempo? ¿Existen diferncias según tipo de filme? Representa visualmente la información y comenta la tendencia observada.