14 Estadística descriptiva con dplyr

En este capítulo se mostrará como usar el paquete dplyr de R para hacer un análisis descriptivo usando una base de datos real.

Las variables de la base de datos que vamos a utilizar en el ejemplo de este capítulo se muestran a continuación.

  • bwt: Peso del bebé al nacer, redondeado a la onza más cercana.
  • gestación: Duración del embarazo en días, calculado a partir del primer día del último período menstrual normal.
  • paridad: Indicador de si el bebé es el primogénito o desconocido.
  • edad: edad de la madre en el momento de la concepción, en años.
  • altura: Altura de la madre, en pulgadas.
  • peso: peso de la madre antes del embarazo, en libras.
  • fumar: estado de tabaquismo Indicador de si la madre fuma o no.

Las unidades de algunas de las variables están en sistema inglés, más adelante mostraremos cómo convertir esas variables.

Para leer la base de datos usamos el siguiente código.

url <- 'https://raw.githubusercontent.com/fhernanb/datos/master/babies.txt'
dt <- read.table(url, header=TRUE, sep='\t')

Par ver el encabezado de la base de datos.

head(dt, n=8)
##   bwt gestation     parity age height weight smoke
## 1 120       284 First born  27     62    100   Not
## 2 113       282 First born  33     64    135   Not
## 3 128       279 First born  28     64    115   Yes
## 4 123        NA First born  36     69    190   Not
## 5 108       282 First born  23     67    125   Yes
## 6 136       286 First born  25     62     93   Not
## 7 138       244 First born  33     62    178   Not
## 8 132       245 First born  23     65    140   Not

Ahora vamos a explorar la base de datos por medio de la función summary.

summary(dt)
##       bwt          gestation        parity               age       
##  Min.   : 55.0   Min.   :148.0   Length:1236        Min.   :15.00  
##  1st Qu.:108.8   1st Qu.:272.0   Class :character   1st Qu.:23.00  
##  Median :120.0   Median :280.0   Mode  :character   Median :26.00  
##  Mean   :119.6   Mean   :279.3                      Mean   :27.26  
##  3rd Qu.:131.0   3rd Qu.:288.0                      3rd Qu.:31.00  
##  Max.   :176.0   Max.   :353.0                      Max.   :45.00  
##                  NA's   :13                         NA's   :2      
##      height          weight         smoke          
##  Min.   :53.00   Min.   : 87.0   Length:1236       
##  1st Qu.:62.00   1st Qu.:114.8   Class :character  
##  Median :64.00   Median :125.0   Mode  :character  
##  Mean   :64.05   Mean   :128.6                     
##  3rd Qu.:66.00   3rd Qu.:139.0                     
##  Max.   :72.00   Max.   :250.0                     
##  NA's   :22      NA's   :36

Otra tabla de resumen se puede obtener con la función str.

str(dt)
## 'data.frame':    1236 obs. of  7 variables:
##  $ bwt      : int  120 113 128 123 108 136 138 132 120 143 ...
##  $ gestation: int  284 282 279 NA 282 286 244 245 289 299 ...
##  $ parity   : chr  "First born" "First born" "First born" "First born" ...
##  $ age      : int  27 33 28 36 23 25 33 23 25 30 ...
##  $ height   : int  62 64 64 69 67 62 62 65 62 66 ...
##  $ weight   : int  100 135 115 190 125 93 178 140 125 136 ...
##  $ smoke    : chr  "Not" "Not" "Yes" "Not" ...

Para conocer la imension de la base de datos usamos la función dim.

dim(dt)
## [1] 1236    7

Para ver el peso de las madres.

