Repte 3: Com podem resumir una variable?

Autor

Cristina Martínez Jaumejoan

Última modificació

28 de novembre de 2025

Per resoldre els exercicis d’aquest repte, he carregat la llibreria tidyverse que ja inclou dplyr, ggplot2, readr, tidyr, forcats, stringr, etc. i les bases de dades que es proposen. Per fer els gràfics, farem servir la llibreria ggplot.

Activitat 1: El baròmetre de Barcelona

En aquesta activitat farem servir el darrer baròmetre de Barcelona, que és una enquesta que realitza periòdicament l’ajuntament de Barcelona per conèixer la opinió de la ciutadania sobre l’evolució de la ciutat de Barcelona.

  1. Hem descarregat la base de dades en text i format csv. I l’hem importat a R, donant el nom de dades_bop a l’objecte que les conté.
dades_bop <- readr::read_csv("r25044_Barometre_Primera_onada_BD_CSVtext_v1_0.csv")
  1. Ara fem una exploració ràpida de les dades. Indica quin és el nombre d’observacions, quines variables hi ha i com estan codificades i la unitat d’observació.

El marc de dades dades_bop conté 807 observacions i 141 variables. La unitat d’observació és una persona enquestada al Baròmetre de Barcelona i pel que fa a la codificació, la majoria de variables són de tipus caràcter.

# Per una exploració general de les variables podem utilitzar `glimpse()`

# Vista parcial per entendre els valors
head(dades_bop)
# A tibble: 6 × 141
  DATA_ENQ   PADRO_BCN_1A2 NACIO01_ACT_UE NACIO02_ACT_UE  NACIO03_ACT_UE
  <date>     <chr>         <chr>          <chr>           <chr>         
