library(tidyverse)
tienda <- read_csv("data/tienda.csv") |>
mutate(zona = factor(zona, levels = c("pueblo", "ciudad", "capital")))Tema 05 - Modelización y aprendizaje estadístico
Ejercicios del tema
Antes de empezar
Estos ejercicios se van haciendo durante las clases del tema: las transparencias indican en qué momento toca cada uno.
Si no lo has hecho ya, lee Cómo trabajar en cada tema: la carpeta del tema con su subdirectorio data, cómo se crea el documento, qué va en la cabecera (con embed-resources: true), la primera celda y cómo se entrega. Vale para todo el curso.
De este tema, lo que te hace falta:
- Los datos son
tienda.csv, de la página Datos. Descárgalos en tu subdirectoriodata. Son 404 clientes encuestados por una cadena de tiendas: una fila por cliente, conventas(gasto anual en euros),renta(mensual, euros),edad,mujer,educ(años de estudios),zonaydescuento(1 si lo recibió). - Un documento por entrega,
T05_E<n>_<ID>.qmd. Cada uno carga los datos en su primera celda, conzonacomo factor ypueblode referencia:
- Donde se pide una semilla, usa tu DNI (sin letra):
set.seed(12345678). Tus cifras serán distintas de las de tus compañeros, y eso es lo esperado.
Entrega 1: una muestra entre muchas y el primer modelo
Apartado a): la precisión de la media con la fórmula
Con \(s/\sqrt{n}\), el error estándar de la media de
tienda$ventasy su intervalo al 95%.Dirección quiere el gasto medio con un error estándar de 20 euros. ¿A cuántos clientes hay que encuestar? Escribe la cuenta.
Apartado b): bootstrap
Con tu DNI como semilla:
El error estándar y el intervalo al 95% de la media con el bootstrap. Compáralos con los del apartado a). ¿Por qué salen casi iguales?
La mediana de
tienda$ventas: error estándar e intervalo al 95% con el bootstrap. ¿Es más o menos precisa que la media?La diferencia de gasto medio entre mujeres y hombres en
tienda, con su error estándar e intervalo por bootstrap, remuestreando por separado el gasto de cada grupo. ¿Puede ser cero la diferencia? Explícalo en una frase.Repite el bootstrap de la mediana quitando
replace = TRUE. ¿Qué sale y por qué?En una frase: ¿de dónde sale la incertidumbre que mides, si los datos son siempre los mismos 404 clientes?
Apartado c): leer los coeficientes
Estima modelo_z <- lm(ventas ~ renta + descuento + zona, data = tienda).
Con
summary(), escribe en euros qué dicen los coeficientes derentaydescuento. Pararenta, cuánto cambia el gasto por cien euros más de renta mensual.¿Qué \(R^2\) tiene el modelo? ¿Qué significa que el resto de la varianza del gasto esté en \(u\)?
Apartado d): predecir dos clientes nuevos
El gasto esperado de un cliente de pueblo con renta 1.500 y sin descuento, y de uno de capital con renta 3.000 y con descuento. predict(modelo_z, newdata = nuevos) predice para nuevos, una tabla con las mismas columnas que usa el modelo.
Apartado e): el coeficiente y la varianza del error
Con tu DNI como semilla, adapta el bucle del bootstrap: en cada vuelta remuestrea filas de tienda (filas <- sample(nrow(tienda), replace = TRUE)), estima el modelo en tienda[filas, ] y guarda el coeficiente de renta, coef(m_b)["renta"], y la varianza de los residuos, var(residuals(m_b)).
Compara el error estándar del coeficiente con el
Std. Errordesummary(), y su intervalo de percentiles con el de la fórmula,confint(modelo_z)["renta", ].El error estándar y el intervalo al 95% de la varianza del error. ¿Cuánto se desvía un cliente típico de lo que predice el modelo?
Entrega 2: muchos modelos posibles
Partimos de ventas ~ renta + descuento + zona. En cada apartado, anota el \(R^2\) de cada modelo con seis decimales, summary(m)$r.squared.
Apartado a): polinomios
Añade edad, y después, de uno en uno, I(edad^2), I(edad^3) e I(edad^4).
Apartado b): tramos de edad
En lugar del polinomio, usa tramos de edad de 20 en 20 años (cut(edad, c(20, 40, 60, 70), include.lowest = TRUE)), de 10 en 10 (seq(20, 70, by = 10)) y de 5 en 5.
Apartado c): interacciones
Partiendo de la parábola, añade educ, y después, de una en una, renta * mujer, educ * mujer y edad * mujer.
Cierra con una tabla: una fila por modelo de esta entrega y su \(R^2\). ¿Cuántos grados, cuántos tramos y cuántas interacciones pondrías? Explica en una frase por qué cuesta decidirlo.
Entrega 3: decidir a quién va el descuento
La tienda quiere una regla para dar el descuento a clientes nuevos. La variable a explicar es descuento; los regresores, renta, edad y zona.
Apartado a): el logit
Estima el modelo con
glm(..., family = "binomial")y obtén la probabilidad predicha de cada cliente conpredict(type = "response"). ¿Entre qué valores está?¿Qué variables importan y en qué dirección? ¿Cuántos clientes pasan de 0,5?
Apartado b): el umbral de siempre
Con umbral 0,5, construye la matriz de confusión con table(). Calcula exactitud, sensibilidad y especificidad, y di qué proporción de clientes tiene descuento de verdad en la muestra.
Apartado c): otros umbrales
Repite con umbral 0,25 y con 0,10. Presenta una tabla de tres filas: umbral, exactitud, sensibilidad, especificidad y número de clientes contactados.
Apartado d): el coste decide
Un modelo que clasifique a todos como “sin descuento”: ¿qué exactitud tiene? ¿Qué métrica lo delata?
La tienda dice que no dar el descuento a quien lo habría recibido cuesta diez veces más que dárselo a quien no lo necesitaba. Calcula el coste de cada umbral, \(10 \cdot FN + FP\). ¿Cuál eliges?
En una frase: ¿por qué 0,5 es una decisión que estás tomando?
Cómo se entrega
Cada ejercicio es una entrega, por el formulario de entrega:
- Entrega 1: una muestra entre muchas y el primer modelo.
T05_E1_ID.zip - Entrega 2: muchos modelos posibles.
T05_E2_ID.zip - Entrega 3: decidir a quién va el descuento.
T05_E3_ID.zip
Subid en cada una un solo .zip con el .qmd y el .html dentro. El ID es el mismo identificador que escribís en el formulario (ver Cómo trabajar). Por ejemplo, T05_E1_12345678.zip.
Las frases de interpretación que se piden expresamente van como texto del documento, no como comentarios dentro del código: para eso es un documento de Quarto y no un guion de R.
Se os dirá en clase cuáles hay que entregar y cuándo.
Comprobad que el nombre sea exacto, o la entrega se rechazará. Recibiréis un correo de confirmación si la entrega es correcta, o de rechazo si no lo es.
Renderizad con embed-resources: true para que el .html se vea por sí solo.
No se valora que esté perfecto: se valora el progreso y que se vea lo que habéis entendido. Si os quedáis a medias, entregad lo que tengáis.
Las entregas que se hagan en clase se cierran al acabar la sesión, con un margen de 15 minutos desde el final. La hora de envío queda registrada.