dt$weight
##    [1] 100 135 115 190 125  93 178 140 125 136 120 124 128  99 154 130 125 125
##   [19] 170 142  93 175 145 182 122 112 106 175 125 132 105 146 123 105 120 130
##   [37] 115  92 101  NA 160 177  NA 119 130 110 150  90 147 119 130 148 110 126
##   [55] 132 130 145 140 116 110  96 118 125 130 125 115 150 137 170 170 130 118
##   [73] 125 120 149 110 107 130 126 103 116 104 135 148 145  NA 117 143 196 113
##   [91] 117 112 104 130 103 100 100 162 110 137 121 120  NA 117 108 140 143 150
##  [109] 125 154  NA 125 136  NA 145 114 109 215 145 170 103 133 130 155 150 150
##  [127] 110 120 154 148 103 110 125 100 147 120 135 145 104 165 107 123 110 127
##  [145] 115 155 125 175 140 250 148 128  NA 132  NA 152 135 104  NA 121 111 138
##  [163] 190 123 125 160 123 105 123 110 109 118 115 105 131 155 170 123 125 120
##  [181] 175 192 116 220 150  NA 117  93  97 135 136 110 124  NA 155 150 168 147
##  [199] 117 110 140 132  97 112  NA 105 110 150 125 150 138 150  99 115 125 130
##  [217] 145 130 125 130 135 121 180 145 136 142 128 120 106 106  NA 117 116 127
##  [235] 135 135 160 120 155 110 190 140 105 125 117 125 128 124 169 125 110 105
##  [253] 110 125 185 142 118 139 160 128 135 148 105 122 140 104 125 132 102 140
##  [271] 103 119 165 115 156 150 120 135 160 140 142 140 118 103 146 126 135 189
##  [289] 157 108 135 122 148 152 140 100 105 105 110 122 125 125 102 125 135 130
##  [307] 130 112 145 117 176  NA 130 112 100 110 135 120 135 123 129 130 136 145
##  [325] 120 120 120 106 135 130 132 110 110 135 127 130 107  NA 103 157 144 130
##  [343] 112 130 130 130 103 110 117 122 110 113  NA 128 132 104 159 115 115 112
##  [361] 135 110 130  NA 145 147 130 112 170 122 125 122 136 143 135 130 121 108
##  [379] 128 105 125 109 100 145 137 150 115 155 112 130 145 124 145 118 100 140
##  [397] 125 134 115  NA 133 105 104 105 117 135 129 120 140 139 116 180 124 143
##  [415] 137 104 132 147 107 110 130 130 135 155 132 114 210 142 138 102 145 102
##  [433] 115 150 110 140 130 120 148  NA 135 108 111  NA 138 130 120 140 127 140
##  [451] 130 115 135 127 124 118 125 165 137 118 140 150 149 127 138  93 125 123
##  [469] 111 133 147  99 125 154 141 115 135  NA  NA 135 155  NA 135 110 130 144
##  [487] 135 135 123 155 130 128 122 118 123 125 120 125 122 162 103 110 111 130
##  [505] 117  95 129 126  NA 175 147 140 180 102 116 110 150 115 120 147 145 110
##  [523] 200 140 130  NA 117 125 180 135 120 109 113 132 110 124 160 160 103 130
##  [541] 128  96 127 120 106 122  89 108 138 125  95 145 140 107 125 135 155 105
##  [559] 102 114 124 137 170 197 171 145 130 165 146 135 134 135 132 105 110 133
##  [577] 132 112 159 135 150 125 105 125 113  98 130 135 119 130 150 127 120 140
##  [595] 129 110 114 130 115 107 155 118 126 115 110 137 115 139 215 140 100 160
##  [613] 107 108 132 116 165 109  98 110 110 115 202 135 112 108 108 118 125 126
##  [631] 112 130 180 145 130  90 100 118 120 145 118 135 129 112 128 155 124 125
##  [649]  NA 165 132 124 135  NA 112 101 117 115 115 135 133 134 119 125 115 110
##  [667] 108  98 105 145 120 140 130 110 107 132 115 118 124  95 116  94 145 125
##  [685] 115 110 102 140 120  94 160 105 120 117 126 175 174 112  NA 144 125 169
##  [703] 135 120 128 135 116 125 140 140 138 128 118 113 105 150 145 153 115 122
##  [721] 127 160 130 198 118 125 110 165 157 120 140 148 126 190 130 100 114 136
##  [739] 117 120 118 100 137 126 120  96 110 182 122 105 130 140 125  NA  98 135
##  [757] 105 125 127 125 120 130  NA 142 105 118 147 106 127 110 104 130 118 111
##  [775] 105 134 140 121 111 120 110 110 160 124 113 145 120  96 130 119 150 124
##  [793] 130 127 100 164 135 155 149 139 130 134 127 110 140 108 124 127 112 120
##  [811] 155 129 132 132 145 124 130 110 108 112 118 135 162 162 130 112 118  91
##  [829] 103 107 100 112 125 134 115 141 118 123 148 125 120 122 126 118 110 108
##  [847] 107 126 120 215 138 170 110 120 150 130 117 107 191 185 150 112 127 110
##  [865] 140 210 111 124 130 133 160 125 143 125  NA 150 100 129 150 110 135 109
##  [883]  NA 125 118 110 132 125 181 123 117 135 130 110 110 140 120 155 114 159
##  [901] 112 116 110 128 136 137 153 130  99 115 125 175 156 107 160 128 130 135
##  [919] 137 125 175 108 137 155 217 126 130 135 156 115 109 105 137 143 123 178
##  [937] 120 134 121 102 115 116 170 160 109 112 120 133 110 130 122 122 121 125
##  [955] 105 112 130 145 145 124 113 120 135 118 118 133 122 125 126 112 137 135
##  [973] 115 135 131 111 110 160 140 149 110 134 155 150 129 122 112 130 128 120
##  [991] 108  98 127 130 145 130 113 156 110 132 140 159 164 114 130 140 127 115
## [1009] 185 124 114 116 112  NA 133 115 115 145 140 127 120 185 130 135 145 130
## [1027] 150 109 110 142 125 132 110 110 120 130 116  90 130 125 112 127 132 128
## [1045]  NA 115 116 145 119 135 117 125 117 120 130 120 125 129 144 100 145 104
## [1063] 110 145 132 125 108 119 118 130 128  97 115 135 142 131 165 122 114 137
## [1081] 107 113 145 110 126 135 111 135 105 113 110 120 121 130 122 127 122 115
## [1099] 104 163 146 113 120 142 124 127 135 122 127 125 135 150 155 120 115 136
## [1117] 115 108 118 115 125 120 140 123  98 118 105 154 118 122 117 150 100 115
## [1135] 118 118 102 127 104  99 107 124 136 142 132 125 106 120 200 113 112 114
## [1153] 117  99 177 145 124 125 134 123 140 130 110 119 104 103 135 180 110 145
## [1171] 150 128 115  95 145 130 103  NA 126 101 113 130 137 112 127 140 110 145
## [1189] 140  89  NA 135 228 160 158 145 127 135 150 170 107 145 130 115 120 113
## [1207] 135 125 156 140 130 103 120 151 103 119 109 145 150 180  95 120 116 136
## [1225] 135 145 102  87 116 121 126 100 120 150 110 129

