# metodos-de-econometria-aplicada-con-python
Métodos de Econometría Aplicada con Python
Volver a la portada del cursoModelos Logísticos y Probit
Sección 5 · Técnicas Avanzadas de Econometría
Modelos logísticos y probit
Café Altura también vende café en grano, y la dirección quiere saber qué clientes lo compran. La respuesta es binaria: compró una bolsa en el mes (1) o no (0). Una regresión lineal sobre una variable 0/1 funciona como primera aproximación, pero predice probabilidades imposibles. En este notebook comparas el modelo lineal de probabilidad con logit y probit, y aprendes a traducir sus coeficientes a efectos en puntos porcentuales. Esta guía acompaña al notebook logit-probit-grano; los datos son una encuesta simulada.
1. Los datos de la encuesta
generar_clientes() devuelve 2500 clientes con edad, ingreso_miles (ingreso mensual en miles de MXN), visitas_mes, usa_app (0/1), distancia_km y compra_grano. Compraron 492: una tasa de 0.197. La primera tabla del notebook ya muestra una diferencia: entre quienes usan la app compra el 26.6 %; entre quienes no, el 14.2 %.
2. Modelo lineal de probabilidad (LPM)
El LPM es MCO con $y \in \{0, 1\}$: cada coeficiente es un cambio en la probabilidad. Sus errores son heterocedásticos por construcción, así que se estima con cov_type="HC1". El problema aparece al predecir: 210 de los 2500 clientes reciben una probabilidad fuera de [0, 1], con mínimo −0.268. Para ordenar clientes eso puede no importar; para reportar probabilidades, sí.
3. Logit y probit
Ambos pasan el índice lineal $x'\beta$ por una función que lo deja entre 0 y 1:
$$P(y=1 \mid x) = \Lambda(x'\beta) = \frac{1}{1+e^{-x'\beta}} \quad \text{(logit)}, \qquad P(y=1 \mid x) = \Phi(x'\beta) \quad \text{(probit)}$$
$\Phi$ es la distribución acumulada normal estándar. Se estiman por máxima verosimilitud:
import numpy as np
import statsmodels.formula.api as smf
cli = generar_clientes()
f = ("compra_grano ~ edad + np.log(ingreso_miles) + visitas_mes"
" + usa_app + distancia_km")
logit = smf.logit(f, data=cli).fit()
probit = smf.probit(f, data=cli).fit()
print(logit.params.round(3))
print(probit.params.round(3))
Logit: edad 0.033, log(ingreso) 0.971, visitas 0.272, usa_app 0.850, distancia −0.140, intercepto −7.293. Probit: 0.018, 0.556, 0.154, 0.488, −0.079. Los coeficientes de logit son unas 1.75 veces los de probit: no es una diferencia de conclusiones, sino de escala (la logística tiene más varianza que la normal estándar). El ajuste es casi idéntico: pseudo $R^2$ 0.146 en ambos, AIC 2129.3 contra 2129.7, y la correlación entre sus probabilidades predichas es 0.999. La prueba de razón de verosimilitud del logit contra un modelo solo con constante da 362.4.
4. Odds ratios
En logit, $e^{\beta}$ es un odds ratio: cuánto se multiplican las chances $p/(1-p)$ por unidad de la variable. Usar la app multiplica las chances por 2.34; cada visita al mes, por 1.312; cada kilómetro de distancia, por 0.869 (13 % menos). Son útiles, pero las chances no son probabilidades, y la dirección pide probabilidades.
5. Efectos marginales promedio
El coeficiente de logit no es un cambio en la probabilidad: el efecto depende de dónde esté el cliente en la curva. El efecto marginal promedio (AME) calcula el efecto para cada cliente y promedia:
ame = logit.get_margeff(at="overall")
print(ame.summary_frame().round(4))
Lo que debes ver (logit / probit): usa_app +0.114 / +0.115, visitas +0.036, distancia −0.019, edad +0.0044 por año, log(ingreso) +0.130. Usar la app sube la probabilidad de compra 11.4 puntos porcentuales. Compara con el LPM: usa_app 0.1186 y visitas 0.0386. Los tres modelos coinciden en los efectos promedio; difieren en los extremos.
Un detalle técnico: get_margeff trata a usa_app como continua por omisión. Para una variable 0/1, la versión discreta (la diferencia entre predecir con 1 y con 0) se obtiene con dummy=True y da +0.117: casi lo mismo.
6. Un perfil concreto
El notebook predice para un cliente de 35 años, ingreso de 25 mil, 8 visitas al mes, con app y a 1.5 km. Logit da 0.450 y probit 0.445. El mismo cliente sin app baja a 0.259 en logit. Para él, la app vale 19 puntos, más que el AME de 11.4, porque está en la zona media de la curva, donde la pendiente es mayor.
7. Clasificar: el corte importa
Convertir probabilidades en sí/no requiere un corte. Con 0.5, la tabla de confusión es [[1954, 54], [401, 91]]: accuracy de 0.818, pero solo detecta 91 de los 492 compradores. Un modelo que dijera «nadie compra» tendría 0.803 de accuracy. Con corte 0.3 la tabla pasa a [[1706, 302], [270, 222]]: accuracy 0.771, pero detecta 222 compradores a cambio de 302 falsas alarmas. Si la campaña de café en grano es barata (un mensaje en la app), el corte bajo conviene.
Qué debes obtener
Tu resumen final: tasa 0.197; LPM con 210 predicciones fuera de rango; razón logit/probit cercana a 1.75; pseudo $R^2$ 0.146; odds ratio de la app 2.34; AME de la app +0.114; perfil 0.450 (0.259 sin app); tablas de clasificación con cortes 0.5 y 0.3. Si tus cifras no coinciden, revisa que el ingreso entre como np.log(ingreso_miles). Como práctica, agrega I(edad**2) al logit y comprueba si el AIC mejora.