Tema 2: Time Series
Introducción
Una serie de tiempo es una colección de observaciones sobre un determinado fenómeno, efectuadas en momentos sucesivos, usualmente equiespaceados.
Algunos ejemplos de series de tiempo son:
1. Precios de acciones
2. Niveles de inventarios
3. Rotación de personal
4. Ventas
5. PIB o GDP
Mas información:
Ejercicio en Clase
Librerías Necesarias
library(forecast)
library(kableExtra)
Datos TS
Ejemplo:
Los siguientes datos de producción inicial inician en el primer
trimestre del 2020. Se busca pronosticar la producción de los siguientes
5 trimestres.
producción <- c(50,53,55,57,55,60)
ts<- ts(data= producción, start = c(2020,1), frequency = 4)
ts
## Qtr1 Qtr2 Qtr3 Qtr4
## 2020 50 53 55 57
## 2021 55 60
Se crearon datos dummy para realizar el primer modelado de ejemplo de Time Series, por esta razón es que se delimitanron bajo una creación manual de vector. Después se delimitó un comienzo de la fecha en 2020 en el primer trimestre.
Modelado
ARIMA
El modelado ARIMA significa AutoRegressive Integrated Moving Average o Modelo Autor-regresivo Integrado de Promedio Móvil.
arima<- auto.arima(ts, D=1)
arima
## Series: ts
## ARIMA(0,0,0)(0,1,0)[4] with drift
##
## Coefficients:
## drift
## 1.5000
## s.e. 0.1768
##
## sigma^2 = 2.01: log likelihood = -2.84
## AIC=9.68 AICc=-2.32 BIC=7.06
summary(arima)
## Series: ts
## ARIMA(0,0,0)(0,1,0)[4] with drift
##
## Coefficients:
## drift
## 1.5000
## s.e. 0.1768
##
## sigma^2 = 2.01: log likelihood = -2.84
## AIC=9.68 AICc=-2.32 BIC=7.06
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 0.03333332 0.5787923 0.3666667 0.03685269 0.6429133 0.06111111
## ACF1
## Training set -0.5073047
En este primer modelo se puede observar como es que el que presenta un mejor desempeño en la iteración interna. De esta manera es que se obtiene un modelo ARIMA (0,0,0)(0,1,0)[4] donde se dice que no hay términos de autor-regresión así como no hay términos de promedio móvil en el modelo – no utiliza los valores anteriores de la serie ni los errores previos para hacer predicciones. Además indica que hay un solo término de diferencia de primer orden – que la serie temporal original fue diferenciada una vez para hacerla estacionaria. Muestra con el [4] que hay una estacionalidad en 4 unidades de tiempo y que se incluyó un término de deriva en el modelo para contar con una tendencia lineal.
Generación de pronóstico
pronostico<- forecast(arima, level = c(95), h=5)
pronostico
## Point Forecast Lo 95 Hi 95
## 2021 Q3 61 58.22127 63.77873
## 2021 Q4 63 60.22127 65.77873
## 2022 Q1 61 58.22127 63.77873
## 2022 Q2 66 63.22127 68.77873
## 2022 Q3 67 63.07028 70.92972
plot(pronostico)
En este caso se presenta un pronóstico con un nivel de confianza de 95% para los siguientes 5 trimestres, se observa una tendencia lineal que sigue en cierta manera los valores y patrones que se mostraban en los valores reales.
| Actividad 2:
Hershey´s
Datos TS
Ejemplo:
Los siguientes datos son de ventas de “leches” Hersehy´s donde comienza
en 2017 durante Enero para después almacenar información mensual.
lechita<- read.csv("C:/Users/Astrid Gonzalez/Documents/UNIVERSIDAD/OCTAVO/Generación de escenarios futuros con analítica/Módulo 1/Ventas_Históricas_Lechitas.csv")
kable(head(lechita)) %>% kable_paper(full_width= T, "hover")
| Mes | Ventas |
|---|---|
| ene-17 | 25520.51 |
| feb-17 | 23740.11 |
| mar-17 | 26253.58 |
| abr-17 | 25868.43 |
| may-17 | 27072.87 |
| jun-17 | 27150.50 |
ts1<- ts(data=lechita$Ventas, start=c(2017,1), frequency=12)
(ts1)
## Jan Feb Mar Apr May Jun Jul Aug
## 2017 25520.51 23740.11 26253.58 25868.43 27072.87 27150.50 27067.10 28145.25
## 2018 28463.69 26996.11 29768.20 29292.51 29950.68 30099.17 30851.26 32271.76
## 2019 32496.44 31287.28 33376.02 32949.77 34004.11 33757.89 32927.30 34324.12
## Sep Oct Nov Dec
## 2017 27546.29 28400.37 27441.98 27852.47
## 2018 31940.74 32995.93 32197.12 31984.82
## 2019 35151.28 36133.07 34799.91 34846.17
Modelado
ARIMA
arima1<- auto.arima(ts1, D=1)
arima1
## Series: ts1
## ARIMA(1,0,0)(1,1,0)[12] with drift
##
## Coefficients:
## ar1 sar1 drift
## 0.6383 -0.5517 288.8980
## s.e. 0.1551 0.2047 14.5026
##
## sigma^2 = 202700: log likelihood = -181.5
## AIC=371 AICc=373.11 BIC=375.72
summary(arima1)
## Series: ts1
## ARIMA(1,0,0)(1,1,0)[12] with drift
##
## Coefficients:
## ar1 sar1 drift
## 0.6383 -0.5517 288.8980
## s.e. 0.1551 0.2047 14.5026
##
## sigma^2 = 202700: log likelihood = -181.5
## AIC=371 AICc=373.11 BIC=375.72
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 25.22163 343.863 227.1699 0.08059942 0.7069541 0.06491041
## ACF1
## Training set 0.2081043
Este modelo presenta un Root Mean Squared Error de 343.86 de ventas, tomando en cuenta la dimensión de los números originales se podría decir que es un buen modelo con error bajo. Además este modelo está tomando en cuenta un valor previo de la serie temporal para predecir el siguiente valor así como un término de diferencia de primer orden en las serie temporal y un término auto-regresivo de primer orden en la serie de las diferencias, además presenta una estacionalidad cada 12 periodos – es decir un patrón de comportamiento – y se incluye un término de deriva que permite una tendencia lineal en el tiempo.
Generación de pronóstico
pronostico1<- forecast(arima1, level = c(95), h=5)
pronostico1
## Point Forecast Lo 95 Hi 95
## Jan 2020 35498.90 34616.48 36381.32
## Feb 2020 34202.17 33155.29 35249.05
## Mar 2020 36703.01 35596.10 37809.92
## Apr 2020 36271.90 35141.44 37402.36
## May 2020 37121.98 35982.07 38261.90
plot(pronostico1)
En este modelo se presenta un nivel de confianza de 95% y una ventana de predicción de los siguientes 5 periodos, en este caso al ser datos mensuales, se pronostican los siguientes 5 meses.
| Actividad 3:
Finanzas Corporativas
Librerías Necesarias
library(finreportr)
Información disponible
Con la función finreportr podemos obtener la siguiente
información:
CompanyInfo()= brinda información general como nombre, ubicación, ZIP, etc.
AnnualReports() = brinda el nombre, fecha y número de acceso.
GetIncome()= brinda el estado de resultados.
GetBalanceSheet() = Brinda el balance general.
GetCashFlow()= Brinda el flujo de efectivo.
Extracción de información
Información de la compañía
options(HTTPUserAgent = "a a@gmail.com")
kable(CompanyInfo("JPM")) %>% kable_paper( "hover")
| company | CIK | SIC | state | state.inc | FY.end | street.address | city.state |
|---|---|---|---|---|---|---|---|
| JPMORGAN CHASE & CO | 0000019617 | 6021 | NY | DE | 1231 | 383 MADISON AVENUE | NEW YORK NY 10017 |
Reportes Anual
kable(head(AnnualReports("BABA", foreign = TRUE))) %>% kable_paper(full_width=T, "hover")
| filing.name | filing.date | accession.no |
|---|---|---|
| 20-F/A | 2024-02-23 | 0001193125-24-044480 |
| 20-F | 2023-07-21 | 0000950170-23-033752 |
| 20-F | 2022-07-26 | 0001104659-22-082622 |
| 20-F | 2021-07-27 | 0001104659-21-096092 |
| 20-F | 2020-07-09 | 0001104659-20-082409 |
| 20-F | 2019-06-05 | 0001047469-19-003492 |
Estado de resultados
options(HTTPUserAgent = "a a@gmail.com")
kable(head(GetIncome("GOOG", 2018)))%>% kable_paper(full_width=T, "hover")
| Metric | Units | Amount | startDate | endDate |
|---|---|---|---|---|
| Revenues | usd | 74989000000 | 2015-01-01 | 2015-12-31 |
| Revenues | usd | 90272000000 | 2016-01-01 | 2016-12-31 |
| Revenues | usd | 110855000000 | 2017-01-01 | 2017-12-31 |
| Cost of Revenue | usd | 28164000000 | 2015-01-01 | 2015-12-31 |
| Cost of Revenue | usd | 35138000000 | 2016-01-01 | 2016-12-31 |
| Cost of Revenue | usd | 45583000000 | 2017-01-01 | 2017-12-31 |
Balance General
options(HTTPUserAgent = "a a@gmail.com")
kable(head(GetBalanceSheet("AMZN", 2015)))%>% kable_paper(full_width=T, "hover")
| Metric | Units | Amount | startDate | endDate |
|---|---|---|---|---|
| Cash and Cash Equivalents, at Carrying Value | usd | 5269000000 | NA | 2011-12-31 |
| Cash and Cash Equivalents, at Carrying Value | usd | 8084000000 | NA | 2012-12-31 |
| Cash and Cash Equivalents, at Carrying Value | usd | 8658000000 | NA | 2013-12-31 |
| Cash and Cash Equivalents, at Carrying Value | usd | 14557000000 | NA | 2014-12-31 |
| Marketable Securities, Current | usd | 3789000000 | NA | 2013-12-31 |
| Marketable Securities, Current | usd | 2859000000 | NA | 2014-12-31 |
Flujo de Efectivo
options(HTTPUserAgent = "a a@gmail.com")
kable(head(GetCashFlow("AAPL", 2014)))%>% kable_paper(full_width=T, "hover")
| Metric | Units | Amount | startDate | endDate |
|---|---|---|---|---|
| Depreciation, Amortization and Accretion, Net | iso4217_USD | 6757000000 | 2012-09-30 | 2013-09-28 |
| Depreciation, Amortization and Accretion, Net | iso4217_USD | 7946000000 | 2013-09-29 | 2014-09-27 |
| Depreciation, Amortization and Accretion, Net | iso4217_USD | 3277000000 | 2011-09-25 | 2012-09-29 |
| Share-based Compensation | iso4217_USD | 2253000000 | 2012-09-30 | 2013-09-28 |
| Share-based Compensation | iso4217_USD | 2863000000 | 2013-09-29 | 2014-09-27 |
| Share-based Compensation | iso4217_USD | 1740000000 | 2011-09-25 | 2012-09-29 |
| Actividad de Equipo:
Series de tiempo Empresas
Se seleccionó a Netflix para realizar el análisis financiero. Se extraerá información de los años 2015 a 2018 para obtener 6 años de datos, de esta manera es que se podrá tener la mayor información posible para realizar los pronósticos.
Análisis financiero
Extracción de datos
options(HTTPUserAgent = "a a@gmail.com")
netflix18<- GetIncome("NFLX", 2018)
netflix15<- GetIncome("NFLX", 2015)
Transformación de datos
## Cambio de datos
netflix15$Metric<- as.factor(netflix15$Metric)
netflix18$Metric<- as.factor(netflix18$Metric)
kable(head(netflix15))%>% kable_paper(full_width=T, "hover")
| Metric | Units | Amount | startDate | endDate |
|---|---|---|---|---|
| Revenues | usd | 3609282000 | 2012-01-01 | 2012-12-31 |
| Revenues | usd | 1023961000 | 2013-01-01 | 2013-03-31 |
| Revenues | usd | 1069372000 | 2013-04-01 | 2013-06-30 |
| Revenues | usd | 1105999000 | 2013-07-01 | 2013-09-30 |
| Revenues | usd | 1175230000 | 2013-10-01 | 2013-12-31 |
| Revenues | usd | 4374562000 | 2013-01-01 | 2013-12-31 |
kable(head(netflix18))%>% kable_paper(full_width=T, "hover")
| Metric | Units | Amount | startDate | endDate |
|---|---|---|---|---|
| Revenues | usd | 6779511000 | 2015-01-01 | 2015-12-31 |
| Revenues | usd | 1957736000 | 2016-01-01 | 2016-03-31 |
| Revenues | usd | 2105204000 | 2016-04-01 | 2016-06-30 |
| Revenues | usd | 2290188000 | 2016-07-01 | 2016-09-30 |
| Revenues | usd | 2477541000 | 2016-10-01 | 2016-12-31 |
| Revenues | usd | 8830669000 | 2016-01-01 | 2016-12-31 |
En este punto ya se cuenta con dos bases de datos diferentes, una del 2015 que incluye datos del 2012 al 2014 y una del 2018 que incluye datos del 2015 a 2017
Marketing Expense
Selección de Métrica a Analizar
marketing_netflix1 <- netflix15[netflix15$Metric == "Marketing Expense",]
marketing_netflix2<- netflix18[netflix18$Metric== "Marketing Expense",]
marketing<- rbind(marketing_netflix1, marketing_netflix2)
marketing$Amount<- as.numeric(marketing$Amount)
kable(head(marketing))%>% kable_paper(full_width=T, "hover")
| Metric | Units | Amount | startDate | endDate | |
|---|---|---|---|---|---|
| 15 | Marketing Expense | usd | 439208000 | 2012-01-01 | 2012-12-31 |
| 16 | Marketing Expense | usd | 469942000 | 2013-01-01 | 2013-12-31 |
| 17 | Marketing Expense | usd | 607186000 | 2014-01-01 | 2014-12-31 |
| 151 | Marketing Expense | usd | 824092000 | 2015-01-01 | 2015-12-31 |
| 161 | Marketing Expense | usd | 991078000 | 2016-01-01 | 2016-12-31 |
| 171 | Marketing Expense | usd | 1278022000 | 2017-01-01 | 2017-12-31 |
Se seleccionó solo la métrica a analizar que corresponde a “Marketing Expenses” para después unir datos a través de las filas, de esta manera se contaron con los datos ordenados.
Datos TS
tsNetflix<- ts(data=marketing$Amount, start=c(2012,1), frequency=1)
tsNetflix
## Time Series:
## Start = 2012
## End = 2017
## Frequency = 1
## [1] 439208000 469942000 607186000 824092000 991078000 1278022000
Modelado
ARIMA
netflix_arima<- auto.arima(tsNetflix)
summary(netflix_arima)
## Series: tsNetflix
## ARIMA(0,1,0) with drift
##
## Coefficients:
## drift
## 167762800
## s.e. 38132573
##
## sigma^2 = 9.082e+15: log likelihood = -98.4
## AIC=200.8 AICc=206.8 BIC=200.02
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set 45240.85 77811930 56153374 -3.152125 8.268978 0.3347189 0.06935673
Este modelo tiene un solo factor diferenciado para realizarlo estacionario, de esta manera es que consigue su modelo óptimo aunque el RMSE presenta valores muy altos.
netflix_for<- forecast(netflix_arima, level= c(95), h=5)
kable(netflix_for) %>% kable_paper("hover")
| Point Forecast | Lo 95 | Hi 95 | |
|---|---|---|---|
| 2018 | 1445784800 | 1259000698 | 1632568902 |
| 2019 | 1613547600 | 1349394990 | 1877700210 |
| 2020 | 1781310400 | 1457790845 | 2104829955 |
| 2021 | 1949073200 | 1575504996 | 2322641404 |
| 2022 | 2116836000 | 1699174051 | 2534497949 |
plot(netflix_for)
Para el pronóstico del gasto de Marketing de Netflix se puede observar que para los próximos 5 años se tendrá un crecimiento en tendencia de los gastos.
Revenue
En este punto ya se cuenta con dos bases de datos diferentes, una del 2015 que incluye datos del 2012 al 2014 y una del 2018 que incluye datos del 2015 a 2017
Selección de Métrica a Analizar
rev_netflix1 <- netflix15[netflix15$Metric == "Revenues",]
rev_netflix2<- netflix18[netflix18$Metric== "Revenues",]
revenue<- rbind(rev_netflix1, rev_netflix2)
revenue$Amount<- as.numeric(revenue$Amount)
revenue<- revenue[-c(2:5, 7:10,13:16, 18:21),]
kable(head(revenue))%>% kable_paper(full_width=T, "hover")
| Metric | Units | Amount | startDate | endDate | |
|---|---|---|---|---|---|
| 1 | Revenues | usd | 3609282000 | 2012-01-01 | 2012-12-31 |
| 6 | Revenues | usd | 4374562000 | 2013-01-01 | 2013-12-31 |
| 11 | Revenues | usd | 5504656000 | 2014-01-01 | 2014-12-31 |
| 12 | Revenues | usd | 6779511000 | 2015-01-01 | 2015-12-31 |
| 17 | Revenues | usd | 8830669000 | 2016-01-01 | 2016-12-31 |
| 22 | Revenues | usd | 11692713000 | 2017-01-01 | 2017-12-31 |
Se seleccionó solo la métrica a analizar que corresponde a “Revenues” para después unir datos a través de las filas, de esta manera se contaron con los datos ordenados.
Datos TS
tsNetflix_rev<- ts(data=revenue$Amount, start=c(2012,1), frequency=1)
tsNetflix_rev
## Time Series:
## Start = 2012
## End = 2017
## Frequency = 1
## [1] 3609282000 4374562000 5504656000 6779511000 8830669000 11692713000
Modelado
ARIMA
netflix_arima2<- auto.arima(tsNetflix_rev)
summary(netflix_arima2)
## Series: tsNetflix_rev
## ARIMA(0,2,0)
##
## sigma^2 = 3.536e+17: log likelihood = -86.49
## AIC=174.98 AICc=176.98 BIC=174.37
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 349207831 485496286 350251542 4.076958 4.100816 0.2166478
## ACF1
## Training set 0.3276528
Este modelo tiene un solo factor diferenciado para realizarlo estacionario, de esta manera es que consigue su modelo óptimo aunque el RMSE presenta valores muy altos.
netflix_for2<- forecast(netflix_arima2, level= c(95), h=5)
kable(netflix_for2) %>% kable_paper("hover")
| Point Forecast | Lo 95 | Hi 95 | |
|---|---|---|---|
| 2018 | 14554757000 | 13389344605 | 15720169395 |
| 2019 | 17416801000 | 14810859663 | 20022742337 |
| 2020 | 20278845000 | 15918271104 | 24639418896 |
| 2021 | 23140889000 | 16757662426 | 29524115574 |
| 2022 | 26002933000 | 17360003361 | 34645862639 |
plot(netflix_for2)
Como se puede observar, el modelo de pronósticos presenta una tendencia positiva de utilidades (revenue) para los próximos 5 años. Aunque no se puede hablar de una causalidad directa entre el gasto de mercadotecnia y las utilidades, si se puede observar como es que ambas variables presentan un comportamiento similar para los próximos años.