Otra forma de ver el peso almacenado en columna 6.

dt[, 6]
##    [1] 100 135 115 190 125  93 178 140 125 136 120 124 128  99 154 130 125 125
##   [19] 170 142  93 175 145 182 122 112 106 175 125 132 105 146 123 105 120 130
##   [37] 115  92 101  NA 160 177  NA 119 130 110 150  90 147 119 130 148 110 126
##   [55] 132 130 145 140 116 110  96 118 125 130 125 115 150 137 170 170 130 118
##   [73] 125 120 149 110 107 130 126 103 116 104 135 148 145  NA 117 143 196 113
##   [91] 117 112 104 130 103 100 100 162 110 137 121 120  NA 117 108 140 143 150
##  [109] 125 154  NA 125 136  NA 145 114 109 215 145 170 103 133 130 155 150 150
##  [127] 110 120 154 148 103 110 125 100 147 120 135 145 104 165 107 123 110 127
##  [145] 115 155 125 175 140 250 148 128  NA 132  NA 152 135 104  NA 121 111 138
##  [163] 190 123 125 160 123 105 123 110 109 118 115 105 131 155 170 123 125 120
##  [181] 175 192 116 220 150  NA 117  93  97 135 136 110 124  NA 155 150 168 147
##  [199] 117 110 140 132  97 112  NA 105 110 150 125 150 138 150  99 115 125 130
##  [217] 145 130 125 130 135 121 180 145 136 142 128 120 106 106  NA 117 116 127
##  [235] 135 135 160 120 155 110 190 140 105 125 117 125 128 124 169 125 110 105
##  [253] 110 125 185 142 118 139 160 128 135 148 105 122 140 104 125 132 102 140
##  [271] 103 119 165 115 156 150 120 135 160 140 142 140 118 103 146 126 135 189
##  [289] 157 108 135 122 148 152 140 100 105 105 110 122 125 125 102 125 135 130
##  [307] 130 112 145 117 176  NA 130 112 100 110 135 120 135 123 129 130 136 145
##  [325] 120 120 120 106 135 130 132 110 110 135 127 130 107  NA 103 157 144 130
##  [343] 112 130 130 130 103 110 117 122 110 113  NA 128 132 104 159 115 115 112
##  [361] 135 110 130  NA 145 147 130 112 170 122 125 122 136 143 135 130 121 108
##  [379] 128 105 125 109 100 145 137 150 115 155 112 130 145 124 145 118 100 140
##  [397] 125 134 115  NA 133 105 104 105 117 135 129 120 140 139 116 180 124 143
##  [415] 137 104 132 147 107 110 130 130 135 155 132 114 210 142 138 102 145 102
##  [433] 115 150 110 140 130 120 148  NA 135 108 111  NA 138 130 120 140 127 140
##  [451] 130 115 135 127 124 118 125 165 137 118 140 150 149 127 138  93 125 123
##  [469] 111 133 147  99 125 154 141 115 135  NA  NA 135 155  NA 135 110 130 144
##  [487] 135 135 123 155 130 128 122 118 123 125 120 125 122 162 103 110 111 130
##  [505] 117  95 129 126  NA 175 147 140 180 102 116 110 150 115 120 147 145 110
##  [523] 200 140 130  NA 117 125 180 135 120 109 113 132 110 124 160 160 103 130
##  [541] 128  96 127 120 106 122  89 108 138 125  95 145 140 107 125 135 155 105
##  [559] 102 114 124 137 170 197 171 145 130 165 146 135 134 135 132 105 110 133
##  [577] 132 112 159 135 150 125 105 125 113  98 130 135 119 130 150 127 120 140
##  [595] 129 110 114 130 115 107 155 118 126 115 110 137 115 139 215 140 100 160
##  [613] 107 108 132 116 165 109  98 110 110 115 202 135 112 108 108 118 125 126
##  [631] 112 130 180 145 130  90 100 118 120 145 118 135 129 112 128 155 124 125
##  [649]  NA 165 132 124 135  NA 112 101 117 115 115 135 133 134 119 125 115 110
##  [667] 108  98 105 145 120 140 130 110 107 132 115 118 124  95 116  94 145 125
##  [685] 115 110 102 140 120  94 160 105 120 117 126 175 174 112  NA 144 125 169
##  [703] 135 120 128 135 116 125 140 140 138 128 118 113 105 150 145 153 115 122
##  [721] 127 160 130 198 118 125 110 165 157 120 140 148 126 190 130 100 114 136
##  [739] 117 120 118 100 137 126 120  96 110 182 122 105 130 140 125  NA  98 135
##  [757] 105 125 127 125 120 130  NA 142 105 118 147 106 127 110 104 130 118 111
##  [775] 105 134 140 121 111 120 110 110 160 124 113 145 120  96 130 119 150 124
##  [793] 130 127 100 164 135 155 149 139 130 134 127 110 140 108 124 127 112 120
##  [811] 155 129 132 132 145 124 130 110 108 112 118 135 162 162 130 112 118  91
##  [829] 103 107 100 112 125 134 115 141 118 123 148 125 120 122 126 118 110 108
##  [847] 107 126 120 215 138 170 110 120 150 130 117 107 191 185 150 112 127 110
##  [865] 140 210 111 124 130 133 160 125 143 125  NA 150 100 129 150 110 135 109
##  [883]  NA 125 118 110 132 125 181 123 117 135 130 110 110 140 120 155 114 159
##  [901] 112 116 110 128 136 137 153 130  99 115 125 175 156 107 160 128 130 135
##  [919] 137 125 175 108 137 155 217 126 130 135 156 115 109 105 137 143 123 178
##  [937] 120 134 121 102 115 116 170 160 109 112 120 133 110 130 122 122 121 125
##  [955] 105 112 130 145 145 124 113 120 135 118 118 133 122 125 126 112 137 135
##  [973] 115 135 131 111 110 160 140 149 110 134 155 150 129 122 112 130 128 120
##  [991] 108  98 127 130 145 130 113 156 110 132 140 159 164 114 130 140 127 115
## [1009] 185 124 114 116 112  NA 133 115 115 145 140 127 120 185 130 135 145 130
## [1027] 150 109 110 142 125 132 110 110 120 130 116  90 130 125 112 127 132 128
## [1045]  NA 115 116 145 119 135 117 125 117 120 130 120 125 129 144 100 145 104
## [1063] 110 145 132 125 108 119 118 130 128  97 115 135 142 131 165 122 114 137
## [1081] 107 113 145 110 126 135 111 135 105 113 110 120 121 130 122 127 122 115
## [1099] 104 163 146 113 120 142 124 127 135 122 127 125 135 150 155 120 115 136
## [1117] 115 108 118 115 125 120 140 123  98 118 105 154 118 122 117 150 100 115
## [1135] 118 118 102 127 104  99 107 124 136 142 132 125 106 120 200 113 112 114
## [1153] 117  99 177 145 124 125 134 123 140 130 110 119 104 103 135 180 110 145
## [1171] 150 128 115  95 145 130 103  NA 126 101 113 130 137 112 127 140 110 145
## [1189] 140  89  NA 135 228 160 158 145 127 135 150 170 107 145 130 115 120 113
## [1207] 135 125 156 140 130 103 120 151 103 119 109 145 150 180  95 120 116 136
## [1225] 135 145 102  87 116 121 126 100 120 150 110 129

