library(tidyverse) # incluye ggplot2
library(readxl) # funciones para importar xlsx
library(janitor) # funciones de limpieza
library(patchwork) #combinar gráficos de ggplot
library(ggExtra)
library(ggthemes) # nuevas temas para los plots
library(plotly) #gráficos interactivos # remotes::install_github("plotly/plotly")
library(tibble)
library(skimr) # reseumen numerico
library(modeest)
library(ggrepel) # añadir etiquetas a los gráficos
library(RColorBrewer) #paletas de colores
library(plotly) #graficos interactivos
library(corrplot)
library(ggridges)
Curso: VIZ de datos con ggplot y Rmarkdown
Introducción al paquete ggplot2 - Histogramas
1 Requisitos
1.1 Crear proyecto
Para seguir este curso debe descargar el documento curso_VIZ-DI.zip que se encuentra en el Repositorio Ridda2. Al descargar el documento, coloque el archivo en cualquier ubicación de su computador y descomprimalo. Dentro del documento aparecerá un archivo llamado curso_VIZ-DI.Rproj con un icono con un cubo celeste y una R (ver imagen), haga doble click sobre el. Se abrirá el Rstudio con la configuración del proyecto a utilizar. esta es la carpeta con los códigos y datos iniciales el curso.
En la carpeta code del proyecto creado, hay un archivo con el nombre cargar-librerias.R, puede ejecutar el código que se muestra en la figura paar instalar los paquetes que nececita para el curso.
1.2 Cargar librerias
Librerias necesarias para el curso. Se deben haber instalado los paquetes previamente con install.packages(nombre del paquete).
1.3 Carga de datos
Para cargar los datos debe crear un nuevo archivo script de R y empezar a utilizar lo ssiguientes códigos.
Se utilizará una versión de los datos palmerpinguins, recopilados y puestos a disposición por la Dra. Kristen Gorman y la Estación Palmer, Antártida LTER , miembro de Long Term Ecological Research Network.
<- read.csv("data/data_penguins.csv")
datos_pinguinos head(datos_pinguinos,5)
X SPECIES ISLAND. bill.lenght bill.depth flipper.lenght MALE FEMALE
1 1 Adelie Torgersen 39.1 18.7 181 3750 NA
2 2 Adelie Torgersen 39.5 17.4 186 NA 3800
3 3 Adelie Torgersen 40.3 18.0 195 NA 3250
4 4 Adelie Torgersen 36.7 19.3 193 NA 3450
5 5 Adelie Torgersen 39.3 20.6 190 3650 NA
2 Objetivo del curso
Hacer uso efectivo de la reglas, principios y recomendaciones en la visualización de datos al generar gráficos con la herramienta Rstudio utilizando lenguaje R y el paquete ggplot2 para crear visualización de datos e informes reproducibles y automatizados con Rmarkdown.
3 EDA
En el año de 1971 el matematico Jhon W. Turkey creo una filosofía o enfoque para el análisis de datos que empleaba técnicas (principalmenet visuales) para maximizar el conocimiento de un conjunto de datos, extraer variables importantes, detectar valores atípicos, desarrollar modelos, detectar patrones, entre otros, a este conjunto de técnicas le llamo E.D.A.(Exploratory data analysis). De manera simplificada el EDA ayuda a determinar las mejores formas de manipular la fuente de datos dada para obtener la respuesta que se necesita garantizando que los resultados sean válidos y aplicables, para ello se apolla de diversos tipos de análisis, donde cada análisis utiliza diveras representaciones gráficas para mostrar los datos de manera visual.
El EDA se vale de diferentes tipos de análisis exploratorios y estas utilizan las representaciones gráficas para mostra de manera visual los datos. Las representaciones graficas pueden darse según el tipo de análisis exploratorio (univariado, bivariado, multivariado), según el tipo de variable o según objetivo del estudio.
Las técnicas gráficas típicas utilizadas en EDA son:
- Histograma
- Diagrama de caja
- Gráficos de barras
- Diagrama de puntos
- Diagrama de tallo y hojas
- Gráficos multivariables
- Mapas de calor
- otros
4 Visualización de datos
La visualización de datos es la técnica utilizada para brindar información sobre los datos utilizando señales visuales como gráficos, tablas, mapas y muchos otros. Esto es útil ya que ayuda a comprender fácilmente y de forma intuitiva grandes cantidades de datos y, por lo tanto, a tomar mejores decisiones al respecto.
La visualización de datos tiene dos propósitos principales:
- Análisis de datos exploratorios e identificación de problemas de datos.
- Comunicar conocimientos y resultados
Las herramientas populares de visualización de datos disponibles son Tableau, Plotly, R, Phyton, Google Charts, DataWraper, Flourish , entre otros. Las distintas plataformas de visualización de datos tienen diferentes capacidades, funcionalidades , sin embargo una de las mayores diferencias de R, es que es lenguaje diseñado para análisis de datos, estadística, visualización e investigación científica. Si bien como lenguaje de programación, su curva de aprendizaje suele resultar compleja, el componente de reprodicibilidad y flexibilidad en las funciones que contienen son una de las mayores ventajas de quienes lo utilizan..
5 Librería ggplot2
El paquete ggplot2 es una paquete inlcuido en la libreria tidyverse (librerias: ggplot2, dplyr, tidyr, readr, purr,tibble, forcats, lubridate), cuya finalidad es entender los gráficos como parte integrar del procesamiento y modelado de los datos, basándose en la idea de Leland Wilkinson, la gramática de los gráficos. Este concepto permite combinar diferentes elementos en el gráficos como si fueran capas superpuestas para vincularlas a los datos, además de mapear atrubutos estéticos como , color, forma, tamaño y la visualización de objetos geompetricos (puntos, barras, lineas). gplot es la abreviación de Grammar of Graphics plot.
Un gráfico en ggplot se compondrá de las siguientes capas:
- Datos: nuestro gráfico estará vinculado a un conjunto de datos.
- Mapeado de elementos (aesthetics): ejes, color, forma, tamaño, etc (en función de los datos)
- Elementos geométricos (geom): puntos, líneas, barras, polígonos, etc.
- Componer gráficas (facet): visualizar varias gráficas a la vez.
- Transformaciones estadísticas (stat): ordenar, resumir, agrupar, etc.
- Sistema de coordenadas (coord): coordenadas, grids, etc.
- Temas (theme): fuente, tamaño de letra, subtítulos, captions, leyenda, ejes, etc.
5.1 Operador pipe
El operador pipe que simbolicamente se puede utilizar como %>% o |> (versiones recientes) se utiliza para tomar el resultado de una expresión y pasarlo a la siguiente expresión, como si estuvieras encajando las operaciones una dentro de la otra. Para utilizar el simbolo del pipe, debemos utilizar las siguientes teclas CTRL+SHIFT+M.
Este componente es parte de los elementos utilizados en la transformación de datos o Data Wrangling y se utilizará en algunos códigos en este curso.
# Ejemplo 1
# Listar los primeros 10 obs de la tabla
head(datos_pinguinos, 10)
X SPECIES ISLAND. bill.lenght bill.depth flipper.lenght MALE FEMALE
1 1 Adelie Torgersen 39.1 18.7 181 3750 NA
2 2 Adelie Torgersen 39.5 17.4 186 NA 3800
3 3 Adelie Torgersen 40.3 18.0 195 NA 3250
4 4 Adelie Torgersen 36.7 19.3 193 NA 3450
5 5 Adelie Torgersen 39.3 20.6 190 3650 NA
6 6 Adelie Torgersen 38.9 17.8 181 NA 3625
7 7 Adelie Torgersen 39.2 19.6 195 4675 NA
8 8 Adelie Torgersen 41.1 17.6 182 NA 3200
9 9 Adelie Torgersen 38.6 21.2 191 3800 NA
10 10 Adelie Torgersen 34.6 21.1 198 4400 NA
# Utilizando pipe
# llamamos el tibble de datos
|>
datos_pinguinos head(10)
X SPECIES ISLAND. bill.lenght bill.depth flipper.lenght MALE FEMALE
1 1 Adelie Torgersen 39.1 18.7 181 3750 NA
2 2 Adelie Torgersen 39.5 17.4 186 NA 3800
3 3 Adelie Torgersen 40.3 18.0 195 NA 3250
4 4 Adelie Torgersen 36.7 19.3 193 NA 3450
5 5 Adelie Torgersen 39.3 20.6 190 3650 NA
6 6 Adelie Torgersen 38.9 17.8 181 NA 3625
7 7 Adelie Torgersen 39.2 19.6 195 4675 NA
8 8 Adelie Torgersen 41.1 17.6 182 NA 3200
9 9 Adelie Torgersen 38.6 21.2 191 3800 NA
10 10 Adelie Torgersen 34.6 21.1 198 4400 NA
# Ejemplo 2
# Resumen de lso datos
summary(datos_pinguinos)
X SPECIES ISLAND. bill.lenght
Min. : 1 Length:333 Length:333 Min. :32.10
1st Qu.: 84 Class :character Class :character 1st Qu.:39.50
Median :167 Mode :character Mode :character Median :44.50
Mean :167 Mean :43.99
3rd Qu.:250 3rd Qu.:48.60
Max. :333 Max. :59.60
bill.depth flipper.lenght MALE FEMALE
Min. :13.10 Min. :172 Min. :3250 Min. :2700
1st Qu.:15.60 1st Qu.:190 1st Qu.:3900 1st Qu.:3350
Median :17.30 Median :197 Median :4300 Median :3650
Mean :17.16 Mean :201 Mean :4546 Mean :3862
3rd Qu.:18.70 3rd Qu.:213 3rd Qu.:5312 3rd Qu.:4550
Max. :21.50 Max. :231 Max. :6300 Max. :5200
NA's :165 NA's :168
# Usando pipe
|>
datos_pinguinos summary()
X SPECIES ISLAND. bill.lenght
Min. : 1 Length:333 Length:333 Min. :32.10
1st Qu.: 84 Class :character Class :character 1st Qu.:39.50
Median :167 Mode :character Mode :character Median :44.50
Mean :167 Mean :43.99
3rd Qu.:250 3rd Qu.:48.60
Max. :333 Max. :59.60
bill.depth flipper.lenght MALE FEMALE
Min. :13.10 Min. :172 Min. :3250 Min. :2700
1st Qu.:15.60 1st Qu.:190 1st Qu.:3900 1st Qu.:3350
Median :17.30 Median :197 Median :4300 Median :3650
Mean :17.16 Mean :201 Mean :4546 Mean :3862
3rd Qu.:18.70 3rd Qu.:213 3rd Qu.:5312 3rd Qu.:4550
Max. :21.50 Max. :231 Max. :6300 Max. :5200
NA's :165 NA's :168
# Ejemplo 3
# Seleccionar las columnas 3 y 5 del tibble datospinguinos
# donde island es igual a Torgersen
# mostrar priemaras 5 filas
head(datos_pinguinos[datos_pinguinos$ISLAND.=="Torgersen",c(4,5)],5)
bill.lenght bill.depth
1 39.1 18.7
2 39.5 17.4
3 40.3 18.0
4 36.7 19.3
5 39.3 20.6
# Utilizando pipe
|>
datos_pinguinos filter(ISLAND.=="Torgersen") |>
select(bill.lenght,bill.depth) |>
head(5)
bill.lenght bill.depth
1 39.1 18.7
2 39.5 17.4
3 40.3 18.0
4 36.7 19.3
5 39.3 20.6
5.2 Estructura de ggplot
La estrutura base de ggplot es la siguiente:
5.3 Función ggplot()
Se crea un lienzo o espacio de trabajo para el gráfico.
ggplot()
5.3.1 Cargar datos
data: es el nombre del tabla en formato tibble o dataframe y se utiliza para cargar los datos, en este caso la tabla datos_pinguinos.
ggplot(data=datos_pinguinos)
5.3.2 Mapeado y estética
mapping: define el mapeo estético de señales proporcionadas por el set de datos, las variables que modifican estas señales deben estar integradas en aes() que integran las escalas, x, y, que representarán cada observación según variables, tambien en este apartado se identifican otras señales como color, size. En este ejemplo utilizaremos solo la varable SPECIES.
Se mostrará en el eje de las X los datos CATEGORICOS de la variable SPECIES.
ggplot(data = datos_pinguinos,
mapping = aes(x=SPECIES))
5.3.3 Geometría
Para poder dibujar el gráfico, ggplot necesita que añadamos una nueva capa de la geometria o tipo de gráfico a utilizar, para añadir la nueva capa debemos de colocar el signo de + al final d ela linea de mapping y luego el tipo de geometría Geometrías ggplot.
En este ejemplo utilizaremos geom_bar(): representa el tipo de geometría de barras que muestra la figura de los gráficos que interperta las señales dados por lo valores de las variables.
ggplot(data = datos_pinguinos,
mapping = aes(x=SPECIES))+
geom_bar()
5.3.4 Ejemplo de gráficos en ggplot
A manera de ejemplo mostraremos tres tipos de gráficos en ggplot con diferentes geometrías, solo con el objetivo de ver la estructura básica funcionando. Al avanzar el curso de mostrará como funciona el paquete ggplot y el funcionamiento de estas geometrias de forma más detallada.
#Ejemplo de gráfico de puntos
ggplot(data = datos_pinguinos,
mapping = aes(x=bill.lenght, y=bill.depth))+
geom_point()
# Ejemplo de gráfico de barras una variable
ggplot(data = datos_pinguinos,
mapping = aes(x=SPECIES))+
geom_bar()
# Ejemplo de gráfico de barras dos variables
ggplot(data = datos_pinguinos,
mapping = aes(x=factor(ISLAND.), y=bill.lenght))+
geom_col()
6 Datos en ggplot
Para hacer gráficos con ggplot es necesario que el conjunto de datos sea un tipo de datos estructurado como son los dataframes o los tibble.
6.1 Objeto tipo dataframe
Los data frame son datos estructurados, lo que comunmente conocemos como tablas. Su mayor características es que los datos que lo conforman pueden ser de diferentes tipos, numéricos (discretos, continuos), caracteres, lógicos, etc. Una de sus limitantes es que al cargar los datos R puede modificarr el nombre de las variables si contienen espacios en blancos o algunos carateres especiales.
# data.frame mtcars muestra todas las filas, se indica con head, mostrar solo 25
head(datos_pinguinos,25)
X SPECIES ISLAND. bill.lenght bill.depth flipper.lenght MALE FEMALE
1 1 Adelie Torgersen 39.1 18.7 181 3750 NA
2 2 Adelie Torgersen 39.5 17.4 186 NA 3800
3 3 Adelie Torgersen 40.3 18.0 195 NA 3250
4 4 Adelie Torgersen 36.7 19.3 193 NA 3450
5 5 Adelie Torgersen 39.3 20.6 190 3650 NA
6 6 Adelie Torgersen 38.9 17.8 181 NA 3625
7 7 Adelie Torgersen 39.2 19.6 195 4675 NA
8 8 Adelie Torgersen 41.1 17.6 182 NA 3200
9 9 Adelie Torgersen 38.6 21.2 191 3800 NA
10 10 Adelie Torgersen 34.6 21.1 198 4400 NA
11 11 Adelie Torgersen 36.6 17.8 185 NA 3700
12 12 Adelie Torgersen 38.7 19.0 195 NA 3450
13 13 Adelie Torgersen 42.5 20.7 197 4500 NA
14 14 Adelie Torgersen 34.4 18.4 184 NA 3325
15 15 Adelie Torgersen 46.0 21.5 194 4200 NA
16 16 Adelie Biscoe 37.8 18.3 174 NA 3400
17 17 Adelie Biscoe 37.7 18.7 180 3600 NA
18 18 Adelie Biscoe 35.9 19.2 189 NA 3800
19 19 Adelie Biscoe 38.2 18.1 185 3950 NA
20 20 Adelie Biscoe 38.8 17.2 180 3800 NA
21 21 Adelie Biscoe 35.3 18.9 187 NA 3800
22 22 Adelie Biscoe 40.6 18.6 183 3550 NA
23 23 Adelie Biscoe 40.5 17.9 187 NA 3200
24 24 Adelie Biscoe 37.9 18.6 172 NA 3150
25 25 Adelie Biscoe 40.5 18.9 180 3950 NA
# Verificar Objeto tipo data.frame
class(datos_pinguinos)
[1] "data.frame"
6.2 Objeto tipo tibble
Los tibble son un tipo de data frame para una gestión más ágil, eficiente y coherente. Las tablas en formato tibble tienen 4 ventajas principales frente a los data frame:
- Permiten imprimir por consola la tabla con mayor información de las variables, solo imprime por defecto las primeras filas (todas si son 20 o menos, 10 si son más de 20 filas). Puedes imprimir las filas y columnas que quieras con print(nombre de tibble), pero por defecto te aseguras de no saturar la consola.
- Mantiene la integridad de los datos (no cambia los tipos de las variables y hace una carga de datos inteligente, interpretando los tipos de datos y colocandolos encima de cada variable.
- Si accedes a una columna que no existe avisa con un warning.
- No solo no cambiará el tipo de datos sino que no cambiará el nombre de las variables (los data frame transforma los caracteres que no sean letras).
# transformat dataframe a tible
<- as_tibble(datos_pinguinos)
datos_pinguinos
# Verificar Objeto tipo tibble
class(datos_pinguinos)
[1] "tbl_df" "tbl" "data.frame"
# tibble imprime solo las primeras 10
# coloca el tipo de dato sencima del nombre de la variable
head(datos_pinguinos,10)
# A tibble: 10 × 8
X SPECIES ISLAND. bill.lenght bill.depth flipper.lenght MALE FEMALE
<int> <chr> <chr> <dbl> <dbl> <int> <int> <int>
1 1 Adelie Torgersen 39.1 18.7 181 3750 NA
2 2 Adelie Torgersen 39.5 17.4 186 NA 3800
3 3 Adelie Torgersen 40.3 18 195 NA 3250
4 4 Adelie Torgersen 36.7 19.3 193 NA 3450
5 5 Adelie Torgersen 39.3 20.6 190 3650 NA
6 6 Adelie Torgersen 38.9 17.8 181 NA 3625
7 7 Adelie Torgersen 39.2 19.6 195 4675 NA
8 8 Adelie Torgersen 41.1 17.6 182 NA 3200
9 9 Adelie Torgersen 38.6 21.2 191 3800 NA
10 10 Adelie Torgersen 34.6 21.1 198 4400 NA
6.3 Resumen de datos
Dos dos formas de mostrar la estructura de los datos datos_pinguinos (dataframe o tibble) con sus tipos de datos según variables es utilizando la función summary() y glipmse(), esto permite identificar anomalías en los nombre de las variables o en el tipo de variables.
# Muestra la estructura de los datos y el tipo de datos
|>
datos_pinguinos summary()
X SPECIES ISLAND. bill.lenght
Min. : 1 Length:333 Length:333 Min. :32.10
1st Qu.: 84 Class :character Class :character 1st Qu.:39.50
Median :167 Mode :character Mode :character Median :44.50
Mean :167 Mean :43.99
3rd Qu.:250 3rd Qu.:48.60
Max. :333 Max. :59.60
bill.depth flipper.lenght MALE FEMALE
Min. :13.10 Min. :172 Min. :3250 Min. :2700
1st Qu.:15.60 1st Qu.:190 1st Qu.:3900 1st Qu.:3350
Median :17.30 Median :197 Median :4300 Median :3650
Mean :17.16 Mean :201 Mean :4546 Mean :3862
3rd Qu.:18.70 3rd Qu.:213 3rd Qu.:5312 3rd Qu.:4550
Max. :21.50 Max. :231 Max. :6300 Max. :5200
NA's :165 NA's :168
# La función glimpse es otra forma de mostrar los datos
# sobre todo cuando son muchas variables
# Muestra tambien el tipo de dato por variable
# Permite mostrar la estructura de datos de forma más ordenada
|>
datos_pinguinos glimpse()
Rows: 333
Columns: 8
$ X <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, …
$ SPECIES <chr> "Adelie", "Adelie", "Adelie", "Adelie", "Adelie", "Adel…
$ ISLAND. <chr> "Torgersen", "Torgersen", "Torgersen", "Torgersen", "To…
$ bill.lenght <dbl> 39.1, 39.5, 40.3, 36.7, 39.3, 38.9, 39.2, 41.1, 38.6, 3…
$ bill.depth <dbl> 18.7, 17.4, 18.0, 19.3, 20.6, 17.8, 19.6, 17.6, 21.2, 2…
$ flipper.lenght <int> 181, 186, 195, 193, 190, 181, 195, 182, 191, 198, 185, …
$ MALE <int> 3750, NA, NA, NA, 3650, NA, 4675, NA, 3800, 4400, NA, N…
$ FEMALE <int> NA, 3800, 3250, 3450, NA, 3625, NA, 3200, NA, NA, 3700,…
6.4 Limpieza de nombre de variables
Si bien la limpieza de los datos es un elemento importante al visualizar datos, no es un tema que veremos en este curso, sin embargo podemos evaluar si el nombre de las variables no están normalizados, que tengan espacios en blanco, ya que R los carga con um punto (.), además de que algunas están en mayúscula y otra en minuscula. Por otro lado podemso eliminar las columnas irrelavntes como la columna X en el tibble, que no representa ningún datos de interés en la tabla.
# Nombre de las variables
|>
datos_pinguinos names()
[1] "X" "SPECIES" "ISLAND." "bill.lenght"
[5] "bill.depth" "flipper.lenght" "MALE" "FEMALE"
# limpieza y normalización de nombres de las variables con janitor
<- janitor::clean_names(datos_pinguinos)
datos_pinguinos
# eliminar primera columna
<- datos_pinguinos[,-1]
datos_pinguinos |>
datos_pinguinos names()
[1] "species" "island" "bill_lenght" "bill_depth"
[5] "flipper_lenght" "male" "female"
# Resumen de datos
|>
datos_pinguinos glimpse()
Rows: 333
Columns: 7
$ species <chr> "Adelie", "Adelie", "Adelie", "Adelie", "Adelie", "Adel…
$ island <chr> "Torgersen", "Torgersen", "Torgersen", "Torgersen", "To…
$ bill_lenght <dbl> 39.1, 39.5, 40.3, 36.7, 39.3, 38.9, 39.2, 41.1, 38.6, 3…
$ bill_depth <dbl> 18.7, 17.4, 18.0, 19.3, 20.6, 17.8, 19.6, 17.6, 21.2, 2…
$ flipper_lenght <int> 181, 186, 195, 193, 190, 181, 195, 182, 191, 198, 185, …
$ male <int> 3750, NA, NA, NA, 3650, NA, 4675, NA, 3800, 4400, NA, N…
$ female <int> NA, 3800, 3250, 3450, NA, 3625, NA, 3200, NA, NA, 3700,…
6.5 Transformación de variables
El resumen de datos tambien permite identificar las variables por tipo, en este caso, dos variables han sido identificadas de tipo caracter species, island, pero realmente son variables categoricas. Una representa las especies de pinguinos y la otra la isla donde se realizo la observación, por lo que debe realizarse su transformación a tipo categórico o en este caso tipo factor.
#Verifcar si una variable tiene datos cualitaticos repetidos
# lo que indica que puede ser una var categorica
table(datos_pinguinos$species)
Adelie Chinstrap Gentoo
146 68 119
#resultado
# Adelie Chinstrap Gentoo
# 146 68 119
# Transformar variables de tipo caracter a factor
$species <- as.factor(datos_pinguinos$species)
datos_pinguinos$island<- as.factor(datos_pinguinos$island)
datos_pinguinos
|>
datos_pinguinos glimpse()
Rows: 333
Columns: 7
$ species <fct> Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie,…
$ island <fct> Torgersen, Torgersen, Torgersen, Torgersen, Torgersen, …
$ bill_lenght <dbl> 39.1, 39.5, 40.3, 36.7, 39.3, 38.9, 39.2, 41.1, 38.6, 3…
$ bill_depth <dbl> 18.7, 17.4, 18.0, 19.3, 20.6, 17.8, 19.6, 17.6, 21.2, 2…
$ flipper_lenght <int> 181, 186, 195, 193, 190, 181, 195, 182, 191, 198, 185, …
$ male <int> 3750, NA, NA, NA, 3650, NA, 4675, NA, 3800, 4400, NA, N…
$ female <int> NA, 3800, 3250, 3450, NA, 3625, NA, 3200, NA, NA, 3700,…
6.6 Tidy data
Un elemento importante en los datos que utiliza ggplot, no es solo el la estructura de la tabla (tibble o dataframe) ya que es posible generar visualizaciones utilizando cualquiera de la datos, lo que si es relevante es es ggplot solo trabaja con datos tipo tidy o datos ordenados.
La librería dplyr, ggplot2 y todos los demás paquetes de tidyverse están diseñados para funcionar con datos ordenados.
Hay tres reglas interrelacionadas que hacen que un conjunto de datos esté ordenado son:
- Cada variable debe tener su propia columna.
- Cada observación debe tener su propia fila.
- Cada valor debe tener su propia celda.
|>
datos_pinguinos head(10)
# A tibble: 10 × 7
species island bill_lenght bill_depth flipper_lenght male female
<fct> <fct> <dbl> <dbl> <int> <int> <int>
1 Adelie Torgersen 39.1 18.7 181 3750 NA
2 Adelie Torgersen 39.5 17.4 186 NA 3800
3 Adelie Torgersen 40.3 18 195 NA 3250
4 Adelie Torgersen 36.7 19.3 193 NA 3450
5 Adelie Torgersen 39.3 20.6 190 3650 NA
6 Adelie Torgersen 38.9 17.8 181 NA 3625
7 Adelie Torgersen 39.2 19.6 195 4675 NA
8 Adelie Torgersen 41.1 17.6 182 NA 3200
9 Adelie Torgersen 38.6 21.2 191 3800 NA
10 Adelie Torgersen 34.6 21.1 198 4400 NA
Adicional a estas tres reglas podemos identificar datos no ordenados porque:
- Los encabezados de columna son valores, no nombres de variables
- Las variables se almacenan tanto en filas como en columnas.
- Los datos de una supuesta variable están en diferentes columnas.
En el caso del tibble datos_pinguinos se observa que existen dos variables male y female que contienen los valores de la masa corporal de los pinguinos body_mass_g.
Dentro de las reglas de los datos tidy, cada variable debe tener su propia columna, La masa corporal de los pinguinos debiera estar en una sola columan y no separada en las variables male y female, por otro lado, los encabezados de columna son valores, no nombres de variables, las variables male y female dibieran ser una variable del tipo sexo.
Esto indica que esta tibble datos_pinguinos no esta ordenado, este tipo de tabla se conoce como data wider o tabla ancha, por lo que debemos tranasformar estos datos, data larga o data longer. Para ellos haremos usos de las funciones pivotes de R, especificamente pivot_longer().
# Transformar a datos tidy
# Para transformar los datos a tidy, se identifican las columnas o variables
# que se desean unir y convertir en una sola variable
# se coloca el nombre de la nueva variable con names_to
# los datos que contenian las variable male y female pasan a otra variable
# a través de values_to.
<- datos_pinguinos |>
datos_pinguinos_tidy pivot_longer(c("male":"female"),
names_to = "sex",
values_to = "body_mass_g")
# numero de observaciones generadas 666
nrow(datos_pinguinos_tidy)
[1] 666
|>
datos_pinguinos_tidy head(10)
# A tibble: 10 × 7
species island bill_lenght bill_depth flipper_lenght sex body_mass_g
<fct> <fct> <dbl> <dbl> <int> <chr> <int>
1 Adelie Torgersen 39.1 18.7 181 male 3750
2 Adelie Torgersen 39.1 18.7 181 female NA
3 Adelie Torgersen 39.5 17.4 186 male NA
4 Adelie Torgersen 39.5 17.4 186 female 3800
5 Adelie Torgersen 40.3 18 195 male NA
6 Adelie Torgersen 40.3 18 195 female 3250
7 Adelie Torgersen 36.7 19.3 193 male NA
8 Adelie Torgersen 36.7 19.3 193 female 3450
9 Adelie Torgersen 39.3 20.6 190 male 3650
10 Adelie Torgersen 39.3 20.6 190 female NA
Al mostrar los datos en formato tidy, podemos observar que si se realizó el pivote de la tabla y se crearon las nuevas variables sex y body_mass_g, sin embargo, había valores vacios (NA) en la tabla original que tambien se cargaron en esta tabla ordenada. Para eliminar estos datos debemos realizar nuevamente el proceso de pivoteo e indicarle a pivot_longer() con values_drop_na = TRUE que elimine los datos vacios.
# transformar a datos tidy eliminados filas vacias
<- datos_pinguinos |>
datos_pinguinos pivot_longer(c("male":"female"),
names_to = "sex",
values_to = "body_mass_g",
values_drop_na = TRUE)
# numero de observaciones generadas 333
nrow(datos_pinguinos)
[1] 333
# Resumend de datos , donde ya no se muestran los datos NA
|>
datos_pinguinos head(10)
# A tibble: 10 × 7
species island bill_lenght bill_depth flipper_lenght sex body_mass_g
<fct> <fct> <dbl> <dbl> <int> <chr> <int>
1 Adelie Torgersen 39.1 18.7 181 male 3750
2 Adelie Torgersen 39.5 17.4 186 female 3800
3 Adelie Torgersen 40.3 18 195 female 3250
4 Adelie Torgersen 36.7 19.3 193 female 3450
5 Adelie Torgersen 39.3 20.6 190 male 3650
6 Adelie Torgersen 38.9 17.8 181 female 3625
7 Adelie Torgersen 39.2 19.6 195 male 4675
8 Adelie Torgersen 41.1 17.6 182 female 3200
9 Adelie Torgersen 38.6 21.2 191 male 3800
10 Adelie Torgersen 34.6 21.1 198 male 4400
#transformar la variable sex a factor
$sex <- as.factor(datos_pinguinos$sex)
datos_pinguinos
# write.csv(datos_pinguinos, "data/data_penguins_clean.csv")
6.7 Resumen numérico del tibble
Hcemos un resumen del tiible, donde se muestra el número de observaciones, variables y tipos de datos que contiene la tabla con las modificaciones realizadas.
# Resumen Numérico de la tabla
|>
datos_pinguinos skim()
Name | datos_pinguinos |
Number of rows | 333 |
Number of columns | 7 |
_______________________ | |
Column type frequency: | |
factor | 3 |
numeric | 4 |
________________________ | |
Group variables | None |
Variable type: factor
skim_variable | n_missing | complete_rate | ordered | n_unique | top_counts |
---|---|---|---|---|---|
species | 0 | 1 | FALSE | 3 | Ade: 146, Gen: 119, Chi: 68 |
island | 0 | 1 | FALSE | 3 | Bis: 163, Dre: 123, Tor: 47 |
sex | 0 | 1 | FALSE | 2 | mal: 168, fem: 165 |
Variable type: numeric
skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
---|---|---|---|---|---|---|---|---|---|---|
bill_lenght | 0 | 1 | 43.99 | 5.47 | 32.1 | 39.5 | 44.5 | 48.6 | 59.6 | ▃▇▇▆▁ |
bill_depth | 0 | 1 | 17.16 | 1.97 | 13.1 | 15.6 | 17.3 | 18.7 | 21.5 | ▅▆▇▇▂ |
flipper_lenght | 0 | 1 | 200.97 | 14.02 | 172.0 | 190.0 | 197.0 | 213.0 | 231.0 | ▂▇▃▅▃ |
body_mass_g | 0 | 1 | 4207.06 | 805.22 | 2700.0 | 3550.0 | 4050.0 | 4775.0 | 6300.0 | ▃▇▅▃▂ |
7 Gráfico de Histograma
Un histograma visualiza la distribución y frecuencia datos durante un intervalo continuo o un período de tiempo determinado de una varible numérica. Cada barra en un histograma representa la frecuencia tabulada en cada intervalo tambien llamado bin.
Los histogramas ayudan a dar una estimación de dónde se concentran los valores, cuáles son los extremos y si hay valores inusuales.
7.1 Crear histograma en R
Se pueden construir histogramas con ggplot2 utilizando la variable numérica flipper_lenght y la geometría geom_histogram(). En ggplot el número de bins o intervalos predeterminado es de 30.
Este historgrama muestra una distribución de los datos entre los valores de 170 a 230 no simétrica y los valores que más se repiten están entre los intervalos 180 a 200.
# Gráfico de histograma
|>
datos_pinguinos ggplot(aes(x= flipper_lenght)) +
geom_histogram()
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
7.2 Modifcar el número de bins
Al modificar el número de intervalos, ene este caso menos intervalos, más datos se agrupan en cada intervalo, por lo que el el eje de las y, tiende a incrementarse.
# Modificar número de bins
|>
datos_pinguinos ggplot(aes(x= flipper_lenght)) +
geom_histogram(bins = 15)
7.3 Modificar color de las líneas
Utilizando nuevamente el intervalo de 30, es un poco complicado poder identifcarlos con claridad, es por ello que modiricaremos el color de linea de cada intervalo con la propiedad color =“#ffffff”. El valor entre comilla representa el color hexadecimal del blanco.
# Modificar el color de las lineas
# Bins predeterminados = 30
|>
datos_pinguinos ggplot(aes(x= flipper_lenght)) +
geom_histogram(color ="#ffffff", bins = 30)
7.4 Modificar color de relleno bins
Para modificar el color del relleno de cada intervalo utilizamos la función fill.
Los colores se pueden colocar con el nombre del color o con el código hexadecimal.
Colores como nombre
Colores hexadecimales
# Gráfico de histograma con colores en los bins para identificar
|>
datos_pinguinos ggplot(aes(x= flipper_lenght)) +
geom_histogram(color ="#ffffff" ,
fill = "#EF3C49",
bins = 30)
7.5 Añadir datos al gráfico
Para añadir datos del conteo de la sobservaciones en un histograma, podemos utilizar la función stat_bin(), a esta función se le añade las propiedades label=..count.. , que realiza el conteo por bins, además de la propiedad geom=“text” que indica que la propiedad es de tipo texto.
# Gráfico de histograma con colores en los bins para identificar
|>
datos_pinguinos ggplot(aes(x= flipper_lenght)) +
geom_histogram(color ="#ffffff" ,
fill = "#EF3C49",
bins=30)+
stat_bin(aes(label=..count..),
geom="text")
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
7.6 Ajustar datos en gráfico
Se puede ajustar la posición del texto utilizando las propiedades vjuts (posicion vertical) y hjust(posición horizontal) en la función stat_bin().
# Gráfico de histograma con colores en los bins para identificar
|>
datos_pinguinos ggplot(aes(x= flipper_lenght)) +
geom_histogram(color ="#ffffff" ,
fill = "#EF3C49",
bins=30)+
stat_bin(aes(label=..count..),
vjust=-0.1,
hjust= 0.5,
geom="text")
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
7.7 Datos en gráfico (bins)
Es importante resaltar que el bins=30 es el valor predeterminado en un histograma, si el valor se modifica como en el ejemplo, este valor se debe modificar tambien en stat_bin() , sino los datos no coincidiran en el gráfico.
# Gráfico de histograma con bins =15
|>
datos_pinguinos ggplot(aes(x= flipper_lenght)) +
geom_histogram(color ="#ffffff" ,
fill = "#EF3C49",
bins=15)+
stat_bin(aes(label=..count..),
vjust=-0.1,
hjust= 0.5,
geom="text")
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
# Gráfico de histograma con bins =15 en el histograma y en el texto
|>
datos_pinguinos ggplot(aes(x= flipper_lenght)) +
geom_histogram(color ="#ffffff" ,
fill = "#EF3C49",
bins=15)+
stat_bin(aes(label=..count..),
vjust=-0.1,
hjust= 0.5,
geom="text",
bins = 15)
7.8 Añadir info al gráfico
Para añadir una linea que intercepte o se dibuje en una posición x del gráfico se utilia la función geom_vline(). xintercept = posición de intersección de la línea.
color = color de la línea.
size = tamaño de la línea.
Valor y tipo de linea linetype = 0 linetype = “blank” * linetype = 1 linetype = “solid” * linetype = 2 linetype = “dashed” * linetype = 3 linetype = “dotted” * linetype = 4 linetype = “dotdash” * linetype = 5 linetype = “longdash” * linetype = 6 linetype = “twodash”
#calculo de la media y la mediana
<- mean(datos_pinguinos$flipper_lenght)
media media
[1] 200.967
<- median(datos_pinguinos$flipper_lenght)
mediana mediana
[1] 197
# Gráfico de histograma con colores en los bins para identificar
|>
datos_pinguinos ggplot(aes(x= flipper_lenght)) +
geom_histogram(color ="#ffffff",
fill = "#EF3C49",
bins=30)+
geom_vline(xintercept = mediana, size = 1) +
geom_vline(xintercept = media, size = 1, linetype = "dashed", color="blue")
# Asimétrica, tiene sesgo a la Derecha (cola a la derecha)
7.9 Histograma y densidad
Podemos añadir un gráfico de densidad (poligono) junto al gráfico de histograma utilizando la función geom_density() en una nueva capa y la estetica en el histograma aes(y = ..density..), recordando que para añadir esta nueva geometria, hay que colocar el signo de + al final del cierre del parentesis de geom_histogram .
# Gráfico de histograma con grafico de densidad
# lwd=1.5 , representa el grosor del borde del
# grafico de densidad
|>
datos_pinguinos ggplot(aes(x= flipper_lenght)) +
geom_histogram(aes(y = ..density..),
color ="#ffffff",
fill = "#EF3C49",
bins=30)+
geom_density(lwd=1.5, colour = "blue")
7.10 Histograma con variable categorica
Es posible utilizar una variable categórica en un histograma, en este caso la variable sex que contiene los valores H y M de los pinguinos. Esta variable representa una estetica del gráfico, por lo tanto debe incluirse dentro de la propiedad aes() de la geometria geom_histogram() y la utilizaremos para modificar el color de relleno del hostograma.
Como la variable sex tiene dos categorias, ggplot genera dos histogramas de diferentes colores, uno por cada categoria.
# Gráfico de histograma con dos variables
|>
datos_pinguinos ggplot(aes(x= flipper_lenght)) +
geom_histogram(aes(fill=sex),
color ="#ffffff",
bins=30)
7.10.1 Añadir datos al histograma
Los códigos para colocar datos al histograma por categoria, es el mismo visto con el de un histograma.
# Gráfico de histograma dos variables
|>
datos_pinguinos ggplot(aes(x= flipper_lenght)) +
geom_histogram(aes(fill=sex),
color ="#ffffff",
bins=30)+
stat_bin(aes(label=..count..),
vjust=-0.1,
hjust= 0.5,
geom="text")
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
7.10.2 Histograma con transparencia
Podemos utilizar la propiedad alpha (transparencia) en le geometria geom_histograma() con valores de (0 a 1), 1 = 100%.
Para que usar la tarnsparencia?
Cuando creamos este tipo de histogramas la naturaleza de ggplot, es crear los histograma una encima del otro, como si fueran un solo historgrama pero separando la distribución de los datos según la variable sex, esto no permite comprar realmente la distribución de los datos de ambos histogramas.
# Gráfico de histograma con dos variables
|>
datos_pinguinos ggplot(aes(x= flipper_lenght)) +
geom_histogram(aes(fill=sex),
color ="#ffffff",
bins=30,
alpha=0.5)
7.10.3 Histograma con transparencia (position)
Si utilizamso la propiedad position = “identity” , en la geometria geom_histogram() podemos ver que ahora los histogramas se solapan, ya que uno esta detrás del otro, permitiendo comparar la distribución de los datos.
# Gráfico de histograma con dos variables
|>
datos_pinguinos ggplot(aes(x= flipper_lenght)) +
geom_histogram(aes(fill=sex),
color ="#ffffff",
bins=30,
alpha=0.5,
position ="identity")
8 Gráfico de boxplot
El Diagrama de Caja y bigotes (box and whisker plot en inglés ) es un tipo de gráfico que muestra un resumen de una gran cantidad de datos en cinco medidas descriptivas, además de intuir su morfología y simetría.
Este tipo de gráficos nos permite identificar valores atípicos y comparar distribuciones de una variable. Además de conocer de una forma cómoda y rápida como el 50% de los valores centrales se distribuyen, para ello utilizamos la geometria geom_boxplot().
Se puede detectar los siguientes valores en el gráfico:
- Primer cuartil: representa el 25% de los datos.
- Tercer cuartil: representa el 75% de los datos acumulados..
- Mediana o Segundo Cuartil: Divide en dos partes iguales la distribución, acumula el 50% de los datos.
- Rango Intercuartílico (RIC): representa el 50% intermedio de los datos. Muestra la distancia entre el primer cuartil y el tercer cuartil (Q3-Q1).
- Vloares mínimo y máximo.
|>
datos_pinguinos ggplot(aes(x= flipper_lenght)) +
geom_boxplot()
# valores de un boxplot
summary(datos_pinguinos$flipper_lenght)
Min. 1st Qu. Median Mean 3rd Qu. Max.
172 190 197 201 213 231
8.1 Boxplot vertical
Para girar el gráfico de boxplot en ggplot, solo debemos cambiar la asignación de la varible x= flipper_lenght a y= flipper_lenght en la estética aes().
|>
datos_pinguinos ggplot(aes(y= flipper_lenght)) +
geom_boxplot()
8.2 Boxplot con distribución de puntos
Para añadir los puntos de distribución en el gráfico del boxplot debemos hacer dos pasos: 1. Añadir el eje y=0 en el aes()
2. Utrilizar le geometría geom_jitter().
|>
datos_pinguinos ggplot(aes(x= flipper_lenght, y=0)) +
geom_boxplot()+
geom_jitter()
8.3 Boxplot con colores
Para modificar la apariencia del gráfico de boxplot, debemos de modificar las propiedades en la geomatria geom_boxplot(). * color = colore e la linea del boxplot * fill = color de la caja, si utilizamos **fill=“transparente”* la caja es trasnparente. * size = grosor de la linea del boxplot.
|>
datos_pinguinos ggplot(aes(x= flipper_lenght, y=0)) +
geom_boxplot(color = "red",
fill = "lightsalmon",
size = 1)+
geom_jitter()
8.4 Boxplot con dos variables
Se queremos utilizar dos variables para comparar sus distribución, debemos utilizar una variable categorica island en el valor de X o Y en función de si queremso mostrar el boxplot horizontal o verical.
|>
datos_pinguinos ggplot(aes(y= flipper_lenght, x=island)) +
geom_boxplot()+
geom_jitter()
8.5 Boxplot con dos variables - colores)
Se queremos darle un color diferente a cada boxplot, colocamos en la geoametria del gráfico la propiedad fill=variable categorica, con ello se creará un color para cada boxplot.
|>
datos_pinguinos ggplot(aes(y= flipper_lenght, x=island)) +
geom_boxplot(aes(fill=island))+
geom_jitter()
9 Gráfico Ridge
Los diagramas de crestas ridges son diagramas de líneas parcialmente superpuestas que crean la impresión de una cadena montañosa. Pueden resultar muy útiles para visualizar cambios en las distribuciones a lo largo del tiempo o el espacio. Para su creación es necesario utilizar la geometria geom_density_ridges() que se encuentra en la libreria ggridges. A diferencia del diagrama de densidad e histograma, este tipo de gráfico necesita que se identifique los valores de X y Y en la estética aes() de ggplot.
# Gráfico Ridge son color
|>
datos_pinguinos ggplot(aes(x= flipper_lenght,
y=island)) +
geom_density_ridges()
Picking joint bandwidth of 3.23
# Gráfico Ridge color relleno
|>
datos_pinguinos ggplot(aes(x= flipper_lenght,
y=island)) +
geom_density_ridges(fill="salmon")
Picking joint bandwidth of 3.23
9.1 Gráfico Ridge - color
Para modificar el color del relleno en los gráficos tipo Ridge utilizamos la porpiedad fill y la variable island que indica el númeor de categorias, estas deben estar integradas en la estetica aes() de la geoametria geom_density_ridges.
# dos variable en el color de la lineas
|>
datos_pinguinos ggplot(aes(x= flipper_lenght,
y=island)) +
geom_density_ridges(aes(fill=island))
Picking joint bandwidth of 3.23
9.2 Gráfico Ridge - color palette
Podemos modificar el relleno en los gráficos tipo Ridge con colores diferentes a los colores predeterminados utilizando scale_fill_brewer y algún tipo de paleta de colores en ggplot. En otro de los temas veremos el uso de estas paletas de colores.
# colores con paleta de colores 1
|>
datos_pinguinos ggplot(aes(x= flipper_lenght,
y=island)) +
geom_density_ridges(aes(fill=island))+
scale_fill_brewer(palette = "Blues")
Picking joint bandwidth of 3.23
# colores con paleta de colores 2
|>
datos_pinguinos ggplot(aes(x= flipper_lenght,
y=island)) +
geom_density_ridges(aes(fill=island))+
scale_fill_brewer(palette = "Pastel2")
Picking joint bandwidth of 3.23
# colores con paleta de colores 8
|>
datos_pinguinos ggplot(aes(x= flipper_lenght,
y=island,
fill=island)) +
geom_density_ridges()+
scale_fill_brewer(palette = "Spectral")
Picking joint bandwidth of 3.23
10 Facetas
Las facetas son una forma más ordenada de mostrar los gráficos que muestran varias categorias, para ello debemos utilizar la geometria facet_grid() con el nombre de la variable. Los simbolos .~ antes de la variable sex le indica a la faceta que debe colocar los gráficos categorizados en columnas, es decir uno al lado del otro.
|>
datos_pinguinos ggplot(aes(x= flipper_lenght)) +
geom_histogram(aes(fill=sex),
color ="#ffffff",
bins=30,
position ="identity")+
facet_grid(.~sex)
10.1 Recomendación 1
Cuando se utilizan facetas para mostrar distribuciones por grupo, permite comparar las distribuciones por una variable categorica, sin emabrgo al separar los datos es importante mirar el eje x donde el rango de distribución del sexo male es mayor, por lo que por recomendación es recomendable mantener los ejes iguales modificando los valores con la función xlim(170,240) colocando los rangos de la distribución.
|>
datos_pinguinos ggplot(aes(x= flipper_lenght)) +
geom_histogram(aes(fill=sex),
color ="#ffffff",
bins=30,
position ="identity")+
facet_grid(.~sex)+
xlim(170,240)
Warning: Removed 4 rows containing missing values (`geom_bar()`).
10.2 Recomendación 2
Otra opción en el uso de facetas para no modificar el eje x, es usar las facetas en foamto de filas.
Para generar las fectas en filas, debemos utilizar los simbolos ~. despues de la variable sex le indica a la faceta que debe colocar los gráficos categorizados en filas, uno debajo del otro. Esto permite una mejor comparación de los histogramas con las mismas coordenasd en el eje x.
|>
datos_pinguinos ggplot(aes(x= flipper_lenght)) +
geom_histogram(aes(fill=sex),
color ="#ffffff",
bins=30,
position ="identity")+
facet_grid(sex~.)
10.3 Titulos y nombre de ejes
Los simbolos ~. despues de la variable sex le indica a la faceta que debe colocar los gráficos categorizados en filas, uno debajo del otro. Esto permite una mejor comparación de los histogramas.
|>
datos_pinguinos ggplot(aes(x= flipper_lenght)) +
geom_histogram(aes(fill=sex),
color ="#ffffff",
bins=30,
position ="identity")+
facet_grid(sex~.)+
labs(title = "Distribución de las longuitud de la aleta de los pinguinos por sexo",
subtitle = "Datos de las islas...",
x="Lonuitud",
y="Cantidad",
fill="Sexo")
11 Práctica
Crear gráfico de histograma utilizando los datos INEC-morbilidad-2023-10-14.csv que se encuentran en la carpeta data.
Al cargar los datos debe filtralos por la región de “PANAMA METRO” y crear un nuevo tibble llamado inec_0 con los nuevos datos.
En el gráfico debe utilizar el tibble inec_0 y filtrar los datos por casos mayores a 20. Utilizar facetas basado en la variable Genero.
Gráfico de resultado: