1 TEMA 0: Preparación y Limpieza de Datos

0.1 Carga de datos

# Leer CSV usando la primera columna como nombre de filas (Muy habitual)
datos = read.csv("archivo.csv", row.names = 1, as.is = TRUE, sep = ",")
# Leer CSV con separador de punto y coma (ejemplo de test)
datos = read.csv("estudi2.csv", sep = ";", row.names = 1)

# Cargar un archivo .RData
load("datos.RData", verbose = TRUE)

# Eliminar las dos primeras columnas de un dataset
datos2 = datos[, -c(1,2)]

0.2 Tipos de Variables y Tabla Auxiliar Es muy útil crear un data.frame auxiliar para gestionar los tipos de variables.

descVars = data.frame("variable" = colnames(datos),
                      "tipo" = c("numérica", "texto", "categórica nominal", "categórica binaria"),
                      stringsAsFactors = FALSE)
rownames(descVars) = descVars$variable

# Filtrar base de datos según el tipo:
datos_num = datos[, descVars$variable[descVars$tipo == "numérica"]]

0.3 Variables constantes o de baja variabilidad

# Para numéricas: Coeficiente de variación (Desviación típica / Media)
mySD = apply(datos_num, 2, sd)
myMU = colMeans(datos_num)
myCV = mySD / myMU
sort(myCV) # Las que tienen CV=0 son constantes y se deben eliminar.

# Para categóricas: Tablas de frecuencia
apply(datos_cat, 2, table, useNA = "i")

# Eliminar variables innecesarias
datos = subset(datos, select = -c(Var1, Var2))

0.4 Valores Anómalos e Inconsistentes (Univariante)

# Boxplot de todas las variables numéricas en escala logarítmica
par(mar = c(9,4,2,2))
boxplot(datos_num, log = "y", las = 2)

# Sustituir valor inconsistente (error) por NA
datos[which.max(datos$CC), "CC"] = NA

0.5 Valores Faltantes (NA)

# Conteo y porcentaje de NAs por columna
numNA = apply(datos, 2, function(x) sum(is.na(x)))
percNA = round(100 * apply(datos, 2, function(x) mean(is.na(x))), 2)

# Imputación por mediana (solo si hay pocos)
datos$Var[is.na(datos$Var)] = median(datos$Var, na.rm = TRUE)

# Eliminar filas con NAs (Típico en test antes de arules)
datos_sin_na = na.omit(datos)

# Imputación avanzada con mice
library(mice)
patrones = md.pattern(datos, rotate.names = TRUE) # Ver patrón de NAs
datosImp = mice(datos, seed = 123, m = 5, print = FALSE)
datosLimpio = complete(datosImp, 4) # Extraer la iteración 4

0.6 Transformaciones y Recodificación (TRUCOS DE TEST)

# Transformar variables 0-1 a lógicas (FALSE/TRUE)
datos[,1:17] = (datos[,1:17] == 1)

# Convertir variables a lógicas basándose en una condición (Ej: >0 es TRUE)
datos[,"TV"] = (as.numeric(as.character(datos[,"TV"])) > 0)

# Cambiar nombres de columnas quitando texto no deseado (Ej: _mg)
tmp = strsplit(colnames(datos), "_", fixed = TRUE)
colnames(datos) = sapply(tmp, function(x) x[1])

# Crear una variable factor repetida (Ej: Tratamiento para ratas)
tratam = factor(rep(seq(50, 200, 50), each = 16))

# Discretización (Categorizar numérica en rangos)
perce = quantile(datos$Price, probs = c(0, 0.4, 0.7, 1))
precioCat = cut(datos$Price, breaks = perce, labels = c("Low", "Mid", "High"), include.lowest = TRUE)

# Transformación Logarítmica (para asimetría positiva)
datos$Price = log(datos$Price) # Cuidado: Si hay ceros usar log(x+1)

# Agrupar categorías minoritarias en "Otros"
ttt = table(datos$Color)
agrupar = names(ttt)[which(ttt < 10)] # Menos de 10 ocurrencias
datos$Color[datos$Color %in% agrupar] = "Others"