Para ver la información de las madres 2, 125, 569 y 830 podemos usar el siguiente código:

dt[c(2, 125, 569, 830), ]
##     bwt gestation     parity age height weight smoke
## 2   113       282 First born  33     64    135   Not
## 125 117       276 First born  31     69    150   Not
## 569 127       254 First born  27     67    146   Yes
## 830  62       228 First born  24     61    107   Not

Para ver la edad y smoke de las mujeres 40, 58, 69 y 256 podemos usar el siguiente código:

dt[c(40, 58, 69, 256), c('age', 'smoke')]
##     age smoke
## 40   31   Not
## 58   33   Not
## 69   31   Yes
## 256  31  <NA>

14.1 Medidas de tendencia central, variabilidad, posición y correlación

En esta sección vamos a mostrar como se pueden obtener algunas medidas de resumen para los datos usando funciones básicas de R como son:

  • mean(x, trim=0, na.rm=FALSE): para calcular el promedio.
  • var(x, na.rm=FALSE): para calcular la varianza muestral.
  • sd(x, na.rm=FALSE): para calcular la desviación estándar muestral.
  • quantile(x, probs, na.rm=FALSE): para calcular cuantiles.
  • min(x, na.rm=FALSE): para calcular el mínimo.
  • max(x, na.rm=FALSE): para calcular el máximo.

