Explicación en clase: Teoría y ejemplo de Producción Trimestral

Concepto

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)

Instalar paquetes y llamar librerías

# install.packages('forecast')
library(forecast)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo

Crear la serie de tiempo

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

Crear modelo ARIMA

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

Generar el 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)

Acividad 2 - Hershey’s

Importar base de datos y crear la serie de tiempo

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

Crear modelo ARIMA

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

Generar el pronóstico

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)

Actividad Finanzas Corporativas

Cargar librerías

library(finreportr)
## Warning: package 'finreportr' was built under R version 4.3.2

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.

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)

Análisis Financiero de Empresa

Integrantes del equipo

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

Acceder para poder obtener información

options(HTTPUserAgent = "a a@gmail.com")

Obtener información de la empresa Microsoft

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

Crear base de datos

msft_income <- GetIncome("MSFT", 2017)
msft_income2 <- GetIncome("MSFT", 2014)
resultado <- rbind(msft_income,msft_income2)

Exploración de la base de datos

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" ...

Limpieza de base de datos

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)

Crear serie de tiempo

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

Modelo ARIMA

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

Pronóstico

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.