Saltar al contenido

# metodos-de-econometria-aplicada-con-python

Métodos de Econometría Aplicada con Python

Volver a la portada del curso
Notebook

Desarrollo del Proyecto

Sección 6 · Proyecto Final

Desarrollo del proyecto

Esta guía recorre la solución de referencia del proyecto final, el notebook proyecto-precio-optimo. Intenta resolver el enunciado por tu cuenta antes de leerla: aquí están las cifras clave y el orden de los pasos. La pregunta de la dirección de Café Altura (cadena ficticia, datos simulados) es concreta: ¿qué precio conviene cobrar? Para responderla necesitas una elasticidad confiable, un diagnóstico que la respalde y una regla que convierta la elasticidad en precio.

Paso 1. Plantear el problema con cifras

El notebook carga generar_panel() y reproduce el punto de partida: el precio medio subió de 60.49 MXN en 2024 a 64.54 en 2025 (+6.7 %) y las tazas cayeron 11.4 %. La dirección quiere saber si la subida fue un error y hacia dónde moverse. La unidad de análisis es la tienda-semana: 4160 filas.

Paso 2. La trampa de la regresión ingenua

La regresión log-log simple da +0.236. Si se tomara en serio, subir el precio 10 % aumentaría las tazas 2.3 %, y la recomendación sería subir sin límite. El notebook la muestra a propósito y explica por qué es falsa: entre tiendas, el precio y las ventas se correlacionan +0.621 porque las buenas ubicaciones cobran más y venden más. Con controles de tienda (M3) la elasticidad pasa a −0.446, todavía sesgada por lo que los controles no capturan.

Paso 3. La elasticidad con efectos fijos

import numpy as np
from linearmodels import PanelOLS

p = generar_panel().set_index(["tienda", "semana"])
p["log_pub"] = np.log1p(p.publicidad_miles)
fe = PanelOLS.from_formula(
    "log_ventas ~ log_precio + promo + temperatura + log_pub"
    " + EntityEffects", p,
).fit(cov_type="clustered", cluster_entity=True)
e = fe.params["log_precio"]
lo, hi = fe.conf_int().loc["log_precio"]
print(round(e, 3), round(lo, 3), round(hi, 3))

Resultado: e = −1.300, error estándar por cluster 0.022 e intervalo al 95 % de [−1.344, −1.257]. La demanda es elástica: un 1 % más de precio cuesta 1.3 % de tazas. Promo 0.131, temperatura −0.017 y log de publicidad 0.081 completan el modelo.

Paso 4. Respaldar la elección del modelo

La solución incluye tres comprobaciones, cada una con su cifra:

  • Los efectos de tienda existen: F de poolability 610.7, p ≈ 0.
  • Están correlacionados con el precio: en la regresión de Mundlak, la media por tienda de log_precio tiene coeficiente 2.733 (p ≈ 1e-34); Wald conjunto 298.3. Se descarta efectos aleatorios como estimador principal, aunque con theta 0.946 da casi lo mismo (−1.289).
  • Los errores van por cluster: en MCO el error de la elasticidad pasa de 0.032 a 0.159 al agrupar por tienda; reportar el clásico sería exagerar la precisión.

Agregar TimeEffects deja la elasticidad en −1.300: los choques comunes de cada semana no la mueven.

Paso 5. ¿Cuánto de la caída explica el precio?

Con e = −1.30, una subida de 6.7 % implica $1.067^{-1.3} - 1 = -8.1\,\%$ de tazas. La caída observada fue −11.4 %, así que el precio explica la mayor parte, no todo. El resto corresponde a otros factores que el informe debe mencionar sin inventar causas. Esta distinción evita que la dirección revierta la subida esperando recuperar todo el volumen.

Paso 6. Simular escenarios: tazas, ingreso y utilidad

Con elasticidad constante, un cambio de precio $c$ mueve las tazas en $(1+c)^{e} - 1$. El ingreso es precio por tazas; la utilidad es margen por tazas, con costo unitario de 18 MXN por bebida (supuesto del enunciado):

costo, p0 = 18.0, 64.54
for c in [-0.10, -0.05, 0.05, 0.10, 0.20]:
    q = (1 + c) ** e
    ingreso = (1 + c) * q - 1
    utilidad = (p0 * (1 + c) - costo) * q / (p0 - costo) - 1
    print(f"{c:+.0%} tazas {q - 1:+.1%} ingreso {ingreso:+.1%}"
          f" utilidad {utilidad:+.1%}")
PrecioTazasIngresoUtilidad
−10 %+14.7 %+3.2 %−1.2 %
−5 %+6.9 %+1.6 %−0.5 %
+5 %−6.1 %−1.5 %+0.4 %
+10 %−11.7 %−2.8 %+0.6 %
+20 %−21.1 %−5.3 %+0.8 %

Aquí está el punto que más se equivoca en la práctica: ingreso no es utilidad. Con demanda elástica, bajar el precio sube el ingreso (+3.2 %) pero baja la utilidad (−1.2 %), porque cada taza adicional cuesta 18 MXN producirla. Un equipo que optimice ingreso recomendaría bajar precios; uno que optimice utilidad, lo contrario.

Paso 7. El precio óptimo con la regla de Lerner

Con demanda de elasticidad constante y costo marginal constante $c$, el precio que maximiza la utilidad cumple la regla de Lerner:

$$\frac{p^* - c}{p^*} = -\frac{1}{e} \quad\Longrightarrow\quad p^* = \frac{c\,e}{1+e}$$

Con $c = 18$ y $e = -1.30$: $p^* = $ 77.9 MXN, con margen de Lerner de 0.769. Usando los extremos del intervalo de la elasticidad, el precio óptimo va de 70.3 a 88.1. El precio medio de 2025 es 64.5 (margen 0.721). Llegar a 77.9 implica subir 20.8 %: las tazas caerían 21.7 % y el ingreso 5.5 %, pero la utilidad subiría solo 0.78 %.

La curva de utilidad es casi plana cerca del óptimo. Esa es la conclusión práctica: hay poco que ganar y bastante riesgo en saltar a 77.9 (reacción de la competencia, clientes perdidos a largo plazo, un costo real distinto de 18). La recomendación de referencia es no bajar precios, sostener el nivel de 2025 y, si se quiere explorar, probar aumentos moderados en algunas tiendas y medir.

Paso 8. Extras

  • Pronóstico 2024: SARIMA(1,0,0)(1,1,0,12) con constante sobre el log de las ventas mensuales. En el holdout de 2023 su MAPE es 3.85 % contra 8.55 % del naive estacional. Reestimado con los 120 meses, pronostica 7961.2 mil tazas para 2024.
  • Café en grano: el logit sobre la encuesta da un efecto marginal promedio de la app de +0.114: los usuarios de la app son el público natural de una campaña.

Qué debes obtener

e = −1.300 [−1.344, −1.257]; precio explica −8.1 % de −11.4 %; escenarios de la tabla; $p^*$ = 77.9 (rango 70.3-88.1) contra 64.5 actual. Si tu elasticidad sale positiva o cerca de −0.45, falta EntityEffects. Como práctica, repite el paso 7 con un costo de 22 MXN y observa cómo se mueve $p^*$.

Recursos