Analítica avanzada y ciencia de datos aplicada
Guía de repaso del módulo
Diplomado en Business Intelligence e Inteligencia Artificial · CEC-EPN · 20 al 28 de octubre de 2026
Inicio
Resumen de consulta rápida del módulo, con la ruta que seguimos, la sintaxis en R que se fue acumulando, los conceptos que más se confunden y lo que se pidió en la evaluación final. Úsalo para repasar, no para copiar: tus cifras salen de tu provincia.
20 horas, 6 clases
Del 20 al 28 de octubre de 2026. Todo con datos reales: ENEMDU anual 2025, la provincia asignada a cada participante.
Una sola base, un solo script
Un mismo bloque de preparación y los mismos objetos de la clase 1 a la 6; cada clase suma pasos al mismo script.
Evaluación
Diagnóstica (0 puntos), cinco formativas de 10 puntos y un taller final de 50. Se aprueba con 70 y 80 % de asistencia.
La ruta en cinco pasos
Clase a clase
Qué vimos cada día y la idea que hay que llevarse.
Exploración y limpieza 20–21 oct
- Descarga y lectura de la ENEMDU anual 2025 y selección de la provincia.
- Auditoría de la base: códigos especiales (
999999y-1pasan a NA), faltantes y atípicos. - Distribuciones y visualización con ggplot2.
Estadística descriptiva 22 oct
- Media, mediana, varianza y coeficiente de variación.
- Factor de expansión: la misma medida cambia con y sin él (media del ingreso en Guayas: 552 sin factor, 467 con factor).
- Correlación: Spearman cuando la variable es muy asimétrica o ordinal.
Probabilidad, inferencia y primer K-means 23 oct
- Probabilidad como proporción y probabilidad condicional (por ejemplo, ganar menos que el salario básico, por sexo).
- Error estándar, intervalo de confianza al 95 % y prueba t de Welch.
- Primer K-means con edad e ingreso.
Segmentación con K-means 26 oct
- Variables estandarizadas con
scale(), ingreso en logaritmo yset.seed()para reproducir resultados. - Método del codo: orienta, no decide. También cuentan el tamaño de los grupos y su sentido.
- Perfiles: tamaño, edad, horas, ingreso mediano, % de mujeres y % rural. Prueba de estabilidad con otra semilla.
Series de tiempo e insights 27 oct
- Serie mensual de 2025: media móvil de 3 meses, tendencia con
lm()y su valor p. - Separar ruido de señal: intervalo de confianza de cada mes contra la media anual.
- Proyección de 3 meses con intervalo de predicción y el límite de usar un solo año.
- Storytelling y recomendaciones: título con el mensaje, tres hallazgos con cifra y una acción con su riesgo.
Taller final: del dato a la decisión 28 oct
- Se reúne todo el recorrido en un solo script que corre de principio a fin.
- Entregas: informe ejecutivo de 3 páginas, presentación ejecutiva con KPIs y recomendaciones, script en R y registro de prompts de IA.
- Exposición de 3 minutos con la presentación, para quienes alcanzan.
Sintaxis en R
El script se arma por bloques sobre la misma preparación. Copia cada bloque debajo del anterior y corre todo de principio a fin.
Se copia una sola vez, al inicio. Cambia PROVINCIA por la tuya.
library(tidyverse)
library(data.table)
PROVINCIA <- 9 # Guayas por defecto; usa la que se te asigne
datos <- fread("enemdu_2025.csv") |>
as_tibble() |>
filter(as.numeric(prov) == PROVINCIA) |>
select(area, p02, p03, p10a, p24, ingrl, fexp, mes) |>
rename(ingreso = ingrl, factor = fexp,
edad = p03, sexo = p02,
instruccion = p10a,
horas = p24)
ing <- datos |>
mutate(ingreso = if_else(ingreso %in% c(999999, -1),
NA_real_, as.numeric(ingreso))) |>
filter(!is.na(ingreso)) |>
mutate(sexo = if_else(sexo == 1, "Hombre", "Mujer"),
area = if_else(area == 1, "Urbano", "Rural"))
nrow(ing)
# Funciones ponderadas (se copian una sola vez)
media_pond <- function(x, w) sum(x * w) / sum(w)
mediana_pond <- function(x, w) {
o <- order(x); x <- x[o]; w <- w[o]
x[which(cumsum(w) >= sum(w) / 2)[1]]
}
sd_pond <- function(x, w)
sqrt(sum(w * (x - media_pond(x, w))^2) / sum(w))
prop_pond <- function(cond, w) sum(w * cond) / sum(w)n_filas <- nrow(datos) n_codigos <- sum(datos$ingreso %in% c(999999, -1), na.rm = TRUE) n_blanco <- sum(is.na(datos$ingreso)) n_ingreso <- nrow(ing) n_cero <- sum(ing$ingreso == 0) q <- quantile(ing$ingreso, c(0.25, 0.75)) lim_sup <- q[2] + 1.5 * (q[2] - q[1]) n_atipicos <- sum(ing$ingreso > lim_sup) summary(ing$ingreso) # Control: n_filas - n_codigos - n_blanco = n_ingreso
# Media, mediana y CV: sin y con factor de expansión
estad <- tibble(
medida = c("Media", "Mediana", "Desv. estándar", "CV"),
sin_factor = c(mean(ing$ingreso), median(ing$ingreso),
sd(ing$ingreso), sd(ing$ingreso) / mean(ing$ingreso)),
con_factor = c(media_pond(ing$ingreso, ing$factor),
mediana_pond(ing$ingreso, ing$factor),
sd_pond(ing$ingreso, ing$factor),
sd_pond(ing$ingreso, ing$factor) /
media_pond(ing$ingreso, ing$factor)))
# Correlación de Spearman (el ingreso es muy asimétrico)
cor(ing$instruccion, ing$ingreso, method = "spearman", use = "complete.obs")
# Probabilidad como proporción: ¿gana menos que el salario básico?
SBU <- 470
mean(ing$ingreso < SBU)
prop_pond(ing$ingreso < SBU, ing$factor)
# Intervalo de confianza al 95 % por grupo
ic_sexo <- ing |>
group_by(sexo) |>
summarise(n = n(),
media = mean(ingreso),
ee = sd(ingreso) / sqrt(n),
li = media - qt(0.975, n - 1) * ee,
ls = media + qt(0.975, n - 1) * ee)
# Prueba t de Welch (no usa el factor de expansión)
prueba <- t.test(ingreso ~ sexo, data = ing)
prueba$conf.int
prueba$p.valueset.seed(2026)
seg <- ing |>
filter(ingreso > 0, !is.na(horas), horas > 0, horas <= 168) |>
mutate(log_ingreso = log(ingreso))
km_datos <- seg |>
select(edad, horas, log_ingreso) |>
scale()
# Método del codo
codo <- tibble(
k = 1:8,
sct = map_dbl(1:8, \(k) kmeans(km_datos, k, nstart = 10)$tot.withinss))
ggplot(codo, aes(k, sct)) +
geom_line() + geom_point() +
scale_x_continuous(breaks = 1:8) +
labs(title = "Método del codo",
x = "Número de grupos (k)",
y = "Variación dentro de los grupos",
caption = "Fuente: INEC, ENEMDU anual 2025")
K <- 3 # tu decisión: codo + tamaño + sentido de los grupos
km <- kmeans(km_datos, centers = K, nstart = 25)
seg <- seg |> mutate(grupo = factor(km$cluster))
perfil <- seg |>
group_by(grupo) |>
summarise(n = n(),
pct_pob = 100 * sum(factor) / sum(seg$factor),
edad = median(edad),
horas = median(horas),
ingreso = median(ingreso),
pct_mujer = 100 * mean(sexo == "Mujer"),
pct_rural = 100 * mean(area == "Rural"))
perfil
# Estabilidad: ¿otra semilla da la misma partición?
set.seed(99)
km2 <- kmeans(km_datos, centers = K, nstart = 25)
table(km$cluster, km2$cluster)serie_mes <- ing |>
group_by(mes = as.numeric(mes)) |>
summarise(n = n(),
media = mean(ingreso),
ee = sd(ingreso) / sqrt(n),
li = media - qt(0.975, n - 1) * ee,
ls = media + qt(0.975, n - 1) * ee,
media_p = media_pond(ingreso, factor))
# Media móvil de 3 meses
serie_mes <- serie_mes |>
mutate(mm3 = (media_p + lag(media_p) + lag(media_p, 2)) / 3)
# Tendencia lineal y su valor p
modelo <- lm(media_p ~ mes, data = serie_mes)
summary(modelo)
# ¿Qué meses se alejan de la media anual más de lo que explica el ruido?
media_anual <- mean(ing$ingreso)
serie_mes |>
mutate(fuera = li > media_anual | ls < media_anual) |>
select(mes, media, li, ls, fuera)
# Proyección de 3 meses con su rango (13 a 15 = ene a mar de 2026)
nuevos <- tibble(mes = 13:15)
predict(modelo, newdata = nuevos, interval = "prediction", level = 0.95)g_bajo <- which.min(perfil$ingreso) # perfil de menor ingreso mediano
kpis <- tibble(
kpi = c("Ingreso mediano (con factor, USD)",
"% que gana menos que el SBU (con factor)",
"Brecha de ingreso hombre-mujer (USD)",
"% de la población en el perfil de menor ingreso",
"Tendencia mensual del ingreso (USD por mes)"),
valor = c(mediana_pond(ing$ingreso, ing$factor),
100 * prop_pond(ing$ingreso < SBU, ing$factor),
unname(prueba$estimate[1] - prueba$estimate[2]),
perfil$pct_pob[g_bajo],
unname(coef(modelo)["mes"])))
print(kpis)Conceptos clave
Lo que más se confunde, en una frase.
Factor de expansión
Cada persona de la muestra representa a varias de la población. Sin él, describes la muestra; con él, la población.
Intervalo de confianza
Rango plausible del valor poblacional. Si los intervalos de dos grupos no se tocan, la diferencia es difícil de explicar por azar.
Valor p
Qué tan raro sería ver este resultado si no hubiera diferencia. No es la probabilidad de que la hipótesis nula sea cierta.
«No significativo»
No prueba que no haya diferencia: puede faltar información. Se dice «no hay evidencia suficiente».
Spearman
Correlación por rangos. Sirve con ingresos (muy asimétricos) y con variables ordinales como el nivel de instrucción.
t.test sin factor
La prueba t de R no usa el factor de expansión ni el diseño muestral. Hay que declararlo como limitación.
K-means
Se estandariza, se fija la semilla y se prueba estabilidad. El codo guía; el sentido de los perfiles decide.
Etiquetas de grupo
El grupo 1, 2 o 3 no es un ranking y puede cambiar de número entre equipos. Nómbralos por su perfil.
Tendencia vs ruido
Una pendiente con p alto no es evidencia de tendencia. Un mes alto o bajo puede ser variación entre meses.
Un solo año
Alcanza para ver la evolución mensual, no para afirmar estacionalidad. La proyección es un ejercicio con su rango, no una promesa.
Ejemplo resuelto
Ejemplo resuelto con la provincia de referencia (Guayas, 09). Tus cifras serán distintas; lo importante es cómo se lee cada resultado.
| Indicador | Valor | Cómo se lee |
|---|---|---|
| Base de trabajo | 18.234 personas | 43.819 filas, menos 230 con código especial y 25.355 sin ingreso |
| Ingreso mediano (con factor) | USD 420 | Sin factor es 470; el factor cambia la foto |
| Gana menos que el SBU | 54,6 % | Con factor; sin factor es 45,7 % |
| Brecha hombre-mujer | USD 47,9 | IC 95 %: 32,5 a 63,3 (p < 0,001); la prueba no usa el factor |
| Spearman ingreso-instrucción | 0,37 | Asociación positiva moderada; con la edad es casi nula (−0,02) |
| Perfil de menor ingreso (k = 3) | 31,4 % de la población | 20 horas semanales, ingreso mediano USD 180, mitad mujeres |
| Tendencia mensual | −5,2 USD por mes (p = 0,34) | No hay evidencia de tendencia |
| Proyección meses 13 a 15 | USD 438, 433 y 428 | Con rango amplio (aprox. 254 a 601): es un ejercicio, no una promesa |
¿Cambió el mercado laboral o es ruido?
En Guayas el ingreso medio ponderado fue de USD 618 en enero y de USD 393 en marzo. No hay tendencia a lo largo del año (p = 0,34), pero sí hay variación entre meses mayor que el ruido simple: 9 de 12 meses quedan fuera de la media anual. Con un solo año no se puede decir si es estacionalidad, composición de la muestra u otro factor. La conclusión honesta: no podemos afirmar que el mercado laboral cambió.
Taller final
Lo que pidió el taller final y cómo se evaluó.
Informe ejecutivo
3 páginas: resumen con el mensaje principal, KPIs, hallazgos con evidencia, perfiles, serie, recomendaciones con riesgo y mitigación, y limitaciones.
Presentación ejecutiva
6 diapositivas: portada con el mensaje, KPIs, tres hallazgos, dos gráficos, recomendaciones y limitaciones.
Script en R
La sintaxis que ejecutaste, de principio a fin y comentada.
Prompts de IA
Registro en el Anexo A: prompt, respuesta, cómo lo verificaste y qué corregiste.
- Ingreso mediano con factor.
- % que gana menos que el SBU, con factor.
- Brecha de ingreso hombre-mujer, con su IC.
- % de la población en el perfil de menor ingreso.
- Tendencia mensual del ingreso y su valor p.
Qué
Una acción concreta, con verbo.
A quién
Quién la ejecuta o a quién va dirigida.
Con qué evidencia
El KPI o hallazgo que la respalda.
Riesgo
Qué puede salir mal.
Mitigación
Qué haces para reducirlo.
Indicador
Cómo sabrás si funcionó.
| Criterio | Puntos |
|---|---|
| Limpieza y exploración | 7,5 |
| Estadística aplicada | 10 |
| Segmentación | 7,5 |
| Series de tiempo | 7,5 |
| Insights y recomendaciones | 10 |
| Informe y presentación ejecutivos | 5 |
| Uso documentado de IA | 2,5 |
| Total | 50 |
- Mi script corre de principio a fin sin errores.
- Las cifras del informe y de la presentación son las mismas y salen de mi script.
- Mis recomendaciones tienen evidencia, riesgo, mitigación e indicador.
- Declaré las limitaciones: un solo año y t.test sin factor.
- Llené el Anexo A con mis prompts y cómo los verifiqué.
Prompts de IA
Prompts reutilizables. La IA ayuda a entender y a redactar; las cifras, la interpretación y la recomendación son tuyas. Verifica siempre contra tu propia salida de R.
Estoy trabajando con la ENEMDU anual 2025 en R (tidyverse). Este es mi código y este es el error que me sale: [pega aquí tu código] [pega aquí el mensaje de error] Explícame qué significa el error en palabras simples y dime qué línea debo revisar. No reescribas todo mi script.
Obtuve este resultado en R con la ENEMDU 2025 (ingreso laboral, mi provincia): [pega aquí la salida] Explícame cómo se lee, qué NO puedo concluir y qué limitaciones debo declarar (por ejemplo, que t.test no usa el factor de expansión).
Este es el borrador de mi informe ejecutivo. Revisa solo la redacción: claridad, tono profesional y que el título diga la conclusión. No cambies mis cifras ni mi interpretación; si algo no cuadra, señálalo como comentario. [pega aquí tu borrador]
Esta es mi recomendación para mejorar la situación laboral de mi provincia, con su evidencia: [pega aquí tu recomendación y los KPIs que la respaldan] Hazme de abogado del diablo: dame 3 riesgos o objeciones razonables y qué dato necesitaría para responder a cada una.
Resume en una tabla de 3 columnas (prompt, qué respondió la IA, cómo lo verifiqué / qué corregí) esta lista de prompts que usé en mi taller: [pega aquí tus prompts] Mantén mis palabras; solo ordena y no inventes verificaciones que yo no hice.
Recursos
Fuentes y herramientas del módulo.
INEC · ENEMDU
Fuente de la base anual 2025 y su documentación.
R
El lenguaje que usamos en todo el módulo.
RStudio
Entorno para escribir y correr tu script.
tidyverse
dplyr, ggplot2, purrr y el resto de paquetes que usamos.
R for Data Science
Libro gratuito en línea para seguir practicando.
An Introduction to Statistical Learning
James, Witten, Hastie y Tibshirani (2021): clustering y estadística aplicada.
Data Science for Business
Provost y Fawcett: de los datos a las decisiones.