1 2025-05-28 SÍ            ESPANYOLA      <NA>            <NA>          
2 2025-05-27 SÍ            ESPANYOLA      RESTA DE PAÏSOS <NA>          
3 2025-05-28 SÍ            ESPANYOLA      <NA>            <NA>          
4 2025-05-26 SÍ            ESPANYOLA      <NA>            <NA>          
5 2025-05-29 SÍ            ESPANYOLA      <NA>            <NA>          
6 2025-05-26 SÍ            ESPANYOLA      <NA>            <NA>          
# ℹ 136 more variables: NACIO_QUOTA_VOT_1A4 <chr>, NACIO_CANVI_1A2 <chr>,
#   NACIO01_ABANS_UE <chr>, NACIO_EVO <chr>, NACIO_EVO_AGR <chr>, SEXE <chr>,
#   EDAT1899_1A6 <chr>, DISTRICTE <chr>, SITLABORAL_1A7 <chr>,
#   ESTUDIS_1A7 <chr>, ESTUDIS_1A3 <chr>, EVO1A_BCN <chr>, EVO1A_CAT <chr>,
#   EVO1A_ESP <chr>, FUTUR_BCN <chr>, FUTUR_CAT <chr>, FUTUR_ESP <chr>,
#   PROB_BCN <chr>, PROB_BCN_AGR <chr>, VAL_GESTMUNI_1A5 <chr>,
#   VAL_GESTMUNI_1A3 <chr>, VAL_GESTGENE_1A5 <chr>, VAL_GESTGENE_1A3 <chr>, …
# Nombre d'observacions i variables
dim(dades_bop)
[1] 807 141
# Nom de les variables
names(dades_bop)
  [1] "DATA_ENQ"                       "PADRO_BCN_1A2"                 
  [3] "NACIO01_ACT_UE"                 "NACIO02_ACT_UE"                
  [5] "NACIO03_ACT_UE"                 "NACIO_QUOTA_VOT_1A4"           
  [7] "NACIO_CANVI_1A2"                "NACIO01_ABANS_UE"              
  [9] "NACIO_EVO"                      "NACIO_EVO_AGR"                 
 [11] "SEXE"                           "EDAT1899_1A6"                  
 [13] "DISTRICTE"                      "SITLABORAL_1A7"                
 [15] "ESTUDIS_1A7"                    "ESTUDIS_1A3"                   
 [17] "EVO1A_BCN"                      "EVO1A_CAT"                     
 [19] "EVO1A_ESP"                      "FUTUR_BCN"                     
 [21] "FUTUR_CAT"                      "FUTUR_ESP"                     
 [23] "PROB_BCN"                       "PROB_BCN_AGR"                  
 [25] "VAL_GESTMUNI_1A5"               "VAL_GESTMUNI_1A3"              
 [27] "VAL_GESTGENE_1A5"               "VAL_GESTGENE_1A3"              
 [29] "VAL_GESTGOESP_1A5"              "VAL_GESTGOESP_1A3"             
 [31] "INT_VOTAR"                      "INT_PARTIT"                    
 [33] "INT_VOT"                        "NOT_MARTIGALBIS"               
 [35] "NOT_COLLBONI"                   "NOT_SANZ"                      
 [37] "NOT_ALAMANY"                    "NOT_SIRERA"                    
 [39] "NOT_OROPULIDO"                  "VAL_MARTIGALBIS"               
 [41] "VAL_MARTIGALBIS_1A2"            "VAL_COLLBONI"                  
 [43] "VAL_COLLBONI_1A2"               "VAL_SANZ"                      
 [45] "VAL_SANZ_1A2"                   "VAL_ALAMANY"                   
 [47] "VAL_ALAMANY_1A2"                "VAL_SIRERA"                    
 [49] "VAL_SIRERA_1A2"                 "VAL_OROPULIDO"                 
 [51] "VAL_OROPULIDO_1A2"              "MUNI_VOTAR"                    
 [53] "MUNI_PARTIT"                    "MUNI_VOT"                      
 [55] "GENE_VOTAR"                     "GENE_PARTIT"                   
 [57] "GENE_VOT"                       "GOESP_VOTAR"                   
 [59] "GOESP_PARTIT"                   "GOESP_VOT"                     
 [61] "INTERES_POLITICA_MUNI_1A5"      "INTERES_POLITICA_MUNI_1A3"     
 [63] "INTERES_POLITICA_GENE_1A5"      "INTERES_POLITICA_GENE_1A3"     
 [65] "INTERES_POLITICA_GOESP_1A5"     "INTERES_POLITICA_GOESP_1A3"    
 [67] "ES_SOCI01_1A2"                  "ES_SOCI02_1A2"                 
 [69] "ES_SOCI03_1A2"                  "ES_SOCI04_1A2"                 
 [71] "ES_SOCI05_1A2"                  "US_SOCI01_1A2"                 
 [73] "US_SOCI02_1A2"                  "US_SOCI03_1A2"                 
 [75] "US_SOCI04_1A2"                  "US_SOCI05_1A2"                 
 [77] "US_SOCI01_1A3"                  "US_SOCI02_1A3"                 
 [79] "US_SOCI03_1A3"                  "US_SOCI04_1A3"                 
 [81] "US_SOCI05_1A3"                  "FREQ_MITJA01_INFO_POLITICA_1A4"
 [83] "FREQ_MITJA01_INFO_POLITICA_1A2" "FREQ_MITJA02_INFO_POLITICA_1A4"
 [85] "FREQ_MITJA02_INFO_POLITICA_1A2" "FREQ_MITJA03_INFO_POLITICA_1A4"
 [87] "FREQ_MITJA03_INFO_POLITICA_1A2" "FREQ_MITJA04_INFO_POLITICA_1A4"
 [89] "FREQ_MITJA04_INFO_POLITICA_1A2" "FREQ_MITJA05_INFO_POLITICA_1A4"
 [91] "FREQ_MITJA05_INFO_POLITICA_1A2" "PROB_BCN_CIVIC_1A4"            
 [93] "PROB_BCN_CIVIC_1A2"             "PRIO_GESTMUNI_CIVIC_1A5"       
 [95] "VAL_BCN_ECON_1A5"               "VAL_BCN_ECON_1A3"              
 [97] "VAL_LLAR_ECON_1A5"              "VAL_LLAR_ECON_1A3"             
 [99] "EVO1A_BCN_ECON"                 "FUTUR12M_BCN_ECON"             
