Encontrar patrones ocultos en la economía mundial y el crecimiento
Índice de contenido
Resumen:
La presente entrada expone la toma de decisiones utilizando un Modelo Oculto de Markov (o HMM, por sus siglas en inglés: “Hidden Markov Model”). Específicamente, se enfoca en el modelo de mezcla gaussiana (Gaussian Mixture), que es un modelo de Markov oculto de aprendizaje automático no supervisado que se utiliza con datos de series temporales. La belleza de este modelo es su falta de sensibilidad a los datos no estacionarios. Después de leer esta entrada, comprenderá mejor cómo funciona el modelo de mezcla gaussiana (Gaussian Mixture) y sabrá cómo desarrollar uno. Tenga en cuenta que HMM es un modelo de aprendiz no supervisado, lo que significa que puede realizar una investigación sin ninguna hipótesis de investigación predeterminada.
¿Cómo citar el presente artículo?
Romero, J. (6 de enero de 2018). Encontrar patrones ocultos en la economía mundial y el crecimiento. Python.JeshuaRomeroGuadarrama. https://www.Python.jeshuaromeroguadarrama.com/es/blog/data-science-and-econometrics/finding-hidden-patterns-in-world-economy-and-growth/.
Encontrar patrones ocultos en la economía mundial y el crecimiento by Jeshua Romero Guadarrama, available under Attribution 4.0 International (CC BY 4.0) at https://www.Python.jeshuaromeroguadarrama.com/es/blog/data-science-and-econometrics/finding-hidden-patterns-in-world-economy-and-growth/.
Encontrar patrones ocultos en la economía mundial y el crecimiento
Introducción
La presente entrada expone la toma de decisiones utilizando un Modelo Oculto de Markov (o HMM, por sus siglas en inglés: “Hidden Markov Model”). Específicamente, se enfoca en el modelo de mezcla gaussiana (Gaussian Mixture), que es un modelo de Markov oculto de aprendizaje automático no supervisado que se utiliza con datos de series temporales. La belleza de este modelo es su falta de sensibilidad a los datos no estacionarios. Después de leer este presente entrada, comprenderá mejor cómo funciona el modelo de mezcla gaussiana (Gaussian Mixture) y sabrá cómo desarrollar uno. Tenga en cuenta que HMM es un aprendiz no supervisado, lo que significa que puede realizar una investigación sin ninguna hipótesis de investigación predeterminada.
Así pues, se asume que existen dos clases, llamadas estados en la toma de decisiones de Markov. Una serie contiene valores continuos y, en ocasiones, querrá clasificar la serie. Por ejemplo, puede clasificar una serie como si tuviera una “tendencia al alza” o una “tendencia a la baja”, donde el estado $0$ representa la tendencia al alza y el estado $1$ representa la tendencia a la baja. Aquí es donde entra en juego el modelado de Markov. El modelado de Markov implica el reconocimiento secuencial de los estados actuales y anteriores, y luego los modelos para pronosticar estados futuros. Aunque es un método útil para descubrir estados ocultos en una serie, no hay métricas suficientes para evaluar los modelos; lo máximo que puede obtener es la media y la covarianza en cada estado.
Antes de continuar, asegúrese de tener la biblioteca hmmlearn
instalada en su entorno.
Para instalar la biblioteca hmmlearn
en un entorno de Python, use el siguiente código:
import warnings
warnings.filterwarnings('ignore')
# !pip install hmmlearn
Del mismo modo, para instalar la biblioteca en un entorno Conda, use el siguiente código:
# conda install -c conda-forge hmmlearn
Aplicación del modelo oculto de Markov
El Modelo Oculto de Markov determina los estados ocultos precedentes y pronostica futuros estados ocultos en una serie. De manera didáctica, se tratarán los estados ocultos como clases. Por ende, se aplicarán ciertos métodos para abordar problemas secuenciales usando una serie de tiempo. Además, se cubrirá brevemente la clasificación binaria y la regresión lineal.
Ahora bien, se desarrolla un modelo de mezcla gaussiana para pronosticar dos estados (crecimiento del PIB mundial decreciente y crecimiento del PIB mundial creciente). La mezcla gaussiana extrae suposiciones respecto a los datos de forma predeterminada. Cada vez que encuentre la palabra “gaussiano”, piense en la normalidad (variables saturadas alrededor del valor medio verdadero). Este método divide la distribución gaussiana en dos mitades y luego determina la probabilidad de que un valor caiga con un cierto estado. Este proceso ocurre de forma incremental.
En resumen, el presente ejemplo investiga los patrones ocultos en el crecimiento del PIB mundial (como porcentaje anual), ya sea decreciente o creciente. Luego aplica este modelo para pronosticar el crecimiento del PIB mundial decreciente y creciente para un año específico.
El siguiente código carga datos sobre el crecimiento del PIB mundial:
import wbdata
# Cargando datos de crecimiento del PIB mundial:
mundo = ["WLD"]
indicadores = {"NY.GDP.MKTP.KD.ZG": "crecimiento_pib"}
df = wbdata.get_dataframe(indicadores,
country = mundo,
convert_date = True)
df["crecimiento_pib"] = df["crecimiento_pib"].fillna(df["crecimiento_pib"].mean())
# Datos de crecimiento económico mundial:
df.head()
crecimiento_pib | |
---|---|
date | |
2021-01-01 | 5.802057 |
2020-01-01 | -3.271219 |
2019-01-01 | 2.614882 |
2018-01-01 | 3.276646 |
2017-01-01 | 3.379490 |
Estadísticas descriptivas
La siguiente gráfica muestra la distribución de los datos de crecimiento del PIB mundial utilizando el código que se presenta a continuación:
import matplotlib.pyplot as plt
# Distribución del crecimiento económico mundial y detección de valores atípicos
df.plot(kind = "box",
color = "green")
plt.title("Distribución del crecimiento del PIB mundial (% anual)")
plt.ylabel("Valores")
# Distribución del crecimiento del PIB mundial y detección de valores atípicos:
plt.show()
El gráfico muestra que la distribución de los datos de crecimiento del PIB mundial (como porcentaje anual) tiene una distribución normal, pero hay valores atípicos en el eje negativo.
El siguiente código devuelve un gráfico que muestra esta distribución sin los valores atípicos:
import numpy as np
# Eliminación de valores atípicos:
df['crecimiento_pib'] = np.where((df["crecimiento_pib"] < -1),
df["crecimiento_pib"].mean(),
df["crecimiento_pib"])
import matplotlib.pyplot as plt
# Distribución del crecimiento del PIB mundial:
df.plot(kind = "hist",
color = "green")
plt.title("Crecimiento del PIB mundial (% anual)")
plt.xlabel("Crecimiento del PIB (% anual)")
plt.ylabel("Frecuencia")
# Distribución del crecimiento del PIB mundial:
plt.show()
El gráfico anterior confirma que se trata de una distribución normal.
En este punto, se necesita una tabla que describa las estimaciones de la tendencia central y dispersión; para lograr tal propósito, se hace uso del siguiente código:
# Estadísticas descriptivas del crecimiento del PIB mundial:
df.describe()
crecimiento_pib | |
---|---|
count | 62.000000 |
mean | 3.660943 |
std | 1.354674 |
min | 0.394431 |
25% | 2.804132 |
50% | 3.571989 |
75% | 4.484825 |
max | 6.558489 |
La tabla presente una serie de estadísticas descriptivas sobre el crecimiento del PIB mundial, mostrando que el valor medio del crecimiento del PIB mundial es $3.660943$ y las observaciones independientes se desvían del valor medio en $1.354674$. Asimismo, el cambio mínimo en la producción económica mundial es de $0.394431$ y el valor máximo es $6.558489$.
El código que se muestra a continuación gráfica el crecimiento del PIB mundial:
# Gráfico lineal de crecimiento del PIB mundial:
df.plot(color = "green",
lw = 4)
plt.title("Gráfico lineal de crecimiento del PIB mundial (% anual)")
plt.xlabel("Fecha")
plt.ylabel("Crecimiento del PIB (% anual)")
# Gráfico lineal de crecimiento del PIB mundial:
plt.show()
El gráfico ilustra la inestabilidad en el crecimiento del PIB mundial. Experimentamos el mayor crecimiento del PIB en $1963$ (en $6.713557$) y el más bajo en $1982$ (en $0.423812$).
El código que se muestra a continuación gráfica el crecimiento logarítmico del PIB mundial:
import pandas as pd
# Gráfico lineal de crecimiento del PIB logarítmico mundial:
df_log = np.log(df)
df_log = pd.DataFrame(df_log)
df_log.plot(color = "green",
lw = 4)
plt.title("Gráfico lineal de crecimiento del PIB logarítmico mundial (% anual)")
plt.xlabel("Fecha")
plt.ylabel("Crecimiento del PIB (% anual)")
# Gráfico lineal de crecimiento del PIB logarítmico mundial:
plt.show()
Desarrollo del modelo de mezcla gaussiana (Gaussian Mixture Model)
El siguiente código construye el modelo de mezcla gaussiana (Gaussian Mixture Model). Asumiendo que los datos provienen de una distribución normal:
# Desarrollo del modelo:
antiguo_df_log = pd.DataFrame(df_log)
df_log = antiguo_df_log.values
x = np.column_stack([df_log])
from hmmlearn import hmm
modelo = hmm.GaussianHMM(n_components = 2,
tol = 0.0001,
n_iter = 10)
modelo.fit(x)
GaussianHMM(n_components=2, tol=0.0001)
El siguiente código genera los estados ocultos en la secuencia (se recomienda consultar la tabla resultante):
# Generar estados ocultos:
estados_ocultos = pd.DataFrame(modelo.predict(x), columns = ["estados_ocultos"])
estados_ocultos.index = antiguo_df_log.index
# Estados ocultos:
estados_ocultos.head()
estados_ocultos | |
---|---|
date | |
2021-01-01 | 1 |
2020-01-01 | 1 |
2019-01-01 | 1 |
2018-01-01 | 1 |
2017-01-01 | 1 |
Representación gráfica de estados ocultos
Para entender la tabla anterior, se puede consultar el siguiente gráfico. El código para este proceso se muestra a continuación:
# Estados de crecimiento del PIB mundial:
aumento_pib = estados_ocultos.loc[estados_ocultos.values == 0]
disminucion_pib = estados_ocultos.loc[estados_ocultos.values == 1]
fig, ax = plt.subplots()
plt.plot(aumento_pib.index,
aumento_pib.values,
".",
linestyle = "none",
color = "navy",
label = "Aumento del crecimiento del PIB")
plt.plot(disminucion_pib.index,
disminucion_pib.values,
".",
linestyle = "none",
color = "red",
label = "Disminución del crecimiento del PIB")
plt.title("Estados de crecimiento del PIB mundial (% anual)")
plt.xlabel("Fecha")
plt.ylabel("Estado")
plt.legend(loc = "best")
# Estados ocultos del crecimiento del PIB mundial:
plt.show()
El siguiente código devuelve un gráfico de dispersión que, como su nombre lo dice, muestra la dispersión de los estados ocultos:
# Dispersión de los estados de crecimiento del PIB mundial:
datos_markov = antiguo_df_log.join(estados_ocultos, how = "inner")
datos_markov = datos_markov[["crecimiento_pib", "estados_ocultos"]]
arriba = pd.Series()
abajo = pd.Series()
mid = pd.Series()
for tupla in datos_markov.itertuples():
if tupla.estados_ocultos == 0:
x = pd.Series(tupla.crecimiento_pib, index = [tupla.Index])
arriba = arriba.append(x)
else:
x = pd.Series(tupla.crecimiento_pib, index = [tupla.Index])
abajo = abajo.append(x)
arriba = arriba.sort_index()
abajo = abajo.sort_index()
fig, ax = plt.subplots()
plt.plot(arriba.index,
arriba.values,
".",
c = "navy",
label = "Aumento del crecimiento del PIB")
plt.plot(abajo.index,
abajo.values,
".",
c = "red",
label = "Disminución del crecimiento del PIB")
plt.title("Crecimiento general del PIB mundial (% anual)")
plt.xlabel("Fecha")
plt.ylabel("Estado")
plt.legend(loc = "best")
# Dispersión de los estados de crecimiento del PIB mundial:
plt.show()
El siguiente código cuenta los estados ocultos en la secuencia y los muestra en un gráfico circular:
# Cuenta de estados ocultos:
markov_binarizado = pd.DataFrame(datos_markov["estados_ocultos"])
markov_binarizado["estados_ocultos"]
datos_markov_binarizado = markov_binarizado.replace({0: "Aumento del PIB", 1: "Disminución del PIB"})
datos_markov_binarizado = datos_markov_binarizado.reset_index()
serie_clases = datos_markov_binarizado.groupby("estados_ocultos").size()
serie_clases.name = "Cuenta"
serie_clases.plot.pie(autopct = "%2.f",
cmap = "RdBu")
plt.title("Gráfico circular de estados ocultos")
# Gráfico circular de estados ocultos del crecimiento del PIB mundial:
plt.show()
El gráfico muestra que el $13%$ de los valores pronosticados aumentan el crecimiento del PIB y el $87%$ lo disminuyen.
El siguiente código traza los estados ocultos a través de muestras generadas aleatoriamente:
# Estados ocultos entre muestras:
numero_muestras = 1000
muestra, _ = modelo.sample(numero_muestras)
plt.plot(np.arange(numero_muestras),
muestra[:, 0],
color = "green")
plt.title("Estados ocultos entre muestras")
plt.xlabel("Muestras")
plt.ylabel("Estados")
# Estados ocultos en muestras:
plt.show()
Para dar sentido a estos resultados, debe observar más de cerca los componentes.
Ordenar estados ocultos
El siguiente código obtiene la media y la varianza en cada orden:
# Componentes de Markov:
for i in range(modelo.n_components):
print("estado oculto de orden {0}".format(i))
print("media =", modelo.means_[i])
print("var =", np.diag(modelo.covars_[i]))
print()
estado oculto de orden 0
media = [0.52979548]
var = [0.42191219]
estado oculto de orden 1
media = [1.35629987]
var = [0.07432585]
En el estado oculto de orden $0$, la media es $0.52979548$ y la varianza es $0.42191219$.
En el estado oculto de orden $1$, la media es $1.35629987$ y la varianza es $0.07432585$.
Conclusión
En la presente entrada se introdujo el modelo de mezcla gaussiana, que es un tipo de modelo oculto de Markov (HMM). Así pues, se exploró el modelo usando dos componentes, dado que había un número predeterminado de estados (donde $0$ representaba el primer estado y $1$ representaba el segundo estado). Luego, se aplicó el modelo para pronosticar estados futuros en la serie de datos del crecimiento del PIB mundial (como porcentaje anual).
popular post
El modelo AR de series temporales univariadas
Resumen: En esta entrada, descubrirá el modelo AR: El modelo autorregresivo.
Leer másEvaluación de modelos para pronosticar
Resumen: Al desarrollar modelos de aprendizaje automático, generalmente se comparan varios modelos durante la fase de construcción.
Leer másModelos para pronosticar
Resumen: El pronóstico, traducido groseramente como la tarea de predecir el futuro, ha estado presente en la sociedad humana durante siglos.
Leer más