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"] = NA0.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 40.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"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]))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)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)supp en el apriori().logical (datos == 1) antes
de meterlos a la librería arules.