[101] "EVO1A_LLAR_ECON"                "FUTUR12M_LLAR_ECON"            
[103] "EVO1A_BCN_ATUR"                 "FUTUR12M_BCN_ATUR"             
[105] "IDEO_1A6"                       "SENT_PERTI_1A5"                
[107] "LLOC_NAIX_1A5"                  "LLENGUA_HAB"                   
[109] "PMI_1A3"                        "PROF_ACT_A"                    
[111] "PROF_ACT_B"                     "PROF_ACT"                      
[113] "PROF_ABANS_A"                   "PROF_ABANS_B"                  
[115] "PROF_ABANS_C"                   "PROF_ABANS"                    
[117] "NOENT_ESTUDIS_1A7"              "NOENT_ESTUDIS_1A3"             
[119] "NOENT_SITLABORAL_1A7"           "NOENT_PROF_ACT_A"              
[121] "NOENT_PROF_ACT_B"               "NOENT_PROF_ACT"                
[123] "NOENT_PROF_ABANS_A"             "NOENT_PROF_ABANS_B"            
[125] "NOENT_PROF_ABANS_C"             "NOENT_PROF_ABANS"              
[127] "PMI_ESTUDIS_1A7"                "PMI_ESTUDIS_1A3"               
[129] "PMI_SITLABORAL_1A7"             "PMI_PROF_ACT_A"                
[131] "PMI_PROF_ACT_B"                 "PMI_PROF_ACT"                  
[133] "PMI_PROF_ABANS_A"               "PMI_PROF_ABANS_B"              
[135] "PMI_PROF_ABANS_C"               "PMI_PROF_ABANS"                
[137] "PMI_PROF"                       "NIVELLSOCIO_LLAR"              
[139] "TIPO_ENTLLAR"                   "HAB_RES_1A4"                   
[141] "PES"                           
# Tipus de dades de cada variable (codificació)
sapply(dades_bop, class)
                      DATA_ENQ                  PADRO_BCN_1A2 
                        "Date"                    "character" 
                NACIO01_ACT_UE                 NACIO02_ACT_UE 
                   "character"                    "character" 
                NACIO03_ACT_UE            NACIO_QUOTA_VOT_1A4 
                   "character"                    "character" 
               NACIO_CANVI_1A2               NACIO01_ABANS_UE 
                   "character"                    "character" 
                     NACIO_EVO                  NACIO_EVO_AGR 
                   "character"                    "character" 
                          SEXE                   EDAT1899_1A6 
                   "character"                    "character" 
                     DISTRICTE                 SITLABORAL_1A7 
                   "character"                    "character" 
                   ESTUDIS_1A7                    ESTUDIS_1A3 
                   "character"                    "character" 
                     EVO1A_BCN                      EVO1A_CAT 
                   "character"                    "character" 
                     EVO1A_ESP                      FUTUR_BCN 
                   "character"                    "character" 
                     FUTUR_CAT                      FUTUR_ESP 
                   "character"                    "character" 
                      PROB_BCN                   PROB_BCN_AGR 
                   "character"                    "character" 
              VAL_GESTMUNI_1A5               VAL_GESTMUNI_1A3 
                   "character"                    "character" 
              VAL_GESTGENE_1A5               VAL_GESTGENE_1A3 
                   "character"                    "character" 
             VAL_GESTGOESP_1A5              VAL_GESTGOESP_1A3 
                   "character"                    "character" 
                     INT_VOTAR                     INT_PARTIT 
                   "character"                    "character" 
                       INT_VOT                NOT_MARTIGALBIS 
                   "character"                    "character" 
                  NOT_COLLBONI                       NOT_SANZ 
                   "character"                    "character" 
                   NOT_ALAMANY                     NOT_SIRERA 
                   "character"                    "character" 
                 NOT_OROPULIDO                VAL_MARTIGALBIS 
                   "character"                    "character" 
           VAL_MARTIGALBIS_1A2                   VAL_COLLBONI 
                   "character"                    "character" 
              VAL_COLLBONI_1A2                       VAL_SANZ 
                   "character"                    "character" 
                  VAL_SANZ_1A2                    VAL_ALAMANY 
                   "character"                    "character" 
               VAL_ALAMANY_1A2                     VAL_SIRERA 
                   "character"                    "character" 
                VAL_SIRERA_1A2                  VAL_OROPULIDO 
                   "character"                    "character" 
             VAL_OROPULIDO_1A2                     MUNI_VOTAR 
                   "character"                    "character" 
                   MUNI_PARTIT                       MUNI_VOT 
                   "character"                    "character" 
                    GENE_VOTAR                    GENE_PARTIT 
                   "character"                    "character" 
                      GENE_VOT                    GOESP_VOTAR 
                   "character"                    "character" 
                  GOESP_PARTIT                      GOESP_VOT 
                   "character"                    "character" 
     INTERES_POLITICA_MUNI_1A5      INTERES_POLITICA_MUNI_1A3 
                   "character"                    "character" 
     INTERES_POLITICA_GENE_1A5      INTERES_POLITICA_GENE_1A3 
                   "character"                    "character" 
    INTERES_POLITICA_GOESP_1A5     INTERES_POLITICA_GOESP_1A3 
                   "character"                    "character" 
                 ES_SOCI01_1A2                  ES_SOCI02_1A2 
                   "character"                    "character" 
                 ES_SOCI03_1A2                  ES_SOCI04_1A2 
                   "character"                    "character" 
                 ES_SOCI05_1A2                  US_SOCI01_1A2 
                   "character"                    "character" 
                 US_SOCI02_1A2                  US_SOCI03_1A2 
                   "character"                    "character" 
                 US_SOCI04_1A2                  US_SOCI05_1A2 
                   "character"                    "character" 
                 US_SOCI01_1A3                  US_SOCI02_1A3 
                   "character"                    "character" 
                 US_SOCI03_1A3                  US_SOCI04_1A3 
                   "character"                    "character" 
                 US_SOCI05_1A3 FREQ_MITJA01_INFO_POLITICA_1A4 
                   "character"                    "character" 
FREQ_MITJA01_INFO_POLITICA_1A2 FREQ_MITJA02_INFO_POLITICA_1A4 
                   "character"                    "character" 
FREQ_MITJA02_INFO_POLITICA_1A2 FREQ_MITJA03_INFO_POLITICA_1A4 
                   "character"                    "character" 
FREQ_MITJA03_INFO_POLITICA_1A2 FREQ_MITJA04_INFO_POLITICA_1A4 
                   "character"                    "character" 
