# metodos-de-econometria-aplicada-con-python
Métodos de Econometría Aplicada con Python
Volver a la portada del cursoAnálisis Exploratorio de Datos
Sección 2 · Análisis de Datos Económicos
Análisis exploratorio de datos
Antes de estimar una sola regresión hay que conocer los datos: qué mide cada columna, cómo se distribuye y qué relaciones aparecen a simple vista. En este notebook exploras el panel semanal de Café Altura, una cadena ficticia de cafeterías con datos simulados. Esta guía acompaña al notebook exploracion-cafe-altura: te dice qué hace cada sección y qué cifra debes ver. Al final llegarás a la pregunta que mueve todo el curso: ¿por qué las tiendas más caras venden más?
1. Tres tipos de datos en un mismo negocio
El notebook carga las tres tablas y muestra su forma. Cada una es un tipo de dato distinto:
- Corte transversal:
generar_tiendas(), 40 tiendas observadas una vez (ciudad,ingreso_zona,competidores,metros2). - Serie de tiempo:
generar_mensual(), una sola unidad (la cadena) durante 120 meses, de 2014 a 2023. - Panel:
generar_panel(), 40 tiendas observadas durante 104 semanas, de 2024-01-01 a 2025-12-22: 4160 filas y 13 columnas.
El panel es el protagonista: permite comparar tiendas entre sí y también cada tienda consigo misma a lo largo del tiempo. Esa doble mirada es la que resolverá el problema de la elasticidad.
2. Resumen numérico
df = generar_panel()
print(df.shape) # (4160, 13)
cols = ["precio", "ventas", "promo", "temperatura", "publicidad_miles"]
print(df[cols].describe().round(2))
Lo que debes ver: el precio por bebida va de 40.20 a 87.30 MXN, con media 62.48. Las ventas (tazas por semana) tienen media 4193.86 y mediana 4063, con un máximo de 11198. La promoción está activa en el 12 % de las semanas. La publicidad local tiene mediana 6.64 mil MXN pero llega a 62.26: pocas semanas con mucho gasto.
3. Ventas por ciudad
Un groupby("ciudad") con medias de precio, ventas, temperatura e ingreso de la zona ordena las ciudades. Monterrey encabeza con 4566.2 tazas semanales por tienda y precio medio 65.8; Guadalajara queda al final con 3530.9 y precio 60.6. Mérida, la ciudad más calurosa (27.1 °C de media), está en la parte baja de la tabla. Guarda esa pista: la temperatura entrará en el modelo.
4. 2024 contra 2025: el problema de la dirección
df["anio"] = df["semana"].dt.year
print(df.groupby("anio")["precio"].mean().round(2))
tazas = df.groupby("anio")["ventas"].sum()
print(tazas)
print(round((tazas[2025] / tazas[2024] - 1) * 100, 1)) # -11.4
El precio medio sube de 60.49 a 64.54 MXN (+6.7 %) y las tazas totales bajan de 9,248,844 a 8,197,601: −11.4 %. Por ciudad, la caída va de −5.8 % en Tijuana a −15.1 % en Guadalajara. La tentación es concluir que todo el descenso se debe al precio. El notebook todavía no lo afirma: en el proyecto final verás que el precio explica una parte, no todo.
5. Asimetría y logaritmos
El histograma de ventas tiene cola a la derecha: asimetría (skew) de 0.86. Con np.log(ventas) la asimetría cae a 0.04, prácticamente simétrica. Hay una segunda razón, más importante, para trabajar en logaritmos: en un modelo log-log el coeficiente del precio se lee directamente como elasticidad. Por eso el panel ya trae log_ventas y log_precio.
6. Promoción y temperatura
Las semanas con promoción venden en promedio 4749.1 tazas contra 4114.5 sin promoción. La correlación de log_ventas con la temperatura es −0.203: con más calor se venden menos bebidas calientes. Ambas son diferencias crudas; la regresión las aislará del resto.
7. La paradoja: las tiendas caras venden más
Esta es la sección central. El notebook calcula el precio medio y las ventas medias de cada tienda y las correlaciona:
por_tienda = df.groupby("tienda")[["precio", "ventas"]].mean()
print(por_tienda.corr().round(3)) # 0.621
g = df.groupby("tienda")[["log_precio", "log_ventas"]]
dentro = df[["log_precio", "log_ventas"]] - g.transform("mean")
print(dentro.corr().round(3)) # -0.602
Entre tiendas la correlación es +0.621: las más caras venden más. La más cara es T31 (75.1 MXN en promedio) y la más barata T05 (48.5). Pero si a cada tienda le restas su propia media, es decir, si comparas cada tienda consigo misma en semanas caras y baratas, la correlación se vuelve −0.602. Y no es un promedio engañoso: en las 40 tiendas, sin excepción, la correlación interna es negativa (entre −0.762 y −0.369).
¿Cómo pueden convivir las dos cifras? Las tiendas en mejores ubicaciones cobran más y también atraen más clientes. La calidad de la ubicación no está en los datos, pero contamina la comparación entre tiendas. Dentro de una misma tienda esa calidad no cambia, así que la relación que queda es la de la demanda: precio más alto, menos tazas. El gráfico de dispersión del notebook lo muestra con una nube por tienda: cada nube baja, aunque las nubes de las tiendas caras estén más arriba.
8. Correlaciones con las variables de la tienda
La matriz de correlaciones confirma la sospecha: log_precio se correlaciona 0.395 con ingreso_zona y 0.522 con competidores, y ambas se correlacionan positivamente con las ventas (0.457 y 0.260). Las zonas con más ingreso y más cafeterías cerca son las buenas ubicaciones. Si un modelo omite esas variables, el precio se lleva su efecto. Eso es sesgo por variable omitida, y lo medirás en la sección de regresión.
Qué debes obtener
Al final del notebook tu resumen debe mostrar: panel de (4160, 13); precio medio 62.48 y ventas medias 4193.86; precio 2024 60.49 contra 2025 64.54 y tazas −11.4 %; asimetría 0.86 en niveles y 0.04 en log; correlación entre tiendas +0.621 y dentro de las tiendas −0.602. Si tus cifras no coinciden, revisa que uses semilla=42 y que la columna de año salga de semana.dt.year. Como práctica, repite la sección 7 por ciudad y comprueba si la paradoja aparece también entre las cinco tiendas de una misma ciudad.