2 TEMA 1: Análisis de Componentes Principales (PCA)

1.1 PCA con PLSandO

library(PLSandO)

# 1. Preparación de datos PCA (Quita baja varianza y variables categóricas)
datosPCA = Preparing(datos, includeFactors = TRUE, CVfilter = 0.01, excludeNA = 0.2)
datosX = datosPCA$x

# 2. Generar el modelo
miPCA = pca(datosX, ncomp = NULL, algo = "nipals", scaling = "standard") 
# scaling: "standard" (centrar y escalar) o "center" (solo centrar)

# 3. Selección de Componentes
pcaPlot(miPCA, type = 'scree') # Scree plot
miPCA$explVar[1:4, ] # Ver varianza explicada

# TRUCO DE TEST: Seleccionar nº mínimo de PCs para >70% de variabilidad
K = min(which(miPCA$explVar[,"cumPercVar"] >= 70))
miPCA = pca(datosX, ncomp = K, algo = "nipals", scaling = "standard")

# 4. Gráficos de PCA (Scores, Loadings, R2)
# Gráfico Scores (PC1 y PC3 coloreado por variable)
pcaPlot(miPCA, type = "scores", comp = c(1,3), colBy = tratam, labels = TRUE, repel = TRUE)
# Gráfico Correlación / Loadings
pcaPlot(miPCA, type = "corr", comp = 1:2, colBy = "contrib", labels = TRUE, col = "hot")
# Gráfico R2 (Variabilidad explicada de cada variable)
pcaPlot(miPCA, type = "R2")
# Biplot
pcaPlot(miPCA, type = "biplot", comp = 1:2, selVars = 0.8, repel = TRUE)

1.2 PCA con FactoMineR (Alternativa usada en el trabajo)

library(FactoMineR)
library(factoextra)

mipca_f = PCA(datosX, scale.unit = TRUE, graph = FALSE)
fviz_pca_biplot(mipca_f, axes = c(1,2), geom.ind = "point")

1.3 Validación de PCA: Valores Anómalos

# ANÓMALOS MODERADOS (Distancia al modelo / SCR / RSS)
anomSCR95 = pcaOutliers(miPCA, method = "RSS", conf = 95)
moderados = sort(anomSCR95$RSS[anomSCR95$ModerateOutliers], decreasing = TRUE)
# Ver contribuciones para ver qué variables causan la anomalía
outlierContrib(miPCA, outliers = anomSCR95, specificObs = names(moderados[1]))

# ANÓMALOS SEVEROS (T2 de Hotelling - Influyen en la creación del modelo)
anomSev99 = pcaOutliers(miPCA, method = "T2", conf = 99)
severos = sort(anomSev99$T2[anomSev99$SevereOutliers], decreasing = TRUE)
outlierContrib(miPCA, outliers = anomSev99, specificObs = names(severos[1]))

3 TEMA 2: Análisis Factorial de Correspondencias (AFC)

2.1 AFC Simple (Dos variables categóricas / Tabla contingencia)

library(FactoMineR)
library(factoextra)

# Test de independencia Chi-Cuadrado (para ver si tiene sentido el AFC)
chisq.test(tabla_contingencia, simulate.p.value = TRUE)

# Generar modelo AFC (Seleccionar dimensiones)
res.afc = CA(tabla_contingencia, graph = FALSE)
fviz_eig(res.afc, addlabels = TRUE) # Scree plot

# Re-generar con ncp adecuado
res.afc = CA(tabla_contingencia, graph = FALSE, ncp = 2)

# Gráficos de interpretación
fviz_ca_row(res.afc, repel = TRUE, col.row = "contrib") # Filas
fviz_ca_col(res.afc, repel = TRUE, col.col = "contrib") # Columnas

# Biplot Asimétrico (Filas en el espacio de las columnas)
fviz_ca_biplot(res.afc, map = "colprincipal", repel = TRUE)

2.2 AFC Múltiple (MCA - Muchas variables categóricas)