FREQ_MITJA04_INFO_POLITICA_1A2 FREQ_MITJA05_INFO_POLITICA_1A4 
                   "character"                    "character" 
FREQ_MITJA05_INFO_POLITICA_1A2             PROB_BCN_CIVIC_1A4 
                   "character"                    "character" 
            PROB_BCN_CIVIC_1A2        PRIO_GESTMUNI_CIVIC_1A5 
                   "character"                    "character" 
              VAL_BCN_ECON_1A5               VAL_BCN_ECON_1A3 
                   "character"                    "character" 
             VAL_LLAR_ECON_1A5              VAL_LLAR_ECON_1A3 
                   "character"                    "character" 
                EVO1A_BCN_ECON              FUTUR12M_BCN_ECON 
                   "character"                    "character" 
               EVO1A_LLAR_ECON             FUTUR12M_LLAR_ECON 
                   "character"                    "character" 
                EVO1A_BCN_ATUR              FUTUR12M_BCN_ATUR 
                   "character"                    "character" 
                      IDEO_1A6                 SENT_PERTI_1A5 
                   "character"                    "character" 
                 LLOC_NAIX_1A5                    LLENGUA_HAB 
                   "character"                    "character" 
                       PMI_1A3                     PROF_ACT_A 
                   "character"                    "character" 
                    PROF_ACT_B                       PROF_ACT 
                   "character"                    "character" 
                  PROF_ABANS_A                   PROF_ABANS_B 
                   "character"                    "character" 
                  PROF_ABANS_C                     PROF_ABANS 
                   "character"                    "character" 
             NOENT_ESTUDIS_1A7              NOENT_ESTUDIS_1A3 
                   "character"                    "character" 
          NOENT_SITLABORAL_1A7               NOENT_PROF_ACT_A 
                   "character"                    "character" 
              NOENT_PROF_ACT_B                 NOENT_PROF_ACT 
                   "character"                    "character" 
            NOENT_PROF_ABANS_A             NOENT_PROF_ABANS_B 
                   "character"                    "character" 
            NOENT_PROF_ABANS_C               NOENT_PROF_ABANS 
                   "character"                    "character" 
               PMI_ESTUDIS_1A7                PMI_ESTUDIS_1A3 
                   "character"                    "character" 
            PMI_SITLABORAL_1A7                 PMI_PROF_ACT_A 
                   "character"                    "character" 
                PMI_PROF_ACT_B                   PMI_PROF_ACT 
                   "character"                    "character" 
              PMI_PROF_ABANS_A               PMI_PROF_ABANS_B 
                   "character"                    "character" 
              PMI_PROF_ABANS_C                 PMI_PROF_ABANS 
                   "character"                    "character" 
                      PMI_PROF               NIVELLSOCIO_LLAR 
                   "character"                    "character" 
                  TIPO_ENTLLAR                    HAB_RES_1A4 
                   "character"                    "character" 
                           PES 
                     "numeric" 
  1. Hem creat una taula de freqüències per la variable PRIO_GESTMUNI_CIVIC_1A5 que recull les respostes a la pregunta: “Per avançar en la millora del comportament dels ciutatans i ciutadanes incívics a la ciutat, què creu que hauria de fer l’ajuntament de Barcelona?”.
# Creem la taula de freqüències absoluta i relativa
freq_prio <- dades_bop |>
  count(PRIO_GESTMUNI_CIVIC_1A5, name = "freq") |>
  mutate(percent = round(freq / sum(freq) * 100, 2)) |>
  arrange(desc(freq))
`freq_prio`
# A tibble: 7 × 3
  PRIO_GESTMUNI_CIVIC_1A5                                freq percent
  <chr>                                                 <int>   <dbl>
1 IMPOSAR SANCIONS MÉS DURES A LES CONDUCTES INCÍVIQUES   274   34.0 
2 AUGMENTAR LA VIGILÀNCIA                                 239   29.6 
3 FER MÉS CAMPANYES DE CONSCIENCIACIÓ                     146   18.1 
4 DONAR MÉS INFORMACIÓ                                     63    7.81
5 DEMANAR COL·LABORACIÓ ALS CIUTADANS I CIUTADANES         43    5.33
6 NO HO SAP                                                26    3.22
7 NO CONTESTA                                              16    1.98

Veiem que la resposta més citada és “Imposar sancions més dures a les conductes incíviques”, amb un 34% de les respostes. Seguida d’“Augmentar la vigilància” amb un 29,6% i “Fer més campanyes de conscienciació” amb un 18,1%. Per tant, podem concloure que la ciutadania prefereix la imposició de més mesures de control i càstig contra l’incivisme, no tant les mesures preventives i informatives.

  1. Calcula la freqüència absoluta i relativa de la variable DISTRICTE.
freq_districte <- dades_bop |>
  count(DISTRICTE, name = "freq") |>
  mutate(percent = round(freq / sum(freq) * 100, 2)) |>
  arrange(desc(freq))

