El método SEMMA fue propuesto por el SAS
Institute como una guía estructurada para desarrollar proyectos de
minería de datos.
Su nombre proviene de las iniciales de las cinco fases principales del
proceso:
El objetivo de SEMMA es ofrecer una estructura clara para pasar del análisis exploratorio al modelado, asegurando que los resultados sean confiables.
En este ejemplo se aplicará el método SEMMA usando el conjunto de
datos mtcars, que contiene información sobre automóviles,
su peso (wt), potencia (hp) y rendimiento en
millas por galón (mpg).
El propósito es predecir el rendimiento
(mpg) a partir del peso del vehículo.
# ======== SAMPLE ========
data("mtcars")
set.seed(123)
n <- nrow(mtcars)
indice <- sample(1:n, size = 0.7*n)
train <- mtcars[indice, ]
test  <- mtcars[-indice, ]
# ======== EXPLORE ========
plot(train$wt, train$mpg,
     main = "Relación entre peso y rendimiento",
     xlab = "Peso del vehículo (wt)",
     ylab = "Millas por galón (mpg)",
     pch = 19, col = "darkblue")
abline(lm(mpg ~ wt, data = train), col = "red", lwd = 2)
# ======== MODIFY ========
train$wt2 <- train$wt^2
test$wt2  <- test$wt^2
# ======== MODEL ========
modelo <- lm(mpg ~ wt + wt2, data = train)
summary(modelo)
# 
# Call:
# lm(formula = mpg ~ wt + wt2, data = train)
# 
# Residuals:
#    Min     1Q Median     3Q    Max 
# -3.255 -1.981 -1.133  1.577  6.099 
# 
# Coefficients:
#             Estimate Std. Error t value Pr(>|t|)    
# (Intercept)  52.3230     5.0997  10.260 3.47e-09 ***
# wt          -14.8521     3.1669  -4.690  0.00016 ***
# wt2           1.3746     0.4663   2.948  0.00826 ** 
# ---
# Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# 
# Residual standard error: 2.924 on 19 degrees of freedom
# Multiple R-squared:  0.826,   Adjusted R-squared:  0.8077 
# F-statistic:  45.1 on 2 and 19 DF,  p-value: 6.091e-08
El modelo ajustado indica que existe una relación negativa y curvilínea entre el peso del vehículo y su rendimiento en millas por galón. El coeficiente asociado al peso (wt) es negativo y significativo, lo que confirma que los autos más pesados tienden a consumir más combustible. Sin embargo, el término cuadrático (wt²) también resulta significativo y positivo, lo que sugiere que la disminución del rendimiento no es completamente lineal: a medida que el peso aumenta, el efecto negativo se atenúa ligeramente. En conjunto, el modelo explica aproximadamente el 82 % de la variabilidad del rendimiento (R² = 0.826) y presenta un error promedio de alrededor de 2.9 mpg, lo que se considera una precisión aceptable. Estos resultados muestran que el peso del vehículo es un factor determinante del consumo, aunque con un comportamiento no estrictamente lineal.
# ======== ASSESS ========
predicciones <- predict(modelo, newdata = test)
rmse <- sqrt(mean((test$mpg - predicciones)^2))
r2   <- 1 - sum((test$mpg - predicciones)^2) / sum((test$mpg - mean(test$mpg))^2)
cat("RMSE =", round(rmse, 2), "   R² =", round(r2, 3))
# RMSE = 2.09    R² = 0.653
plot(test$mpg, predicciones,
     main = "Valores observados vs. predichos",
     xlab = "Rendimiento real (mpg)",
     ylab = "Predicción del modelo",
     pch = 19, col = "darkgreen")
