class: center, middle, titular background-size: contain <img src="img/see.png" width="250px"/> # Sección 7: Análisis Exploratorio de Datos ## **PROGRAMA INTERNACIONAL DE ESTADÍSTICA APLICADA A LA INVESTIGACIÓN CIENTÍFICA** #### MÓDULO: SOFTWARES PARA EL MANEJO DE DATOS <br> <br> Linda Cabrera Orellana #### Marzo, 2023 --- class: middle, center, inverse
# Análisis exploratorio de datos --- background-image: url("img/artista.jpeg") background-size: cover --- #
Análisis exploratorio de datos El análisis exploratorio es un enfoque en el que se "deja hablar a los datos" para que ellos nos den las pistas necesarias para construir modelos o incluso desarrollar supuestos o conclusiones. Conocer los datos "como a la palma de tu mano", este es el primer beneficio del EDA ( _Exploratory Data Analysis_ ), algo útil seas científico, analista comercial, de marketing, ingeniero o cualquier puesto donde analizar datos sea fundamental. El EDA permite entender los datos examinando las variables y sus interacciones antes de aplicar las técnicas estadísticas, debido a que nos permite encontrar errores en el conjunto de datos. Se realiza mediante **estadísticos descriptivos** y principalmente **gráficos**. Suele ser un proceso iterativo: - se plantea una pregunta - se grafica o se crea una tabla para responder - se obtiene una idea o una nueva pregunta del paso anterior - Proporciona pistas o intuición --- #
Histograma de frecuencias .pull-left[ Para explorar variables numéricas continuas o discretas podemos utilizar los histogramas de frecuencias con `geom_histogram()`. El histograma clasifica al conjunto de datos numéricos en intervalos o contenedores ( _bins_ ) y realiza un conteo de las observaciones presentes en cada uno de esos contenedores. Son muy útiles porque permiten: - Visualizar la variabilidad - Identificar valores atípicos - Evaluar el ajuste de una función de distribución de probabilidad - Analizar la simetría de los datos **Valores atípicos:** ( _outlier_ en inglés ) observación que es numéricamente distante del resto de los datos. ] .pull-right[ <img src="img/histograma1.png" width="600px"/> ] --- #
Histograma de frecuencias .pull-left[ ```r profesores %>% ggplot(aes(x = edad)) + # agregamos la capa de geometría geom_histogram(binwidth = 8, color = "black", fill = "chartreuse4", alpha = 0.5) + # agregamos capa de escalas scale_x_continuous(breaks = seq(20, 70, 8)) + scale_y_continuous(breaks = seq(0, 65, 10)) + # agregamos capa de temas labs(x = "Edad de Profesores", y = "Frecuencia", title = "Edad de Profesores Encuestados", subtitle = "Histograma de frecuencias") + theme(text = element_text(colour = "grey45", size = 10), plot.title = element_text(face = "bold", size = 14, colour = "grey30"), plot.background = element_rect(fill = "grey92"), panel.grid.minor = element_blank()) ``` ] .pull-right[ <!-- --> ] --- #
Gráfico de barras .pull-left[ El gráfico de barras es una forma de resumir un conjunto de datos por categorías de una **variable cualitativa** y su frecuencia de aparición en una muestra. En estos gráficos, el ancho de la barra debe ser uniforme para todas las barras del diagrama, la longitud de la barra debe ser proporcional a la cantidad que representa y las barras pueden disponerse vertical u horizontalmente. **Paletas de colores manual:** Podemos crear paletas de colores de forma manual en un vector y usarlas en los gráficos de `ggplot2` con `scale_fill_manual()`. En el siguiente [link](https://r-charts.com/es/paletas-colores/#discretas) encontrará varias paletas de colores. **Temas:** Adicionalmente a los temas que vienen por default en `ggplot2`, existen otros paquetes que podemos usar para establecer temas a nuestros gráficos. En el siguiente [link](https://r-charts.com/ggplot2/themes/) encontrará paquetes sobre temas que trabajan con `ggplot2`. ] .pull-right[ <img src="img/barras.png" width="600px"/> ] --- #
Gráfico de barras .pull-left[ ```r ## creamos paleta de colores manual paleta_simpson <- c("#FED439", "#709AE1", "#FD7446", "#D5E4A2", "#197EC0", "#46732E", "#71D0F5", "#370335", "#075149", "#C80813","#1A9993", "#FD8CC1", "#8A9197") ## paquete para nuevos temas library(ggthemes) ## gráfico de barras profesores %>% ggplot(aes(x = asistente, fill = asistente)) + geom_bar() + scale_fill_manual(values = paleta_simpson) + labs(x = "Sexo", y = "Frecuencia", title = "Cantidad de Profesores que piensan que es mejor contar con un asistente en clase a tiempo completo", subtitle = "Gráfico de Barras", fill = "Prefieren asistente en clases: ") + theme_pander() + theme(legend.position = "bottom", axis.text.x = element_blank()) ``` ] .pull-right[ <!-- --> ] --- #
Gráfico de columnas .pull-left[ En R el gráfico de columnas es muy parecido al gráfico de barras en su forma. El gráfico de barras `geom_bar` contabiliza el número de casos u observaciones de una variable categórica, y el gráfico de columnas `geom_col` también puede usarse para lo mismo, con la ventaja de que facilita la inclusión de etiquetas al gráfico con la geometría `geom_text()`. Además, el `geom_col()` también puede representar la suma de valores de una variable cuantitativa, respecto a variable categórica. Primero, si deseamos representar el número de observaciones, previamente con las funciones `group_by()` y `summarise()` se realiza un cuadro resumen de las categorías con sus frecuencias para añadir las etiquetas de las columnas. A diferencia de `geom_bar()`, `geom_col()` necesita que se definan 2 variables en su capa de estética, donde `\(x\)` será la variable categórica y `\(y\)` será la columna de frecuencia calculada previamente en el cuadro resumen. ] .pull-right[ **Más etiquetas:** Existen otras formas que nos ayudan a agregar etiquetas a nuestros gráficos, como por ejemplo la geometría `geom_label()` o el paquete `ggrepel`. En el siguiente [link](https://ggrepel.slowkow.com/articles/examples.html) encontrará más información y ejemplos acerca del paquete `ggrepel`. <img src="img/ggrepel.jpg" width="500px"/> ] --- #
Gráfico de columnas .pull-left[ ```r ## cuadro resumen de frecuencias de categorías g_barras <- profesores %>% group_by(asistente) %>% summarise(frecuencia = n()) ## gráfico de columnas con geom_col() g_barras %>% ggplot(aes(x = asistente, y = frecuencia, fill = asistente)) + geom_col() + scale_fill_manual(values = paleta_simpson) + labs(x = "Sexo", y = "Frecuencia", title = "Cantidad de Profesores que piensan que es mejor contar con un asistente en clase a tiempo completo", subtitle = "Gráfico de Columnas", fill = "Prefieren asistente en clases: ") + theme_pander() + theme(legend.position = "bottom", axis.text.x = element_blank()) ``` ] .pull-right[ <!-- --> ] --- #
Gráfico de columnas y Gráfico de texto .pull-left[ ```r ## agregamos la capa de geom_text() g_barras %>% ggplot(aes(x = asistente, y = frecuencia, fill = asistente)) + geom_col() + geom_text(aes(label = frecuencia, y = frecuencia), nudge_y = 2, size = 4, color = "grey50") + scale_fill_manual(values = paleta_simpson) + labs(x = "Sexo", y = "Frecuencia", title = "Cantidad de Profesores que piensan que es mejor contar con un asistente en clase a tiempo completo", subtitle = "Gráfico de Columnas", fill = "Prefieren asistente en clases: ") + theme_pander() + theme(legend.position = "bottom", axis.text.x = element_blank()) ``` ] .pull-right[ <!-- --> ] --- #
Gráfico de columnas .pull-left[ ```r ## cuadro resumen g_columnas <- profesores %>% group_by(asistente) %>% summarise(total = sum(alumnos_NEE)) ## gráfico de columnas g_columnas %>% ggplot(aes(x = asistente, y = total, fill = asistente)) + geom_col() + geom_text(aes(label = total, y = total), nudge_y = 2, size = 4, color = "grey50") + scale_fill_manual(values = paleta_simpson) + labs(x = "Sexo", y = "Frecuencia", title = "Total de alumnos con NEE según los profesores que piensan que es mejor contar con un asistente en clase a tiempo completo", subtitle = "Gráfico de Columnas", fill = "Prefieren asistente en clases: ") + theme_pander() + theme(legend.position = "bottom", axis.text.x = element_blank()) ``` ] .pull-right[ <!-- --> ] --- background-image: url("img/frecuencias.png") background-size: cover --- #
Gráfico de dispersión .pull-left[ El gráfico de dispersión se usa para identificar la intensidad de la _relación entre dos variables numéricas_. El eje `\(x\)` representa la variable independiente, mientras que el eje `\(y\)` representa la variable dependiente. En R lo generamos con `geom_point()`. Si no existe una variable dependiente, cualquier variable se puede representar en cada eje y el diagrama de dispersión mostrará el **grado de correlación (no causalidad)** entre las dos variables. Un diagrama de dispersión puede sugerir varios tipos de **correlaciones** entre las variables con un intervalo de confianza determinado (Ver siguiente página). Con `geom_smooth()` se puede dibujar una línea de ajuste (llamada también "línea de tendencia") con el fin de estudiar la correlación entre las variables. ] .pull-right[ <img src="img/dispersion.png" width="600px"/> ] --- background-image: url("img/correlacion.png") background-size: cover --- #
Gráfico de dispersión Para poder elaborar un gráfico de dispersión con más detalles, agregaremos una nueva columna al conjunto de datos `profesores` que será el salario, para esto utilizaremos las funciones `mutate()` y `case_when()`. `case_when()` permite definir una variable, de forma tal que tome un valor particular para cada condición establecida. En caso de no cumplir con ninguna de las condiciones establecidas, la variable tomará valor `NA`. La sintaxis de la función es: .pull-left[ ```r # Valores no especificados por default NA case_when(condicion_logica1 ~ valor asignado1, condicion_logica2 ~ valor asignado2) ``` ] .pull-right[ ```r # Se pueden especificar condiciones restantes case_when(condicion_logica1 ~ valor asignado1, condicion_logica2 ~ valor asignado2, TRUE ~ valor asignado3) ``` ] Entonces, agregamos la nueva columna: ```r profesores <- profesores %>% mutate(salario = case_when(nivel == "BASICO" ~ round(400+(tiempo*35)+(alumnos*0.01)), nivel == "INTERMEDIO" ~ round(600+(tiempo*30)+(alumnos*0.01)), nivel == "SUPERIOR" ~ round(1676+(tiempo*80)))) ``` --- #
Gráfico de dispersión .pull-left[ ```r # visualizar a los profesores que más ganan por nivel mas_ganan <- profesores %>% group_by(nivel) %>% filter(row_number(desc(salario))==1) ## gráfico de dispersión profesores %>% ggplot(aes(x = edad, y = tiempo, size = salario, color = sexo)) + geom_point(alpha = 0.5) + geom_text(data = mas_ganan, aes(label = paste("Codigo: ", cod, "- Salario: $", salario)), size = 3, nudge_x = -3, color = "black") + geom_point(data = mas_ganan, shape = 21, color = "black", stroke = 1.2) + scale_size( #modifica la escala de la variable salario breaks = floor(seq(500, 4500, length.out = 5)), #los límites del 500 al 4500, lo divide en 5 grupos limits = c(200, 4700), #los límites de los valores range = c(2, 10)) + #radio de los puntos scale_color_manual(values = paleta_simpson) + labs(x = "Edad del Profesor", y = "Tiempo de Docencia", title = "Edad vs Tiempo de docencia de los Profesores", subtitle = "Gráfico de Dispersión", color = "Sexo del Profesor", size = "Salario del Profesor") + theme_pander() + theme(legend.position = "bottom", legend.box = "vertical") ``` ] .pull-right[ <!-- --> ] --- #
Gráfico de cajas .pull-left[ El gráfico de cajas permite conocer cómo se distribuyen los datos dentro de una variable. En R lo obtenemos con un `geom_boxplot()` y la información que se representa en el diagrama de cajas es la siguiente: - **Mediana.** Punto medio de los valores ordenados de menor a mayor o de mayor a menor representando el 50% de los datos. - **Cuartiles.** Dividen al conjunto de observaciones en 4 partes iguales. El `\(Q_1\)` representa el 25% de las observaciones y el `\(Q_3\)` representa el 75% de las observaciones. - **Rango Intercuartílico (RIC).** Es la diferencia entre el tercer y el primer cuartil. - **Límites Superior o Inferior ($L_s$ o `\(L_i\)`).** `\(L_s\)` contiene los casos por encima de `\(Q_3\)` sin incluir valores atípicos o `\(L_i\)` por debajo de `\(Q_1\)` también sin incluir valores atípicos. ] .pull-right[ <img src="img/boxplot.png" width="600px"/> ] --- #
Gráfico de cajas .pull-left[ ```r profesores %>% ggplot(aes(x = nivel, y = salario, fill = nivel)) + geom_boxplot() + stat_summary(fun = mean, shape = 18, size = 1, color = "chartreuse4") + geom_jitter(alpha = 0.3) + scale_fill_manual(values = paleta_simpson) + labs(x = "Nivel en que imparte docencia", y = "Salario del profesor", title = "Salario de Profesores por el nivel en el que imparte docencia", subtitle = "Gráfico de Cajas y Gráfico de Fluctuación") + theme_pander() + theme(legend.position = "none") ``` ] .pull-right[ <!-- --> ] --- #
Otros Gráficos .pull-left[ Para visualizar una variable numérica y una categórica podemos utilizar un `geom_histogram()`, agregamos la estética `aes(fill = variable_categórica)` y el argumento `position = "identity"`. ```r # agregamos aes(fill = ...) y position = "identity" profesores %>% ggplot(aes(x = salario)) + geom_histogram(bins = 10, color = "black", aes(fill = nivel), position = "identity", alpha = 0.4) + scale_fill_manual(values = paleta_simpson) + labs(x = "Salario de Profesores", y = "Frecuencia", title = "Distribución del Salario de Profesores encuestados", subtitle = "Por nivel de docencia") + theme_pander() ``` ] .pull-right[ <!-- --> ] --- #
Otros Gráficos .pull-left[ Otra forma de visualizar es arreglar las barras una alado de otra, para esto solo modificamos la posición a `position = "dodge"`. ```r ## modificamos la posición a position = "dodge" profesores %>% ggplot(aes(x = salario)) + geom_histogram(bins = 10, color = "black", aes(fill = nivel), position = "dodge", alpha = 0.4) + scale_fill_manual(values = paleta_simpson) + labs(x = "Salario de Profesores", y = "Frecuencia", title = "Distribución del Salario de Profesores encuestados", subtitle = "Por nivel de docencia") + theme_pander() ``` ] .pull-right[ <!-- --> ] --- #
Otros Gráficos .pull-left[ También podemos separar las categorías con `facet_wrap()`, esto las separará por columnas. Aquí no es necesario especificar una posición en la geometría del histograma. ```r ## separamos las categorías con facet_wrap() profesores %>% ggplot(aes(x = salario, fill = nivel)) + geom_histogram(bins = 10, color = "black", alpha = 0.4) + facet_wrap( ~ nivel) + scale_fill_manual(values = paleta_simpson) + labs(x = "Salario de Profesores", y = "Frecuencia", title = "Distribución del Salario de Profesores encuestados", subtitle = "Por nivel de docencia") + theme_pander() ``` ] .pull-right[ <!-- --> ] --- #
Otros Gráficos .pull-left[ Si queremos el arreglo de las categorías por filas utilizamos `facet_grid()`. ```r ## separamos las categorías con facet_grid() profesores %>% ggplot(aes(x = salario, fill = nivel)) + geom_histogram(bins = 10, color = "black", alpha = 0.4) + facet_grid(nivel ~ .) + scale_fill_manual(values = paleta_simpson) + labs(x = "Salario de Profesores", y = "Frecuencia", title = "Distribución del Salario de Profesores encuestados", subtitle = "Por nivel de docencia") + theme_pander() ``` ] .pull-right[ <!-- --> ] --- #
Otros Gráficos .pull-left[ Para obtener una composición total del gráfico en porcentaje podemos usar `position = "fill"` y `scale_y_continuous()` para modificar las etiquetas de la escala del eje `\(y\)`. ```r library(scales) profesores %>% ggplot(aes(x = salario, fill = nivel)) + geom_histogram(bins = 10, color = "black", alpha = 0.4, position = "fill") + scale_y_continuous(labels = percent_format()) + scale_fill_manual(values = paleta_simpson) + labs(x = "Salario de Profesores", y = "Frecuencia", title = "Distribución del Salario de Profesores encuestados", subtitle = "Por nivel de docencia") + theme_pander() ``` ] .pull-right[ <!-- --> ] --- #
Otros Gráficos .pull-left[ `geom_density()`, `geoom_vline()` y `geom_text()` en un solo gráfico: ```r profesores %>% ggplot(aes(x = salario, fill = nivel)) + geom_density(alpha = 0.5) + geom_vline(data = salarios_medios, aes(xintercept = media, color = nivel), linetype = "dashed", linewidth = 1) + geom_text(data = salarios_medios, aes(x = media-100, label = paste("MEDIA: $", round(media, 2)), y = 0.0017, angle = 90)) + scale_fill_manual(values = paleta_simpson) + scale_color_manual(values = paleta_simpson) + labs(x = "Salario de Profesores", y = "Densidad", title = "Distribución del Salario de Profesores encuestados", subtitle = "Por nivel de docencia") + theme_pander() ``` ] .pull-right[ <!-- --> ] --- background-image: url("https://media1.popsugar-assets.com/files/thumbor/XGbRY5FyWX99jE-AVcO0vx7A008/fit-in/1024x1024/filters:format_auto-!!-:strip_icc-!!-/2017/04/26/922/n/1922283/a08d3bf8b558b4c9_giphy_4_/i/When-Your-BFF-Tells-You-First-Name-Guy-She-Going-Date-You-Spring-CIA-Mode.gif") background-size: cover --- class: middle, center, inverse <br> <br> # Análisis Exploratorio de Datos ### Linda Cabrera Orellana .pull-left[ .center[ ### [@socecuest
](https://www.facebook.com/socecuest) ### [@see_estadistica
](https://www.instagram.com/see_estadistica/) ]] .pull-right[ .center[ ### [@see_estadistica
](https://twitter.com/see_estadistica) ### [@sosecuest
](https://t.me/sosecuest) ]]