Visualización y Gestión de Datos. Reto 1

Autor/a

Xabier Lavandero

04/04/2026

4 de abril de 2026

Introducción

Para resolver los retos de la asignatura de Visualización y Gestión de Datos, debéis descargar e instalar R y RStudio y utilizar Quarto dentro de RStudio para elaborar y entregar los resultados en formato HTML.

En este primer reto realizaréis operaciones básicas con variables, manipularéis datos con código y generaréis un documento HTML mediante Quarto.

Para ejecutar correctamente el código, debéis tener instalados, como mínimo, los paquetes dplyr, tidyverse, tibble y knitr.

Actividad 1

Este Reto 1 se basa en el Barómetro del Centro de Investigaciones Sociológicas (CIS) de Marzo 2025. Se ha realizado a población española de ambos sexos de 18 años y más. Se puede consultar el estudio completo en este enlace.

Para realizar el ejercicio, se adjunta el conjunto datos CIS_2025.RData, en formato de R, donde se encuentran las siguientes variables que se han escogido a partir de los datos originales.

Variable Pregunta Escala / categorías respuesta
SEXO Sexo de la persona entrevistada Hombre; Mujer
EDAD Edad de la persona entrevistada Edad (en años)
ESTUDIOS Nivel de estudios alcanzado por la persona entrevistada No universitarios; Universitarios
TRUMP Efectos de la presidencia de Donald Trump en la relación de la Unión Europea y EE. UU. Va a continuar como estaba; Va a cambiar
TRUMP_EEUU Valoración para los EE.UU. de los efectos del cambio de la relación entre la UE y EE. UU. con la presidencia de Donald Trump De 1 (Será muy positivo) a 5 (Será muy malo)
TRUMP_UE Valoración para la UE de los efectos del cambio de la relación entre la UE y EE. UU. con la presidencia de Donald Trump De 1 (Será muy positivo) a 5 (Será muy malo)
PROBVOTO Escala de probabilidad de voto (0-10) en elecciones generales De 0 (Con toda seguridad, no iría a votar) a 10 (Con toda seguridad, iría a votar)
ESCIDEOL Escala de autoubicación ideológica De 1 (Izquierda) a 10 (Derecha)

A partir de las variables, se pueden llevar a cabo diferentes análisis basados en los objetivos o intereses que tengan los investigadores.

  • Antes de empezar, carga los datos CIS_2025.Rdata.

Responde a las siguientes preguntas:

  1. Para cada variable SEXO ,EDAD, ESTUDIOS, TRUMP,TRUMP_EEUU, TRUMP_UE, PROBVOTO ,ESCIDEOL determina la tipología de variable.
Variable Tipo de variable
SEXO Cualitativa / Categórica nominal
EDAD Cuantitativa / Numérica
ESTUDIOS Cualitativa / Categórica ordinal
TRUMP Cualitativa / Categórica nominal
TRUMP_EEUU Cuantitativa / Numérica
TRUMP_UE Cuantitativa / Numérica
PROBVOTO Cuantitativa / Numérica
ESCIDEOL Cuantitativa / Numérica

SEXO = Cualitativa nominal
EDAD = Cuantitativa numérica
ESTUDIOS = Cualitativa ordinal
TRUMP = Cualitativa nominal
TRUMP_EEUU = Cuantitativa numérica (escala ordinal tratada como numérica)
TRUMP_UE = Cuantitativa numérica (escala ordinal tratada como numérica)
PROBVOTO = Cuantitativa numérica
ESCIDEOL = Cuantitativa numérica

  1. Cuantas observaciones tiene el conjunto de datos? 4018 observaciones (personas entrevistadas)
  1. Revisa el conjunto de datos de manera preliminar utilizando las funciones básicas disponibles:
str(CIS_2025)
tibble [4,018 × 8] (S3: tbl_df/tbl/data.frame)
 $ SEXO      : Factor w/ 2 levels "Hombre","Mujer": 1 2 1 1 2 1 1 2 1 1 ...
 $ EDAD      : num [1:4018] 45 60 60 43 38 54 67 71 23 31 ...
 $ ESTUDIOS  : Factor w/ 2 levels "No universitarios",..: 1 1 2 1 1 2 2 2 1 2 ...
 $ TRUMP     : Factor w/ 2 levels "Va a cambiar",..: NA 1 1 1 2 2 1 1 1 2 ...
 $ TRUMP_EEUU: num [1:4018] NA 4 5 5 NA NA 4 5 4 NA ...
 $ TRUMP_UE  : num [1:4018] NA 5 4 2 NA NA 5 5 4 NA ...
 $ PROBVOTO  : num [1:4018] 0 8 10 10 10 10 0 10 8 2 ...
 $ ESCIDEOL  : num [1:4018] 5 1 3 4 10 6 1 1 4 6 ...