abline(0, 1, col = "red", lwd = 2, lty = 2)
En este caso, los resultados muestran que el modelo explica alrededor
del 65 % de la variabilidad del rendimiento de los vehículos (R² =
0.653), lo que indica una relación moderadamente fuerte entre el peso y
el consumo, pero con un margen importante de variación no explicada por
el modelo. El RMSE = 2.09 sugiere que, en promedio, las predicciones
difieren de los valores reales del rendimiento en unas 2 millas por
galón, lo que puede considerarse un error aceptable para un modelo
simple. En conjunto, estos valores reflejan que el peso es un factor
relevante para estimar el rendimiento, aunque existen otros elementos
(como la aerodinámica, la potencia o el tipo de transmisión) que también
influyen y no están incluidos en este modelo básico.
El Team Data Science Process (TDSP) fue desarrollado
por Microsoft para guiar proyectos de ciencia de datos
de forma integral.
Su propósito es conectar la pregunta de negocio con el
análisis técnico y la implementación
práctica del modelo.
Las fases principales del TDSP son:
El TDSP busca asegurar que el proceso sea reproducible, medible y útil para la toma de decisiones.
Se usará nuevamente el conjunto de datos mtcars.
El objetivo será predecir si un vehículo tiene alto consumo de
combustible, considerando que un automóvil con menos de 20
millas por galón (mpg < 20) se considera de alto
consumo.
# ======== BUSINESS UNDERSTANDING ========
mtcars$alto_consumo <- ifelse(mtcars$mpg < 20, 1, 0)
# ======== DATA ACQUISITION & UNDERSTANDING ========
plot(mtcars$wt, mtcars$mpg,
     main = "Peso vs. rendimiento (mpg)",
     xlab = "Peso del vehículo", ylab = "Millas por galón",
     pch = 19, col = "darkblue")
# ======== MODELING ========
modelo_log <- glm(alto_consumo ~ wt + hp, data = mtcars, family = binomial())
summary(modelo_log)
# 
# Call:
# glm(formula = alto_consumo ~ wt + hp, family = binomial(), data = mtcars)
# 
# Coefficients:
#               Estimate Std. Error z value Pr(>|z|)
# (Intercept)   -894.228 365884.162  -0.002    0.998
# wt             202.865  84688.218   0.002    0.998
# hp               2.021    858.062   0.002    0.998
# 
# (Dispersion parameter for binomial family taken to be 1)
# 
#     Null deviance: 4.3860e+01  on 31  degrees of freedom
# Residual deviance: 1.1156e-08  on 29  degrees of freedom
# AIC: 6
# 
# Number of Fisher Scoring iterations: 25
El resultado muestra que el modelo de regresión logística logró clasificar perfectamente los vehículos entre alto y bajo consumo, pero esto produjo un problema conocido como separación perfecta. En este caso, el peso y la potencia distinguen sin error los grupos, haciendo que los coeficientes crezcan hasta valores extremadamente grandes y los errores estándar sean desproporcionados. Por ello, aunque el modelo presenta una desviancia residual prácticamente nula (lo que sugiere ajuste perfecto), sus parámetros no son estadísticamente interpretables: los valores-p cercanos a 1 indican falta de significancia y los signos o magnitudes de los coeficientes carecen de sentido práctico. En síntesis, el modelo predice bien en esta muestra, pero no es estable ni generalizable, por lo que no puede considerarse un modelo válido para interpretación o uso predictivo fuera del conjunto de datos.
# ======== ASSESS ========
prob <- predict(modelo_log, type = "response")
pred_clase <- ifelse(prob >= 0.5, 1, 0)
exactitud <- mean(pred_clase == mtcars$alto_consumo)
TP <- sum(pred_clase == 1 & mtcars$alto_consumo == 1)
FN <- sum(pred_clase == 0 & mtcars$alto_consumo == 1)
sensibilidad <- TP / (TP + FN)
cat("Exactitud =", round(exactitud, 2),
    "   Sensibilidad =", round(sensibilidad, 2))
# Exactitud = 1    Sensibilidad = 1
plot(prob, mtcars$alto_consumo,
     main = "Probabilidad estimada de alto consumo",
     xlab = "Probabilidad predicha", ylab = "Clase real (0=no, 1=sí)",
     pch = 19, col = "darkred")
