CE_5

Análisis de series de tiempo

Índice de Percepción de la Corrupción en México

Paquetes

library(pacman)
p_load("tidyverse", "lubridate", "forecast", "TTR", "MLmetrics", "tseries", "fpp", "TSstudio", "xfun", "DT", "mFilter")

Introduccion

La corrupción existe desde el inicio de nuestra historia hasta nuestros tiempos con similitudes exageradas que hacen pensar que la sociedad gira en un círculo vicioso destinado a no terminar, la etimología de palabra corrupción se origina del latín “corruptio”, la cual es la acción y efecto de destruir o alterar globalmente por putrefacción, también acción de dañar, sobornar o pervertir a alguien.

La corrupción es un factor cultural que se genera desde las esferas social, económica y política, hace parte del desarrollo antropológico del hombre, la especie humana por naturaleza es ambiciosa y en ningún caso conformista, el individuo necesita cada vez más cosas (poder, dinero, cariño) y nunca es suficiente. Esta es una de las conductas que se evidencia en el sistema económico mundial más aceptado “El Capitalismo”, en este modelo se invierte un capital privado (dinero) y se busca recibir a cambio una utilidad, es decir se reafirma la necesidad de tener más.

La corrupción es un fenómeno que involucra muchos aspectos diferentes y, por lo tanto, es difícil dar una definición precisa y completa. Sin embargo, en el centro de la mayoría de las definiciones de corrupción está la idea de que un acto corrupto implica el abuso del poder encomendado para beneficio privado, los ejemplos más comunes son el soborno, el clientelismo y la malversación.

Importamos datos

library(readr)
corrupcion <- read_csv("TI-corruption-perception-index.csv") # Importamos datos
## Rows: 7 Columns: 4
## -- Column specification --------------------------------------------------------
## Delimiter: ","
## chr (2): Entity, Code
## dbl (2): Year, Corruption Perception Index - Transparency International (2018)
## 
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.

Índice de Percepción de la Corrupción de Transparencia Internacional. Las puntuaciones están en una escala de 0 a 100, donde 0 significa que un país es percibido como altamente corrupto. Esta entrada presenta los datos disponibles y la evidencia empírica sobre la corrupción, un problema importante que impone costos políticos, económicos y ambientales a las sociedades de todo el mundo.

  • Verificar si existen datos faltantes
anyNA(corrupcion)
## [1] FALSE

Esto significa que no hay datos faltantes

Decomposicion de serie de tiempo en sus partes principales

corrupcionTS <- ts(corrupcion[ ,c(4)],start =2012,end =2018,frequency = 1)
corrupcionTS
## Time Series:
## Start = 2012 
## End = 2018 
## Frequency = 1 
##      Corruption Perception Index - Transparency International (2018)
## [1,]                                                              34
## [2,]                                                              34
## [3,]                                                              35
## [4,]                                                              31
## [5,]                                                              30
## [6,]                                                              29
## [7,]                                                              28
plot(corrupcionTS, xlab = "Año",ylab = "Índice de Corrupción")

autoplot(mstl(corrupcionTS))

corrupcionFil <- mFilter(corrupcionTS,filter="HP")
plot(corrupcionFil)

Division de los datos para validacián cruzada

test_corrupcionMX <- tail(corrupcionTS,12) #20% para pruebas
train_corrupcionMX <- head(corrupcionTS, length(corrupcionTS)-12) #80% para entrenamiento

Ajuste del modelo

Según el resultado de descomposición, los datos de corrupcion tienen una tendencia y estacionalidad. para el siguiente paso, usaremos Triple Exponential Smooting/Holt Winters Exponential Smoothing, Exponential Smoothing de Holt-Winters con tendencia y componente estacional multiplicativo.

corrupcionMX_TS <- ts(corrupcion[ ,c(4)],start =2012,end =2018,frequency = 2)
train_corrupcionMX_TS <- head(corrupcionMX_TS, length(corrupcionTS)-12)
corrupcion_ses <- HoltWinters(train_corrupcionMX_TS, seasonal = "multiplicative",)
corrupcion_ses
## Holt-Winters exponential smoothing with trend and multiplicative seasonal component.
## 
## Call:
## HoltWinters(x = train_corrupcionMX_TS, seasonal = "multiplicative")
## 
## Smoothing parameters:
##  alpha: 0.2696495
##  beta : 0
##  gamma: 1
## 
## Coefficients:
##          [,1]
## a  31.7441846
## b  -0.5000000
## s1  0.9196634
## s2  1.0710623

Forecasting

corrupcion_forecast <- forecast(object = corrupcion_ses, h=500)

Visualizando resultados

corrupcion_ten <- holt(train_corrupcionMX,damped = TRUE,h=3)
## Warning in ets(x, "AAN", alpha = alpha, beta = beta, phi = phi, damped =
## damped, : Not enough data to use damping
corrupcionTS %>%
  autoplot(series = "actual") +
  autolayer(corrupcion_ten$fitted,series = "train") +
  autolayer(corrupcion_ten$mean, series = "test") +
  theme_minimal()

Evaluar la precisián del modelo

eval_ses <- accuracy(corrupcion_forecast, test_corrupcionMX)
eval_ses
##                       ME     RMSE      MAE        MPE     MAPE      MASE
## Training set -0.07505656 3.029788 2.139891 -0.6628102 6.735800 1.0699455
## Test set     -0.82584688 2.385609 1.793445 -2.8886323 6.143408 0.8967225
##                     ACF1 Theil's U
## Training set  0.02164339        NA
## Test set     -0.64077766  2.733955

De acuerdo con el analisis de precision tenemos un error medio de: 9.25%

Utilizando el moelo SARIMA o ARIMA

Los modelos SARIMA captan el comportamiento puramente estacional de una serie, en forma similar, como hemos visto, se realiza para la componente regular o no estacional. Una serie con influencia solamente por la componente estacional puede ser descrito por un modelo SARIMA

Empezamos haciendo una prueba al conjunto de datos:

Esta prueba (dickey-fuller) sirve para en funcion del valor de P, determinar si los datos SON o NO SON estacionarios

adf.test(corrupcionTS)
## Warning in adf.test(corrupcionTS): p-value smaller than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  corrupcionTS
## Dickey-Fuller = -4.5427, Lag order = 1, p-value = 0.01
## alternative hypothesis: stationary

De acuerdo con esta prueba los datos NO son estacionarios

Analisis de mediante SARIMA

corrupacion_auto <- auto.arima(y= train_corrupcionMX, seasonal = F)
summary(corrupacion_auto)
## Series: train_corrupcionMX 
## ARIMA(0,0,0) with non-zero mean 
## 
## Coefficients:
## intercept  
##        34  
## 
## sigma^2 estimated as 0:  log likelihood=Inf
## AIC=-Inf   AICc=NaN   BIC=-Inf
## 
## Training set error measures:
##              ME RMSE MAE MPE MAPE MASE ACF1
## Training set  0    0   0   0    0  NaN  NaN

Analizando la serie de tiempo por medio de un modelo SARIMA

train_corrupcionMX %>%
  autoplot(series="actual") +
  autolayer(corrupacion_auto$fitted, series ="SARIMA auto") +
  theme_minimal()

Visualizando la grafica de resultados de datos reales versus las predicciones (forecasting) del modelo SARIMA

Descarga del codigo

xfun::embed_file("A8U1.Rmd")

Download A8U1.Rmd