¿Cuál es el peso promedio de las madres?

mean(dt$weight)
## [1] NA

El resultado de NA se debe a los NA’s presentes en la base de datos. Para remover los NA’s podemos proceder de la siguiente manera:

mean(dt$weight, na.rm=TRUE)
## [1] 128.6258

Vamos ahora a averiguar características de resumen para el peso de los bebés.

¿Cual es el peso promedio de los bebés?

mean(dt$bwt)
## [1] 119.5769

¿Cual es la varianza del peso de los bebés?

var(dt$bwt)
## [1] 332.5682

¿Cual es la desviación del peso de los bebés?

sd(dt$bwt)
## [1] 18.23645

¿Cuales son Q1, D4 y P90 para el peso de los bebés?

quantile(dt$bwt, probs=c(0.25, 0.40, 0.90))
##    25%    40%    90% 
## 108.75 116.00 142.00

14.2 Paquete dplyr

El paquete dplyr es un paquete que se usa para manejar bases de datos. En este enlace puede consultar la ayuda del paquete y ver la viñetas con ejemplos de las funciones del paquete.

El paquete dplyr hace parte de un ecosistema llamado tidyverse, el cual es un conjunto de paquetes complementarios utilizados para hacer análisis de datos.

A continuación una figura con algunos de los paquetes de tidyverse.

A continuación se muestra el hexalogo del paquete dplyr que vamos a utilizar en esta publicación.

Para usar el paquete dplyr podemos cargar a tidyverse o directamente a dplyr así:

library(dplyr)

En el mensaje anterior se aclara que hay unas funciones de dplyr que enmarcaran otras funciones de los paquetes stats y base.

14.3 Pipes en R

