# Gráficos de Cleveland en versión ggplot2

## Introducción

En este material se presentan ejemplos de las funciones ofrecidas por el paquete `ggcleveland`, todas ellas destinadas al Análisis Exploratorio de Datos.

    # Paquetes necesarios y otras configuraciones
    library(ggcleveland)
    library(ggplot2)
    library(dplyr)
    theme_set(theme_bw() + theme(panel.spacing = unit(0, "lines")))

## Gráficos de cuantiles

El dataset `futbol` contiene datos sobre la distancia (`dist`) que recorre la pelota al ser pateada por jugadores de fútbol según la longitud de pierna (`long`) del pateador, que se encuentra categorizada. El objetivo es determinar si la distancia está relacionada con la longitud de pierna. Se podría esperar que los jugadores de piernas más largas tengan una contextura física mayor y por lo tanto mayor potencia al patear.

La función `gg_quantiles()` produce gráficos QQ (cuantil-cuantil) para comparar la distribución de una variable cuantitativa en dos o más grupos:

    data(futbol)

    # Quedarse con solo dos grupos
    futbol2 <-
      futbol %>%
      filter(longp %in% c("< 0.81 m", "0.81 a 0.90 m"))

    # Gráfico de cuantiles para dos grupos
    gg_quantiles(futbol2, dist, longp)

    # Más de dos grupos
    gg_quantiles(futbol, dist, longp, size = 0.4, color = "red", shape = 3) +
        labs(title = "Gráficos QQ de a pares", x = "Distancia (m)", y = "Distancia (m)")

También permite graficar los cuantiles de cada grupo vs cuantiles calculados con todos los grupos combinados. Esto puede ser útil para estudiar residuos luego de algún ajuste, con el objetivo de evaluar la homogeneidad de los mismos. En el siguiente ejemplo, se realiza un ajuste por la media (como en un modelo lineal) y se comparar los residuos de cada grupo versus todos los residuos juntos:

    futbol <-
      futbol %>%
      group_by(longp) %>%
      mutate(ajuste = mean(dist), res = dist - ajuste)

    gg_quantiles(futbol, res, longp, combined = TRUE)

## El gráfico Media-Diferencia de Tukey.

Las funciones `gg_tmd()` y `gg_tmd_paired()` producen el gráfico de medias-diferencias de Tukey (Tukey’s Mean-Difference Plot), que puede ser utilizado para evaluar visualmente el desplazamiento entre 2 o más distribuciones:

    # Dos grupos
    gg_tmd(futbol2, dist, longp)

    # Múltiples grupos
    gg_tmd(futbol, dist, longp, size = 0.5)

Cuando se tienen dos muestras apareadas, se debe utilizar la función `gg_tmd_paired()`, que requiere la misma cantidad de observaciones en cada grupo y que las variables estén medidas en la misma escala, como ocurre con el dataset `ozone`, el cual presenta la concentración de ozono en dos ciudades distintas durante los mismos días:

    data(ozone)
    gg_tmd_paired(ozone, stamford, yonkers)

## Gráfico de residuos y valores ajustados

La función `gg_rf()` produce un residual-fit plot (gráfico de residuos y valores ajustados), que permite comparar la dispersión de los residuos de un ajuste y de los valores ajustados, dando una idea de la variabilidad total explicada por el ajuste del modelo:

    gg_rf(futbol, dist, ajuste, res, ylabel = "Distancia (m)")

    # Agregando las observaciones centradas por la media general
    gg_rf(futbol, dist, ajuste, res, cen_obs = TRUE, ylabel = "Distancia (m)")

## Gráfico de dispersión-posición (spread-location plot)

La función `gg_sl()` produce un spread-location plot, una herramienta que busca detectar cambios en dispersión, reduciéndolo a un problema de observación de la posición.

    gg_sl(futbol2, dist, longp, xlabel = "Mediana de distancia jittered (m)",
          jitterwidth = 1.5) +
      xlim(45, 68)

## Gráficos de transformaciones de potencia

La función `gg_pt()` produce gráficos QQ Normal para evaluar transformaciones de potencia, que consisten en elevar a las observaciones a un conjunto de potencias señaladas en el argumento `tau`, en el cual el valor 0 indica la transformación logarítmica:

    gg_pt(futbol2, dist, taus = c(-1, -0.5, 0, 0.5), nrow = 1)

    # Para cada grupo por separado
    gg_pt(futbol2, dist, longp, taus = c(-1, -0.5, 0, 0.5))

## Gráficos condicionantes

La función `gg_coplot()` produce conditioning plots o coplots, los cuales son una herramienta de visualización útil para estudiar cómo una variable respuesta depende de 2 o más factores. Un coplot permite visualizar dependencia condicional. El panel superior indica cada rango de valores de la variable condicionante a los cuales queda condicionada la relación que se observa entre las otras dos variables en los paneles inferiores, que pueden considerarse como los paneles dependientes.

Se ejemplifica con los datos `rubber`, que tratan sobre un experimento industrial donde se probó el efecto de un material abrasivo sobre 30 piezas de caucho, registrando tres variables.

    data(rubber)
    # Slicing con intervalos solapados
    gg_coplot(rubber, x = tensile.strength, y = abrasion.loss, faceting = hardness,
      number_bins = 6, overlap = 3/4,
      ylabel = "Pérdida de abrasión (g/hp-hour))",
      xlabel = "Resistencia a la tracción (kg/cm2)",
      facet_label = "Dureza (grados Shore)",
      loess_family = "symmetric", size = 2)

    # Slicing con intervalos sin solapamientos, con igual amplitud
    gg_coplot(rubber, x = tensile.strength, y = abrasion.loss, faceting = hardness,
      number_bins = 6, overlap = 0,
      ylabel = "Pérdida de abrasión (g/hp-hour))",
      xlabel = "Resistencia a la tracción (kg/cm2)",
      facet_label = "Dureza (grados Shore)",
      loess = FALSE, size = 2)

    # Slicing con intervalos sin solapamientos, con aprox. igual cantidad de datos
    gg_coplot(rubber, x = tensile.strength, y = abrasion.loss, faceting = hardness,
      number_bins = 6, overlap = 0, equal_length = F,
      ylabel = "Pérdida de abrasión (g/hp-hour))",
      xlabel = "Resistencia a la tracción (kg/cm2)",
      facet_label = "Dureza (grados Shore)",
      loess = FALSE, size = 2)

En el caso de que la variable condicionante tenga pocos valores distintos, cada uno de ellos puede utilizarse como un panel condicionante para explorar la relación entre las otras dos variables, como ocurre con el dataset `galaxy`:

    data(galaxy)

    # Slicing con los valores únicos de la variable de faceting
    gg_coplot(galaxy, x = posicion.radial, y = velocidad,
      faceting = angulo, number_bins = 7, loess_span = .5, loess_degree = 2,
      facet_labeller = function(x) paste0("Ángulo = ", x, "º"),
      facet_label = "Ángulo (grado)", facets_nrow = 2, intervals_height = 0.2,
      xlabel = "Posición radial (arcsec)", ylabel = "Velocidad (km/s)")

Para armar los intervalos solapados se emplea el algoritmo de conteos iguales, el cual puede ser implementado por fuera de la construcción del gráfico mediante la función `equal_count()`.