dades_bop <- readr::read_csv("r25044_Barometre_Primera_onada_BD_CSVtext_v1_0.csv")Repte 3: Com podem resumir una variable?
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.
- Hem descarregat la base de dades en text i format csv. I l’hem importat a R, donant el nom de
dades_bopa l’objecte que les conté.
- 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"
- Hem creat una taula de freqüències per la variable
PRIO_GESTMUNI_CIVIC_1A5que 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.
- 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%).
- 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).
- 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.
- 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 deEVO_NUM, que vagi del 3 (ha millorat) a 1 (ha empitjorat). No ho sap i No contesta deixa’ls com aNA_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_.
- 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 variableEVO_NUMen funció deSEXE.
# 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.
- 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.
- 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-laVAL_COLLBONI_num). No ho sap, no contesta o no el coneix considera-les com aNA_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
- 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”.
- Carrega les dadades amb el nom
dades_ist.
dades_ist <- readr::read_csv("ist14074com.csv")- 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 (€)"
- 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 (%)")- Com segurament hauràs observat en el punt 2, la variable
valors’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 nomvalor_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.
- 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.
- 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.