summary(CIS_2025)
     SEXO           EDAD                    ESTUDIOS   
 Hombre:2129   Min.   :18.00   No universitarios:1938  
 Mujer :1889   1st Qu.:39.00   Universitarios   :2078  
               Median :51.00   NA's             :   2  
               Mean   :50.96                           
               3rd Qu.:63.00                           
               Max.   :97.00                           
                                                       
                        TRUMP        TRUMP_EEUU       TRUMP_UE    
 Va a cambiar              :3273   Min.   :1.000   Min.   :1.000  
 Va a continuar como estaba: 477   1st Qu.:2.000   1st Qu.:4.000  
 NA's                      : 268   Median :4.000   Median :4.000  
                                   Mean   :3.556   Mean   :3.953  
                                   3rd Qu.:4.000   3rd Qu.:5.000  
                                   Max.   :5.000   Max.   :5.000  
                                   NA's   :973     NA's   :841    
    PROBVOTO         ESCIDEOL     
 Min.   : 0.000   Min.   : 1.000  
 1st Qu.: 9.000   1st Qu.: 3.000  
 Median :10.000   Median : 5.000  
 Mean   : 8.494   Mean   : 4.861  
 3rd Qu.:10.000   3rd Qu.: 6.000  
 Max.   :10.000   Max.   :10.000  
 NA's   :14       NA's   :171     
head(CIS_2025)
# A tibble: 6 × 8
  SEXO    EDAD ESTUDIOS          TRUMP     TRUMP_EEUU TRUMP_UE PROBVOTO ESCIDEOL
  <fct>  <dbl> <fct>             <fct>          <dbl>    <dbl>    <dbl>    <dbl>
1 Hombre    45 No universitarios <NA>              NA       NA        0        5
2 Mujer     60 No universitarios Va a cam…          4        5        8        1
3 Hombre    60 Universitarios    Va a cam…          5        4       10        3
4 Hombre    43 No universitarios Va a cam…          5        2       10        4
5 Mujer     38 No universitarios Va a con…         NA       NA       10       10
6 Hombre    54 Universitarios    Va a con…         NA       NA       10        6
  1. La variable EDAD recoge la edad de la persona entrevistada. Crea una nueva variable llamada NACIMIENTO que estime su año de nacimiento (a partir de EDAD).
CIS_2025 <- CIS_2025 %>%
  mutate(NACIMIENTO = 2025 - EDAD)
  1. Crea una tabla que incluya las variables SEXO EDAD y NACIMIENTO
tabla_basica <- CIS_2025 %>%
  select(SEXO, EDAD, NACIMIENTO)

head(tabla_basica)
# A tibble: 6 × 3
  SEXO    EDAD NACIMIENTO
  <fct>  <dbl>      <dbl>
1 Hombre    45       1980
2 Mujer     60       1965
3 Hombre    60       1965
4 Hombre    43       1982
5 Mujer     38       1987
6 Hombre    54       1971
  1. Muestra una tabla con las personas que tienen estudios universitarios e indica cuántas observaciones (personas) cumplen esa condición
universitarios <- CIS_2025 %>%
  filter(ESTUDIOS == "Universitarios")

nrow(universitarios)
[1] 2078
  1. Muestra una tabla con las personas que tienen estudios universitarios y una edad entre 30 y 35 años (incluidos). Indica también cuántas observaciones cumplen ambas condiciones.
uni_30_35 <- CIS_2025 %>%
  filter(ESTUDIOS == "Universitarios",
         EDAD >= 30 & EDAD <= 35)

nrow(uni_30_35)
[1] 216
  1. Calcula un resumen estadístico (usando la función summarize) del conjunto de datos obteniendo la media de PROBVOTO, la media y la mediana de EDAD, y el valor máximo de EDAD. Nota: Trata los valores perdidos como NA).
resumen <- CIS_2025 %>%
  summarize(
    media_probvoto = mean(PROBVOTO, na.rm = TRUE),
    media_edad = mean(EDAD, na.rm = TRUE),
    mediana_edad = median(EDAD, na.rm = TRUE),
    max_edad = max(EDAD, na.rm = TRUE)
  )
  1. Repite el análisis del ejercicio anterior desagregando por SEXO: calcula los mismos estadísticos por separado para hombres y mujeres.
resumen_sexo <- CIS_2025 %>%
  group_by(SEXO) %>%
  summarize(
    media_probvoto = mean(PROBVOTO, na.rm = TRUE),
    media_edad = mean(EDAD, na.rm = TRUE),
    mediana_edad = median(EDAD, na.rm = TRUE),
    max_edad = max(EDAD, na.rm = TRUE)
  )
  1. Recodifica la variable SEXO para que la categoría “Hombre” pase a llamarse “Masculino” y “Mujer” pase a “Femenino”.
CIS_2025 <- CIS_2025 %>%
  mutate(SEXO = recode(SEXO,
                       "Hombre" = "Masculino",
                       "Mujer" = "Femenino"))
  1. Crea una nueva variable categórica ordinal a partir de EDAD (por ejemplo, EDAD_CAT) que agrupe las edades en los siguientes intervalos:
Rango de edad
De 18 a 25 años
De 26 a 35 años
De 36 a 45 años
De 46 a 55 años
De 56 a 65 años
66 años o más
CIS_2025 <- CIS_2025 %>%
  mutate(EDAD_CAT = case_when(
    EDAD >= 18 & EDAD <= 25 ~ "18-25",
    EDAD >= 26 & EDAD <= 35 ~ "26-35",
    EDAD >= 36 & EDAD <= 45 ~ "36-45",
    EDAD >= 46 & EDAD <= 55 ~ "46-55",
    EDAD >= 56 & EDAD <= 65 ~ "56-65",
    EDAD >= 66 ~ "66+"
  ))
  1. Entre las personas que valoran como muy malos los efectos del cambio en la relación UE–EE.UU. con la presidencia de Donald Trump tanto para la UE (TRUMP_UE = 5) como para EE.UU. (TRUMP_EEUU = 5), y que afirman que con toda seguridad irán a votar (PROBVOTO = 10), ¿cuántas personas hay en cada nivel de ESTUDIOS? Nota:Para resolverlo, utiliza la función filter() para aplicar las condiciones y count() para obtener el recuento por ESTUDIOS.
resultado <- CIS_2025 %>%
  filter(TRUMP_UE == 5,
         TRUMP_EEUU == 5,
         PROBVOTO == 10) %>%
  count(ESTUDIOS)

Actividad 2

Para practicar la creación de bases de datos y la identificación de tipos de variables (nominales, ordinales y numéricas), se construirá un pequeño conjunto de datos desde cero.

  1. Usando la función tibble(), crea un conjunto de datos con cinco países que además incluya una variable nominal, una variable ordinal y dos variables numéricas.
  library(tibble)
library(dplyr)

paises <- tibble(
  pais = c("España", "México", "Alemania", "Brasil", "Japón"),
  continente = c("Europa", "América", "Europa", "América", "Asia"),
  nivel_desarrollo = factor(
    c("alto", "medio", "alto", "medio", "alto"),
    levels = c("bajo", "medio", "alto"),
    ordered = TRUE
  ),
  poblacion_millones = c(48.6, 129.7, 84.4, 203.1, 123.3),
  pib_per_capita = c(33000, 14000, 52000, 11000, 42000)
)
  1. Crea una variable lógica (TRUE/FALSE):
paises <- paises %>%
  mutate(mas_100_millones = poblacion_millones > 100)

paises
# A tibble: 5 × 6
  pais     continente nivel_desarrollo poblacion_millones pib_per_capita
  <chr>    <chr>      <ord>                         <dbl>          <dbl>
1 España   Europa     alto                           48.6          33000
2 México   América    medio                         130.           14000
3 Alemania Europa     alto                           84.4          52000
4 Brasil   América    medio                         203.           11000
5 Japón    Asia       alto                          123.           42000
# ℹ 1 more variable: mas_100_millones <lgl>
  1. Ordena el conjunto de datos según una de las variables numéricas utilizando la función arrange() (puede ser en orden ascendente o descendente).
paises_ordenados <- paises %>%
  arrange(desc(pib_per_capita))

paises_ordenados
# A tibble: 5 × 6
  pais     continente nivel_desarrollo poblacion_millones pib_per_capita
  <chr>    <chr>      <ord>                         <dbl>          <dbl>
1 Alemania Europa     alto                           84.4          52000
2 Japón    Asia       alto                          123.           42000
3 España   Europa     alto                           48.6          33000
4 México   América    medio                         130.           14000
5 Brasil   América    medio                         203.           11000
# ℹ 1 more variable: mas_100_millones <lgl>
  1. Elimina dos países del conjunto de datos que has creado (por ejemplo, filtrándolos por su nombre) y muestra el resultado.
paises_filtrados <- paises %>%
  filter(!pais %in% c("Brasil", "Japón"))

paises_filtrados
# A tibble: 3 × 6
  pais     continente nivel_desarrollo poblacion_millones pib_per_capita
  <chr>    <chr>      <ord>                         <dbl>          <dbl>
1 España   Europa     alto                           48.6          33000
2 México   América    medio                         130.           14000
3 Alemania Europa     alto                           84.4          52000
# ℹ 1 more variable: mas_100_millones <lgl>
  1. Plantea una pregunta adicional de interés que puedas responder con estos datos y resuélvela utilizando las funciones adecuadas y el operador pipe (%>%). Cuál es el PIB per cápita medio de los países con nivel de desarrollo alto?
paises %>%
  filter(nivel_desarrollo == "alto") %>%
  summarise(media_pib_per_capita = mean(pib_per_capita))
# A tibble: 1 × 1
  media_pib_per_capita
                 <dbl>
1               42333.