Reto 3

Solución PAC3

Eugenia Cornide

Última modificación

19 de abril de 2026

Para resolver los ejercicios de este reto, usa las funciones de la librería dplyr que has aprendido hasta ahora. Considera si necesitas otras librerías para abrir, por ejemplo, las bases de datos que se proponen. Para hacer los gráficos, usa la librería ggplot. Un gráfico debe poder entenderse por sí solo, por lo que lo más importante cuando los hagas es que tengas presente aspectos como, por ejemplo, que los nombres de los ejes o la sleyendas sean idenfiticables, o que los colores (o formas) que uses permitan una buena identificación entre las categorías.

Actividad 1

En esta actividad usaremos un marco de datos que contiene información del Barómetro de Opinión Pública del CEO. És una encuesta que se realiza periodicamente en Cataluña y contiene diversas variables relacionadas con opiniones políticas y sociales. Con estos datos haremos un sencillo análisis de la opinión pública en Cataluña. Aprovecharemos que los datos estan colgados en la web del CEO para importarlas directamente de allí. Para hacerlo, copiaremos el link en el que se encuentran estos datos dentro de la función read_delim. Esta funcion permite importar ficheros de texto como a base de datos.

Mostrar código.
#Recuerda que todos los chunks estan en eval = F, para activarlos debes canviar a eval = T
ceo <- readr::read_delim(
  "https://upceo.ceo.gencat.cat/wsceop/9928/Microdades_anonimitzades_1145.csv",
  delim = ";",
  locale = readr::locale(encoding = "ISO-8859-1") # Así nos aseguramos que los acentos se importan correctamente.
)
  1. Realiza una exploración rápida del mismo con las funciones que conoces, identificando el numero de observaciones, qué variables tiene, como están codificadas y la unidad de observación.
Mostrar código.
#glimpse(ceo) #nos da la estructura, el numero de variables y tipos, si son de texto, numericas o categóricas
dim(ceo) #nos dice el numero de filas y columnas
[1] 2000  300
Mostrar código.
#names(ceo) #da la lista de los nombres de todas las variables. Las oculto para no alargar el ejercicio.

El dataset contiene 2000 observaciones (filas) y 300 variables (columnas), donde cada fila corresponde a una persona encuestada, es decir, la unidad de observación es el individuo.

Las variables se distribuyen entre variables categóricas, variables numéricas y variables de tipo carácter.

Las variables incluyen información sociodemográfica y opiniones políticas.

Actividad 2

  1. Crea una tabla de frecuencias para la variable ‘MONARQUIA_REPUBLICA’ (¿Qué forma de gobierno prefiere usted, monarquía o república?) y comenta el resultado.
Mostrar código.
ceo |>
  group_by(MONARQUIA_REPUBLICA) |> #agrupo los datos por categoria
  summarise(n = n()) |> #suma cuantas personas hay en cada grupo
 mutate(per = round(n / sum(n) * 100, 1)) #calcula la frecuencia relativa
# A tibble: 5 × 3
  MONARQUIA_REPUBLICA     n   per
  <chr>               <int> <dbl>
1 Monarquia             335  16.8
2 No contesta            52   2.6
3 No ho sap             132   6.6
4 República            1424  71.2
5 Una altra              57   2.9

Los resultados arrojan una preferencia de la población catalana hacia un modelo de estado republicano, seguido de una gran proporcion de personas que destaca la monarquía como forma de gobierno, Hay un elevado número de peronas que no saben o no responde. En este caso, la ausencia de respuesta no necesariamente puede estar relacionada con una falta de opinion o criterio de las personas encuestadas, sino que puede verse afectada por el contexto sociopolítico de Cataluña. Este aspecto puede ser relevante de cara a la interpretación de los datos.

  1. Crea una tabla con LLOC_NAIX (¿Me podría decir dónde nació?) que te permita responder a la pregunta siguiente: ¿Qué porcentaje de personas de la muestra han nacido en Cataluña (Catalunya, en catalán)?
Mostrar código.
ceo |>
    count(LLOC_NAIX)
# A tibble: 3 × 2
  LLOC_NAIX                         n
  <chr>                         <int>
