Objetivo

En las siguientes lineas trabajaremos las claves y aspectos principales para en analisis exploratorio de datos.

Introduccion

La exploracion es un proceso fundamental del analisis de datos, que se sustenta principalmente en estos 3 aspectos:

Nuestro objetivo durante este proceso de exploracion es desarrollar un entendimiento de nuestros datos.Remarcar que estamos hablando de un proceso creativa que se basa en la calidad y cantidad de preguntas que seamos capaces de gestionar.

Variacion

Por definicion, una variacion es es la tendencia de los valores de una variable a cambiar de medida a medida.

Cada variable y su patron de variacion que nos puede revelar informacion interesante.

Por lo tanto, la mejor manera de entender estos patrones es a traves de la visualizacion.

Como visualizamos la distribucion de una variable dependera en si la variable es categorica o continua.

Una variable es categorica si solo puede gestionar one o un pequeño conjunto de dato. En R, generalmente las variables categoricas se guardan como factores o caracteres. Lo mas recomendable es utilizar un grafico de barras.

Una variable es continua si puede gestionar un infinito conjunto de datos. En este caso la mejor es utilizar un histograma.

library(tidyverse)

Si estamos interesados en visualizar varios histograma a la vez, podemos utilizar la función geom_freqpoly().En vez de utilizar barras, emplea lineas lo que facilita su interpretacion. binwidth se utiliza para definir la anchura.

ggplot(data = diamonds, mapping = aes(x = carat, color = cut)) +
  geom_freqpoly(binwidth = 0.1)

Los valores centrales de nuestro dataset o tambien conocidos como valores tipicos son los valores comunes del mismo con los que trabajaremos de manera general. Con estos valores nos centraremos en buscar relaciones entre variables.

Outliers son observaciones que no son comunes. Puntos de datos que no siguen un patron definido. Algunas veces los outliers se crear debido a una mala imporacion de los datos. Cuando dispones de mucha informacion es complicado ver los ouliers en el histograma.

ggplot(data = diamonds) +
  geom_histogram(mapping = aes(x = y), binwidth = 0.5)

Con la funcion coord_cartesian() podemos hacer zoom sobre los datos para encontrar los outliers de manera mas detallada.

ggplot(data = diamonds) +
  geom_histogram(mapping = aes(x = y), binwidth = 0.5) +
  coord_cartesian(ylim = c(0,50))

En este ejemplo podemos ver que tenemos 3 valores poco comunes: 0, 30 y 60.

unusual <- diamonds %>% 
  filter(y < 3 | y > 20) %>%
  arrange(y)

Es buena practica repetir los analisis con y sin outliers. Si tienen un minimo efecto en los resultados, y no conseguimos saber porque estan ahi, es logico reemplazarlos por missing values. Sin embargo, si tienen algun efecto sustancial no deberiamos dejarlos de lado sin justificacion.

Missing Values

Si hemos identificado valores poco comunes en nuestro dataset, tenemos dos opciones para tratar con ello:

** Eliminarlos de nuestro dataset **, como por ejemplo hacemos el dataset de los diamantes.

diamonds2 <- diamonds %>% 
  filter(between(y,3,20))

O por otro lado, reemplazar los valores como poco comunes (outliers) por missing values. Lo más sencillo es utilizar la funcion mutate() para reemplazar la variable con una copia modificada.

diamonds2 <- diamonds %>% 
  mutate(y = ifelse(y < 3 | y > 20, NA, y))

En este sentido, tanto R como GGplot2 apoyan la idea de que los valores faltantes no deberían desaparecer sin una justificacion.

Covariacion

Si la variacion describe el comportamiento dentro de una variable, la covariacion describe el comportamiento entre variables.

La covariacion es la tendencia para los valores de 2 o mas variables para “transformar/variar” de una manera relacionada.

La mejor forma de conocer la covariacion de variables a traves de la visualizacion.

La exploracion de una variable categorica y continua es bastante comun.

Una alternativa bastante comun para trabajar con estas variables es la visualizacion a traves de un boxplot.

A la hora de plotear un boxplot, tenemos que entender estos aspectos:

- Es una caja que se "estira" desde el percentil 25 de la distribucion hasta el 75, una distancia conocida como el intercuartil.
- En el medio de la caja hay una lina que muestra la mediana, 50 percentil de la distribucion.
- Estas tres lineas nos dan un sentido de division de la distribucion. 
- Los puntos que sobresalen a la caja son los denominados "outliers".
- Por ultimo, hay una linea que se extiende desde cada extremo del cuadro y va al punto no externo mas lejano en la distribucion.

Por ejemplo,

ggplot(data = diamonds, mapping = aes(x = cut, y = price)) + 
  geom_boxplot()

Muchas variables categoricas no tienen un orden intrinseco, por lo que de cara a mejorar la visualizacion podemos reordenarlas.

