Una serie de tiempo es una colección de observaciones sobre un determinado fenómeno, efectuadas en momentos sucesivos, usualmente equiespaciados.
Algunos ejemplos de series de tiempo son:
1. Precios de acciones
2. Niveles de inventario
3. Rotación de personal
4. Ventas
5. PIB (GDP)
Más información:
Libro R for Data Science
(2e)
# install.packages('forecast')
library(forecast)
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
Ejemplo:
Los siguientes datos de producción trimestral inician en el primer
trimestre de 2020.
Se busca pronosticar la producción de los siguientes 5 trimestres.
produccion <- c(50,53,55,57,55,60)
ts <- ts(data=produccion,start=c(2020,1),frequency = 4)
ts
## Qtr1 Qtr2 Qtr3 Qtr4
## 2020 50 53 55 57
## 2021 55 60
ARIMA significa AutoRegressive Integrated Moving Average o Modelo Autorregresivo 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
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)
library(readxl)
lechita<- read_excel("Ventas_Históricas_Lechitas.xlsx")
lechita$Ventas <- as.numeric(lechita$Ventas)
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
arima1 <- auto.arima(ts1)
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
pronostico1 <- forecast(arima1,level = c(95),h=12)
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
## Jun 2020 37102.65 35958.91 38246.40
## Jul 2020 37151.04 36005.74 38296.35
## Aug 2020 38564.65 37418.71 39710.59
## Sep 2020 38755.23 37609.03 39901.42
## Oct 2020 39779.03 38632.73 40925.33
## Nov 2020 38741.63 37595.29 39887.97
## Dec 2020 38645.86 37499.50 39792.22
plot(pronostico1)
library(finreportr)
## Warning: package 'finreportr' was built under R version 4.3.2
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.
options(HTTPUserAgent = "a a@gmail.com")
CompanyInfo("JPM")
## company CIK SIC state state.inc FY.end street.address
## 1 JPMORGAN CHASE & CO 0000019617 6021 NY DE 1231 383 MADISON AVENUE
## city.state
## 1 NEW YORK NY 10017
AnnualReports ("BABA", foreign = TRUE)
## filing.name filing.date accession.no
## 1 20-F/A 2024-02-23 0001193125-24-044480
## 2 20-F 2023-07-21 0000950170-23-033752
## 3 20-F 2022-07-26 0001104659-22-082622
## 4 20-F 2021-07-27 0001104659-21-096092
## 5 20-F 2020-07-09 0001104659-20-082409
## 6 20-F 2019-06-05 0001047469-19-003492
## 7 20-F 2018-07-27 0001047469-18-005257
## 8 20-F 2017-06-15 0001047469-17-004019
## 9 20-F 2016-05-24 0001047469-16-013400
## 10 20-F 2015-06-25 0001047469-15-005768
apple_income <- GetIncome("AAPL", 2016)
amazon_balance <- GetBalanceSheet("AMZN", 2015)
apple_cash <- GetCashFlow("AAPL", 2014)
Victor Manuel Muñoz Tirado - A01423434
Vivian Pérez Mosqueda - A01731984
Sebastian Romano Mena - A00831709 ## Cargar librerías
library(finreportr)
library(forecast)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.2 ✔ readr 2.1.4
## ✔ forcats 1.0.0 ✔ stringr 1.5.0
## ✔ ggplot2 3.4.2 ✔ tibble 3.2.1
## ✔ lubridate 1.9.2 ✔ tidyr 1.3.0
## ✔ purrr 1.0.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
options(HTTPUserAgent = "a a@gmail.com")
CompanyInfo("MSFT")
## company CIK SIC state state.inc FY.end street.address
## 1 MICROSOFT CORP 0000789019 7372 WA WA 0630 ONE MICROSOFT WAY
## city.state
## 1 REDMOND WA 98052-6399
AnnualReports("MSFT")
## filing.name filing.date accession.no
## 1 10-K 2023-07-27 0000950170-23-035122
## 2 10-K 2022-07-28 0001564590-22-026876
## 3 10-K 2021-07-29 0001564590-21-039151
## 4 10-K 2020-07-30 0001564590-20-034944
## 5 10-K 2019-08-01 0001564590-19-027952
## 6 10-K 2018-08-03 0001564590-18-019062
## 7 10-K 2017-08-02 0001564590-17-014900
## 8 10-K 2016-07-28 0001193125-16-662209
## 9 10-K 2015-07-31 0001193125-15-272806
## 10 10-K 2014-07-31 0001193125-14-289961
## 11 10-K 2013-07-30 0001193125-13-310206
## 12 10-K 2012-07-26 0001193125-12-316848
## 13 10-K 2011-07-28 0001193125-11-200680
## 14 10-K 2010-07-30 0001193125-10-171791
## 15 10-K 2009-07-30 0001193125-09-158735
## 16 10-K 2008-07-31 0001193125-08-162768
## 17 10-K 2007-08-03 0001193125-07-170817
## 18 10-K 2006-08-25 0001193125-06-180008
## 19 10-K 2005-08-26 0001193125-05-174825
## 20 10-K 2004-09-01 0001193125-04-150689
## 21 10-K 2003-09-05 0001193125-03-045632
## 22 10-K 2002-09-06 0001032210-02-001351
## 23 10-K 2001-09-18 0001032210-01-501099
## 24 10-K 2000-09-28 0001032210-00-001961
## 25 10-K 1999-09-28 0001032210-99-001375
## 26 10-K 1998-09-25 0001032210-98-001067
## 27 10-K 1997-09-29 0001017062-97-001764
## 28 10-K 1996-09-27 0000891020-96-001130
## 29 10-K 1995-09-25 0000891020-95-000433
## 30 10-K 1994-09-27 0000891020-94-000175
msft_income <- GetIncome("MSFT", 2017)
msft_income2 <- GetIncome("MSFT", 2014)
resultado <- rbind(msft_income,msft_income2)
str(resultado)
## 'data.frame': 221 obs. of 5 variables:
## $ Metric : chr "Sales Revenue Goods Net" "Sales Revenue Goods Net" "Sales Revenue Goods Net" "Sales Revenue Services And Other Net" ...
## $ Units : chr "U_iso4217USD" "U_iso4217USD" "U_iso4217USD" "U_iso4217USD" ...
## $ Amount : chr "75956000000" "61502000000" "57190000000" "17624000000" ...
## $ startDate: chr "2014-07-01" "2015-07-01" "2016-07-01" "2014-07-01" ...
## $ endDate : chr "2015-06-30" "2016-06-30" "2017-06-30" "2015-06-30" ...
resultado$startDate <- as.Date(resultado$startDate)
resultado$endDate <- as.Date(resultado$endDate)
resultado$Amount <- as.numeric(resultado$Amount)
str(resultado)
## 'data.frame': 221 obs. of 5 variables:
## $ Metric : chr "Sales Revenue Goods Net" "Sales Revenue Goods Net" "Sales Revenue Goods Net" "Sales Revenue Services And Other Net" ...
## $ Units : chr "U_iso4217USD" "U_iso4217USD" "U_iso4217USD" "U_iso4217USD" ...
## $ Amount : num 7.60e+10 6.15e+10 5.72e+10 1.76e+10 2.38e+10 ...
## $ startDate: Date, format: "2014-07-01" "2015-07-01" ...
## $ endDate : Date, format: "2015-06-30" "2016-06-30" ...
resultado_income <- resultado[resultado$Metric=="Sales Revenue Net",]
resultado_income <- resultado_income[order(resultado_income$startDate), ]
resultado_income<-resultado_income[c(1,2,7,12,14,19), ]
resultado_income<-select(resultado_income,Amount,startDate)
ts <- ts(data=log(resultado_income$Amount), start = c(2011,1), frequency=1)
ts
## Time Series:
## Start = 2011
## End = 2016
## Frequency = 1
## [1] 25.02358 25.07804 25.18725 25.26208 25.16967 25.22252
arima <- auto.arima(ts, D = 1)
arima
## Series: ts
## ARIMA(0,0,0) with non-zero mean
##
## Coefficients:
## mean
## 25.1572
## s.e. 0.0335
##
## sigma^2 = 0.008089: log likelihood = 6.48
## AIC=-8.97 AICc=-4.97 BIC=-9.39
pronostico <- forecast(arima, h=5)
pronostico
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## 2017 25.15719 25.04193 25.27245 24.98091 25.33347
## 2018 25.15719 25.04193 25.27245 24.98091 25.33347
## 2019 25.15719 25.04193 25.27245 24.98091 25.33347
## 2020 25.15719 25.04193 25.27245 24.98091 25.33347
## 2021 25.15719 25.04193 25.27245 24.98091 25.33347
plot(pronostico)
## Conclusión Después de analizar el modelo y el pronóstico
desarrollados, llegamos a la conclusión de que la variable elegida Sales
Revenue Net no es la más adecuada para el modelo ARIMA. Además, es
necesario más adelante conocer como ajustar los parámetros del modelo
para obtener un resultado óptimo. Esto lo sabemos ya que la gráfica
generada muestra un pronóstico muy lineal para los próximos años.
Mejorar esta situación permitiría tener una visión más detallada de la
situación de la Microsoft en los años siguientes. Finalmente podemos
decir que para Microsoft como para diferentes empresas es importante
reconocer la importancia el uso de diferentes modelos como ARIMA y
generar pronósticos para saber como actuar.