1 A Catalunya                    1405
2 A altres comunitats autònomes   400
3 Fora d'Espanya                  195
Mostrar código.
ceo |>
  group_by(LLOC_NAIX) |> #agrupa a las personas por lugar de nacimiento
  summarise(n = n()) |> #cuenta las personas de cada grupo
  mutate(per = round(n / sum(n) * 100, 1)) |> #establece el porcentaje en cada grupo
  filter(LLOC_NAIX == "A Catalunya") #filtra el resulado Cataluña
# A tibble: 1 × 3
  LLOC_NAIX       n   per
  <chr>       <int> <dbl>
1 A Catalunya  1405  70.2

El análisis de la variable LLOC_NAIX muestra que aproximadamente un 70% de la muestra ha nacido en Cataluña. Primero se han consultado los resultados sobre el lugar de nacimiento para asegurar la respuesta y luego establecer el porcentaje. Este resultado encaja con el lugar de realización de la encuesta, aunque también refleja la población nacida en otros territorios.

  1. Calcula la frecuencia absoluta y relativa de la variable REC_PARLAMENT_VOT (Recuerdo de voto en el Parlament de aquellos que votaron). Elimina de la tabla los casos que no recuerdan haber votado (” “) con ‘filter’ antes de calular las frecuencias
Mostrar código.
 ceo |>
  filter(REC_PARLAMENT_VOT != " ") |>  # elimina la opción no recuerdo. Aquí hay que hacer el filtro antes para que no se alteren los resultados
  group_by(REC_PARLAMENT_VOT) |>      # agrupa lso resultados por partido votado
  summarise(n = n()) |>               # cuenta los resultados de cada opción
 mutate(per = round(n / sum(n) * 100, 1)) # calcula la frecuencia relativa
# A tibble: 15 × 3
   REC_PARLAMENT_VOT       n   per
   <chr>               <int> <dbl>
 1 Aliança Catalana       31   2.4
 2 Altres partits          4   0.3
 3 C's                     1   0.1
 4 CUP                    66   5.1
 5 Comuns Sumar           83   6.4
 6 ERC                   255  19.8
 7 En blanc               29   2.3
 8 Junts per Catalunya   184  14.3
 9 No contesta            55   4.3
10 No ho sap              40   3.1
11 Nul                    10   0.8
12 PACMA                   9   0.7
13 PP                     66   5.1
14 PSC/PSOE              385  29.9
15 VOX                    69   5.4

La frecuencia absoluta nos indica el número total de votantes de cada partido, mientras que la relativa nos da el porcentaje de cada opción con respecto al total consultado, en este caso, de las opciones de partidos consultados sin las respuestas que indicaban no recordar el voto.

  1. ¿Cual fué el partido que más gente recuerda haber votado en aquellas elecciones? Elimina de la tabla los casos que no recuerdan haber votado (” “) con ‘filter’ y muestra sólo el valor más frecuente (moda) para la variable REC_PARLAMENT_VOT
Mostrar código.
ceo |>
  filter(REC_PARLAMENT_VOT != " ") |> # elimina la opción no recuerdo.
  group_by(REC_PARLAMENT_VOT) |>      # agrupa los resultados por partido votado
  summarise(n = n()) |>               # cuenta los resultados de cada opción
  arrange(desc(n))                    #ordena de mayor a menor. El n con mayor frecuencia absoluta es la moda
# A tibble: 15 × 2
   REC_PARLAMENT_VOT       n
   <chr>               <int>
 1 PSC/PSOE              385
 2 ERC                   255
 3 Junts per Catalunya   184
 4 Comuns Sumar           83
 5 VOX                    69
 6 CUP                    66
 7 PP                     66
 8 No contesta            55
 9 No ho sap              40
10 Aliança Catalana       31
11 En blanc               29
12 Nul                    10
13 PACMA                   9
14 Altres partits          4
15 C's                     1

El partido más votado según la encuesta fue PSC/PSOE (29,9%), seguido de ERC (19,8%) y Junts per Catalunya (14,3%). (El porcentaje se ha obtenido en la tabla anterior).

  1. Convierte la variable SATIS_DEMOCRACIA (¿Está usted muy, bastante, poco o nada satisfecho/a con el funcionamiento de nuestra democracia?) en una variable ordinal (factor) con el comando ‘mutate’ y ordena las categorias de respuesta de la manera siguiente: “Molt satisfet/a”, “Bastant satisfet/a”, “Poc satisfet/a”, “Gens satisfet/a”, “No ho sap”, “No contesta”. Después, Calcula la frecuencia absoluta y relativa.

