Sesión : Visualización de datos
Taller de Investigación: Política Cuantitativa “CUANTIPOL” - UNMSM
Descarguemos e importemos la data:
El Barómetro de las Américas es el proyecto más conocido de LAPOP. Este estudio es un estudio comparativo científicamente de valores y comportamientos democráticos que cubre todos los países independientes de América del Norte, Central y del Sur, así como un número significativo de países del Caribe. El trabajo de LAPOP en el Barómetro de las Américas incluye el diseño de encuestas, el diseño de muestras, la prueba previa cualitativa e iterativa de nuevos módulos, la auditoría de datos, el análisis y la elaboración de informes.
Utilizaremos la siguiente data del 2021 de Vanderbilt University para utilizar las principales funciones dentro de Tidyverse y las más útiles para nuestro trabajo en el taller.
Instalamos y corremos los paquetes y librerías que utilizaremos:
::p_load(haven, # Import foreign statistical formats
pacman# Tools for examining and cleaning dirty data
janitor, # Interactive web-based graph
plotly, # To map variables to aesthetics
ggplot2, # Packages and tools for the R programming
tidyverse, # Comparar gráficas
cowplot, # Gráfico de densidad de crestas
ggridges )
- Importamos desde Github:
<- read_dta("https://github.com/Taller-UNMSM-CUANTIPOL-2023/Visualizacion-de-datos/raw/main/documentos/PER_2021_LAPOP.dta") |>
df_lapop clean_names() # Takes and returns a data.frame clean
#names(df_lapop) # Nombre de las variables del df
#str(df_lapop) # Estructura del df, tipo de variables
#class(df_lapop) # Tipo del vector
ggplot2
- Este paquete sirve para crear gráficos basados en la data seleccionada. También se le puede indicar una serie de parámetros como el color y tipo de letra, los títulos de los gráficos y más características que se indican con los comando.
Recordemos:
Tipos de variables
En las sesiones previas hemos estudiado estos tipos de variables:
TIPO |
|
---|---|
Variables nominales |
|
Variables ordinales |
|
Variables continuas | Estatura, peso, ingreso mensual, extensión, PBI per cápita, % de participación electoral. |
Variables discretas | Número de hijos, edad, número de revocatorias, número de postas médicas, población. |
En ese sentido, debemos crear gráficos según el tipo de variables de interés:
Algo más: factores
En R, las variables nominales se denominan factores, las variables ordinales como factores ordinales/ordenados , es decir, pueden.
Por otro lado, las variables continuas y discretas como num. En algunos casos, se puede encontrar lectura de variables como int (interger), que también son variables numéricas.
Variable categórica nominal: jc15a
& q1tb
JC15A. ¿Cree usted que cuando el país enfrenta momentos muy difíciles, se justifica que el presidente del país cierre el Congreso y gobierne sin Congreso?
#str(df_lapop$jc15a)
#table(df_lapop$jc15a) # 1: 640, 2: 821
#sum(is.na(df_lapop$jc15a)) # Advertimos NA's: 1577
<- df_lapop |>
df_congre filter(!is.na(jc15a)) |> # Borramos NA's de la columna
mutate(disolucion_c = as.factor(jc15a)) |>
mutate(disolucion_c = factor(disolucion_c, levels = levels(disolucion_c),
labels = c("Si","No")))
Subseteamos solo la variable y la sobreescribiremos en la misma data:
<- df_congre |>
df_congre group_by(disolucion_c) |>
count() |>
ungroup() |>
mutate(pcnt = n / sum(n)) |> # Creamos una columna de proporción
arrange(pcnt) |> # Oderna ascendentemente
mutate(etiquetas = scales::percent(pcnt)) # Otra columna con el porcentaje
Recordemos…
usamos el pipe operator
|>
como un “conector”, es útil pensarlo como un ” y luego”.creamos un dataframe llamado “df”,Agrupamos los datos por la variable “sex”;
Contamos la frecuencia de las categorias de sex, es decir, Hombre-Mujer en esta base de datos;
Desgrupamos la data para que no afecté el siguiente paso;
Usamos mutate para crear la variable pcnt en la cual vamos a dividir n(cantidad de observaciones en cada categoría)/ la suma total de observaciones de la muestra;
ordenamos la variable creada de menor a mayor;
creamos otra variable llamada etiqueta en donde generamos los porcentajes de cada categoria según la cantidad de observaciones en cada una.
= ggplot(df_congre, aes(x = reorder(disolucion_c, n), y = n,
bp fill = disolucion_c)) +
geom_bar(stat = "identity") + # Data precalculada (transformación estadistica)
scale_fill_brewer(palette = "Paired") + # Color de las barras
coord_flip() +
labs(x = "", y = "Cantidad de entrevistadxs",
title = "Entrevistadxs según si justifica el cierre del congreso",
subtitle = "", caption = "LAPOP, PERU 2021",
fill = "¿Disolución del Congreso?") + # Leyenda
theme(plot.title = element_text(hjust = 0.8)) + # Centrar Título
theme(panel.background = element_rect(fill = "white", colour = "white")) +
geom_text(aes(label = etiquetas), vjust = 1.5, color = "Black", size = 5)
#bp
ggplotly(bp)
Entrevistados según la justificación del cierre del congreso.
Q1TB. Para fines estadísticos, ¿me podría por favor decir cuál es su género?
#str(df_lapop$q1tb)
#table(df_lapop$q1tb) # 1: 1617, 2: 1418, 3: 3
# Eliminando casos perdidos:
sum(is.na(df_lapop$q1tb)) # NA's: 0
[1] 0
<- df_lapop |>
df_sex filter(!is.na(q1tb)) |> # Borramos NA's de la columna
mutate(sex = as.factor(q1tb)) |>
mutate(sex = factor(sex, levels = levels(sex),
labels = c("Hombre","Mujer", "Otro")))
# Guardemos también en la data principal:
<- df_lapop |>
df_lapop filter(!is.na(q1tb)) |> # Borramos NA's de la columna
mutate(sex = as.factor(q1tb)) |>
mutate(sex = factor(sex, levels = levels(sex),
labels = c("Hombre","Mujer", "Otro")))
<- df_sex |>
df_pc group_by(sex) |>
count() |>
ungroup() |>
mutate(pcnt = n / sum(n)) |>
arrange(pcnt) |>
mutate(etiquetas = scales::percent(pcnt))
GRAFICO DE SECTORES (PIE CHART)
= ggplot(df_pc, aes(x = "", y = pcnt, fill = sex)) +
pc geom_col(width = 1, color = "white") + # Para los bordes
geom_label(aes(label = etiquetas), position = position_stack(vjust = 0.5),
show.legend = FALSE) +
coord_polar("y", start = 0) + # Para convertir la barra en circulo
theme_void() + # Borra todo lo que esta alrededor del grafico
guides(fill = guide_legend(title = "sexo")) +
scale_fill_brewer(palette = "Paired") + # Color del gráfico
labs(x = "", y = "Cantidad de encuestadxs",
title = "Encuestadxs según sexo",
subtitle = "", caption = "LAPOP, PERU 2021",
fill = "¿Disolución del Congreso?")
# Agregamos el título
#pc
<- plot_ly(df_pc,
pc2 labels = ~ sex,
values = ~ pcnt,
type = 'pie')
<- pc2 |>
pc2 layout(title = 'Grafico Dinámico Pie',
xaxis = list(showgrid = FALSE,
zeroline = FALSE,
showticklabels = FALSE),
yaxis = list(showgrid = FALSE,
zeroline = FALSE,
showticklabels = FALSE))
pc2
Variable Categórica ordinal: m1
M1. Hablando en general acerca del gobierno actual, ¿diría usted que el trabajo que está realizando el Presidente Francisco Sagasti es…?:
- Percepción respecto a la labor del presidente Vizcarra…
#str(df_lapop$m1)
#table(df_lapop$m1) # 1: 640, 2: 821
#sum(is.na(df_lapop$m1)) # Advertimos NA's: 1577
<- df_lapop |>
df_pre filter(!is.na(m1)) |> # Borramos NA's de la columna
mutate(percepcion = as.factor(m1)) |>
mutate(percepcion = factor(percepcion, levels = levels(percepcion),
labels = c("Muy bueno", "Bueno", "Regular",
"Malo", "Muy malo"), ordered = T))
#table(df_pre$percepcion)
#str(df_pre$percepcion)
Subseteamos solo la variable y la sobreescribiremos en la misma data:
<- df_pre |>
df_pre group_by(percepcion) |>
count() |>
ungroup() |>
mutate(pcnt = n / sum(n)) |> # Creamos una columna de proporción
arrange(pcnt) |> # Oderna descendentemente
mutate(etiquetas = scales::percent(pcnt)) # Otra columna con el porcentaje
#df_pre
Gráfica Pie: percepcion
Gráfica de barras: percepcion
= ggplot(df_pre, aes(x = reorder(percepcion, n), y = n,
bp2 fill = percepcion)) +
geom_bar(stat = "identity") + # Data precalculada (transformación estadistica)
scale_fill_brewer(palette = "Paired") + # Color de las barras
coord_flip() +
labs(x = "Categorías", y = "Frecuencias",
title = "Entrevistadxs según su percepción de la labor del presidente",
subtitle = "", caption = "LAPOP, PERU 2021",
fill = "Nivel de percepción:") + # Leyenda
theme(plot.title = element_text(hjust = 0.8)) + # Centrar Título
theme(panel.background = element_rect(fill = "white", colour = "white")) +
geom_text(aes(label = etiquetas), vjust = 1.5, color = "Black", size = 5)
#bp2
ggplotly(bp2)
rownames(df_pre) = df_pre$n # Etiquetas
Boxplot
#boxplot(df_pre$m1) # Boxplot basico de R
<- ggplot(df_pre, aes(x = "", y = reorder(percepcion, n), color = "")) +
bp3 geom_boxplot(outlier.shape = NA) +
coord_flip() + # Volteamos el gráfico
scale_fill_brewer(palette = "Paired") +
theme(legend.position = "top", axis.text.y = element_blank(),
panel.background = element_rect(fill = "white",
colour = "white")) + # Quitamos categorías
geom_jitter(width = 0.5,
colour = 2 ,
shape = 17,
size = 1) + # Agregamos los casos como puntos
labs(title = "Percepción de satisfacción respecto a la labor del presidente Vizcarra",
x = "", y = "Percepción")
#bp3
ggplotly(bp3) # Boxplot dinámico
INTERPRETACION:
- La mayoría de personas considera que la labor del expresidente Sagasti ha sido regular.
- El 2.90% de las personas considera que la labor del expresidente Sagasti ha sido muy mala, mientras que el 3.79 considera que fue muy buena. En particular, el 50.27% de los encuestados, es decir, la mayoría considera que su labor fue regular.
Variable númerica (Continuas o discretas): confi_ins
Creación del indicador confianza en las instituciones en el Perú:
Definir qué es un sistema politico
qué significa confianza
Luego las personas que realizan las encuestas, a traves de una serie preguntas van a medir dicho concepto. ¿cómo resumir dichas preguntas en un numero? - Indice aditivo: sumar las variables.
Definimos las variables que conforman el indicador de confianza en las instituciones…
B13
. ¿Hasta qué punto tiene confianza usted en el Congreso? 49
B21
. ¿Hasta qué punto tiene confianza usted en los partidos políticos? 51
B32
. ¿Hasta qué punto tiene usted confianza en su municipalidad? 52
B47A
. ¿Hasta qué punto tiene usted confianza en las elecciones en este país? 54
c(49, 51, 52, 54)] = lapply(df_lapop[, c(49, 51, 52, 54)], as.numeric) # Convertimos a v. númericas
df_lapop[,
# Visualizamos un resumen estadistico de cada variable:
|>
df_lapop select(b13, b21, b32, b47a) |>
summary()
b13 b21 b32 b47a
Min. :1.000 Min. :1.000 Min. :1.000 Min. :1.000
1st Qu.:1.000 1st Qu.:1.000 1st Qu.:1.000 1st Qu.:2.000
Median :2.000 Median :2.000 Median :3.000 Median :4.000
Mean :2.297 Mean :2.214 Mean :3.117 Mean :3.616
3rd Qu.:3.000 3rd Qu.:3.000 3rd Qu.:4.000 3rd Qu.:5.000
Max. :7.000 Max. :7.000 Max. :7.000 Max. :7.000
NA's :2280 NA's :2272 NA's :1542 NA's :1542
#df_lapop$confi_ins = df_lapop$b13 + df_lapop$b21 + df_lapop$b32 + df_lapop$b47a
<- df_lapop |>
df_lapop mutate(confi_ins = b13 + b21 + b32 + b47a)
summary(df_lapop$confi_ins)
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
4.00 7.00 10.00 11.12 15.00 27.00 2650
$confi_ins = ((df_lapop$confi_ins - 4) / 23) * 100
df_lapop# Restamos el mínimo y divimos entre el máximo ya restado
# y finalmente se multiplica * 100: (Indice aditivo de 0 a 100)
<- df_lapop |>
df_lapop filter(!is.na(confi_ins)) # Eliminamos los NA's
#Resumen del indicador:
summary(df_lapop$confi_ins)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.00 13.04 26.09 30.94 47.83 100.00
HISTOGRAMA: confi_ins
<- ggplot(df_lapop, aes(x = confi_ins)) +
h geom_histogram(breaks = seq(100), fill = "blue",
alpha = 0.5, position = "identity") +
labs(title = "Confianza en la instituciones", y = "", x = "Index",
subtitle = "", caption = "LAPOP 2021") +
theme(plot.title = element_text(hjust = 0.5)) +
theme(panel.background = element_rect(fill = "white", colour = "white")) +
geom_vline(aes(xintercept = mean(confi_ins, na.rm = T)),
color = "blue",
linetype = "dashed",
size = 1)
#h
ggplotly(h)
BOXPLOT: confi_ins
<- ggplot(df_lapop, aes(x = "", y = confi_ins, color = "")) +
bp2 geom_boxplot(utlier.shape = NA) +
coord_flip() +
theme(legend.position = "top", axis.text.y = element_blank(),
panel.background = element_rect(fill = "white", colour = "white")) +
geom_jitter(width = 0.2,
color = 2,
shape = 17,
size = 1) +
labs(title = "El apoyo al sistema político según el sexo", x = "", y ="Index",
subtitle = "", caption = "@luccemhu")
#bp2
ggplotly(bp2)
Y si agregamos… sex: q1tb?
- Recordemos que guardamos esta variable en una nueva columna.
Violin Plot
Permite una comprensión de la propagación y la densidad de nuestros datos, pero hacerlo sin usar el resumen de cinco números.
Comparemoslo con el boxplot a traves de
cowplot
<- df_lapop |> # Boxplot
p1 ggplot(aes(x = sex , y = confi_ins, color = sex)) +
geom_boxplot() +
theme(legend.position = "bottom") +
geom_dotplot(binaxis = 'y',
stackdir = 'center',
dotsize = 0.5)
<- df_lapop |> # Violin plot
p2 ggplot(aes(x = sex , y = confi_ins, color = sex)) +
geom_violin() +
theme(legend.position = "bottom") +
geom_dotplot(binaxis = 'y',
stackdir = 'center',
dotsize = 0.5)
plot_grid(p1, p2) # Comparamos ambas gráficas
Ridgeline Plots: ggridges
- Útil para la visualización compacta y la comparación de distribuciones.
<- df_lapop |>
p3 ggplot(aes(x = confi_ins, y = sex, color = sex)) +
geom_density_ridges(alpha = 0.5)
p3
Ahora, compara los 3 gráficos en un solo plot:
- Hint:
cowplot
Bibliografía:
Ritchey, F. (2006). Estadística para las ciencias sociales. México: Mc Gray Hill Interamericana. Cap.3,4,5). http://metodos-avanzados.sociales.uba.ar/wp-content/uploads/sites/216/2021/07/Ritchey-2002_Teorica.pdf
De la puente, C. (2015). Estadística y Gráficos. Estadística aplicada a las Ciencias Sociales - Videotutoriales de enseñanza-aprendizaje. Diapositivas
Ballesteros, E. (2015). Estadística descriptiva univariante mediante el gráfico de caja y bigotes. Estadística aplicada a las Ciencias Sociales - Videotutoriales de enseñanza-aprendizaje. Diapositivas
Más recursos: