Claude Code a RStudio per a l’Anàlisi de Dades Polítiques

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

Published

April 17, 2026

ImportantNota 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
NotePresentació 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

1 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
WarningPrincipi 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ç.


2 Instal·lació i Configuració

2.1 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
  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.

Comproveu la versió de Node.js al Terminal de RStudio (panell inferior):

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 i seguiu els passos. Un cop instal·lat, tanqueu i torneu a obrir RStudio perquè reconegui Node.js al Terminal.

2.2 Instal·lació de Claude Code

Claude Code s’instal·la com a paquet npm global. Executeu aquesta comanda al Terminal de RStudio:

npm install -g @anthropic-ai/claude-code
WarningProblema 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:

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned

I torneu a intentar la instal·lació.

Verifiqueu la instal·lació:

claude --version

2.3 Autenticació

2.4 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:

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.

WarningComproveu 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:

Sys.getenv("ANTHROPIC_API_KEY")  # Ha de retornar "" (buit)

Si retorna alguna cosa, podeu eliminar-la del fitxer .Renviron amb:

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:

claude /status
NoteLí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

2.5 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:

cd C:\Usuaris\el-vostre-nom\el-meu-projecte-bop
claude
TipConsell: 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:

claude

sense necessitat de canviar de directori. Per comprovar amb quin compte esteu autenticats:

claude /status

Veureu el prompt interactiu de Claude Code. Ara podeu escriure instruccions en llenguatge natural.


3 Configuració del Projecte: Treballar amb Dades del BOP

3.1 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:

Code
# 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")

3.2 Instal·lació dels paquets R necessaris

Code
# 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")
}

3.3 Càrrega de les dades del BOP

El CEO ofereix dues maneres d’accedir a les dades del BOP:

3.3.1 Opció A: Via el paquet R CEOdata (Recomanada)

Code
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")
Code
# 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)

3.3.2 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/

Code
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
NoteSobre 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.


4 La Vostra Primera Sessió amb Claude Code

4.1 Iniciar una sessió interactiva

Al Terminal de RStudio, llanceu Claude Code (assegureu-vos d’estar al directori del projecte):

claude

Ara esteu en una sessió interactiva. Claude Code pot veure els fitxers del vostre projecte. Provem algunes interaccions bàsiques.

4.2 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:

Code
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))
TipInspeccionar 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?

4.3 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)

4.4 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?

5 Casos d’Ús Reals: Anàlisi de Dades d’Enquesta

5.1 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):

Code
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()
  )

5.2 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.
Code
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)

5.3 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ó.
Code
# 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)

5.4 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.
Code
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)

5.5 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.
Code
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)

6 Ús de Skills amb Claude Code

6.1 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

6.2 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:

Code
# 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.

# 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)

6.3 Ú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.

6.4 Una skill per a la documentació de variables

Creeu skills/docs_variables.md:

# 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.

6.5 Una skill per a informes reproduïbles

Creeu skills/plantilla_informe.md:

# 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.

7 Ús Avançat: Tasques Agèntiques

7.1 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.

7.2 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.
Code
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)

7.3 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”

8 Consells d’Integració al Flux de Treball

8.1 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

8.2 Integració amb Git

Claude Code també pot ajudar amb el control de versions. Al Terminal de RStudio, podeu demanar-li directament:

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.

8.3 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í]

8.4 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]

9 El que Claude Code No Pot Fer (i Quan No Usar-lo)

9.1 Limitacions a tenir en compte

WarningConeixeu 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

9.2 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
TipConsells 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

10 Exercicis

10.1 Exercici 1: Exploració bàsica de dades (15 minuts)

Usant Claude Code, genereu codi per a:

  1. Carregar els dos últims anys de dades del BOP
  2. Produir una taula de freqüències ponderada de la pregunta d’independència (C700)
  3. 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ó?

10.2 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:

  1. Interpreteu la bretxa entre els catalanoparlants i els castellanoparlants de primera llengua
  2. La bretxa s’ha eixamplat o reduït amb el temps?
  3. Afegiu una regió ombrejada per al període del referèndum d’independència del 2017 (1 d’octubre de 2017)

10.3 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.”

10.4 Exercici 4: Revisió metodològica (15 minuts)

Enganxeu el codi següent a Claude Code i demaneu-li que identifiqui qualsevol problema metodològic:

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)?


11 Recursos i Lectures Addicionals

11.1 Documentació oficial

11.2 Anàlisi d’enquestes a R

11.3 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.

TipIdees 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