Ten en cuenta que:

  • “Molt satisfet/a” significa “Muy satisfecho/a”
  • “Bastant satisfet/a” significa “Bastante satisfecho/a”
  • “Poc satisfet/a” significa “Poco satisfecho/a”
  • “Gens satisfet/a” significa “Nada satisfecho/a”
  • “No ho sap” significa “No lo sabe”
Mostrar código.
#primero hay que recodificar a factor ordinal


ceo <- ceo |>
  mutate(                          
    SATIS_DEMOCRACIA = factor(SATIS_DEMOCRACIA,    #modifica la variable en ordinal  dentro de la base de datos, con factor
      ordered = TRUE,                              #convertimos en ordinal
      levels = c(                                  #establece el orden que queremos
        "Molt satisfet/a",
        "Bastant satisfet/a",
        "Poc satisfet/a",
        "Gens satisfet/a",
        "No ho sap",
        "No contesta")))
  #calculamos la frecuencia absoluta y relativa
ceo |>
  count(SATIS_DEMOCRACIA, sort = T)  |> #cuenta cuantos casos hay en cada categoria y los ordena
  mutate(per = round(n / sum(n) * 100, 1)) #frecuencia relativa        
# A tibble: 6 × 3
  SATIS_DEMOCRACIA       n   per
  <ord>              <int> <dbl>
1 Poc satisfet/a       949  47.4
2 Bastant satisfet/a   526  26.3
3 Gens satisfet/a      425  21.2
4 Molt satisfet/a       65   3.2
5 No ho sap             30   1.5
6 No contesta            5   0.2
  1. Recodifica los valores de VAL_GOV_CAT_0_10 de tal manera que crees la variable VAL_GOV_CAT_0_10_NUM en el dataset ceo, que vaya del 10 al 1. No ho sap y No contesta dejalos cómo NA_real_.

Ten en cuenta que:

  • “10 Molt bona” significa “10 Muy buena”
  • “0 Molt dolenta” significa “0 Muy mala”
  • “No ho sap” significa “No lo sabe”

Primero comprobamos qué valores tiene la variable VAL_GOB_CAT_0_10

Mostrar código.
unique(ceo$VAL_GOV_CAT_0_10)    #comprobamos que valores tiene la variable
 [1] "5"              "7"              "6"              "4"             
 [5] "8"              "2"              "3"              "0 Molt dolenta"
 [9] "9"              "1"              "10  Molt bona"  "No ho sap"     
[13] "No contesta"   
Mostrar código.
ceo <- ceo |>
  mutate(                       #creamos una nueva variable
    VAL_GOV_CAT_0_10_NUM = case_when(  #codificamos la variable categórica a  numerica
      VAL_GOV_CAT_0_10 == "10 Molt bona" ~ 10,
      VAL_GOV_CAT_0_10 == "9" ~ 9,
      VAL_GOV_CAT_0_10 == "8" ~ 8,
      VAL_GOV_CAT_0_10 == "7" ~ 7,
      VAL_GOV_CAT_0_10 == "6" ~ 6,
      VAL_GOV_CAT_0_10 == "5" ~ 5,
      VAL_GOV_CAT_0_10 == "4" ~ 4,
      VAL_GOV_CAT_0_10 == "3" ~ 3,
      VAL_GOV_CAT_0_10 == "2" ~ 2,
      VAL_GOV_CAT_0_10 == "1" ~ 1,
      VAL_GOV_CAT_0_10 == "0 Molt dolenta" ~ 0,
      VAL_GOV_CAT_0_10 %in% c("No ho sap", "No contesta") ~ NA_real_, #asignamos NA_real a los valores NS/NC
      .default = NA_real_
    )
  )
  1. Calcula la media y la mediana de la variable VAL_GOV_CAT_0_10_NUM segun recuerdo de voto REC_PARLAMENT_VOT y comenta brevemente el resultado. Recuerda eliminar a las personas que no recuerdan haber votado y las que no saben o no contestan la valoración del gobierno. Para resolver este ejercicio utilizamos los cálculos elaborados previamente. En primer lugar, filtramos los resultados eliminando las variables indicadas, personas que no recuerdan el voto y los que no saben, no contestan.A continuación averiguamos los valores de la media y la mediana.
