---
title: "Claude Code a RStudio per a l'Anàlisi de Dades Polítiques"
subtitle: "Una sessió pràctica amb el Baròmetre d'Opinió Política del CEO — versió pla Pro"
author: "Anàlisi de Dades Polítiques — Sessió de Taller"
date: today
format:
html:
toc: true
toc-depth: 3
toc-location: left
number-sections: true
code-fold: show
code-tools: true
theme: cosmo
highlight-style: github
embed-resources: true
pdf:
toc: true
number-sections: true
geometry: margin=1in
execute:
eval: false
echo: true
warning: false
message: false
---
::: {.callout-important}
## Nota sobre el pla Pro i Claude Code
Aquest document és per a usuaris del **pla Pro de claude.ai** ($20/mes). Bones notícies: **el pla Pro inclou accés a Claude Code** sense necessitat de clau API separada.
Com funciona:
- Claude Code s'autentica via el vostre compte de claude.ai (OAuth), igual que quan inicieu sessió al web
- **No cal cap clau API ni cap configuració de facturació addicional**
- L'ús de Claude Code **compta conjuntament** amb l'ús de claude.ai — tots dos comparteixen els límits del pla Pro
- Si en algún moment arribeu al límit, podeu esperar que es reiniciï (cada 5 hores) o activar l'opció d'ús addicional des del vostre compte
⚠️ **Important:** Si teniu la variable `ANTHROPIC_API_KEY` configurada al sistema per qualsevol raó, Claude Code la usarà en lloc de la subscripció Pro i us generarà càrrecs per consum de l'API. En cas de dubte, comproveu que **no** teniu aquesta variable configurada (vegeu la secció d'autenticació).
Sobre Windows:
- Els blocs de comandes de terminal es mostren com a text i s'han d'executar manualment al **Terminal de RStudio** (PowerShell per defecte a Windows)
- Useu **Eines → Terminal → Terminal nou** (o `Maj+Alt+T`) per obrir-lo
:::
::: {.callout-note}
## Presentació del taller
Aquesta sessió introdueix **Claude Code**, l'assistent de programació amb IA d'Anthropic, integrat directament a **RStudio**. L'utilitzarem per accelerar l'anàlisi del **Baròmetre d'Opinió Política (BOP)** del Centre d'Estudis d'Opinió (CEO) de la Generalitat de Catalunya — un dels conjunts de dades d'enquesta longitudinal més rics disponibles per estudiar l'opinió pública catalana.
Al final d'aquesta sessió, sereu capaços de:
- Instal·lar i configurar Claude Code al terminal i a l'entorn RStudio
- Usar Claude Code per escriure, depurar i explicar codi R de manera interactiva
- Aplicar Claude Code a tasques reals amb dades d'enquesta: càrrega, neteja, ponderació i visualització de dades del BOP
- Crear i usar **skills** — plantilles de prompts reutilitzables — per estandarditzar el vostre flux de treball analític
- Saber quan (i quan no) confiar en el codi generat per IA
:::
---
# Context: Què és Claude Code?
Claude Code és un assistent de programació amb IA de línia de comandes creat per Anthropic. A diferència de les eines d'IA basades en xat, opera **dins del vostre entorn de desenvolupament** — pot llegir els vostres fitxers, entendre el context del projecte, executar codi i suggerir edicions directament. Penseu-hi com un programador parell amb IA que coneix la vostra base de codi.
A RStudio, Claude Code s'executa al panell **Terminal** (no a la Consola R), però les seves sortides flueixen directament cap als vostres scripts i documents. Això el fa ideal per a:
- Esbossar codi que després inspeccioneu i executeu a R
- Explicar què fa el codi existent
- Depurar missatges d'error ràpidament
- Escriure documentació i comentaris
- Automatitzar tasques de dades repetitives
::: {.callout-warning}
## Principi fonamental: la IA com a accelerador, no com a autoritat
Claude Code és una eina potent, però comet errors. **Sempre heu de llegir, entendre i provar cada fragment de codi que genera.** Aquest taller us donarà els marcs per fer-ho de manera eficaç.
:::
---
# Instal·lació i Configuració
## Requisits previs
Abans d'instal·lar Claude Code necessiteu:
1. **Node.js** (versió 18 o posterior) — Claude Code s'executa sobre Node.js
2. **Un compte de claude.ai amb pla Pro actiu** — si no en teniu, subscriviu-vos a [claude.ai/upgrade](https://claude.ai/upgrade)
3. **RStudio** (versió 2022.07 o posterior recomanada)
**No cal cap clau API separada.** Usareu les mateixes credencials (correu + contrasenya) que quan accediu a [claude.ai](https://claude.ai).
Comproveu la versió de Node.js al **Terminal de RStudio** (panell inferior):
```powershell
node --version
npm --version
```
La sortida hauria de mostrar `v18.x.x` o superior per a Node.js. Si Node.js no està instal·lat, descarregueu l'instal·lador per a Windows de [nodejs.org](https://nodejs.org) i seguiu els passos. Un cop instal·lat, **tanqueu i torneu a obrir RStudio** perquè reconegui Node.js al Terminal.
## Instal·lació de Claude Code
Claude Code s'instal·la com a paquet npm global. Executeu aquesta comanda al **Terminal de RStudio**:
```powershell
npm install -g @anthropic-ai/claude-code
```
::: {.callout-warning}
## Problema habitual a Windows: permisos d'execució de scripts
Si obteniu un error del tipus `claude : El terme 'claude' no es reconeix...` o un error de política d'execució, executeu primer:
```powershell
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
```
I torneu a intentar la instal·lació.
:::
Verifiqueu la instal·lació:
```powershell
claude --version
```
## Autenticació
## Autenticació amb el pla Pro
La primera vegada que executeu Claude Code, s'obrirà el navegador per autenticar-vos amb el vostre compte de claude.ai. No cal cap clau API. Executeu al **Terminal de RStudio**:
```powershell
claude
```
Se us demanarà que trieu el mètode d'autenticació. Seleccioneu **"Sign in with Claude.ai"** (o equivalent) i seguiu el flux al navegador amb el correu i la contrasenya del vostre compte Pro.
Un cop autenticat, Claude Code recordarà les credencials per a sessions futures.
::: {.callout-warning}
## Comproveu que no teniu una clau API configurada
Si en algun moment heu configurat la variable `ANTHROPIC_API_KEY` al sistema (per exemple, per a un altre projecte), Claude Code l'usarà en lloc de la subscripció Pro i us generarà càrrecs inesperats. Comproveu-ho a la **Consola R**:
```r
Sys.getenv("ANTHROPIC_API_KEY") # Ha de retornar "" (buit)
```
Si retorna alguna cosa, podeu eliminar-la del fitxer `.Renviron` amb:
```r
usethis::edit_r_environ()
# Esborreu la línia ANTHROPIC_API_KEY=... i deseu el fitxer
# Reinicieu RStudio
```
Podeu verificar quin compte usa Claude Code en qualsevol moment amb:
```powershell
claude /status
```
:::
::: {.callout-note}
## Límits d'ús compartits
L'ús de Claude Code **compta conjuntament** amb l'ús de claude.ai. El pla Pro ofereix com a mínim 5 vegades l'ús del pla gratuït, però hi ha un límit per sessió (reseteja cada 5 hores) i un límit setmanal.
Consells per gestionar l'ús:
- Per a tasques llargues, dividiu-les en passos concrets
- Eviteu adjuntar fitxers de dades grans directament — describiu-ne l'estructura en text
- Si arribeu al límit, podeu esperar que es reiniciï o activar l'opció d'"ús addicional" des del vostre compte de claude.ai
:::
## Obrir Claude Code a RStudio
A RStudio, obriu el panell **Terminal** (Eines → Terminal → Terminal nou, o `Maj+Alt+T`). Navegueu a la carpeta del projecte i llanceu Claude Code:
```powershell
cd C:\Usuaris\el-vostre-nom\el-meu-projecte-bop
claude
```
::: {.callout-tip}
## Consell: navegar fins al projecte a Windows
Si heu creat un projecte de RStudio (fitxer `.Rproj`), el Terminal ja s'obre a la carpeta del projecte automàticament. En aquest cas, simplement executeu:
```powershell
claude
```
sense necessitat de canviar de directori. Per comprovar amb quin compte esteu autenticats:
```powershell
claude /status
```
:::
Veureu el prompt interactiu de Claude Code. Ara podeu escriure instruccions en llenguatge natural.
---
# Configuració del Projecte: Treballar amb Dades del BOP
## Creació d'una estructura de projecte
Primer, creem una estructura de projecte neta. Al Terminal (amb Claude Code en execució), podríeu demanar:
> *"Crea una estructura de projecte R per analitzar dades d'enquesta del Baròmetre d'Opinió Política del CEO, amb carpetes per a dades, scripts, sortides i un README"*
O feu-ho manualment a R:
```{r}
#| label: project-setup
# Executeu això a la Consola R per configurar el projecte
dirs <- c("data/raw", "data/processed", "scripts",
"outputs/figures", "outputs/tables", "skills")
for (d in dirs) {
if (!dir.exists(d)) dir.create(d, recursive = TRUE)
}
cat("Estructura del projecte creada.\n")
```
## Instal·lació dels paquets R necessaris
```{r}
#| label: install-packages
# Paquets principals per a aquest taller
packages <- c(
"CEOdata", # Accés directe a les dades d'enquesta del CEO
"tidyverse", # Manipulació de dades i visualització
"haven", # Llegir fitxers SPSS (.sav)
"survey", # Anàlisi d'enquestes complexes amb ponderacions
"srvyr", # Anàlisi d'enquestes estil tidyverse
"janitor", # Utilitats de neteja de dades
"gt", # Taules de qualitat per a publicació
"ggthemes", # Temes addicionals per a ggplot2
"scales", # Formatació per a gràfics
"labelled" # Treballar amb variables etiquetades d'SPSS
)
# Instal·leu els paquets que falten
to_install <- packages[!sapply(packages, requireNamespace, quietly = TRUE)]
if (length(to_install) > 0) {
install.packages(to_install)
}
# CEOdata pot caldre instal·lar-lo des de GitHub si no és al CRAN
if (!requireNamespace("CEOdata", quietly = TRUE)) {
if (!requireNamespace("remotes", quietly = TRUE)) install.packages("remotes")
remotes::install_github("ceopinio/CEOdata")
}
```
## Càrrega de les dades del BOP
El CEO ofereix dues maneres d'accedir a les dades del BOP:
### Opció A: Via el paquet R `CEOdata` (Recomanada)
```{r}
#| label: load-ceodata
library(CEOdata)
library(tidyverse)
library(labelled)
# Carrega tots els Baròmetres disponibles (des de 2014, mètode presencial)
# És un conjunt de dades gran: ~44.000 enquestats, ~1.200 variables
bop_all <- CEOdata()
# Visió ràpida
glimpse(bop_all[, 1:15]) # Primeres 15 variables
cat("Dimensions:", nrow(bop_all), "files ×", ncol(bop_all), "columnes\n")
```
```{r}
#| label: load-recent
# Carrega només els baròmetres recents (des de 2022)
bop_recent <- CEOdata(date_start = "2022-01-01")
cat("Dades recents:", nrow(bop_recent), "files\n")
# Carrega una onada específica pel seu REO (número de registre d'estudi)
# Exemple: REO 1160 (useu CEOmeta() per explorar els estudis disponibles)
meta <- CEOmeta()
head(meta[, c("REO", "Titol enquesta", "Dia inici treball de camp")], 10)
```
### Opció B: Descàrrega directa de la matriu fusionada
El CEO proporciona fitxers SPSS fusionats a:
`https://ceo.gencat.cat/ca/barometre/matrius-fusionada-BOP/`
```{r}
#| label: load-spss
library(haven)
# Si heu descarregat el fitxer .sav manualment:
# bop_raw <- read_sav("data/raw/matriu_fusionada_BOP_presencial.sav")
# Inspeccioneu l'estructura d'un conjunt de dades SPSS amb etiquetes
# bop_raw |>
# select(1:10) |>
# look_for() # del paquet labelled: mostra les etiquetes de les variables
```
::: {.callout-note}
## Sobre les dades del BOP
El Baròmetre d'Opinió Política (BOP) es realitza aproximadament tres vegades l'any des de 2005. La sèrie presencial (CAPI) usada aquí va des d'abril de 2014 amb mostres de ~2.000 enquestats per onada. Les variables clau inclouen:
- **PONDERA**: ponderació de l'enquesta (useu-la sempre!)
- **BOP_NUM / ANY / MES**: identificador d'onada i data
- **C700**: preferència d'independència (la "pregunta de la independència")
- **C710**: règim territorial preferit (federació, independència, etc.)
- **INTENCIÓ_VOTO**: intenció de vot
- **RECORD_VOTO**: record de vot
- **VALORACIÓ_\***: valoració dels líders polítics (escala 0–10)
- **IDEOL_0_10**: autoposicionament esquerra-dreta (0–10)
- **LLENGUA_PRIMERA**: primera llengua
- **PROVINCIA**: província de residència
- **SEXE, EDAT**: dades sociodemogràfiques
Useu `CEOsearch("independen")` per trobar totes les variables relacionades amb un tema.
:::
---
# La Vostra Primera Sessió amb Claude Code
## Iniciar una sessió interactiva
Al **Terminal de RStudio**, llanceu Claude Code (assegureu-vos d'estar al directori del projecte):
```powershell
claude
```
Ara esteu en una sessió interactiva. Claude Code pot veure els fitxers del vostre projecte. Provem algunes interaccions bàsiques.
## Prompts bàsics: explorant les dades
**Prompt 1 — Entendre una variable:**
Escriviu això al prompt de Claude Code:
```
Tinc un conjunt de dades anomenat bop_recent carregat a R des del paquet CEOdata
(enquesta d'opinió política catalana). La variable C700 és la pregunta sobre
la independència. Podeu escriure codi R per produir una taula de freqüències
ponderada de C700 usant la variable de pes PONDERA, amb etiquetes adequades?
```
Claude Code podria generar alguna cosa com:
```{r}
#| label: claude-example-1
library(tidyverse)
library(srvyr)
library(CEOdata)
# Carrega les dades (si no estan ja carregades)
bop_recent <- CEOdata(date_start = "2022-01-01")
# Crea un objecte de disseny d'enquesta amb ponderacions
bop_svy <- bop_recent |>
as_survey_design(weights = PONDERA)
# Taula de freqüències ponderada de la variable de preferència d'independència
bop_svy |>
group_by(C700) |>
summarise(
n_ponderat = survey_total(vartype = "ci"),
pct = survey_mean(vartype = "ci") * 100
) |>
arrange(desc(pct))
```
::: {.callout-tip}
## Inspeccionar la sortida de Claude abans d'executar-la
Abans de prémer "Executa", pregunteu-vos sempre:
1. El codi té sentit lògicament?
2. Utilitza els noms de variables correctes (comproveu amb `names(bop_recent)`)?
3. Gestiona adequadament els valors mancants (NA, "No sap", "No contesta")?
4. S'aplica correctament la ponderació de l'enquesta?
:::
## Demanar a Claude que expliqui codi
També podeu enganxar codi existent i demanar a Claude que l'expliqui:
**Prompt 2 — Explicació:**
```
Explica pas a pas què fa aquest codi R, per a un estudiant que coneix R bàsic
però no ha usat mai el paquet srvyr:
bop_svy <- bop_recent |>
as_survey_design(weights = PONDERA)
```
## Demanar a Claude que corregeixi errors
Quan R produeix un error, enganxeu-lo directament a Claude Code:
**Prompt 3 — Depuració:**
```
He obtingut aquest error en executar el meu codi R:
Error in UseMethod("summarise") :
no applicable method for 'summarise' applied to an object of class "data.frame"
El meu codi era:
bop_recent |> group_by(ANY) |> summarise(n = survey_mean())
Què hi ha de malament i com ho soluciono?
```
---
# Casos d'Ús Reals: Anàlisi de Dades d'Enquesta
## Cas d'ús 1: Evolució temporal de la preferència d'independència
**Prompt per a Claude Code:**
```
Escriu codi R per crear un gràfic de sèrie temporal de la preferència
d'independència a Catalunya usant el conjunt de dades bop_all de CEOdata.
La variable és C700. Usa el pes PONDERA i agrupa per BOP_NUM (onada).
Mostra el percentatge que dóna suport a la independència al llarg del temps,
amb una línia de tendència suavitzada. Usa ggplot2 amb un tema net.
```
Sortida esperada (reviseu i adapteu):
```{r}
#| label: independence-timeseries
#| fig-cap: "Suport a la independència catalana al llarg del temps (ponderat, BOP CEO)"
library(srvyr)
library(ggplot2)
library(scales)
# Definiu els codis de resposta favorables a la independència
# A C700: normalment 1 = Sí (independència), 2 = No
# Verifiqueu sempre amb: table(bop_all$C700, useNA = "always")
bop_svy_all <- bop_all |>
filter(!is.na(C700), !is.na(PONDERA)) |>
mutate(
any_onada = paste(ANY, sprintf("%02d", MES), sep = "-"),
pro_indep = as.integer(C700 == 1) # Ajusteu el codi si cal
) |>
as_survey_design(weights = PONDERA)
tendencia_independencia <- bop_svy_all |>
group_by(ANY, MES) |>
summarise(
pct_si = survey_mean(pro_indep, na.rm = TRUE, vartype = "ci") * 100
) |>
ungroup() |>
mutate(data = as.Date(paste(ANY, MES, 1, sep = "-")))
ggplot(tendencia_independencia, aes(x = data, y = pct_si)) +
geom_ribbon(aes(ymin = pct_si_low, ymax = pct_si_upp),
alpha = 0.2, fill = "#E31E24") +
geom_line(colour = "#E31E24", linewidth = 0.8) +
geom_point(size = 1.5, colour = "#E31E24") +
geom_smooth(method = "loess", se = FALSE, colour = "darkred",
linetype = "dashed", linewidth = 0.6) +
scale_y_continuous(limits = c(30, 65),
labels = label_percent(scale = 1)) +
scale_x_date(date_breaks = "1 any", date_labels = "%Y") +
labs(
title = "Suport a la Independència de Catalunya al Llarg del Temps",
subtitle = "Percentatge ponderat que respon 'Sí' a la pregunta d'independència (BOP, CEO)",
x = NULL, y = "% a favor de la independència",
caption = "Font: Baròmetre d'Opinió Política, Centre d'Estudis d'Opinió (Generalitat de Catalunya).\nEstimacions ponderades amb intervals de confiança del 95%."
) +
theme_minimal(base_size = 12) +
theme(
plot.title = element_text(face = "bold"),
panel.grid.minor = element_blank()
)
```
## Cas d'ús 2: Tabulació creuada amb desglossament demogràfic
**Prompt per a Claude Code:**
```
Vull creuar la preferència d'independència (C700) per grup d'edat i gènere
usant les dades del BOP del CEO (bop_recent). La variable de pes és PONDERA.
L'edat és a la variable EDAT (contínua). Crea grups d'edat (18-34, 35-54, 55+),
i produeix una taula creuada ponderada i un gràfic de barres agrupades.
```
```{r}
#| label: crosstab-demo
#| fig-cap: "Preferència d'independència per grup d'edat i gènere (ponderat)"
bop_crosstab <- bop_recent |>
filter(!is.na(C700), !is.na(EDAT), !is.na(SEXE), !is.na(PONDERA)) |>
mutate(
grup_edat = case_when(
EDAT < 35 ~ "18–34",
EDAT < 55 ~ "35–54",
TRUE ~ "55+"
) |> factor(levels = c("18–34", "35–54", "55+")),
genere = case_when(
SEXE == 1 ~ "Home",
SEXE == 2 ~ "Dona",
TRUE ~ NA_character_
),
pro_indep = as.integer(C700 == 1)
) |>
filter(!is.na(genere)) |>
as_survey_design(weights = PONDERA)
resultat_crosstab <- bop_crosstab |>
group_by(grup_edat, genere) |>
summarise(
pct_si = survey_mean(pro_indep, na.rm = TRUE, vartype = "ci") * 100,
n = unweighted(n())
)
# Visualització
ggplot(resultat_crosstab, aes(x = grup_edat, y = pct_si, fill = genere)) +
geom_col(position = "dodge", width = 0.7) +
geom_errorbar(aes(ymin = pct_si_low, ymax = pct_si_upp),
position = position_dodge(0.7), width = 0.25) +
scale_fill_manual(values = c("Home" = "#2C7BB6", "Dona" = "#D7191C")) +
scale_y_continuous(labels = label_percent(scale = 1), limits = c(0, 70)) +
labs(
title = "Suport a la Independència per Grup d'Edat i Gènere",
x = "Grup d'edat", y = "% a favor de la independència",
fill = "Gènere",
caption = "Font: BOP CEO (onades recents). Estimacions ponderades amb IC del 95%."
) +
theme_minimal(base_size = 12)
```
## Cas d'ús 3: Valoració dels líders polítics
**Prompt per a Claude Code:**
```
A les dades del BOP del CEO, hi ha variables per valorar els líders polítics
en una escala del 0 al 10. Escriu codi per: (1) trobar totes les variables
de valoració (probablement contenen "VALORACIÓ" o "VAL" al nom), (2) calcular
les mitjanes ponderades per a l'onada més recent, (3) crear un gràfic de punts
que ranguegi els líders de major a menor aprovació.
```
```{r}
#| label: leader-ratings
# Troba les variables de valoració dels líders
vars_lideres <- names(bop_recent)[grepl("VAL|VALORACI", names(bop_recent),
ignore.case = TRUE)]
cat("Possibles variables de valoració de líders:\n")
print(head(vars_lideres, 20))
# Funció per calcular la mitjana ponderada per a variables d'escala 0-10
valoracio_ponderada <- function(dades, var, var_pes = "PONDERA") {
x <- dades[[var]]
w <- dades[[var_pes]]
# Tractem els valors fora de 0-10 com a mancants (codis de no-resposta)
x[x < 0 | x > 10] <- NA
if (sum(!is.na(x)) < 30) return(NULL) # Ometeu si hi ha massa poques respostes
tibble(
variable = var,
mitjana_valoracio = weighted.mean(x, w, na.rm = TRUE),
n_valids = sum(!is.na(x))
)
}
# Apliqueu-ho a l'onada més recent
bop_ultima_onada <- bop_recent |>
filter(ANY == max(ANY, na.rm = TRUE)) |>
filter(!is.na(PONDERA))
valoracions <- purrr::map_dfr(vars_lideres, ~valoracio_ponderada(bop_ultima_onada, .x)) |>
filter(!is.na(mitjana_valoracio)) |>
arrange(desc(mitjana_valoracio))
# Gràfic de punts
ggplot(valoracions, aes(x = mitjana_valoracio,
y = reorder(variable, mitjana_valoracio))) +
geom_vline(xintercept = 5, linetype = "dashed", colour = "grey60") +
geom_point(size = 3, colour = "#2C7BB6") +
scale_x_continuous(limits = c(0, 10), breaks = seq(0, 10, 2)) +
labs(
title = "Valoració dels Líders Polítics",
subtitle = "Onada més recent, mitjanes ponderades (0 = molt deficient, 10 = excel·lent)",
x = "Valoració mitjana (0–10)",
y = NULL,
caption = "Font: BOP CEO. Mitjanes ponderades; n ≥ 30 per líder."
) +
theme_minimal(base_size = 11)
```
## Cas d'ús 4: Regressió amb ponderacions d'enquesta adequades
**Prompt per a Claude Code:**
```
Escriu codi R per executar una regressió logística que predeixi el suport
a la independència (C700, binària: sí/no) a partir de la ideologia
esquerra-dreta (IDEOL_0_10), l'edat (EDAT), el gènere (SEXE) i la primera
llengua (LLENGUA_PRIMERA) usant les dades del BOP del CEO. Usa el paquet
survey per tenir en compte correctament les ponderacions PONDERA.
Mostra després un gràfic de coeficients.
```
```{r}
#| label: regression
library(survey)
library(broom)
# Preparació de les dades
bop_reg <- bop_recent |>
filter(!is.na(C700), !is.na(PONDERA)) |>
mutate(
indep = as.integer(C700 == 1),
ideologia = ifelse(IDEOL_0_10 %in% c(98, 99), NA, IDEOL_0_10),
edat = ifelse(EDAT < 18 | EDAT > 99, NA, EDAT),
dona = as.integer(SEXE == 2),
catalanoparlant = as.integer(LLENGUA_PRIMERA == 1) # Verifiqueu el codi
) |>
filter(!is.na(ideologia), !is.na(edat), !is.na(dona))
# Disseny d'enquesta per a la regressió
disseny_svy <- svydesign(ids = ~1, weights = ~PONDERA, data = bop_reg)
# Regressió logística amb ponderacions d'enquesta
model <- svyglm(
indep ~ ideologia + edat + dona + catalanoparlant,
design = disseny_svy,
family = quasibinomial()
)
summary(model)
# Gràfic de coeficients usant broom
df_coef <- tidy(model, conf.int = TRUE, exponentiate = TRUE) |>
filter(term != "(Intercept)") |>
mutate(
term = recode(term,
"ideologia" = "Ideologia esq.-dreta (més alt = més dreta)",
"edat" = "Edat",
"dona" = "Dona (vs. home)",
"catalanoparlant" = "Primera llengua català (vs. altra)"
)
)
ggplot(df_coef, aes(x = estimate, y = reorder(term, estimate))) +
geom_vline(xintercept = 1, linetype = "dashed", colour = "grey50") +
geom_errorbarh(aes(xmin = conf.low, xmax = conf.high), height = 0.2) +
geom_point(size = 3, colour = "#E31E24") +
scale_x_log10() +
labs(
title = "Predictors del Suport a la Independència",
subtitle = "Regressió logística ponderada per enquesta — Odds ratios amb IC del 95%",
x = "Odds ratio (escala logarítmica)", y = NULL,
caption = "Font: BOP CEO (onades recents). n ponderat."
) +
theme_minimal(base_size = 11)
```
## Cas d'ús 5: Generació d'una taula d'informe d'enquesta
**Prompt per a Claude Code:**
```
Necessito una taula de qualitat per a publicació que mostri els principals
indicadors polítics de l'última onada del BOP del CEO. Inclou: suport a la
independència, satisfacció amb la democràcia, mitjana esquerra-dreta i
aprovació del govern. Mostra percentatges o mitjanes ponderats, mides de
mostra i intervals de confiança del 95%. Usa el paquet gt.
```
```{r}
#| label: report-table
library(gt)
library(srvyr)
# Onada més recent
reo_mes_recent <- bop_recent |>
filter(!is.na(BOP_NUM)) |>
pull(BOP_NUM) |>
levels() |>
tail(1)
bop_onada <- bop_recent |>
filter(as.character(BOP_NUM) == reo_mes_recent, !is.na(PONDERA)) |>
as_survey_design(weights = PONDERA)
# Calculeu estadístics resum
estadistics_resum <- tribble(
~Indicador, ~Valor, ~IC_baix, ~IC_alt, ~N,
"% a favor de la independència",
bop_onada |>
summarise(m = survey_mean(C700 == 1, na.rm = TRUE)) |>
pull(m) * 100,
bop_onada |>
summarise(m = survey_mean(C700 == 1, na.rm = TRUE, vartype = "ci")) |>
pull(m_low) * 100,
bop_onada |>
summarise(m = survey_mean(C700 == 1, na.rm = TRUE, vartype = "ci")) |>
pull(m_upp) * 100,
bop_onada |>
summarise(n = unweighted(sum(!is.na(C700)))) |>
pull(n)
)
# Formateu com a taula gt
estadistics_resum |>
gt() |>
tab_header(
title = "Indicadors Polítics Clau — Baròmetre d'Opinió Política del CEO",
subtitle = paste("Onada:", reo_mes_recent, "| Estimacions ponderades")
) |>
fmt_number(columns = c(Valor, IC_baix, IC_alt), decimals = 1) |>
fmt_integer(columns = N) |>
cols_label(
Indicador = "Indicador",
Valor = "Estimació",
IC_baix = "IC 95% (baix)",
IC_alt = "IC 95% (alt)",
N = "n (sense ponderar)"
) |>
tab_source_note("Font: BOP CEO. Estimacions ponderades usant la variable PONDERA.") |>
tab_options(table.font.size = 12)
```
---
# Ús de Skills amb Claude Code
## Què són les skills?
A Claude Code, les **skills** són fitxers de prompts estructurats i reutilitzables emmagatzemats al vostre projecte que defineixen com Claude hauria d'abordar tasques recurrents específiques. Actuen com a instruccions personalitzades que podeu invocar de manera consistent entre sessions.
Per a l'anàlisi de dades polítiques, les skills us ajuden a:
- Estandarditzar com es produeixen les taules ponderades
- Assegurar que Claude sempre utilitza mètodes apropiats per a enquestes
- Construir plantilles compartides que el vostre equip investigador pugui usar
## Creació de la vostra primera skill
Creeu un fitxer anomenat `skills/analisi_enquesta.md` al vostre projecte. Primer, creeu la carpeta `skills` des de la **Consola R**:
```{r}
#| label: create-skills-dir
# Creeu la carpeta skills des de la Consola R (funciona a Windows i macOS)
if (!dir.exists("skills")) dir.create("skills")
cat("Carpeta 'skills' creada al directori del projecte.\n")
```
Ara creeu el fitxer `skills/analisi_enquesta.md` des de RStudio: aneu a **Fitxer → Fitxer nou → Fitxer de text**, escriviu el contingut següent i deseu-lo amb el nom `analisi_enquesta.md` dins la carpeta `skills`.
````markdown
# Skill: Anàlisi de l'Enquesta BOP del CEO
## Context
Esteu ajudant amb l'anàlisi del Baròmetre d'Opinió Política (BOP) del
Centre d'Estudis d'Opinió (CEO) de la Generalitat de Catalunya.
Es tracta d'una enquesta complexa amb respostes ponderades.
## Estructura de les dades
- Conjunt de dades principal: `bop` (carregat des del paquet CEOdata o fitxer SPSS)
- Variable de pes: `PONDERA` (USEU-LA SEMPRE per a qualsevol estimació)
- Identificadors clau: `BOP_NUM` (onada), `ANY` (any), `MES` (mes)
- Codis de no-resposta en variables numèriques: típicament 98 (No sap),
99 (No contesta) — recodifiqueu-los sempre a NA abans de l'anàlisi
## Regles que heu de seguir sempre
1. SEMPRE apliqueu les ponderacions d'enquesta usant el paquet `srvyr` o `survey`
2. SEMPRE informeu els intervals de confiança juntament amb les estimacions puntuals
3. SEMPRE comproveu i gestioneu els valors mancants explícitament
4. SEMPRE verifiqueu els codis de les variables abans d'etiquetar-les
(useu `table()` o `val_labels()`)
5. Useu `as_survey_design(weights = PONDERA)` com a disseny d'enquesta estàndard
6. Per a la regressió, useu `svyglm()` del paquet `survey`
## Estàndards de sortida
- Percentatges amb un decimal
- Tots els gràfics inclouen: títol, subtítol, etiquetes dels eixos,
peu de font amb la font de dades
- Tema de ggplot2: `theme_minimal()` per defecte
- Paleta de colors: useu `#E31E24` (vermell) i `#2C7BB6` (blau) com a
colors principals
## Referència de variables comunes
- C700: Preferència d'independència (1=Sí, 2=No, 3=Indiferent, 98/99=NS/NC)
- C710: Règim territorial preferit (federació, independència, etc.)
- IDEOL_0_10: Escala esq.-dreta (0=extrema esq., 10=extrema dreta, 98/99=NS/NC)
- SEXE: Gènere (1=Home, 2=Dona)
- EDAT: Edat en anys
- LLENGUA_PRIMERA: Primera llengua (1=Català, 2=Castellà, 3=Les dues igual, ...)
- PROVINCIA: Província (1=Barcelona, 2=Girona, 3=Lleida, 4=Tarragona)
````
## Ús de la skill a Claude Code
Un cop teniu el fitxer de skill, referencieu-lo explícitament als vostres prompts:
```
Seguint les instruccions a skills/analisi_enquesta.md, produeix una tabulació
creuada ponderada de la preferència d'independència (C700) per província
(PROVINCIA) per a l'onada més recent disponible. Inclou els intervals de confiança.
```
Claude Code llegirà el fitxer de skill i aplicarà les seves regles a tot el codi generat.
## Una skill per a la documentació de variables
Creeu `skills/docs_variables.md`:
````markdown
# Skill: Documentació de Variables del BOP
Quan se us demani documentar una variable del BOP del CEO:
1. Mostreu el nom i l'etiqueta de la variable
2. Mostreu la taula de freqüències completa (recompte sense ponderar,
% ponderat, amb IC)
3. Mostreu la tendència temporal si la variable apareix en múltiples onades
4. Senyaleu qualsevol problema conegut: taxes de no-resposta superiors al 10%,
canvis en la redacció de la pregunta entre onades, o codificació no comparable
5. Suggeriu enfocaments analítics apropiats per a aquest tipus de variable
Formateu tota la sortida com un bloc de codi Quarto estructurat que es pugui
inserir directament en un document d'anàlisi .qmd.
````
## Una skill per a informes reproduïbles
Creeu `skills/plantilla_informe.md`:
````markdown
# Skill: Secció d'Informe d'Anàlisi del BOP
Quan se us demani escriure una secció de resultats:
1. Comenceu amb una breu descripció de la variable i el que mesura
2. Informeu l'estimació de l'onada més recent amb % ponderat i IC
3. Descriviu la tendència temporal (creixent/decreixent/estable) si les
dades abasten múltiples onades
4. Senyaleu qualsevol diferència estadísticament significativa per
subgrups clau (gènere, edat, llengua, província)
5. Escriviu en català acadèmic, temps passat, llenguatge prudent i matisat
6. Incloeu el bloc de codi R que produeix cada estadístic
7. Acabeu amb una frase d'interpretació per a un públic no especialista
Citeu sempre com: Centre d'Estudis d'Opinió (CEO), Generalitat de Catalunya.
````
---
# Ús Avançat: Tasques Agèntiques
## Demanar a Claude Code que gestioni tasques de múltiples passos
Una de les fortaleses de Claude Code és gestionar **tasques analítiques de múltiples passos** de manera autònoma. Per exemple:
**Prompt:**
```
Necessito una anàlisi descriptiva completa de l'última onada del BOP. Si us plau:
1. Carrega les dades usant CEOdata
2. Produeix una taula de descripció de la mostra (n per gènere, grup d'edat,
llengua i província)
3. Produeix estimacions ponderades per a les 5 preguntes d'actitud política
més rellevants
4. Desa totes les sortides com a fitxers .csv a outputs/tables/
5. Desa tots els gràfics com a fitxers .png a outputs/figures/
6. Escriu un breu resum dels resultats clau en text pla
```
Claude Code planificarà i executarà aquests passos seqüencialment, mostrant-vos cada acció abans de dur-la a terme.
## Demanar a Claude que cerqui a les vostres dades
**Prompt:**
```
Cerca en aquest conjunt de dades totes les variables que contenen informació
sobre la satisfacció amb la democràcia o les institucions democràtiques.
Llista els noms de les variables, les seves etiquetes, i mostra'm la
distribució de freqüències de la més rellevant per a l'última onada.
```
```{r}
#| label: variable-search
library(CEOdata)
library(labelled)
# Claude podria generar codi com aquest:
# Cerca de variables que mencionen la democràcia a les seves etiquetes
bop_recent <- CEOdata(date_start = "2022-01-01")
# Obté les etiquetes de les variables
etiquetes_var <- var_label(bop_recent)
df_etiquetes <- tibble(
variable = names(etiquetes_var),
etiqueta = unlist(lapply(etiquetes_var, function(x) if (is.null(x)) NA else x))
)
# Cerca variables relacionades amb la democràcia
vars_democracia <- df_etiquetes |>
filter(grepl("democrà|democra|satisfac|institucions|confiança",
etiqueta, ignore.case = TRUE))
print(vars_democracia)
```
## Refinament iteratiu
Claude Code funciona millor en conversa. No intenteu obtenir-ho tot en un sol prompt. Itereu:
1. **Demaneu un primer esbós**: "Escriu codi per traçar les tendències d'independència per província"
2. **Executeu-lo, anoteu els problemes**: "Funciona però les etiquetes de l'eix x es superposen"
3. **Refineu**: "Arregla la superposició de les etiquetes de l'eix x i afegeix una línia vertical per al referèndum del 2017"
4. **Generalitzeu**: "Converteix-ho en una funció que pugui reutilitzar per a qualsevol variable binària del BOP"
---
# Consells d'Integració al Flux de Treball
## Usar Claude Code sense sortir de RStudio
El flux de treball recomanat:
1. **Codeu a RStudio** — escriviu els vostres scripts `.R` o `.qmd` a l'editor
2. **Executeu Claude Code al panell Terminal** — demaneu ajuda, obteniu fragments de codi
3. **Copieu els suggeriments de Claude** a l'editor de scripts
4. **Llegiu el codi**, enteneu-lo i executeu-lo a la Consola R
5. **Itereu** — torneu a Claude per a correccions o millores
## Integració amb Git
Claude Code també pot ajudar amb el control de versions. Al **Terminal de RStudio**, podeu demanar-li directament:
```powershell
claude
```
I llavors escriure al prompt de Claude Code:
```
Fes commit dels meus canvis actuals amb un missatge descriptiu
que resumeixi el que fa l'anàlisi. Crea també un fitxer .gitignore
adequat per a un projecte R si no n'existeix cap.
```
## Escriure comentaris i documentació
**Prompt:**
```
Afegeix comentaris detallats a aquest codi R explicant el que fa cada pas,
escrit per a un estudiant de ciència política que coneix R bàsic però
és nou en l'anàlisi d'enquestes:
[enganxeu el vostre codi aquí]
```
## Demanar a Claude que revisi el vostre codi
**Prompt:**
```
Revisa aquest codi R per detectar errors estadístics o metodològics.
Estic analitzant dades d'enquesta amb ponderacions complexes. Presta
especial atenció a: (1) l'ús correcte de les ponderacions d'enquesta,
(2) la gestió dels valors mancants, (3) els estadístics de prova apropiats.
[enganxeu el vostre codi]
```
---
# El que Claude Code No Pot Fer (i Quan No Usar-lo)
## Limitacions a tenir en compte
::: {.callout-warning}
## Coneixeu els límits
**Claude Code pot cometre errors en:**
- **Codificació de variables**: no coneix els codis reals de les vostres dades — verifiqueu sempre amb `table()` abans d'usar etiquetes
- **Eleccions estadístiques**: pot suggerir proves inadequades (p. ex., ignorant el disseny d'enquesta)
- **Afirmacions causals**: no pot jutjar si una relació és causal
- **Dades no públiques**: no té coneixement del vostre conjunt de dades específic llevat que pugui llegir els fitxers
**Verifiqueu sempre:**
- Que els noms de les variables existeixin: `names(bop_recent)`
- Que els codis siguin correctes: `table(bop_recent$C700, useNA = "always")`
- Que els resultats siguin plausibles: compareu amb els informes publicats pel CEO
- Que les ponderacions s'apliquin: les estimacions no ponderades i ponderades haurien de diferir
:::
## Quan usar Claude Code
| Tasca | Usar Claude Code? |
|-------|------------------|
| Escriure codi de càrrega de dades rutinari | ✅ Sí |
| Generar plantilles de ggplot2 | ✅ Sí |
| Depurar missatges d'error | ✅ Sí |
| Escriure codi de regressió en primer esbós | ✅ Sí (i revisar-lo) |
| Interpretar resultats estadístics | ⚠️ Amb precaució |
| Triar el mètode estadístic adequat | ⚠️ Amb precaució |
| Validar que les vostres troballes siguin correctes | ❌ No — useu el coneixement substantiu |
| Substituir la comprensió dels mètodes d'enquesta | ❌ No |
::: {.callout-tip}
## Consells per al pla Pro: gestionar l'ús eficientment
El pla Pro comparteix els límits entre claude.ai i Claude Code. Per treure el màxim profit:
- **Sigues concret als prompts**: un prompt ben formulat estalvia 3-4 torns de conversa
- **Tanca la sessió de Claude Code quan no l'useu**: `Ctrl+C` al Terminal i `exit`
- **Reserveu Claude Code per a tasques de codi**: per a preguntes conceptuals o de recerca, useu el chat de claude.ai, que sol ser més ràpid i eficient en tokens
- **Useu `claude --continue`** per reprendre la darrera conversa sense recarregar el context des de zero
- **Reviseu l'ús** amb `/status` dins de Claude Code o des del vostre compte a [claude.ai](https://claude.ai)
:::
---
# Exercicis
## Exercici 1: Exploració bàsica de dades (15 minuts)
Usant Claude Code, genereu codi per a:
a. Carregar els dos últims anys de dades del BOP
b. Produir una taula de freqüències ponderada de la pregunta d'independència (C700)
c. Comparar els percentatges ponderats i no ponderats i comentar la diferència
**Pregunta de reflexió:** Per què podrien diferir les estimacions ponderades i no ponderades? Què corregeix la ponderació?
## Exercici 2: Anàlisi de tendència temporal (20 minuts)
Demaneu a Claude Code que us ajudi a replicar el gràfic de sèrie temporal del suport a la independència però desglossat per primera llengua (`LLENGUA_PRIMERA`). Llavors:
a. Interpreteu la bretxa entre els catalanoparlants i els castellanoparlants de primera llengua
b. La bretxa s'ha eixamplat o reduït amb el temps?
c. Afegiu una regió ombrejada per al període del referèndum d'independència del 2017 (1 d'octubre de 2017)
## Exercici 3: Construïu una skill (20 minuts)
Creeu un fitxer de skill anomenat `skills/regressio_bop.md` que instrueixi Claude Code sobre com executar i presentar una regressió ponderada per enquesta usant les dades del BOP. La vostra skill hauria d'especificar:
- Quins paquets usar
- Com gestionar els codis de no-resposta
- Com presentar la sortida (gràfic de coeficients + taula)
- Quines comprovacions de robustesa executar
Llavors proveu la vostra skill amb el prompt: "Seguint skills/regressio_bop.md, prediu la intenció de vot a partir de la ideologia, l'edat i la llengua."
## Exercici 4: Revisió metodològica (15 minuts)
Enganxeu el codi següent a Claude Code i demaneu-li que identifiqui qualsevol problema metodològic:
```r
bop <- CEOdata(date_start = "2020-01-01")
# Suport a la independència per edat
bop |>
group_by(EDAT > 50) |>
summarise(pct_si = mean(C700 == 1, na.rm = TRUE))
lm(C700 ~ EDAT + SEXE + IDEOL_0_10, data = bop) |> summary()
```
**Quins problemes hauria d'identificar Claude (i vosaltres)?**
---
# Recursos i Lectures Addicionals
## Documentació oficial
- **Claude Code**: [docs.claude.com/en/docs/claude-code/overview](https://docs.claude.com/en/docs/claude-code/overview)
- **Baròmetre CEO**: [ceo.gencat.cat/ca/barometre](https://ceo.gencat.cat/ca/barometre)
- **Paquet R CEOdata**: [github.com/ceopinio/CEOdata](https://github.com/ceopinio/CEOdata)
- **Eina interactiva DadesCEO**: [dades.ceo.gencat.cat](https://dades.ceo.gencat.cat)
## Anàlisi d'enquestes a R
- Lumley, T. (2010). *Complex Surveys: A Guide to Analysis Using R*. Wiley.
- Documentació del paquet `srvyr`: [cran.r-project.org/package=srvyr](https://cran.r-project.org/package=srvyr)
- Documentació del paquet `survey`: [r-survey.r-forge.r-project.org](http://r-survey.r-forge.r-project.org/survey/)
## Anàlisi de dades polítiques
- Hanmer, M. J., & Kalkan, K. O. (2013). Behind the curve: Clarifying the best approach to calculating predicted probabilities and marginal effects from limited dependent variable models. *American Journal of Political Science*, 57(1), 263–277.
- King, G., Tomz, M., & Wittenberg, J. (2000). Making the most of statistical analyses: Improving interpretation and presentation. *American Journal of Political Science*, 44(2), 347–361.
---
::: {.callout-tip}
## Idees clau
1. **Claude Code viu al Terminal** — no és una finestra de xat, és un company de programació que veu el vostre projecte
2. **Llegiu sempre abans d'executar** — el codi generat per IA s'ha d'entendre i verificar, especialment les ponderacions d'enquesta i els codis de variables
3. **Les skills escalen el vostre flux de treball** — invertiu temps escrivint bons fitxers de skill i reutilitzeu-los entre projectes
4. **Itereu conversacionalment** — els millors resultats provenen de prompts curts i específics seguits de refinament
5. **El vostre coneixement substantiu és irreemplaçable** — Claude Code sap com programar; vosaltres sabeu el que el BOP mesura i el que els resultats signifiquen políticament
:::