freq_districte
# A tibble: 10 × 3
   DISTRICTE              freq percent
   <chr>                 <int>   <dbl>
 1 EIXAMPLE                134   16.6 
 2 SANT MARTÍ              115   14.2 
 3 SANTS - MONTJUÏC         90   11.2 
 4 HORTA - GUINARDÓ         89   11.0 
 5 NOU BARRIS               84   10.4 
 6 SANT ANDREU              75    9.29
 7 SARRIÀ - SANT GERVASI    73    9.05
 8 GRÀCIA                   63    7.81
 9 LES CORTS                43    5.33
10 CIUTAT VELLA             41    5.08

L’Eixample és el districte amb més persones enquestades (16,6%), seguit de Sant Martí (14,2%) i Sants-Montjuïc (11,2%). Els districtes amb menys presència a la mostra són Les Corts (5,33%) i Ciutat Vella (5,08%).

  1. Quin percentatge de persones de la mostra han nascut a la ciutat? I a Catalunya?
# Percentatge nascuts a Barcelona ciutat
# Taula de freqüències absoluta i relativa del lloc de naixement
freq_lloc_naix <- dades_bop |>
  count(LLOC_NAIX_1A5, name = "n") |>
  mutate(r = round(n / sum(n) * 100, 1))

freq_lloc_naix
# A tibble: 6 × 3
  LLOC_NAIX_1A5                n     r
  <chr>                    <int> <dbl>
1 BARCELONA CIUTAT           474  58.7
2 NO CONTESTA                  1   0.1
3 RESTA D'ESPANYA            118  14.6
4 RESTA DE CATALUNYA          87  10.8
5 RESTA DE LA UNIÓ EUROPEA    34   4.2
6 RESTA DEL MÓN               93  11.5

Del total de 807 persones enquestades, aproximadament un 58,7% han nascut a Barcelona ciutat i un 10,8% a la resta de Catalunya. La resta ha nascut fora de Catalunya (resta d’Espanya, UE o món).

  1. Quin és el problema més greu que té la ciutat segons les persones enquestades? Aquesta informació la recull la variable PROB_BCN.
# Taula de freqüències del problema més greu a Barcelona
prob_bcn <- dades_bop |>
  count(PROB_BCN, name = "freq") |>
  arrange(desc(freq))

prob_bcn
# A tibble: 80 × 2
   PROB_BCN                                freq
   <chr>                                  <int>
 1 PREU DE L'HABITATGE                      121
 2 DELINQÜÈNCIA / ROBATORIS / ATRACAMENTS   113
 3 MANCA D'HABITATGE                         88
 4 INSEGURETAT (NO CONCRETEN)                70
 5 MASSA TURISME                             61
 6 PROMOCIÓ DEL LLOGUER / LLOGUERS CARS      28
 7 NETEJA (NO CONCRETEN)                     24
 8 MANCA DE CIVISME                          21
 9 ELS POLÍTICS / LA POLÍTICA                19
10 IMMIGRACIÓ EXCESSIVA / DESCONTROLADA      19
# ℹ 70 more rows

La categoria més mencionada a la variable PROB_BCN, i per tant, el problema més greu que perceben les persones enquestades, és “PREU DE L’HABITATGE”, amb 121 mencions.

  1. Recodifica els valors de la variable EVO1A_BCN, que recull si la persona enquestada creu que la ciutat ha millorat o empitjorat en el darrer any. Per fer-ho, crea una nova variable a la qual donguis el nom de EVO_NUM, que vagi del 3 (ha millorat) a 1 (ha empitjorat). No ho sap i No contesta deixa’ls com a NA_real_.
dades_bop <- dades_bop |>
  mutate(
    EVO_NUM = case_when(
      EVO1A_BCN == "HA MILLORAT" ~ 3,
      EVO1A_BCN == "ESTÀ IGUAL" ~ 2,
      EVO1A_BCN == "HA EMPITJORAT" ~ 1,
      EVO1A_BCN %in% c("NO HO SAP", "NO CONTESTA") ~ NA_real_,
      TRUE ~ NA_real_
    )
  )
dades_bop |> count(EVO1A_BCN, EVO_NUM)
# A tibble: 5 × 3
  EVO1A_BCN     EVO_NUM     n
  <chr>           <dbl> <int>
1 ESTÀ IGUAL          2   164
2 HA EMPITJORAT       1   365
3 HA MILLORAT         3   250
4 NO CONTESTA        NA     1
5 NO HO SAP          NA    27