Mostrar código.
ceo_filtro <- ceo |>
  filter(
    !REC_PARLAMENT_VOT %in% c("No ho sap", "No contesta", " "),   #elimina los que no recuerdan el voto (no saben, no contestan + vacío)
    !is.na(VAL_GOV_CAT_0_10_NUM)                             #elimina los NA que creamos antes
  )

ceo_filtro |>
  group_by(REC_PARLAMENT_VOT) |> #cuenta los resultados de cada categoría
  summarise(
    media = mean(VAL_GOV_CAT_0_10_NUM, na.rm = TRUE), #calculamos la media
    mediana = median(VAL_GOV_CAT_0_10_NUM, na.rm = TRUE), #calculamos la mediana
    n = n()
  )
# A tibble: 13 × 4
   REC_PARLAMENT_VOT   media mediana     n
   <chr>               <dbl>   <dbl> <int>
 1 Aliança Catalana     3.13     3      31
 2 Altres partits       2.25     2       4
 3 C's                  4        4       1
 4 CUP                  4.95     5      64
 5 Comuns Sumar         5.64     6      78
 6 ERC                  5.37     6     247
 7 En blanc             4.38     4.5    26
 8 Junts per Catalunya  4.55     5     178
 9 Nul                  3.4      4      10
10 PACMA                2.67     4       9
11 PP                   3.44     4      64
12 PSC/PSOE             5.84     6     359
13 VOX                  3        3      68
  1. Ahora veremos si hay diferencias segun la edad en la valoración del gobierno. Haz un barplot (geom_bar, utiliza la opción position="dodge") de la distribucion de la variable VAL_GOV_CAT_0_10_NUM por EDAT_GR (Grupo de edad).
Mostrar código.
ggplot(ceo_filtro, #creamos el gráfico sobre nuestra seleccion anterior
       aes(x = EDAT_GR, #marca los esteticos
           fill = factor(VAL_GOV_CAT_0_10_NUM))) +   #colorea las barras por grado de valoracion
  geom_bar(position = "dodge") #esto junta las barras

Los resultados muestran diferencias significativas en cuanto al rango de edad de las personas encuestadas, destacando una valoreacion muy negativa en la franja de los 35 a los 64, especialmente en los más jovenes de este rango. Las personas de mayor edad son quienes valoran mas positivamente el gobierno.

Actividad 3

En esta actividad analizaremos un marco de datos obtenido a partir del Banco Mundial. El Banco Mundial pone a disposición pública una gran cantidad de indicadores comparados entre países sobre desarrollo económico y social, como el producto interior bruto, la esperanza de vida, la educación o el mercado laboral. Para importar estos datos directamente desde internet utilizaremos el paquete WDI, que permite descargar indicadores internacionales actualizados de forma sencilla desde R. Si no tienes el paquete instalado debes instalarlo con la función install.packages("WDI") y cargarlo.

Mostrar código.
library(WDI)

wdi <- WDI(
  country = "all",
  indicator = c(
    gdp = "NY.GDP.PCAP.KD",
    lifeExp = "SP.DYN.LE00.IN",
    population = "SP.POP.TOTL"
  ),
  start = 2000,
  end = 2023
) %>%
  as_tibble()
  1. En primer lugar realiza una exploración del marco de datos wdi. No olvides explicar si tenemos NA y en qué variables.