# Las variables suplementarias no participan en la creación de las componentes 
# quanti.sup = num columna cuantitativa, quali.sup = num columnas cualitativas
res.mca <- MCA(datos, graph = FALSE, quanti.sup = 1, quali.sup = 2:3, ncp = 4)

# Correlación de variables con las componentes
fviz_mca_var(res.mca, choice = "mca.cor", repel = TRUE, axes = 1:2)

# Gráfico de Categorías (Variables)
fviz_mca_var(res.mca, col.var = "steelblue", repel = TRUE, axes = 1:2)

# Gráfico de Observaciones (Individuos) coloreado por una variable cualitativa
fviz_mca_ind(res.mca, habillage = "Sick", addEllipses = TRUE, label = "none")

# Gráfico de elipses para múltiples variables
fviz_ellipses(res.mca, c("Mayo", "Fever"), geom = "point", axes = 1:2)

4 TEMA 3: Reglas de Asociación

3.1 Preparación y Algoritmo Aprior

library(arules)
library(arulesViz)

# Exploración gráfica de transacciones (Ver los ítems más frecuentes)
itemFrequencyPlot(Groceries, topN = 20, type = "absolute")

# Algoritmo Apriori (Configuración de Soporte y Confianza)
reglas = apriori(transacciones, parameter = list(supp = 0.02, conf = 0.8))

# Apriori obligando a que aparezca algo en el consecuente (rhs) o antecedente (lhs)
reglas_rhs = apriori(transacciones, parameter = list(supp = 0.05, conf = 0.8),
                     appearance = list(rhs = c("Survived=No", "Survived=Yes")))

3.2 Filtrado, Ordenación y Calidad (TRUCOS DE TEST)

# 1. Eliminar reglas REDUNDANTES
NoRedundantes = reglas[!is.redundant(x = reglas, measure = "confidence")]

# 2. Conservar solo reglas MAXIMALES
maximales = reglas[is.maximal(reglas)]

# 3. Filtrar reglas basadas en métricas (Ej: lift > 1.5)
filtradas = arules::subset(NoRedundantes, subset = lift > 1.5)

# 4. Ordenar reglas (Ej: de mayor a menor lift)
ordenadas = arules::sort(filtradas, by = "lift", decreasing = TRUE)
inspect(ordenadas[1:10])

# 5. Búsquedas específicas en las reglas (%in%, %ain%, %oin%, %pin%)
# %pin% busca coincidencia parcial (Ej: contiene la palabra "Sex")
filtradas_sex = arules::subset(reglas, subset = items %pin% "Sex")

# 6. Calcular P-Valor con el Test Exacto de Fisher y añadirlo a las métricas
metricas = interestMeasure(reglas, measure = c("fishersExactTest"), transactions = datos)
quality(reglas) = cbind(quality(reglas), "FET" = metricas)

# Filtrar por significancia (Test de Fisher significativo, alpha = 0.001)
reglas_sig = arules::subset(reglas, subset = FET < 0.001)

3.3 Visualización y Reglas Secuenciales

# Visualización básica
plot(ordenadas[1:10], method = "graph", engine = "htmlwidget")
plot(ordenadas, method = "paracoord", control = list(reorder = TRUE))

# Reglas Secuenciales con cSPADE
library(arulesSequences)
ccc = cspade(trans, parameter = list("support" = 0.2))
lasreglas = ruleInduction(ccc, trans, confidence = 0.8)

4.0.1 Consejos para el examen:

  • Gestión de errores frecuentes: Si R te da un error de “Cannot allocate vector size…” en asociación, sube el límite de supp en el apriori().
  • Las preguntas con capturas: Las capturas que me enviaste son ejercicios súper típicos. Familiarízate bien con cómo convertir datos a logical (datos == 1) antes de meterlos a la librería arules.
  • Identificación de Anómalos en PCA: Recuerda siempre: Anómalos Moderados = SCR/RSS (Distancia al modelo). Anómalos Severos = \(T^2\) de Hotelling (Palanca, influyen en la construcción de los ejes).