ggplot(data = mpg) + 
  geom_boxplot(
    mapping = aes(
      x = reorder(class, hwy, FUN = median),
      y = hwy
    )
  )

Para visualizar la covariacion entre variables categoricas, hay que contar el numero de observaciones para cada combinacion. Una geom que nos puede ayudar con ello es geom_count.

ggplot(data = diamonds) + 
  geom_count(mapping = aes(x = cut, y = color))

Otra opcion, computar todo ello con count y visualizarlo con geom_tile().

diamonds %>% 
  count(color, cut) %>%
  ggplot(mapping = aes(x = color, y = cut)) +
  geom_tile(mapping = aes(fill = n))

Si las variables categoricas estan desordenadas, podemos utilizar el paquete seriation para que de manera simultanea reordene las filas y columnas para encontrar patrones. Para graficos mas amplios, se puede emplear d3heatmap o heatmaply.

Una manera util de visualizar la covariacion entre dos variables continuas es utilizar la funcion geom_point().

ggplot(data = diamonds) + 
  geom_point (mapping = aes(x = carat, y = price))

Cuanto mas grande es el dataset menos util son los scatterplot, por lo tanto como hemos hecho en anteriores plots podemos jugar con la caracteristica de transparecia.

ggplot(data = diamonds) + 
  geom_point(
    mapping = aes(x = carat, y = price),
    alpha = 1/100)

Otras funciones que son interesantes son geom_bin2d() y geom_hex().

ggplot(data = diamonds) + 
  geom_bin2d(mapping = aes(x = carat, y = price))

Otra opcion es segmentar una variable continua como si fuera una variable categorica, y aplicar tecnicas de visualizacion anteriores, como el boxplot. Algunos aspectos interesantes son el uso de cut_width(), divide x entre diferentes anchuras.Si queremos que el grafico sea propocional al numero de punto en cada bin, podemos utilizar varwith = TRUE.

ggplot(data = diamonds,mapping = aes(x = carat, y = price)) + 
  geom_boxplot(mapping = aes(group = cut_number(carat,20)))

Patrones y modelos

Los patrones en nuestros datos nos dan pistas sobre la relacion de las variables.Podemos algunas preguntas muy interesantes como estas:

Por ejemplo en este grafico podemos ver la relacion de longitud de explosion de un volcan y el tiempo de espera.

ggplot(data = faithful) + 
  geom_point(mapping = aes(x = eruptions, y = waiting))

La covariacion a diferencia de la variacion, es un fenomeno que reduce la incertidumbre.Si dos variables “covarian”, podemos utilizar el valor de una variable para realizar mejor predicciones sobre los valores de la segunda.

Por otro lado, en un caso especial donde la covariacion sea casual, podemos utilizar la variable para controlar la segunda. Para todo ello utilizamos los modelos, para extraer patrones.

Este es un ejemplo interesante:

En base al dataset de diamantes, es complicado entender la relacion entre el corte y el precio, porque el corte y los quilates, y los quilates y el precio están estrechamente relacionados. Podemos utilizar un modelo para eliminar la fuerte relacion entre precio y los quilates para poder ver mas alla.

Este modelo nos sirve para predecir el precio en base a los quilates y luego tener como resultado la difernecia entre el actual y lo que hemos predecido.

library(modelr)

mod <- lm(log(price) ~ log(carat), data = diamonds)

diamonds2 <- diamonds %>% 
  add_residuals(mod) %>%
  mutate(resid = exp(resid))

diamonds2
## # A tibble: 53,940 x 11
##    carat cut       color clarity depth table price     x     y     z resid
##    <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl> <dbl>
##  1 0.23  Ideal     E     SI2      61.5    55   326  3.95  3.98  2.43 0.820
##  2 0.21  Premium   E     SI1      59.8    61   326  3.89  3.84  2.31 0.955
##  3 0.23  Good      E     VS1      56.9    65   327  4.05  4.07  2.31 0.822
##  4 0.290 Premium   I     VS2      62.4    58   334  4.2   4.23  2.63 0.569
##  5 0.31  Good      J     SI2      63.3    58   335  4.34  4.35  2.75 0.511
##  6 0.24  Very Good J     VVS2     62.8    57   336  3.94  3.96  2.48 0.787
##  7 0.24  Very Good I     VVS1     62.3    57   336  3.95  3.98  2.47 0.787
##  8 0.26  Very Good H     SI1      61.9    55   337  4.07  4.11  2.53 0.690
##  9 0.22  Fair      E     VS2      65.1    61   337  3.87  3.78  2.49 0.913
## 10 0.23  Very Good H     VS1      59.4    61   338  4     4.05  2.39 0.850
## # ... with 53,930 more rows
ggplot(data = diamonds2) +
  geom_point(mapping = aes(x = carat, y = resid))

Una vez hemos eliminado esa relacion entre quilates y precio, podemos valorar la relacion entre precio y corte.

ggplot(data = diamonds2) + 
  geom_boxplot(mapping = aes(x = cut, y = resid))