Ejemplo métodos suavizado desempleo

Ejemplo métodos suavizado desempleo#

import pandas as pd
from matplotlib import pyplot as plt
# Cargar el archivo xlsx:
df = pd.read_excel('Desempleo.xlsx')

# Corregir nombres de columnas si tienen espacios
df.columns = df.columns.str.strip()

df.head()
Fecha Desempleo
0 2001-01-01 16.622326
1 2001-02-01 17.434206
2 2001-03-01 15.811933
3 2001-04-01 14.515078
4 2001-05-01 14.035833
# Convertir 'Fecha' a datetime y usar como índice
df['Fecha'] = pd.to_datetime(df['Fecha'])
df.set_index('Fecha', inplace=True)

# Ordenar por fecha por si acaso
df = df.sort_index()

# Establecer frecuencia explícita para evitar el warning de statsmodels
df.index.freq = df.index.inferred_freq

plt.figure(figsize=(12, 5))
plt.plot(df, color='navy')
plt.title("Serie de tiempo: Desempleo")
plt.xlabel("Fecha")
plt.ylabel("Valor")
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()

print("Estadísticas descriptivas:")
print(df.describe())

plt.figure(figsize=(8, 4))
plt.hist(df, bins=30, color='steelblue', edgecolor='black')
plt.title("Histograma")
plt.xlabel("Valor")
plt.ylabel("Frecuencia")
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
../../_images/output_3_05.png
Estadísticas descriptivas:
        Desempleo
count  295.000000
mean    11.673757
std      2.422288
min      7.563100
25%      9.841250
50%     11.226400
75%     12.911872
max     21.972000
../../_images/output_3_21.png

Descomposición:#

from statsmodels.tsa.seasonal import seasonal_decompose
# Descomposición aditiva (periodo de 12 meses)
descomposicion_add = seasonal_decompose(df, model="additive", period=12)
# Graficar
plt.figure(figsize=(10, 8))
plt.subplot(4, 1, 1)
plt.plot(descomposicion_add.observed, color="darkblue")
plt.title("Descomposición aditiva - Desempleo")

plt.subplot(4, 1, 2)
plt.plot(descomposicion_add.trend, color="black")
plt.ylabel("Tendencia")

plt.subplot(4, 1, 3)
plt.plot(descomposicion_add.seasonal, color="black")
plt.ylabel("Estacionalidad")

plt.subplot(4, 1, 4)
plt.plot(descomposicion_add.resid, color="black")
plt.ylabel("Residuo")
plt.xlabel("Fecha")

plt.tight_layout()
plt.show()
../../_images/output_7_011.png
df_2019 = df.loc[:'2019-12-31']

plt.figure(figsize=(12, 5))
plt.plot(df_2019, color='navy')
plt.title("Serie de tiempo: Desempleo hasta 2019")
plt.xlabel("Fecha")
plt.ylabel("Valor")
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
../../_images/output_8_09.png

Métodos de suavizamiento:#

from statsmodels.tsa.holtwinters import SimpleExpSmoothing, Holt, ExponentialSmoothing
# Ajuste 1: Suavizado Exponencial Simple (SES)
ses_model = SimpleExpSmoothing(df_2019).fit(optimized=True)
ses_fit = ses_model.fittedvalues
alpha_opt_ses = ses_model.model.params['smoothing_level']
forecast_ses = ses_model.forecast(12)

# Ajuste 2: Holt (nivel + tendencia)
holt_model = Holt(df_2019).fit(optimized=True)
holt_fit = holt_model.fittedvalues
alpha_opt_holt = holt_model.model.params['smoothing_level']
beta_opt_holt = holt_model.model.params['smoothing_trend']
forecast_holt = holt_model.forecast(12)

# Ajuste 3: Holt-Winters (nivel + tendencia + estacionalidad)
hw_model = ExponentialSmoothing(df_2019, trend='add', seasonal='add', seasonal_periods=12).fit(optimized=True)
hw_fit = hw_model.fittedvalues
alpha_opt_hw = hw_model.model.params['smoothing_level']
beta_opt_hw = hw_model.model.params['smoothing_trend']
gamma_opt_hw = hw_model.model.params['smoothing_seasonal']
forecast_hw = hw_model.forecast(12)

# Graficar los tres ajustes sobre la serie original
plt.figure(figsize=(14, 6))
plt.plot(df_2019, label='Serie original', color='black', linewidth=2)
plt.plot(ses_fit, label=f'SES (nivel) α = {alpha_opt_ses:.4f}', color='blue', linestyle='-', alpha=0.8)
plt.plot(holt_fit, label=f'Holt (nivel + tendencia) α = {alpha_opt_holt:.4f}, β = {beta_opt_holt:.4f}',
         color='green', linestyle='-', alpha=0.8)
plt.plot(hw_fit,
         label=f'Holt-Winters (nivel + tendencia + estacionalidad) α={alpha_opt_hw:.2f}, β={beta_opt_hw:.2f}, γ={gamma_opt_hw:.2f}',
         color='red', linestyle='-', alpha=0.8)
plt.plot(forecast_ses, label='Pronóstico SES', color='blue', linestyle='--')
plt.plot(forecast_holt, label='Pronóstico Holt', color='green', linestyle='--')
plt.plot(forecast_hw, label='Pronóstico Holt-Winters', color='red', linestyle='--')
plt.title('Comparación de métodos de suavizado: SES, Holt y Holt-Winters')
plt.xlabel('Fecha')
plt.ylabel('Valor')
plt.legend()
plt.grid(True, linestyle='--', alpha=0.5)
plt.tight_layout()
plt.show()
../../_images/output_11_014.png

Cómo cambian los resultados con el método multiplicativo en Holt-Winters

Cómo sería el ajuste a la serie de tiempo completa