#Análisis Exploratorio de Datos library(tidyverse) ## #Visualización de la distribución de los cortes de diamante. #Cuando la variable es categórica (nominal,ordinal), solo tiene un valor dentro de un conjunto pequeño. #Se puede contar cuánto tiene de cada uno. ggplot(data = diamonds) + geom_bar(mapping = aes(x = cut)) #lo mismo se puede realizar manualmente diamonds %>% count(cut) ## #Cuando la variable es continua puede convenir un histograma para ver la distribución de los datos. ggplot(data = diamonds) + geom_histogram(mapping = aes(x = carat), binwidth = 0.5) #combinando count() con cut_width() se llega a lo mismo diamonds %>% count(cut_width(carat, .5)) ## #Se queda con los diamantes con carat menores a 3 smaller <- diamonds %>% filter(carat <3) #smaller <- diamonds %>% filter(carat <.85 & carat >0.95) #Vemos a esos diamantes con mayor detalle. ggplot(data = smaller, mapping = aes(x = carat)) + geom_histogram(binwidth = 0.01) #probar con binwidth = 0.01 carat. ¿Por qué hay tantos diamantes de 0.9 carat? ## #Para realizar múltiples histogramas en el mismo plot ggplot(data = smaller, mapping = aes(x = carat, color = cut)) + geom_freqpoly(binwidth = 0.01) + scale_color_brewer(palette = "Set1") ## Outliers #¿Por qué se dibuja así la gráfica? ¿Por qué quedó contra la izquierda? ggplot(diamonds) + geom_histogram(mapping = aes(x = y), binwidth = 0.5) #Para limitar el máximo del eje vertical e intentar ver los outliers se puede hacer: ggplot(diamonds) + geom_histogram(mapping = aes(x = y), binwidth = 0.5) + coord_cartesian(ylim = c(0, 50)) ## Eliminamos los outliers. #Observamos los outliers: y<3 e y>20; arrange ordena los datos por y. unusual <- diamonds %>% filter(y < 3 | y > 20) %>% arrange(y) unusual #los outliers 0 son error, extrañamente los diamantes grandes no son diamantes caros #Eliminamos los outliers: y<3 e y>20; diamonds2 <- diamonds %>% filter(!(y < 3 | y > 20)) %>% arrange(y) #Hace lo mismo diamonds2 <- diamonds %>% filter(between(y, 3, 20)) #No hace lo mismo: no elimina los outliers sino que sustituye los outliers por NA. #La información eliminada podría ser útil. diamonds2 <- diamonds %>% mutate(y = ifelse(y < 3 | y > 20, NA, y)) #Histograma sin outliers ggplot(diamonds2) + geom_histogram(mapping = aes(x = y), binwidth = 0.05) #+coord_cartesian(ylim = c(0, 50)) ## ¿Que hacemos con estos outliers? #O los eliminamos ... diamonds2 <- diamonds %>% filter(between(y, 3, 20)) #O borramos sólo los datos problemáticos pero dejamos el resto de la observación ... diamonds2 <- diamonds %>% mutate(y = ifelse(y < 3 | y > 20, NA, y)) #analizar ifelse ## #ggplot2 avisa cuando se eliman observaciones por falta de datos ggplot(data = diamonds2, mapping = aes(x = x, y = y)) + geom_point() #> Warning: Removed 9 rows containing missing values (geom_point). #Esos Warning pueden no aparecer. ggplot(data = diamonds2, mapping = aes(x = x, y = y)) + geom_point(na.rm = TRUE) #media con los outliers mean(diamonds$y) #media sin los outliers pero con NA mean(diamonds2$y) #media sin los outliers y sin considerar los NA mean(diamonds2$y,na.rm=TRUE) ## #Los outliers pueden existir en las combinaciones de dos variables (combinaciones poco probables) ggplot(data = diamonds2) + geom_point(mapping = aes(x = x, y = y)) + coord_cartesian(xlim = c(4, 11), ylim = c(4, 11)) ## Covariación: relación entre variable categórica y contínua #Difícil comparar las distribuciones porque hay mucho de ideal y poco de Fair ggplot(data = diamonds, mapping = aes(x = price)) + geom_freqpoly(mapping = aes(color = cut), binwidth = 500) #histograma por cada cut. #Para ver la cantidad de cada uno. ggplot(diamonds) + geom_bar(mapping = aes(x = cut)) #y = ..density.. hace que el área bajo la curva mida uno ggplot(data = diamonds,mapping = aes(x = price, y = ..density..)) + geom_freqpoly(mapping = aes(color = cut), binwidth = 500) ## Utilizar boxplot para interpretar la distribución por categoría. #cut es una variable categórica ordinal (con orden intrínseco) ggplot(data = diamonds, mapping = aes(x = cut, y = price)) + geom_boxplot() #aquí class es una variable categórica nominal (sin orden intrínseco) ggplot(data = mpg, mapping = aes(x = class, y = hwy)) + geom_boxplot() ## #Aquí se reordena class en función de la mediana de las hwy por cada class ggplot(data = mpg) + geom_boxplot(mapping = aes(x = reorder(class, hwy, FUN = median),y = hwy)) #Se intercambian los ejes x e y, en este caso para que los nombres largos queden mejor ggplot(data = mpg) + geom_boxplot(mapping = aes(x = reorder(class, hwy, FUN = median),y = hwy)) + coord_flip() ## Covariación: relación entre 2 variables categóricas #Se puede utilizar geom_count() ggplot(data = diamonds) + geom_count(mapping = aes(x = color, y = cut)) #También se puede utilizar count. No "gráfico". diamonds %>% count(color, cut) -> colorcut #Otra posibilidad es geom_tile() diamonds %>% count(color, cut) %>% ggplot(mapping = aes(x = color, y = cut)) + geom_tile(mapping = aes(fill = n)) ## Covariación: relación entre 2 variables continuas #Si se utiliza geom_point y hay muchos puntos, se pierde noción de la densidad ggplot(data = diamonds) + geom_point(mapping = aes(x = carat, y = price)) #Se puede utilizar en transparencia, pero igual puede haber el mismo problema con la densidad. #Además no hay una escala al costado, asociada a la tonalidad. ggplot(data = diamonds) + geom_point(mapping = aes(x = carat, y = price), alpha = 1/100) ## #geom_bin2d permite manejar mejor la densidad, y ponerle una escala de colores ggplot(data = smaller) + geom_bin2d(mapping = aes(x = carat, y = price)) #geom_hex es similar a geom_density2d, pero con embaldosado hexagonal. install.packages("hexbin") ggplot(data = smaller) + geom_hex(mapping = aes(x = carat, y = price)) #geom_boxplot también puede utilizarse, dividiendo una de ellas en secciones o grupos ggplot(data = smaller, mapping = aes(x = carat, y = price)) + geom_boxplot(mapping = aes(group = cut_width(carat, 0.1))) #geom_boxplot pero manteniendo la misma cantidad de observaciones por boxplot() ggplot(data = smaller, mapping = aes(x = carat, y = price)) + geom_boxplot(mapping = aes(group = cut_number(carat, 20))) ## #272 erupciones y tiempo de espera a la próxima erupción del geyser Faithful en Yellowstone. head(faithful) #Se perciben 2 cluster de datos. ggplot(data = faithful, mapping = aes(x = eruptions)) + geom_histogram(binwidth = 0.25) #Se perciben 2 clusters en la correlación entre las 2 variables ggplot(data = faithful) + geom_point(mapping = aes(x = eruptions, y = waiting)) #Primero se calcula el modelo lineal entre log(price) y log(carat) library(modelr) mod <- lm(log(price) ~ log(carat), data = smaller) #hacer ?lm para entender un poco más #hacer > mod para ver la información contenida #Luego se agrega el residuo a smaller (diamantes con carat <3) smaller <- smaller %>% add_residuals(mod) %>% #ver ?add_residuals mutate(resid = exp(resid)); #ver mutate mod$coefficients[1] #intercept mod$coefficients[2] #log(carat) #Dibujamos la curva que aproxima a la distribución de carat y precio. xx <- seq(0.1,2.5,0.1) yy <- exp(mod$coefficients[1] + mod$coefficients[2]*log(xx)) #calculo xx e yy para dibujar la linea de la regresi?n lineal ggplot() + geom_point(data=smaller,mapping = aes(y=price,x=carat), alpha=0.01) + geom_line(mapping = aes(y=yy,x=xx), color= "red", size=1.2)# + #curva de regresión lineal # geom_smooth(data=smaller , mapping = aes(y=price,x=carat)); #curva de geom_smooth() #Aquí visualizamos la relación entre cut y el precio una vez que la relación con carat ha sido eliminada ggplot(data = smaller) + geom_boxplot(mapping = aes(x = cut, y = resid))