En R se tienen dos tipos de operadores pipe:

  • %>% del paquete magrittr.
  • |> nativo y pertenece a la base de R.

Los operadores pipe sirve para escribir instrucciones de manera secuencial. A continuación vamos a mostrar dos ejemplos de la misma operación usando ambos pipe.

El objetivo es tomar la base de datos dt, extraer la variable bwt y al vector o variable resultante calcularle la media con mean.

dt %>% pull(bwt) %>% mean  # Usando pipe de magrittr
## [1] 119.5769
dt |> pull(bwt) |> mean()  # Usando pipe nativo
## [1] 119.5769

De la salida anterior vemos que los resultados son idénticos.

Para ver una comparación de los dos pipe se recomienda ver el siguiente video.

14.4 Estadística descriptiva con dplyr

La función glimpse del paquete dplyr nos da un resumen de las variables de la base de datos.

glimpse(dt)
## Rows: 1,236
## Columns: 7
## $ bwt       <int> 120, 113, 128, 123, 108, 136, 138, 132, 120, 143, 140, 144, …
## $ gestation <int> 284, 282, 279, NA, 282, 286, 244, 245, 289, 299, 351, 282, 2…
## $ parity    <chr> "First born", "First born", "First born", "First born", "Fir…
## $ age       <int> 27, 33, 28, 36, 23, 25, 33, 23, 25, 30, 27, 32, 23, 36, 30, …
## $ height    <int> 62, 64, 64, 69, 67, 62, 62, 65, 62, 66, 68, 64, 63, 61, 63, …
## $ weight    <int> 100, 135, 115, 190, 125, 93, 178, 140, 125, 136, 120, 124, 1…
## $ smoke     <chr> "Not", "Not", "Yes", "Not", "Yes", "Not", "Not", "Not", "Not…

Vamos a extraer una sola variable con pull y luego a calcular la media, varianza y desviación estándar del peso de los bebés.

dt |> pull(bwt) |> mean()
## [1] 119.5769
dt |> pull(bwt) |> var()
## [1] 332.5682
dt |> pull(bwt) |> sd()
## [1] 18.23645
dt |> pull(bwt) |> quantile(probs=c(0.25, 0.40, 0.90))
##    25%    40%    90% 
## 108.75 116.00 142.00

Vamos a calcular las mismas medidas de resumen anteriores pero con escritura secuencial usando el operador pipe |> y la función summarise.

dt |> summarise(media_peso = mean(bwt),
                varianza_peso = var(bwt),
                desvi_peso = sd(bwt),
                Q1 = quantile(bwt, probs=0.25),
                D4 = quantile(bwt, probs=0.40),
                P90 = quantile(bwt, probs=0.90))
##   media_peso varianza_peso desvi_peso     Q1  D4 P90
## 1   119.5769      332.5682   18.23645 108.75 116 142

Vamos a ver cómo cambian las medidas anteriores cuando diferenciamos por el tipo de embarazo.

dt |> group_by(parity) |> 
  summarise(media_peso = mean(bwt),
            varianza_peso = var(bwt),
            desvi_peso = sd(bwt),
            Q1 = quantile(bwt, probs=0.25),
            D4 = quantile(bwt, probs=0.40),
            P90 = quantile(bwt, probs=0.90),
            n = n())
## # A tibble: 2 × 8
##   parity     media_peso varianza_peso desvi_peso    Q1    D4   P90     n
##   <chr>           <dbl>         <dbl>      <dbl> <dbl> <dbl> <dbl> <int>
## 1 First born       120.          345.       18.6   109   116   143   921
## 2 Unknown          118.          294.       17.1   107   114   139   315

Vamos a ver como cambiar las medidas anteriores cuando diferenciamos por fumar.

dt |> group_by(smoke) |> 
  summarise(media_peso = mean(bwt),
            varianza_peso = var(bwt),
            desvi_peso = sd(bwt),
            Q1 = quantile(bwt, probs=0.25),
            D4 = quantile(bwt, probs=0.40),
            P90 = quantile(bwt, probs=0.90),
            n = n())
## # A tibble: 3 × 8
##   smoke media_peso varianza_peso desvi_peso    Q1    D4   P90     n
##   <chr>      <dbl>         <dbl>      <dbl> <dbl> <dbl> <dbl> <int>
## 1 Not         123.          303.       17.4  113   119   144    742
## 2 Yes         114.          328.       18.1  102   109.  138    484
## 3 <NA>        127.          476.       21.8  110.  122.  152.    10

