Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Industria
Isabella Castillo, Danna Cardona, Brian Carreño
11/12/2020
Serie Industria
Se empieza por llamar a las librerías necesarias en el transcurso del documento e importar la base de datos a
trabajar.
library(forecast)
library(lmtest)
##
## Attaching package: 'zoo'
library(readxl)
library(tsoutliers)
library(tseries)
library(car)
library(readr)
series <- read_delim("C:/Users/brian.carreno/Downloads/series.csv",
";", escape_double = FALSE, trim_ws = TRUE)
file:///C:/Users/brian.carreno/Desktop/parcialfinalts.html 1/24
11/12/2020 Industria
library(readxl)
serieORI <- read_excel("C:/Users/brian.carreno/Downloads/series (1).xlsx")
VarTS<- serieORI$IND
VarTS <- ts(VarTS,start=c(2000,01),frequency=12)
plot(VarTS)
Box Cox
Para el evaluar si es necesario usar Box-Cox se observan los resultados de la librería forecast usando los
métodos de “guerrero” y “loglik”. Elegimos un lambda=2 que es el resultado sugerido con el método de “loglik”
file:///C:/Users/brian.carreno/Desktop/parcialfinalts.html 2/24
11/12/2020 Industria
## [1] 0.429797
BoxCox.lambda(VarTS,method="loglik",lower=0)
## [1] 2
logVar=forecast::BoxCox(VarTS,lambda=2)
BoxCox.lambda(logVar,method="loglik",lower=0)
## [1] 1.05
plot(logVar)
file:///C:/Users/brian.carreno/Desktop/parcialfinalts.html 3/24
11/12/2020 Industria
Diferenciación ordinaria
Para analizar si es necesario diferenciar se realiza la prueba de Dickey-Fuller
#Prueba de Dickey-Fuller
acf(logVar)
##
## Augmented Dickey-Fuller Test
##
## data: logVar
## Dickey-Fuller = -3.5606, Lag order = 5, p-value = 0.03812
## alternative hypothesis: stationary
dlogVar=diff(logVar)
tseries::adf.test(dlogVar,k=12) #No toca volver a diferenciar
file:///C:/Users/brian.carreno/Desktop/parcialfinalts.html 4/24
11/12/2020 Industria
##
## Augmented Dickey-Fuller Test
##
## data: dlogVar
## Dickey-Fuller = -3.824, Lag order = 12, p-value = 0.01884
## alternative hypothesis: stationary
plot(dlogVar)
##
Diferenciación estacional
#Analizar estacionareidad
monthplot(dlogVar)
file:///C:/Users/brian.carreno/Desktop/parcialfinalts.html 5/24
11/12/2020 Industria
nsdiffs(dlogVar)
## [1] 0
#Los gráficos mensuales evidentemente tienen media variable, por lo que se procede a diferenciar
estacionalmente
DdlogVar=diff(dlogVar,lag=12)
par(mfrow=c(2,1))
plot(dlogVar)
plot(DdlogVar)
file:///C:/Users/brian.carreno/Desktop/parcialfinalts.html 6/24
11/12/2020 Industria
par(mfrow=c(1,1))
monthplot(DdlogVar)
file:///C:/Users/brian.carreno/Desktop/parcialfinalts.html 7/24
11/12/2020 Industria
nsdiffs(DdlogVar)
## [1] 0
Al observar los gráficos mensuales de la serie ya diferenciada estacionalmente se observa que no es necesaria
otra diferenciación estacional y se procede a observar las funciones de autocorrelación.
file:///C:/Users/brian.carreno/Desktop/parcialfinalts.html 8/24
11/12/2020 Industria
pacf(DdlogVar,lag.max = 60)
file:///C:/Users/brian.carreno/Desktop/parcialfinalts.html 9/24
11/12/2020 Industria
mejor ajuste.
modelo1 = forecast::Arima(VarTS, c(3, 1, 1), seasonal = list(order = c(0, 1, 1), period = 12),la
mbda = 2,method = c("CSS-ML"))
coeftest(modelo1)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 -1.38673 0.55729 -2.4883 0.01283 *
## ar2 -0.92963 0.50122 -1.8548 0.06363 .
## ar3 -0.26316 0.25819 -1.0193 0.30808
## ma1 0.46535 0.56162 0.8286 0.40733
## sma1 -0.95812 0.14958 -6.4055 1.498e-10 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
file:///C:/Users/brian.carreno/Desktop/parcialfinalts.html 10/24
11/12/2020 Industria
modelo2 = forecast::Arima(VarTS, c(2, 1,1), seasonal = list(order = c(0, 1, 1), period = 12),lam
bda = 2,method = c("CSS-ML"))
coeftest(modelo2)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 -0.862175 0.119224 -7.2316 4.775e-13 ***
## ar2 -0.446563 0.088798 -5.0290 4.931e-07 ***
## ma1 -0.050161 0.129608 -0.3870 0.6987
## sma1 -0.966022 0.182143 -5.3036 1.135e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
modelo3 = forecast::Arima(VarTS, c(2, 1,0), seasonal = list(order = c(0, 1, 1), period = 12),lam
bda = 2,method = c("CSS-ML"))
coeftest(modelo3)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 -0.900803 0.061635 -14.6152 < 2.2e-16 ***
## ar2 -0.469875 0.061576 -7.6308 2.332e-14 ***
## sma1 -0.972106 0.218806 -4.4428 8.881e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
AIC(modelo1);AIC(modelo2);AIC(modelo3)
## [1] 2841.896
## [1] 2840.258
## [1] 2838.406
Partiendo de las comparaciones entre el modelo1 y modelo2, elegimos el segundo modelo al observar la
significancia de los estimadores y el criterio AIC. A este modelo2 eliminamos los órdenes MA con lo cual
obtenemos el modelo3 cuyo AIC es aún menor y todos los parámetros son significativos.
file:///C:/Users/brian.carreno/Desktop/parcialfinalts.html 11/24
11/12/2020 Industria
acf(residuales)
file:///C:/Users/brian.carreno/Desktop/parcialfinalts.html 12/24
11/12/2020 Industria
pacf(residuales)
file:///C:/Users/brian.carreno/Desktop/parcialfinalts.html 13/24
11/12/2020 Industria
Se procede a realizar los tests de Jarque-Bera y Ljung-Box, y los gráficos de CUSUM y CUSUMSQ.
par(mfrow=c(1,1))
jarque.bera.test(residuales) #p-value = 0.01714
##
## Jarque Bera Test
##
## data: residuales
## X-squared = 19.547, df = 2, p-value = 5.693e-05
qqPlot(residuales) #Por ahora se observa que no se cumple el supuesto de normalidad pero esto pu
ede ser corregido con la eliminación de los outliers detectados.
file:///C:/Users/brian.carreno/Desktop/parcialfinalts.html 14/24
11/12/2020 Industria
## [1] 199 99
#Test de autocorrelación
acf(residuales,lag.max = 30)
file:///C:/Users/brian.carreno/Desktop/parcialfinalts.html 15/24
11/12/2020 Industria
##
## Box-Ljung test
##
## data: residuales
## X-squared = 29.368, df = 21, p-value = 0.1054
file:///C:/Users/brian.carreno/Desktop/parcialfinalts.html 16/24
11/12/2020 Industria
###Estadísticas CUSUM
res=residuales
cum=cumsum(res)/sd(res)
N=length(res)
cumq=cumsum(res^2)/sum(res^2)
Af=0.948 ###Cuantil del 95% para la estadistica cusum
co=0.14422 ####Valor del cuantil aproximado para cusumsq para n/2
LS=Af*sqrt(N)+2*Af*c(1:length(res))/sqrt(N)
LI=-LS
LQS=co+(1:length(res))/N
LQI=-co+(1:length(res))/N
par(mfrow=c(2,1))
plot(cum,type="l",ylim=c(min(LI),max(LS)),xlab="t",ylab="",main="CUSUM")
lines(LS,type="S",col="red")
lines(LI,type="S",col="red")
#CUSUM Square
plot(cumq,type="l",xlab="t",ylab="",main="CUSUMSQ")
lines(LQS,type="S",col="red")
lines(LQI,type="S",col="red")
file:///C:/Users/brian.carreno/Desktop/parcialfinalts.html 17/24
11/12/2020 Industria
#Análisis de Outliers
coef = coefs2poly(modelo3)
outliers = locate.outliers(residuales,coef, cval = 3.5)
outliers
n <- length(VarTS)
xreg = outliers.effects(outliers,n)
Se detectan 5 outliers. 2 aditivos en 159 y 199, uno de cambio de nivel en 97 y dos transitorios en 94 y 200. Se
repite el procedimiento para obervar si se encuentran más outliers con el modelo ajustado a los anteriores outliers
encontrados.
modelSO = Arima(VarTS, c(2, 1,0), seasonal = list(order = c(0, 1, 1), period = 12),lambda = 2,me
thod = c("CSS-ML"), xreg = xreg)
resi_analisis = modelSO$residuals
coef_analisis = coefs2poly(modelSO)
outliers_analisis = locate.outliers(resi_analisis,coef_analisis)
outliers_analisis
coeftest(modelo3)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 -0.900803 0.061635 -14.6152 < 2.2e-16 ***
## ar2 -0.469875 0.061576 -7.6308 2.332e-14 ***
## sma1 -0.972106 0.218806 -4.4428 8.881e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
coeftest(modelSO)
file:///C:/Users/brian.carreno/Desktop/parcialfinalts.html 18/24
11/12/2020 Industria
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 -0.930075 0.060870 -15.2797 < 2.2e-16 ***
## ar2 -0.501418 0.060767 -8.2515 < 2.2e-16 ***
## sma1 -0.878631 0.069627 -12.6191 < 2.2e-16 ***
## AO159 -645.010772 186.982019 -3.4496 0.0005614 ***
## AO199 -710.718604 196.988691 -3.6079 0.0003087 ***
## LS97 -292.657105 173.508641 -1.6867 0.0916610 .
## TC94 453.273201 182.805075 2.4795 0.0131551 *
## TC200 485.822450 169.618683 2.8642 0.0041806 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
AIC(modelo3); AIC(modelSO)
## [1] 2838.406
## [1] 2800.336
Al realizar de nuevo el procedimiento de detección de outliers no se encuentran más datos atípicos. Se procede a
realizar el análisis de residuales a modelSO. Se observa además que por el criterio AIC el modelo modelSO es
mejor.
par(mfrow=c(1,1))
jarque.bera.test(resi_analisis ) #p-value = 0.6431
##
## Jarque Bera Test
##
## data: resi_analisis
## X-squared = 0.8829, df = 2, p-value = 0.6431
file:///C:/Users/brian.carreno/Desktop/parcialfinalts.html 19/24
11/12/2020 Industria
## [1] 99 87
#Test de autocorrelación
file:///C:/Users/brian.carreno/Desktop/parcialfinalts.html 20/24
11/12/2020 Industria
##
## Box-Ljung test
##
## data: resi_analisis
## X-squared = 20.591, df = 16, p-value = 0.1948
file:///C:/Users/brian.carreno/Desktop/parcialfinalts.html 21/24
11/12/2020 Industria
###Estadísticas CUSUM
res2=resi_analisis
cum=cumsum(res2)/sd(res2)
N=length(res2)
cumq=cumsum(res2^2)/sum(res2^2)
Af=0.948 ###Cuantil del 95% para la estadistica cusum
co=0.14422 ####Valor del cuantil aproximado para cusumsq para n/2
LS=Af*sqrt(N)+2*Af*c(1:length(res2))/sqrt(N)
LI=-LS
LQS=co+(1:length(res2))/N
LQI=-co+(1:length(res2))/N
par(mfrow=c(2,1))
plot(cum,type="l",ylim=c(min(LI),max(LS)),xlab="t",ylab="",main="CUSUM")
lines(LS,type="S",col="red")
lines(LI,type="S",col="red")
#CUSUM Square
plot(cumq,type="l",xlab="t",ylab="",main="CUSUMSQ")
lines(LQS,type="S",col="red")
lines(LQI,type="S",col="red")
Se
realiza de nuevo el análisis de residuales teninendo en cuenta los outliers detectados anteriormente. Encontramos
que el supuesto de normalidad si se cumple y que no se presenta autocorrelación en nuestro modelo.Igualmente
file:///C:/Users/brian.carreno/Desktop/parcialfinalts.html 22/24
11/12/2020 Industria
con la gráfica CUSUMQS de homogeneidad de varianza marginal se observa buenos rsultados en comparación a
la gráfica de nuestro modelo sin tener en cuenta los outliers. A pesar de que en la función de autocorrelación se
observa un rezago fuera de las bandas, el test de Ljung-Box no muestra autocorrelación serial.
h <- 1
n <- length(test) - h + 1
fc <- ts(numeric(n), start=c(2016,09), freq=12)
fitmodelo <- Arima(VarTS, c(2, 1,0), seasonal = list(order = c(0, 1, 1), period = 12),lambda = 2
,method = c("CSS-ML"), xreg = xreg)
for(i in 1:n){
x <- window(VarTS, end = c(2016, 08+(i-1)))
refit <- Arima(x, model= fitmodelo,xreg=xreg[1:(length(train)+(i-1)),])
fc[i] <- forecast::forecast(refit, h=h, xreg= xreg[1:(length(train)+(i-1)),])$mean[h]
}
plot(cbind(test, fc),
plot.type = "single",
col = c("red", "blue"))
dife=(test-fc)^2
ecm=(1/(length(test)))*sum(dife)
ecm
file:///C:/Users/brian.carreno/Desktop/parcialfinalts.html 23/24
11/12/2020 Industria
## [1] 11.97132
El error cuadrático medio de nuestro modelo SARIMA es 11.97 y en comparación con el modelo de árboles es un
mejor modelo ya que el error cuadrático medio por este otro método fue de 17.8. Este error es mucho mayor
cuando se consideran las 17 covariables que arroja en principio el modelo.
file:///C:/Users/brian.carreno/Desktop/parcialfinalts.html 24/24
Parcial1
data['Mes'] = pd.to_datetime(data['Mes'])
indice = data.set_index('Mes')
ts = indice['IND']
#Establecer frecuencia del índice
indice.index.freq='MS'
ts.index.freq='MS'
#Graficar la Serie
plt.plot(ts)
plt.title('Industria')
1
[10]: Text(0.5, 1.0, 'Industria')
plot_acf(ts,lags=20)
pyplot.show()
Se puede observar en el ACF que la serie presenta un ciclo anual. Esto porque en un periodo de 12
meses el valor medio depende del mes considerado. Por esto mismo, se puede afirmar que existe
una estructura de autocorrelación definida, con valores fuera de las bandas de confianza.
La series no es estacionaria
2
1.2 Transformación de Box-Cox
Ahora se analiza si es necesario realizar una transformaion de Box-Cox. Para ello se observa el
lambda que recomienda la libreria scipy
print(sp.stats.boxcox(ts,alpha=0.05)[1])
2.40614965681135
Como se observa en la salida anterior, se sugiere usar un λ = 2.4 aproximadamente. R toma un
λ = 2 pero se realizan los procedimientos en concordancia con las sugerencias de Python.
indice2 = data.set_index('Mes')
logCAN = indice2['logCANbx']
#Fijar la frecuencia del índice
logCAN.index.freq='MS'
logCAN.plot()
pyplot.show()
La grafica anterior muestra la serie transformada por Box-Cox, cambiando un poco frente al caso
sin transformacion.
3
1.4 Árboles de decisión
En este caso se comienza por la creación de las variables rezagadas.
df1 = DataFrame()
CANdf = pd.DataFrame(logCAN)
#Covariables
for i in range(17,0,-1):
df1[['t-'+str(i)]] = CANdf.shift(i)
print(df1)
4
2000-03-01 NaN NaN NaN NaN
2000-04-01 NaN NaN NaN NaN
2000-05-01 NaN NaN NaN NaN
... ... ... ... ...
2017-07-01 33767.960888 34259.994248 35283.895278 25111.497251
2017-08-01 34259.994248 35283.895278 25111.497251 25585.302073
2017-09-01 35283.895278 25111.497251 25585.302073 31763.375649
2017-10-01 25111.497251 25585.302073 31763.375649 24904.091216
2017-11-01 25585.302073 31763.375649 24904.091216 30307.993441
t-1
Mes
2000-01-01 NaN
2000-02-01 8834.807750
2000-03-01 10028.258952
2000-04-01 12107.160159
2000-05-01 9561.499369
... ...
2017-07-01 29885.893791
2017-08-01 30405.357158
2017-09-01 33135.698008
2017-10-01 33046.466470
2017-11-01 33561.100872
[45]: #Columna t
df1['t'] = logCAN.values
print(df1.head(20))
5
2000-03-01 NaN NaN NaN NaN
2000-04-01 NaN NaN NaN NaN
2000-05-01 NaN NaN NaN NaN
2000-06-01 NaN NaN NaN NaN
2000-07-01 NaN NaN NaN NaN
2000-08-01 NaN NaN NaN NaN
2000-09-01 NaN NaN NaN NaN
2000-10-01 NaN NaN NaN NaN
2000-11-01 NaN NaN NaN NaN
2000-12-01 NaN NaN NaN NaN
2001-01-01 NaN NaN NaN NaN
2001-02-01 NaN NaN NaN NaN
2001-03-01 NaN NaN NaN 8834.807750
2001-04-01 NaN NaN 8834.807750 10028.258952
2001-05-01 NaN 8834.807750 10028.258952 12107.160159
2001-06-01 8834.807750 10028.258952 12107.160159 9561.499369
2001-07-01 10028.258952 12107.160159 9561.499369 12517.574662
2001-08-01 12107.160159 9561.499369 12517.574662 13276.126246
6
2000-05-01 NaN NaN NaN NaN
2000-06-01 NaN NaN NaN NaN
2000-07-01 NaN NaN NaN 8834.807750
2000-08-01 NaN NaN 8834.807750 10028.258952
2000-09-01 NaN 8834.807750 10028.258952 12107.160159
2000-10-01 8834.807750 10028.258952 12107.160159 9561.499369
2000-11-01 10028.258952 12107.160159 9561.499369 12517.574662
2000-12-01 12107.160159 9561.499369 12517.574662 13276.126246
2001-01-01 9561.499369 12517.574662 13276.126246 12642.260410
2001-02-01 12517.574662 13276.126246 12642.260410 15710.987025
2001-03-01 13276.126246 12642.260410 15710.987025 14017.013371
2001-04-01 12642.260410 15710.987025 14017.013371 15853.341808
2001-05-01 15710.987025 14017.013371 15853.341808 17267.822305
2001-06-01 14017.013371 15853.341808 17267.822305 13362.070607
2001-07-01 15853.341808 17267.822305 13362.070607 10284.621104
2001-08-01 17267.822305 13362.070607 10284.621104 10540.649510
t-1 t
Mes
2000-01-01 NaN 8834.807750
2000-02-01 8834.807750 10028.258952
2000-03-01 10028.258952 12107.160159
2000-04-01 12107.160159 9561.499369
2000-05-01 9561.499369 12517.574662
2000-06-01 12517.574662 13276.126246
7
2000-07-01 13276.126246 12642.260410
2000-08-01 12642.260410 15710.987025
2000-09-01 15710.987025 14017.013371
2000-10-01 14017.013371 15853.341808
2000-11-01 15853.341808 17267.822305
2000-12-01 17267.822305 13362.070607
2001-01-01 13362.070607 10284.621104
2001-02-01 10284.621104 10540.649510
2001-03-01 10540.649510 13565.751196
2001-04-01 13565.751196 11123.639014
2001-05-01 11123.639014 13970.570576
2001-06-01 13970.570576 12447.652844
2001-07-01 12447.652844 12648.096722
2001-08-01 12648.096722 13303.593183
8
2002-01-01 13362.070607 10284.621104 10540.649510 13565.751196
2002-02-01 10284.621104 10540.649510 13565.751196 11123.639014
2002-03-01 10540.649510 13565.751196 11123.639014 13970.570576
2002-04-01 13565.751196 11123.639014 13970.570576 12447.652844
2002-05-01 11123.639014 13970.570576 12447.652844 12648.096722
2002-06-01 13970.570576 12447.652844 12648.096722 13303.593183
2002-07-01 12447.652844 12648.096722 13303.593183 13713.464888
2002-08-01 12648.096722 13303.593183 13713.464888 15530.336931
2002-09-01 13303.593183 13713.464888 15530.336931 15264.207302
2002-10-01 13713.464888 15530.336931 15264.207302 13053.761205
9
2002-09-01 13494.193187 14040.933317 11861.528307 13094.569510
2002-10-01 14040.933317 11861.528307 13094.569510 13228.566918
t-1 t
Mes
2001-06-01 13970.570576 12447.652844
2001-07-01 12447.652844 12648.096722
2001-08-01 12648.096722 13303.593183
2001-09-01 13303.593183 13713.464888
2001-10-01 13713.464888 15530.336931
2001-11-01 15530.336931 15264.207302
2001-12-01 15264.207302 13053.761205
2002-01-01 13053.761205 10644.393826
2002-02-01 10644.393826 10669.290257
2002-03-01 10669.290257 10571.785556
2002-04-01 10571.785556 13494.193187
2002-05-01 13494.193187 14040.933317
2002-06-01 14040.933317 11861.528307
2002-07-01 11861.528307 13094.569510
2002-08-01 13094.569510 13228.566918
2002-09-01 13228.566918 13384.900198
2002-10-01 13384.900198 15977.801285
Ahora se genera la partición de la base. Para empezar se separan las variables rezagadas de la
columna de datos t definida anteriormente. Esto para tener la distinción entre covariables y vari-
able respuesta.
Ahora que se tiene la distincion entre y y X, se dividen estos dos conjuntos en dos partes, el
conjunto de validación y el conjunto entrenamiento. Se toman 15 datos de validación. Se notan
las variables como test por facilidad pero estas hacen referencia al conjunto de validación.
Y1 = y1
traintarget_size = 183
train_target, test_target = Y1[0:traintarget_size], Y1[traintarget_size:len(Y1)]
10
[49]: # Features Train-Val split
trainfeature_size = 183
train_feature, test_feature = X1[0:trainfeature_size], X1[trainfeature_size:
,→len(X1)]
1.0
-0.4330516704949361
max_depth= 2
0.8152166896655462
-0.647021873889613
11
max_depth= 3
0.8648190081409888
-0.46795376865845983
max_depth= 4
0.9061342324349833
-0.47664554983452745
max_depth= 5
0.9426969754330095
-0.5774614769318107
max_depth= 7
0.9834000035229826
-0.222779408711977
max_depth= 8
0.9927172936249665
-0.519032710271299
max_depth= 10
0.9992364226890428
-0.4912073654114555
Anteriormente se tenia un R2 = −0.433, que es bastante malo pero como se observa en la salida
anterior, podría mejorar. Este coeficiente alcanza un valor en el conjunto de validación de aprox
−0.22 cuando se toma una profundidad máxima de 7. Se estima nuevamente el modelo especifi-
cando este parámetro.
[54]: 17363308.844464015
12
[55]: d = {'observado': targetjoint, 'Predicción': predictionjoint}
ObsvsPred=pd.DataFrame(data=d,index=indicetrian_test)
ObsvsPred.head(10)
Evidentemente el modelo no es muy bueno tomando como covariable los rezagos significativos.
13
Como ejercicio adicional se propone una segunda opcion, tomar los primeros 2 rezagos y los
ultimos 2. No se comenta paso a paso como el caso anterior pero los procedimientos son análogos.
#Columna t
df1['t'] = ts.values
print(df1.head(14))
CANsplit = df1_CAN.values
X1= CANsplit[:, 0:-1] #Seleccionar covariables
y1 = CANsplit[:,-1] #Separar columna 't'
trainfeature_size = 183
train_feature, test_feature = X1[0:trainfeature_size], X1[trainfeature_size:
,→len(X1)]
14
print(decision_tree_CAN.score(test_feature,test_target))
15
2001-04-01 10540.649510 13565.751196 9561.499369 12517.574662 69.201
2001-05-01 13565.751196 11123.639014 12517.574662 13276.126246 76.075
2001-06-01 11123.639014 13970.570576 13276.126246 12642.260410 72.512
2001-07-01 13970.570576 12447.652844 12642.260410 15710.987025 72.995
2001-08-01 12447.652844 12648.096722 15710.987025 14017.013371 74.544
2001-09-01 12648.096722 13303.593183 14017.013371 15853.341808 75.490
2001-10-01 13303.593183 13713.464888 15853.341808 17267.822305 79.496
2001-11-01 13713.464888 15530.336931 17267.822305 13362.070607 78.927
2001-12-01 15530.336931 15264.207302 13362.070607 10284.621104 73.959
2002-01-01 15264.207302 13053.761205 10284.621104 10540.649510 67.946
2002-02-01 13053.761205 10644.393826 10540.649510 13565.751196 68.012
Observations for Target: 203
Training Observations for Target: 183
Validation Observations for Target: 20
Observations for feature: 203
Training Observations for feature: 183
Validation Observations for feature: 20
1.0
0.11216668980585531
max_depth= 2
0.8481719715059304
-0.9581347741106794
max_depth= 3
0.891688075801554
-0.5951970739075925
max_depth= 4
0.920812675121631
0.08116032962489794
max_depth= 5
0.9451022315852008
0.18316002016104027
max_depth= 7
0.9759733895208629
0.2188407609561649
max_depth= 8
0.9896871745563044
0.2498700930937643
max_depth= 10
0.9980536395131769
0.0780408301254435
16
Tomando depth=8 se obtiene un mejor R2 que en el caso donde se tomaban 17 covariables. Ob-
serve los resultados finales:
[68]: from matplotlib import pyplot as plt
# Se cambia el parametro max_depth por 4, según lo mencionado anteriormente
decision_tree_CAN = DecisionTreeRegressor(max_depth=8)
decision_tree_CAN.fit(train_feature, train_target)
# Predict values for train and test
train_prediction = decision_tree_CAN.predict(train_feature)
test_prediction = decision_tree_CAN.predict(test_feature)
[68]: 17.8187084455139
17