abline(h = 0.5, col = "gray", lty = 2)
# ======== DEPLOYMENT ========
predecir_consumo <- function(peso, potencia, modelo){
  nueva_data <- data.frame(wt = peso, hp = potencia)
  probabilidad <- predict(modelo, newdata = nueva_data, type = "response")
  return(probabilidad)
}
predecir_consumo(3.0, 120, modelo_log)
#            1 
# 2.220446e-16
Una aseguradora desea comprender y predecir el riesgo de siniestro en su cartera de autos. Cada registro representa una póliza anual con características del conductor y del vehículo. El objetivo es analizar el riesgo y estimar la probabilidad de siniestro para apoyar decisiones de tarificación y gestión del riesgo.
Los estudiantes aplicarán dos enfoques complementarios:
Se utilizará un conjunto de datos con la siguiente estructura:
| Variable | Tipo | Descripción | 
|---|---|---|
edad_conductor | 
numérica | Edad del conductor principal (18–75 años). | 
antiguedad_vehiculo | 
numérica | Años desde la fabricación del vehículo (0–20). | 
valor_vehiculo | 
numérica | Valor asegurado del vehículo (en millones). | 
region | 
categórica | Zona de residencia: Urbana o Rural. | 
num_siniestros | 
entera | Número de siniestros reportados en el año. | 
siniestro | 
binaria | 1 si hubo al menos un siniestro, 0 si no. | 
Nota: Si no existe la variable
siniestro, puede derivarse denum_siniestros(1 sinum_siniestros > 0).
# =====================================================
#   GENERACIÓN DE DATOS: RIESGO DE SINIESTRO (ACTUARIAL)
# =====================================================
set.seed(123)   # para reproducibilidad
n <- 3000        # tamaño de la muestra
# ---------------------------
# Variables principales
# ---------------------------
edad_conductor <- sample(18:75, n, replace = TRUE)
antiguedad_vehiculo <- sample(0:20, n, replace = TRUE)
valor_vehiculo <- round(runif(n, 20, 120), 1)  # millones
region <- sample(c("Urbana", "Rural"), n, replace = TRUE, prob = c(0.7, 0.3))
# ---------------------------
# Generación de siniestros
# ---------------------------
# modelo base para probabilidad de siniestro (logit)
# conductores más jóvenes y autos más viejos = mayor riesgo
logit_p <- -4 + 0.05*(60 - edad_conductor) + 
  0.08*antiguedad_vehiculo + 
  0.6*(region == "Urbana")
# convertir logit a probabilidad (logística inversa)
p_siniestro <- exp(logit_p) / (1 + exp(logit_p))
# número de siniestros según probabilidad esperada
num_siniestros <- rpois(n, lambda = p_siniestro * 2)
# variable binaria de siniestro (1 si hay al menos uno)
siniestro <- ifelse(num_siniestros > 0, 1, 0)
# ---------------------------
# Base de datos final
# ---------------------------
datos_siniestros <- data.frame(
  edad_conductor,
  antiguedad_vehiculo,
  valor_vehiculo,
  region,
  num_siniestros,
  siniestro
)
# Vista previa
head(datos_siniestros)
Urbana o Rural),Entregable A: un breve informe con las visualizaciones, interpretación y conclusiones sobre las variables más influyentes en el riesgo observado.
El objetivo es predecir si ocurrirá un siniestro
durante el año de la póliza, usando características conocidas del
conductor y del vehículo.
La aseguradora desea identificar clientes de alto
riesgo para ajustar sus primas o reforzar las estrategias de
prevención.
Defina: - Una métrica de éxito (por ejemplo,
alcanzar al menos 70 % de exactitud o una sensibilidad mínima de
0.60).
- Un umbral inicial de clasificación (por ejemplo,
0.5).
Comente: ¿Qué implica, en este contexto, clasificar erróneamente a un cliente?
siniestro = 1 hay; si son muy
pocos, comente qué problema podría generar eso en el modelado.Ajuste un modelo de regresión logística donde la
variable dependiente sea siniestro y los predictores sean
algunas de las variables explicativas (por ejemplo,
edad_conductor, antiguedad_vehiculo,
valor_vehiculo y region).
Incluya: 1. El comando de ajuste (glm(...))
2. Un resumen del modelo (summary(...))
3. Una interpretación básica de los signos de los coeficientes: - ¿A
mayor antigüedad del vehículo, aumenta o disminuye la probabilidad de
siniestro? - ¿La zona urbana presenta más riesgo?
Con las probabilidades estimadas, clasifique los casos según el
umbral definido (por ejemplo, 0.5).
Luego:
Describa en pocas líneas cómo se podría usar el modelo dentro de la aseguradora:
Incluya también una reflexión sobre las limitaciones del modelo, como el tamaño de la muestra, variables omitidas o posibles sesgos.
Entregable B:
Un informe corto con las métricas principales del modelo, una breve
interpretación de los coeficientes y una propuesta sencilla de cómo usar
los resultados en decisiones actuariales.