Vamos a ver como cambiar las medidas anteriores cuando diferenciamos por el tipo de embarazo y fumar.

dt |> group_by(parity, smoke) |> 
  summarise(media_peso = mean(bwt),
            varianza_peso = var(bwt),
            desvi_peso = sd(bwt),
            Q1 = quantile(bwt, probs=0.25),
            D4 = quantile(bwt, probs=0.40),
            P90 =quantile(bwt, probs=0.90),
            n = n())
## `summarise()` has grouped output by 'parity'. You can override using the
## `.groups` argument.
## # A tibble: 5 × 9
## # Groups:   parity [2]
##   parity     smoke media_peso varianza_peso desvi_peso    Q1    D4   P90     n
##   <chr>      <chr>      <dbl>         <dbl>      <dbl> <dbl> <dbl> <dbl> <int>
## 1 First born Not         124.          308.       17.6  113   120   145    548
## 2 First born Yes         114.          345.       18.6  101   110   139.   363
## 3 First born <NA>        127.          476.       21.8  110.  122.  152.    10
## 4 Unknown    Not         121.          284.       16.8  112   117   140    194
## 5 Unknown    Yes         113.          275.       16.6  102   109   131    121

Calculando la correlación entre peso bebe y peso madre.

dt |> select(bwt, weight) |> cor()
##        bwt weight
## bwt      1     NA
## weight  NA      1

Como hay NA en alguna de las variables vamos a agregar use='complete.obs' para obtener la correlación.

dt |> select(bwt, weight) |> cor(use='complete.obs')
##              bwt    weight
## bwt    1.0000000 0.1540382
## weight 0.1540382 1.0000000

De la salida anterior vemos que la correlación lineal de Pearson entre ambas variables es 0.1541.

14.5 Creando nuevas variables

En esta sección vamos a mostrar cómo crear nuevas variables a partir de variables ya existentes en la base de datos.

Vamos a transformar la altura y el peso de la madre al sistema internacional de unidades.

dt |> mutate(height_mt = height * 0.0254,
             weight_kg = weight * 0.453592) -> dt

head(dt, n=4)
##   bwt gestation     parity age height weight smoke height_mt weight_kg
## 1 120       284 First born  27     62    100   Not    1.5748  45.35920
## 2 113       282 First born  33     64    135   Not    1.6256  61.23492
## 3 128       279 First born  28     64    115   Yes    1.6256  52.16308
## 4 123        NA First born  36     69    190   Not    1.7526  86.18248

Ahora vamos a calcular el IMC con las nuevas variables así:

dt |> mutate(imc = weight_kg / height_mt^2) -> dt

dt |> head(n=4)
##   bwt gestation     parity age height weight smoke height_mt weight_kg      imc
## 1 120       284 First born  27     62    100   Not    1.5748  45.35920 18.29004
## 2 113       282 First born  33     64    135   Not    1.6256  61.23492 23.17244
## 3 128       279 First born  28     64    115   Yes    1.6256  52.16308 19.73949
## 4 123        NA First born  36     69    190   Not    1.7526  86.18248 28.05778

De la salida anterior vemos la nueva base de datos con las tres nuevas variables creadas con mutate.

14.6 Tablas de frecuencia

Vamos a una la variable de clasificación según peso. Recien nacidos con pesos inferiores a 100 onzas son considerados livianos, aquellos con pesos entre 100 (inclusive) y 140 son aceptables y con pesos de 140 o más se consideran sanos.

dt |> mutate(clasi = cut(bwt, 
                         breaks=c(-Inf, 100, 140, Inf),
                         labels=c("Liviano","Aceptable","Sano"),
                         include.lowest = TRUE)) -> dt

Tabla de frecuencia absoluta para clasificación.

dt |> pull(clasi) |> 
  table()
## 
##   Liviano Aceptable      Sano 
##       174       917       145

Tabla de frecuencia relativa para clasificación.

dt |> pull(clasi) |> 
  table() |> 
  prop.table() |> 
  round(digits=4)
## 
##   Liviano Aceptable      Sano 
##    0.1408    0.7419    0.1173

Tabla de frecuencia absoluta para fumar y clasificación.