He recodificat la variable EVO1A_BCN perquè es pogués utilitzar com a numèrica. Els textos originals no coincidien exactament i per això primer tots els valors sortien com NA. Un cop identificats els literals correctes, he creat EVO_NUM assignant 3 a “HA MILLORAT”, 2 a “ESTÀ IGUAL” i 1 a “HA EMPITJORAT”. Les opcions “NO HO SAP” i “NO CONTESTA” les he deixat com NA_real_.

  1. Hi ha diferències en com veuen l’evolució de la ciutat en funció del sexe? Per veure-ho, fes un gràfic de barres (barplot amb la funció geom_bar() i l’opció position = "dodge") de la distribució de la variable EVO_NUM en funció de SEXE.
# Gràfic de barres de l'evolució de la ciutat segons sexe
dades_bop %>%
  ggplot(aes(x = factor(EVO_NUM), fill = SEXE)) +
  geom_bar(position = "dodge") +
  scale_fill_brewer(palette = "Set2") +
  labs(
    x = "Evolució percebut (1 = empitjora, 3 = millora)",
    y = "Freqüència",
    fill = "Sexe",
    title = "Percepció de l'evolució de Barcelona segons el sexe"
  ) +
  theme_minimal()

He creat un gràfic de barres per comparar la percepció de l’evolució de Barcelona segons el sexe. Per fer-ho, hem utilitzat ggplot() amb geom_bar(position = “dodge”), que permet posar les barres de dones i homes una al costat de l’altra. A l’eix X hi hem posat la variable recodificada EVO_NUM (1 = empitjora, 3 = millora) i a l’eix Y la seva freqüència. També hem utilitzat el color per diferenciar els sexes.

El gràfic mostra que tant dones com homes consideren majoritàriament que Barcelona ha empitjorat. Les dones apareixen més concentrades a la categoria “empitjora”, mentre que els homes tenen una distribució més repartida.

  1. I en funció de l’edat?
dades_bop |> 
  ggplot(aes(x = EVO_NUM, fill = EDAT1899_1A6)) +
  geom_bar(position = "dodge") +
  labs(
    title = "Percepció de l'evolució de Barcelona segons l'edat",
    x = "Evolució percebuda (1 = empitjora, 3 = millora)",
    y = "Freqüència",
    fill = "Edat"
  ) +
  theme_minimal()

Primer he representat la distribució de la variable EVO_NUM en funció de l’edat utilitzant un gràfic de barres amb geom_bar(position = “dodge”), que permet comparar visualment com percep cada grup d’edat l’evolució de Barcelona durant l’últim any. Cada barra correspon a un valor d’evolució (1 = empitjora, 3 = millora) i els colors diferencien les franges d’edat.

Pel que fa al resultat, tots els grups d’edat coincideixen a considerar que la ciutat ha empitjorat, però aquesta percepció és més forta com més gran és l’edat. Les persones de 65 anys o més són les que més afirmen que la ciutat ha empitjorat, mentre que els grups més joves (especialment 18–24 i 25–34) mostren una distribució una mica més equilibrada entre “igual” i “millora”. Però la tendència general és clara, a més edat, més percepció negativa de l’evolució de Barcelona.

  1. Quina és la puntuació mitjana i mediana que rep l’alcalde, Jaume Collboni? La informació sobre la puntuació està recollida en la variable VAL_COLLBONI, però pensa que R no la llegeix com a numèrica perquè algunes categories inclouen text. Abans de calcular la puntuació mitjana i mediana, el primer que has de fer és transformar-la com a numèrica (anomena-la VAL_COLLBONI_num). No ho sap, no contesta o no el coneix considera-les com a NA_real (2 punts).
# Primer cal recodificar VAL_COLLBONI a variable numèrica
dades_bop <- dades_bop |>
  mutate(
    VAL_COLLBONI_num = case_when(
      VAL_COLLBONI %in% c("NO CONTESTA", "NO HO SAP", "NO EL CONEIX") ~ NA_real_,
      TRUE ~ as.numeric(VAL_COLLBONI)
    )
  )

# I ja podem calcular mitjana i mediana
mitjana_collboni <- mean(dades_bop$VAL_COLLBONI_num, na.rm = TRUE)
mediana_collboni <- median(dades_bop$VAL_COLLBONI_num, na.rm = TRUE)

#La mitjana és
mitjana_collboni
[1] 5.378738
#La mediana és
mediana_collboni
[1] 5
  1. Com es distribueix aquesta valoració en funció de com se sitúa la persona enquestada en l’eix esquerra-dreta (variable IDEO_1A6)? Mostra-ho en un diagrama de caixa.
# Primer cal convertim la ideologia en factor ordenat
dades_bop <- dades_bop |>
  mutate(
    IDEO_1A6 = factor(
      IDEO_1A6,
      levels = c("1 ESQUERRA", "2", "3", "4", "5 CENTRE", "6", "7", "8", "9", "10 DRETA")
    )
  )