Mostrar código.
glimpse(wdi) #nos da la estructura, el numero de variables y tipos, si son de texto, numericas o categóricas
Rows: 6,384
Columns: 7
$ country    <chr> "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan",…
$ iso2c      <chr> "AF", "AF", "AF", "AF", "AF", "AF", "AF", "AF", "AF", "AF",…
$ iso3c      <chr> "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AF…
$ year       <int> 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,…
$ gdp        <dbl> 308.3183, 277.1181, 338.1400, 346.0716, 338.6373, 363.6401,…
$ lifeExp    <dbl> 55.00500, 55.51100, 56.22500, 57.17100, 57.81000, 58.24700,…
$ population <dbl> 20130327, 20284307, 21378117, 22733049, 23560654, 24404567,…
Mostrar código.
summary(wdi) #nos da informacion de cada variable.
   country             iso2c              iso3c                year     
 Length:6384        Length:6384        Length:6384        Min.   :2000  
 Class :character   Class :character   Class :character   1st Qu.:2006  
 Mode  :character   Mode  :character   Mode  :character   Median :2012  
                                                          Mean   :2012  
                                                          3rd Qu.:2017  
                                                          Max.   :2023  
                                                                        
      gdp            lifeExp        population       
 Min.   :   233   Min.   :14.66   Min.   :9.544e+03  
 1st Qu.:  1769   1st Qu.:65.17   1st Qu.:1.453e+06  
 Median :  5324   Median :71.96   Median :9.688e+06  
 Mean   : 14380   Mean   :70.51   Mean   :2.869e+08  
 3rd Qu.: 18070   3rd Qu.:76.88   3rd Qu.:5.986e+07  
 Max.   :225884   Max.   :86.37   Max.   :8.064e+09  
 NA's   :273      NA's   :24      NA's   :24         

Tras el análisis de los datos podemos determinar que el marco de datos contiene observaciones sobre los distintos paises del mundo por años.Las variables que contienen ausencia de datos, principalmente en las variables numéricas gdp,lifeExp y population, lo que puede deberse a la frecuencia o forma de recoger los daos de cada país.

  1. Escoje dos países y visualiza cómo ha evolucionado la esperanza de vida a lo largo del tiempo. Comenta brevemente cómo estaba distribuída en las dos regiones entre el 2000 i el 2023.
Mostrar código.
wdi |>
  filter(country %in% c("Spain", "Angola")) |> #filtramos para elegir dos países
  ggplot(aes(x = year, y = lifeExp, color = country)) + #establecemos los criterios de la gráfica
  geom_line() + #elegimos una grafica de línea para mostrar la evolución de una variable a partir de una segunda variable de tipo temporal
  labs(x = "Año", y = "Esperanza de vida")

Los resultados muestran un crecimiento positivo en ambos países entre 2000 y 2023, si bien es mucho más acusado en el país africano que en España. España presenta niveles más altos durante todo el periodo, pero con un crecimiento más estable y moderado. En cambio, Angola parte de valores mucho más bajos, pero experimenta un crecimiento más rápido y sostenido a lo largo del tiempo. En ambos casos, hay un descenso de la esperanza de vida coincidente con la pandemia del COVID, en 2019-2020, si bien los efectos de esta crisis son mas significativos al inicio de la misma en España y posteriormente en Angola. A partir de ese momento se mantiene la tendencia positiva de la gráfica.

  1. Haz un histograma con todos los datos de los mismos dos países, separado por un geom_facet():
Mostrar código.
wdi |>
  filter(country %in% c("Spain", "Angola")) |> #selecciona los dos países a comparar
  ggplot(aes(x = lifeExp)) +
  geom_histogram(binwidth = 1, fill = "lightblue", color = "black") +
  facet_wrap(~country)

El gráfico muestra la distribución de los años de esperanza de vida en ambos países.

  1. Hazte una pregunta sobre uno o diversos países que puedas resolver mediante una visualización de las que has estudiado en esta unidad. Respondela con un gráfico.

¿Qué relación existe entre el PIB per cápita y la esperanza de vida en Angola entre 2000 y 2023, y cómo ha evolucionado esta relación a lo largo del tiempo?

Mostrar código.
wdi |> 
  filter(country == "Angola") |>  # Filtramos solo para Angola
    ggplot(aes(x = gdp, y = lifeExp)) +  # Estéticos
  geom_point(alpha = 0.6) +  # Puntos (observaciones)
  geom_smooth(method = "lm") +  # Línea de relación entre las variables 
  
  labs(
    title = "Relación entre PIB per cápita y esperanza de vida",
    x = "PIB per cápita",
    y = "Esperanza de vida"
  )

La gráfica resultante compara la evolucion de la esperanza de vida con el aumento del PIB per cápita de la oblación. Se observa un aumento progresivo en ambos aspectos, como indica la linea ascendente. Aunque hay dispersion en los datos en algunos años, se observa una relacion positiva entre ambar variables a lo largo del tiempo.