-
Notifications
You must be signed in to change notification settings - Fork 12
/
15-factors.Rmd
308 lines (214 loc) · 9.14 KB
/
15-factors.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
# Factores
```{r, include = FALSE}
library(tidyverse)
library(datos)
```
## 15.3 Encuesta social general{-#encuesta}
### 15.3.1 Ejercicios{-#ejercicios-1531}
1. Explora la distribución de `ingreso`. ¿Qué hace que el gráfico de barras por defecto sea tan difícil de comprender? ¿Cómo podrías mejorarlo?
<div class="solucion">
<h3>Solución</h3>
Este es el gráfico por defecto:
```{r}
ggplot(encuesta) +
aes(ingreso) +
geom_bar()
```
Resulta difícil de leer porque las etiquetas de los valores son muy largas. Una opción para resolver esto sería girando el gráfico. Esto se puede hacer con `coord_flip()` o, en la última versión de ggplot, moviendo la variable de eje:
```{r}
ggplot(encuesta) +
aes(ingreso) +
geom_bar() +
coord_flip()
# es lo mismo que
ggplot(encuesta) +
aes(y = ingreso) +
geom_bar()
```
En este caso particular no tendría tanto sentido ordenar las barras de forma ascendente o descente, ya que los datos ya tienen un orden. Algo que sí podríamos hacer es eliminar "No aplica" y cambiar el nombre de la etiqueta del eje x:
```{r}
encuesta %>%
filter(ingreso != "No aplica") %>%
ggplot() +
aes(y = ingreso) +
geom_bar() +
labs(x = "Respuestas")
```
</div>
2. ¿Cuál es la `religion` más común de la encuesta? ¿Cuál es el `partido` más común?
<div class="solucion">
<h3>Solución</h3>
Una forma de encontrar el valor con mayor frecuencia sería contando con `count()` y luego ordenando de mayor a menor con `arrange(desc())` para ver cuál queda primero. Otra opción es utilizar la función `top_n()`, también del paquete **dplyr**.
La religión más común es "Protestante":
```{r}
encuesta %>%
count(religion) %>%
top_n(1)
```
El valor más común en `partido` es "Independiente":
```{r}
encuesta %>%
count(partido) %>%
top_n(1)
```
</div>
3. ¿A qué `religion` se aplica cada `denominacion`? ¿Cómo puedes encontrarlo con una tabla? ¿Cómo lo puedes descubrir con una visualización?
<div class="solucion">
<h3>Solución</h3>
Una forma de hacerlo sería contar las combinaciones de religión y denominación, lo que nos entregaría una tabla en la que podríamos ver cada cruce (por ejemplo, con `encuesta %>% count(religion, denominacion)`). Sin embargo, antes de hacer eso sería bueno eliminar los niveles que corresponden a una denominación: "Sin respuesta", "No sabe", "No aplica", "No denominacional":
```{r}
encuesta %>%
filter(!denominacion %in% c("Sin respuesta", "No sabe", "No aplica", "No denominacional")) %>%
count(religion, denominacion)
```
Las denominaciones corresponden a la religión Protestante. Podemos comprobar que es la única que aparece solo contando `religion`:
```{r}
encuesta %>%
filter(!denominacion %in% c("Sin respuesta", "No sabe", "No aplica", "No denominacional")) %>%
count(religion)
```
En una visualización lo podríamos descubrir con `facet_wrap()`. Podemos hacer un gráfico de columnas para la frecuencia de respuestas por cada denominación. Si faceteamos el gráfico según religión, solo nos aparecerá protestante porque en las otras religiones no hay valores.
```{r}
encuesta %>%
filter(!denominacion %in% c("Sin respuesta", "No sabe", "No aplica", "No denominacional")) %>%
count(religion, denominacion) %>%
ggplot(aes(y = denominacion, x = n)) +
geom_col() +
facet_wrap(~religion)
```
Como se comentó antes en el capítulo, ggplot descarta los niveles no utilizados. Si quisieras que los mostrara igual, podrías agregar la opción `drop = FALSE`, aunque como son tantos los niveles de `denominacion` quedarían amontonadas las etiquetas y habría que editar el tamaño del gráfico para evitar este problema:
```{r}
encuesta %>%
filter(!denominacion %in% c("Sin respuesta", "No sabe", "No aplica", "No denominacional")) %>%
count(religion, denominacion) %>%
ggplot(aes(y = denominacion, x = n)) +
geom_col() +
facet_wrap(~religion, drop = FALSE)
```
</div>
## 15.4 Modificar el orden de los factores {-#modificar-factores}
### 15.4.1 Ejercicios{-#ejercicios-1541}
1. Hay algunos números sospechosamente grandes en `horas_tv`. ¿Es la media un buen resumen?
<div class="solucion">
<h3>Solución</h3>
Miremos los estadísticos de resumen y hagamos un histograma para explorar los datos:
```{r}
summary(encuesta$horas_tv)
encuesta %>%
filter(!is.na(horas_tv)) %>%
ggplot(aes((horas_tv))) + geom_histogram(binwidth = 1)
```
Efectivamente, hay valores demasiado altos. Pareciera que hay personas que ven televisión todo el día y no duermen nunca, lo que es poco verosímil. Podría ser mejor utilizar la mediana como resumen. En todo caso, estos números anormalmente altos son bastante pocos.
</div>
2. Identifica, para cada factor en `encuesta`, si el orden de los niveles es arbitrario o responde a algún principio.
<div class="solucion">
<h3>Solución</h3>
Primero, identifiquemos qué variables son factores. Una forma de hacerlo es utilizar `select_if`, que selecciona columnas de acuerdo a una condición, y luego extraer los nombres de las variables.
```{r}
encuesta %>%
select_if(is.factor) %>%
names()
```
Ahora, revisemos los niveles de cada una de ellas.
En el caso de `estado_civil` pareciera que tenemos dos extremos: nunca se ha casado y casado, y entre ellas están agrupadas las categorías que hacen alusión a gente que estuvo casada, pero ya no.
```{r}
levels(encuesta$estado_civil)
```
En la variable `raza` pareciera no haber ningún orden en particular:
```{r}
levels(encuesta$raza)
```
Si visualizamos los datos, es posible ver que los tres primeros niveles se ordenaron por frecuencia.
```{r}
ggplot(encuesta, aes(raza)) + geom_bar() + scale_x_discrete(drop = FALSE)
```
`ingreso` está ordenado por rangos que van de mayor a menor.
```{r}
levels(encuesta$ingreso)
```
Los niveles de `partido` están ordenados a partir de más republicano a más demócrata.
```{r}
levels(encuesta$partido)
```
`religión` pareciera no tener ningún orden en particular:
```{r}
levels(encuesta$religion)
```
Si visualizamos para chequear, podemos confirmar el orden aleatorio:
```{r}
ggplot(encuesta, aes(y = religion)) + geom_bar() + scale_x_discrete(drop = FALSE)
```
En el caso de `denominacion`, los niveles que pertencen a variantes de una denominacion (luterana, episcopal, metodista, etc.) están agrupados. Pero estos grupos entre sí no responden a un orden en particular:
```{r}
levels(encuesta$denominacion)
```
</div>
3. ¿Por qué mover "No aplica" al inicio de los niveles lo llevó al final del gráfico?
<div class="solucion">
<h3>Solución</h3>
</div>
## 15.5 Modificar los niveles de los factores{-#modificar-niveles}
### 15.5.1 Ejercicios{-#ejercicios-1551}
1. ¿Cómo han cambiado en el tiempo las proporciones de personas que se identifican como Demócratas, Republicanas e Independientes?
<div class="solucion">
<h3>Solución</h3>
Para responder esta pregunta vamos a usar la versión de los datos que se muestran al final de esta sección en que los niveles de `partido` se agruparon con `factor_collapse)`
```{r}
partido_anio <- encuesta %>%
mutate(partido = fct_collapse(partido,
otro = c("Sin respuesta", "No sabe", "Otro partido"),
republicano = c("Fuertemente republicano", "No fuertemente republicano"),
independiente = c("Ind, pro rep", "Independiente", "Ind, pro dem"),
demócrata = c("No fuertemente demócrata", "Fuertemente demócrata")
)) %>%
count(anio, partido)
ggplot(partido_anio) +
aes(anio, n, colour = partido) +
geom_line()
```
Sería mejor si más que el número de respuestas, graficáramos la proporción:
```{r}
partido_anio %>%
group_by(anio) %>%
mutate(proporcion = n / sum(n)) %>%
ggplot() +
aes(anio, proporcion, colour = partido) +
geom_line()
```
</div>
2. ¿Cómo podrías colapsar `ingreso` en un grupo más pequeño de categorías?
<div class="solucion">
<h3>Solución</h3>
Actualmente los niveles agrupan los datos de tres formas: tramos de mil, dos mil y cinco mil dólares:
```{r}
levels(encuesta$ingreso)
```
Una forma de colapsaros en menos categorías sería solo utilizar los tramos de 5000 dólares. Esto hace sentido si revisamos cómo se distribuyen los datos:
```{r}
ggplot(encuesta) +
aes(y = ingreso) +
geom_bar()
```
Para la agrupación, podemos utilizar `fct_collapse()`
```{r}
encuesta %>%
mutate(ingreso_reagrupado = fct_collapse(ingreso,
"Menos de 5000" = c("Menos de 1000", "1000 - 2999", "3000 - 3999", "4000 - 4999"),
"5000 - 9999" = c("5000 - 5999", "6000 - 6999", "7000 - 7999", "8000 - 9999"))) %>%
ggplot() +
aes(y = ingreso_reagrupado) +
geom_bar()
```
También podemos reagrupar "Sin respuesta", "No sabe", "Se niega a responder" y "No aplica" en una categoría a la que podríamos llamar "Desconocido" o "Sin información". Editemos el código anterior para que refleje este cambio:
```{r}
encuesta %>%
mutate(ingreso_reagrupado = fct_collapse(ingreso,
"Menos de 5000" = c("Menos de 1000", "1000 - 2999", "3000 - 3999", "4000 - 4999"),
"5000 - 9999" = c("5000 - 5999", "6000 - 6999", "7000 - 7999", "8000 - 9999"),
"Sin información" = c("Sin respuesta", "No sabe", "Se niega a responder", "No aplica")
)) %>%
ggplot() +
aes(y = ingreso_reagrupado) +
geom_bar()
```
</div>