# Després fem el diagrama de caixa per representar la valoració Collboni segons ideologia
ggplot(dades_bop, aes(x = IDEO_1A6, y = VAL_COLLBONI_num)) +
  geom_boxplot(fill = "#69b3a2", alpha = 0.7) +
  labs(
    title = "Valoració de Jaume Collboni segons posició ideològica",
    x = "Ideologia (1 = esquerra, 10 = dreta)",
    y = "Valoració de Collboni"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Amb ggplot() he fet el gràfic de caixa boxplot. A aes() he indicat quina variable va a l’eix X (IDEO_1A6) i quina va a l’eix Y (VAL_COLLBONI_num), que és la valoració recodificada abans de text a numèrica amb mutate. El diagrama de caixa permet veure la distribució de les puntuacions dins de cada grup ideològic. He afegit labs() per posar títol i noms als eixos i theme_minimal() per fer-lo més net i llegible. L’última línia, axis.text.x = element_text(angle = 45), serveix per girar les etiquetes de l’eix X i evitar que se sobreposin.

La valoració de Collboni és similar al llarg de tot l’eix ideològic, amb valoracions properes al 5. Tot i això, les persones situades més cap al centre i centre-esquerra tendeixen a valorar-lo una mica millor, mentre que les posicions més extremes presenten dispersió i puntuacions més baixes.

Activitat 2: Evolució de la població ocupada a Catalunya

En aquesta activitat volem mostrar, mitjançant un gràfic, l’evolució del percentatge de persones ocupades de manera comparada en dues comarques de Catalunya entre els anys 2015 i 2022.

El primer que fem és obtenir les dades, que les proporciona l’Institut d’Estadística de Catalunya (IDESCAT). Més concretament, farem servir les dades que recull l’[índex socioeconòmic territorial]. La base de dades “Indicadors socioeconòmics. Valors” amb una desagregació geogràfica de “Comarques i Aran”.

  1. Carrega les dadades amb el nom dades_ist.
dades_ist <- readr::read_csv("ist14074com.csv")
  1. Fes una exploració de les dades per veure quines variables tens i com estan codificades. Quines categories té la variable concepte?

El conjunt de dades conté 2.016 observacions i 5 variables, i la seva unitat d’observació és un indicador socioeconòmic concret (concepte) per a una comarca i un any determinats.

Pel que fa a la codificació, la variable any és numèrica, mentre que la resta (comarca o Aran, concepte, estat i valor) estan importades com a variables de tipus caràcter. La variable concepte recull els indicadors disponibles.

# Per una exploració general de les variables podem utilitzar `glimpse()`

# Vista parcial per entendre els valors
head(dades_ist)
# A tibble: 6 × 5
    any `comarca o Aran` concepte                                    estat valor
  <dbl> <chr>            <chr>                                       <chr> <chr>
1  2015 Alt Camp         població ocupada (%)                        <NA>  61.5 
2  2015 Alt Camp         treballadors de baixa qualificació (%)      <NA>  15.3 
3  2015 Alt Camp         població amb estudis baixos (%)             ..    null 
4  2015 Alt Camp         població jove sense estudis postobligatori… ..    null 
5  2015 Alt Camp         estrangers de països de renda baixa o mitj… <NA>  10.3 
6  2015 Alt Camp         renda mitjana per persona (€)               <NA>  11251
# Nombre d'observacions i variables
dim(dades_ist)
[1] 2016    5
# Nom de les variables
names(dades_ist)
[1] "any"            "comarca o Aran" "concepte"       "estat"         
[5] "valor"         
# Tipus de dades de cada variable (codificació)
sapply(dades_ist, class)
           any comarca o Aran       concepte          estat          valor 
     "numeric"    "character"    "character"    "character"    "character" 
# Categories de la variable 'concepte'
unique(dades_ist$concepte)
[1] "població ocupada (%)"                             
[2] "treballadors de baixa qualificació (%)"           
[3] "població amb estudis baixos (%)"                  
[4] "població jove sense estudis postobligatoris (%)"  
[5] "estrangers de països de renda baixa o mitjana (%)"
[6] "renda mitjana per persona (€)"                    
  1. Crea un nou marc de dades que només contingui només la informació sobre la població ocupada. Anomena el marc de dades pob_ocupada.
pob_ocupada <- dades_ist |>
  filter(concepte == "població ocupada (%)")
  1. Com segurament hauràs observat en el punt 2, la variable valor s’ha importat com a variable de caràcter quan hauria de ser numèrica. Transfórmala sobre el marc de dades que has creat en l’apartat anterior creant una de nova que tingui com a nom valor_num.
pob_ocupada <- pob_ocupada |>
  mutate(valor_num = as.numeric(valor))
#Revisem si ha funcionat
head(pob_ocupada)
# A tibble: 6 × 6
    any `comarca o Aran` concepte             estat valor valor_num
  <dbl> <chr>            <chr>                <chr> <chr>     <dbl>
1  2015 Alt Camp         població ocupada (%) <NA>  61.5       61.5
2  2015 Alt Empordà      població ocupada (%) <NA>  56.9       56.9
3  2015 Alt Penedès      població ocupada (%) <NA>  63.1       63.1
4  2015 Alt Urgell       població ocupada (%) <NA>  53.0       53  
5  2015 Alta Ribagorça   població ocupada (%) <NA>  61.7       61.7
6  2015 Anoia            població ocupada (%) <NA>  59.8       59.8

Hem creat una nova variable valor_num transformant la variable valor a format numèric perquè s’havia importat com a caràcter i, per tant, no es podia utilitzar per fer càlculs ni representar gràficament. Els valors no numèrics s’han convertit en NA.

  1. Fent servir el marc de dades pob_ocupada, que només recull els valors per a la població ocupada, pots indicar quines són les 5 comarques de Catalunya que han tingut un percentatge mitjà de població ocupada més elevat al llarg del període? I les que menys?
# Mitjana de població ocupada per comarca
mitjanes_comarques <- pob_ocupada |>
  group_by(`comarca o Aran`) |>
  summarise(mitjana_ocupada = mean(valor_num, na.rm = TRUE)) |>
  arrange(desc(mitjana_ocupada))

# Les top 5 comarques amb més població ocupada
top5 <- head(mitjanes_comarques, 5)
top5
# A tibble: 5 × 2
  `comarca o Aran` mitjana_ocupada
  <chr>                      <dbl>
1 Pla de l'Estany             71.3
2 Segarra                     70.3
3 Moianès                     70.1
4 Solsonès                    69.5
5 Garrotxa                    69.5
# Les top 5 comarques amb menys població ocupada
bottom5 <- tail(mitjanes_comarques, 5)
bottom5
# A tibble: 5 × 2
  `comarca o Aran` mitjana_ocupada
  <chr>                      <dbl>
1 Tarragonès                  59.8
2 Baix Ebre                   59.3
3 Baix Penedès                58.4
4 Montsià                     56.3
5 Alt Urgell                  56.2

Hem calculat el percentatge mitjà de població ocupada per comarca utilitzant el marc de dades pob_ocupada. Primer hem agrupat les observacions per comarca i hem calculat la mitjana de la variable valor_num. Després hem ordenat les comarques de més a menys.

  1. Segueix treballant amb el marc de dades pob_ocupada. Selecciona dues de les comarques i crea un gràfic que mostri l’evolució del percentatge de la població ocupada per cada una de les comarques que has escollit.
#Per veure el llistat de comarques amb la taula de freqüències 
table(pob_ocupada$`comarca o Aran`)

         Alt Camp       Alt Empordà       Alt Penedès        Alt Urgell 
                8                 8                 8                 8 
   Alta Ribagorça             Anoia              Aran             Bages 
                8                 8                 8                 8 
        Baix Camp         Baix Ebre      Baix Empordà    Baix Llobregat 
                8                 8                 8                 8 
     Baix Penedès        Barcelonès          Berguedà          Cerdanya 
                8                 8                 8                 8 
 Conca de Barberà            Garraf         Garrigues          Garrotxa 
                8                 8                 8                 8 
          Gironès           Maresme           Moianès           Montsià 
                8                 8                 8                 8 
          Noguera             Osona     Pallars Jussà    Pallars Sobirà 
                8                 8                 8                 8 
     Pla d'Urgell   Pla de l'Estany           Priorat     Ribera d'Ebre 
                8                 8                 8                 8 
         Ripollès           Segarra            Segrià             Selva 
                8                 8                 8                 8 
         Solsonès        Tarragonès        Terra Alta            Urgell 
                8                 8                 8                 8 
Vallès Occidental   Vallès Oriental 
                8                 8 
#He escollit Alt Camp i Baix Camp
dues_comarques <- pob_ocupada |>
  filter(`comarca o Aran` %in% c("Alt Camp", "Baix Camp"))

# Gràfic d'evolució del percentatge de població ocupada
ggplot(dues_comarques, aes(x = any, y = valor_num, color = `comarca o Aran`)) +
  geom_line(linewidth = 1) +
  geom_point(size = 2) +
  labs(
    title = "Evolució de la població ocupada (%) a Alt Camp i Baix Camp",
    x = "Any",
    y = "Percentatge població ocupada",
    color = "Comarca"
  ) +
  theme_minimal()

BIBLIOGRAFIA

IDESCAT. (2022). Índex socioeconòmic territorial. GENCAT. Disponible a: (https://www.idescat.cat/dades/obertes/ist)

Mas, J. [Jordi]. Vall, P. [Pau]. (2024). R en Ciències Socials II. FUOC. Disponible a (https://jmas.quarto.pub/r-ciencies-socials-ii/)

Oficina Municipal de Dades. (2025). Baròmetre de Barcelona - Primera onada 2025. R.I.S. Disponible a: (https://w10.bcn.cat/APPS/riswestudis/editEstudi.do?reqCode=inspectById&estudiid=8060&set-locale=ca_ES#)

Posit. (s.d.). Data visualization with ggplot2. CC BY SA Posit Software, PBC.