dt |> select(smoke, clasi) |> 
  table() |> 
  addmargins()
##      clasi
## smoke Liviano Aceptable Sano  Sum
##   Not      62       581   99  742
##   Yes     111       331   42  484
##   Sum     173       912  141 1226

Tabla de frecuencia relativa para fumar y clasificación.

dt |> select(smoke, clasi) |> 
  table() |> 
  prop.table()
##      clasi
## smoke    Liviano  Aceptable       Sano
##   Not 0.05057096 0.47389886 0.08075041
##   Yes 0.09053834 0.26998369 0.03425775

Tabla de frecuencia relativa por columnas para fumar y clasificación.

dt |> select(smoke, clasi) |> 
  table() |> 
  prop.table(margin=2)
##      clasi
## smoke   Liviano Aceptable      Sano
##   Not 0.3583815 0.6370614 0.7021277
##   Yes 0.6416185 0.3629386 0.2978723

14.7 Gráficos

En esta sección se mostrará como crear algunos gráficos básicos. Para más detalles de como construir otros gráficos se recomienda consultar el libro Gráficos con R.

Boxplot para el peso de los bebés.

boxplot(dt$bwt, las=1, col="darkorchid1", 
        ylab="Peso del bebe (onzas)")
Boxplot para el peso de los bebés.

Figure 14.1: Boxplot para el peso de los bebés.

Boxplot horizontal para el peso de los bebés.

boxplot(dt$bwt, las=1, col="darkseagreen2",
        horizontal=TRUE,
        xlab="Peso del bebe (onzas)")
Boxplot horizontal para el peso de los bebés.

Figure 14.2: Boxplot horizontal para el peso de los bebés.

Boxplot para el peso de los bebés diferenciando por la variable smoke.

boxplot(dt$bwt ~ dt$smoke, las=1)
Boxplot para el peso diferenciando por fumar.

Figure 14.3: Boxplot para el peso diferenciando por fumar.

Editando el boxplot para obtener una mejor apariencia.

boxplot(dt$bwt ~ dt$smoke, las=1, 
        col=c("dodgerblue", "hotpink2"),
        main='Babies weight given smoke status',
        xlab='Does the mother smoke?',
        ylab='Weight (ounces)')
Boxplot mejorado para el peso diferenciando por fumar.

Figure 14.4: Boxplot mejorado para el peso diferenciando por fumar.

¿Como cambiar Not y Yes de smoke para colocar el gráfico en español?

dt$fuma <- ifelse(dt$smoke == 'Not', 'No', 'Si')

Boxplot en español

boxplot(dt$bwt ~ dt$fuma, las=1,
        xlab='¿Fuma la madre?',
        ylab='Peso del bebe (onzas)', las=1)
## Warning in (function (z, notch = FALSE, width = NULL, varwidth = FALSE, :
## Duplicated argument las = 1 is disregarded
Boxplot para el peso de los bebés en español.

Figure 14.5: Boxplot para el peso de los bebés en español.

¿Cual es la relación entre peso del bebe y de la madre?

plot(x=dt$weight, y=dt$bwt,
     xlab='Peso de la madre (libras)',
     ylab='Peso del bebe (onzas)', las=1)
Diagrama de dispersión para peso del bebé versus peso de la madre.

Figure 14.6: Diagrama de dispersión para peso del bebé versus peso de la madre.

Diagrama de dispersión entre pesos diferenciando por fumar

dt2 <- na.omit(dt)

plot(x=dt2$weight, y=dt2$bwt, pch=20, las=1,
     xlab='Peso de la madre (libras)',
     ylab='Peso del bebe (onzas)',
     col=as.factor(dt2$smoke))

legend('bottomright', legend=c('No', 'Si'),
       pch=20, col=1:2)
Diagrama de dispersión para peso del bebé versus peso de la madre diferenciando por fumar.

Figure 14.7: Diagrama de dispersión para peso del bebé versus peso de la madre diferenciando por fumar.

Para ver la relación entre el peso de la madre y la edad de la madre.

plot(dt$age, dt$weight, pch=20, col="tomato", las=1,
     xlab="Edad de la madre",
     ylab="Peso de la madre")
Diagrama de dispersión del peso de la madre versus su edad.

Figure 14.8: Diagrama de dispersión del peso de la madre versus su edad.