Pronosticar en R con Prophet
Amigos
PYME, en publicaciones anteriores, hemos hablado de la importancia del
pronóstico y hemos dicho que es el punto de partida para la gestión de la
cadena de suministro.
Actualmente
existen softwares y paquetes de código abierto que nos permiten elaborar
Pronósticos con una gran exactitud. Es por ello que a continuación comparto con
ustedes esta información. La mayoría de las veces nuestra PYME no cuenta con
los recursos económicos para adquirir paquetes Informáticos que cuestan
bastante dinero. Sin embargo es posible obtener pronósticos de calidad a través
de recursos informáticos de código abierto. Les sugiero descargar de internet el
software R y el paquete Prophet para elaborar sus Pronósticos.
El
pronóstico a menudo se considera una progresión natural de los
informes. ¿Informar nos ayuda a responder lo que
sucedió? El pronóstico ayuda a responder la siguiente pregunta
lógica: ¿qué pasará?
Históricamente,
los pronósticos de alta calidad han sido muy difíciles de producir. Esto
dio como resultado una grave escasez de analistas que podían entregar pronósticos con el nivel de precisión
requerido para impulsar las decisiones comerciales. Para aliviar esta
brecha de suministro y hacer que la predicción escalable sea mucho más fácil,
el equipo de Core Data Science en Facebook creó Prophet ,
una biblioteca de predicción para Python y R, que abrieron en 2017.
La
intención detrás de Prophet es "hacer que sea más fácil para los expertos
y no expertos hacer pronósticos de alta calidad que se mantengan al día con la
demanda". Prophet puede producir pronósticos
confiables y robustos (a menudo con un mejor desempeño que otras técnicas de
pronóstico comunes) con muy pequeño esfuerzo manual al tiempo que permite la
aplicación del conocimiento del dominio a través de parámetros fácilmente
interpretables.
En
esta receta, aprenderá a usar Prophet (en R) para resolver un problema común:
pronosticar los pedidos diarios de una empresa para el próximo año. Este
ejemplo liviano debería servir como una excelente manera de comenzar con
Prophet, y con suerte generará inspiración para profundizar aún más en la vasta
funcionalidad de la biblioteca.
Esta
receta se divide en cuatro secciones principales:
- Preparación de datos y exploración
- Transformada de Box-Cox
- Previsión
- Transformada inversa de Box-Cox
Puede
encontrar implementaciones de todos los pasos descritos a continuación en
este informe de Modo de ejemplo .
Preparación de datos y exploración
Prophet
funciona mejor con datos de periodicidad diaria con al menos un año de datos
históricos. Es posible usar Prophet para pronosticar usando datos sub-diarios o mensuales , pero para los propósitos de esta receta, usaremos la
periodicidad diaria recomendada. Usaremos SQL para discutir los datos que
nos gustaría pronosticar en una periodicidad diaria:
`
select
``
date,
value
from modeanalytics.daily_orders
order
by
date`
NOTA:
Si bien Prophet es relativamente robusto a la falta de datos, es importante
asegurarse de que a su serie temporal no le falte una cantidad significativa de
observaciones. Si a su serie temporal le faltan un gran número de
observaciones, considere usar una técnica de remuestreo o pronosticar sus datos a una frecuencia menor (por
ejemplo, hacer pronósticos mensuales utilizando observaciones mensuales)
Ahora
que tenemos nuestros datos en una periodicidad diaria, podemos canalizar
nuestro conjunto de resultados de consultas SQL en un objeto de marco de datos
R en el cuaderno R. Primero, cambie el nombre de su consulta SQL a
Daily Orders
. Luego, dentro del cuaderno R, podemos usar la siguiente
declaración para canalizar nuestro conjunto de resultados de consulta en un
marco de datos df:df <- datasets[[
"Daily Orders"]]
Para
tener una idea rápida de cuántas observaciones contiene su marco de datos,
puede ejecutar la siguiente declaración:
# Retreive dimension of object
dim(df)
Prophet
siempre espera dos columnas en el DataFrame de entrada:
ds
y que y,
contienen la fecha y los valores numéricos, respectivamente. Para
verificar los tipos de columnas en su DataFrame, puede ejecutar la siguiente
instrucción en el cuaderno R:# Inspect variables
str(df)
En
este ejemplo, necesitará hacer una conversión manual de clase:
# Parse date column
df <- mutate (
df,
date = ymd_hms(date)
# parse date column using lubridate ymd_hms function
)
Una
vez que haya confirmado que las columnas en su marco de datos son las clases
correctas, puede crear una nueva columna
ds
en su marco de datos que sea una copia exacta de la columna de
fecha, y una nueva columna y
que sea una copia exacta de la columna de valor:df <- mutate (
df,
ds = date,
# Create new ds column from date using mutate
y =
value
# Create new y column from value using mutate
)
Luego
puede reutilizar la
date
columna que se utilizará como índice del marco de datos:# # Repurpose date column to be used as dataframe index
df <- column_to_rownames(df,
var =
"date")
Ahora
que tiene sus datos preparados para usarlos con Prophet, es una buena práctica
trazarlos e inspeccionar cómo se ven los datos antes de introducirlos en
Prophet. Usando nuestros datos de ejemplo, podemos usar ggplot2 para crear la siguiente visualización:

Hay
algunas cosas que notar sobre esta trama:
- Hay un cambio notable en la trayectoria de
la tendencia alrededor de mayo de 2017. Por defecto, Prophet detecta
automáticamente este tipo de " puntos de cambio de tendencia " y permite que la tendencia se
adapte adecuadamente. Prophet también permite un control más
detallado sobre la identificación de estos puntos de cambio de tendencia .
- Hay una notable estacionalidad semanal y
anual. Prophet se ajustará automáticamente a las estacionalidades semanales y
anuales si la serie temporal tiene más de dos ciclos de duración.
- La media y la varianza de nuestras
observaciones aumentan con el tiempo. Prophet modela de forma nativa
el aumento de la media de los datos a lo largo del tiempo, pero debemos
tomar medidas adicionales para normalizar la mayor variación posible para
lograr los resultados de pronóstico más precisos. Podemos hacer esto
aplicando una transformación de potencia a nuestros datos.
Transformada de Box-Cox
A
menudo, en el pronóstico, elegirá explícitamente un tipo específico de transformación
de potencia para aplicar a los datos para eliminar el ruido antes de alimentar
los datos en un modelo de pronóstico (por ejemplo, una transformación
logarítmica o una transformación de raíz cuadrada, entre otros). Sin
embargo, a veces puede ser difícil determinar qué tipo de transformación de
potencia es adecuada para sus datos. Aquí es donde entra en juego la transformación Box-Cox .
Las
transformaciones de Box-Cox son transformaciones de datos que evalúan un
conjunto de coeficientes lambda (λ) y selecciona el valor que logra la mejor
aproximación de la normalidad.
La biblioteca
de pronóstico R proporciona una función de
transformación Box-Cox incorporada, llamada BoxCox () . La función BoxCox () tiene dos entradas requeridas:
un vector numérico o series de tiempo de clase
ts
y un parámetro de
transformación de coeficiente lambda. Para determinar el coeficiente
lambda para usar en la transformación Box-Cox, puede usar la función
incorporada BoxCox.lambda () , que selecciona
automáticamente el coeficiente lambda óptimo para la transformación.
Para
nuestro ejemplo, dejaremos que la
[BoxCox.lambda()](https://www.rdocumentation.org/packages/forecast/versions/8.1/topics/BoxCox.lambda)
función determine el λ
óptimo para usar en la transformación, y luego usaremos ese valor en la
función BoxCox () :# The BoxCox.lambda() function will choose a value of lambda
lam = BoxCox.lambda(df
$value, method =
"loglik")
df
$y = BoxCox(df
$value, lam)
df.m <- melt(df, measure.vars=c(
"value",
"y"))
Si
trazamos nuestros datos recién transformados junto con los datos no
transformados, podemos ver que la transformación de Box-Cox pudo eliminar gran
parte de la variación creciente en nuestras observaciones a lo largo del
tiempo:

Previsión
El
primer paso para crear un pronóstico usando Prophet es importar la
fbprophet
biblioteca en nuestro
cuaderno R:library(prophet)
Una
vez que haya imprimido la biblioteca del profeta, estará listo para ajustar un
modelo a sus datos históricos. Para ello, llame a la
prophet()
función utilizando su
marco de datos preparado como entrada:m <- prophet(df)
Una
vez que haya usado Prophet para ajustar el modelo usando el conjunto de datos
transformado de Box-Cox, ahora puede comenzar a hacer predicciones para fechas
futuras. Prophet tiene una función auxiliar incorporada
make_future_dataframe
para crear un marco de
datos de fechas futuras. La make_future_dataframe
función le permite
especificar la frecuencia y el número de períodos que le gustaría pronosticar
en el futuro. Por defecto, la frecuencia se establece en días. Como
estamos usando datos de periodicidad diaria en este ejemplo, dejaremos freq
el valor predeterminado y
estableceremos el periods
argumento en 365, lo que indica que nos
gustaría pronosticar 365 días en el futuro.future
<- make_future_dataframe(m, periods = 365)
Ahora
podemos usar la
predict()
función para hacer predicciones para cada fila
en el marco de datos futuro.forecast <- predict(m, future)
En
este punto, Prophet habrá creado un nuevo marco de datos asignado a la variable
de pronóstico que contiene los valores pronosticados para fechas futuras en una
columna llamada
yhat
, así como intervalos de incertidumbre y
componentes para el pronóstico. Podemos visualizar el pronóstico
utilizando la plot
función auxiliar incorporada de
Prophet :plot(m, forecast)
En
nuestro ejemplo, nuestro pronóstico es el siguiente:

Si
desea visualizar los componentes de pronóstico individuales, puede usar la
función incorporada de Prophet
plot_components
:prophet_plot_components(m, forecast)
La
ejecución
plot_components
de nuestros datos de ejemplo devuelve el
siguiente conjunto de visualizaciones de componentes:
Las
previsiones y las visualizaciones de componentes muestran que Prophet pudo
modelar con precisión la tendencia subyacente en los datos, al tiempo que
modeló con precisión la estacionalidad semanal y anual (por ejemplo, menor
volumen de pedidos en fin de semana y días festivos).
Transformada inversa de Box-Cox
Dado
que Prophet se usó en los datos transformados de Box-Cox, deberá transformar
sus valores pronosticados nuevamente en sus unidades originales. Para
transformar sus nuevos valores pronosticados nuevamente en sus unidades
originales, deberá realizar una transformación inversa de Box-Cox.
La biblioteca
de pronóstico R proporciona una función de
transformación inversa inversa de Box-Cox, llamada
[InvBoxCox()](https://www.rdocumentation.org/packages/forecast/versions/8.1/topics/BoxCox)
. La InvBoxCox()
función tiene dos
entradas requeridas; un vector numérico o series de tiempo de clase ts
y un parámetro de
transformación del coeficiente lambda. Transformaremos inversamente
columnas específicas en nuestro marco de datos de pronóstico, y suministraremos
el valor λ que obtuvimos anteriormente de nuestra primera transformación
Box-Cox almacenada en la lam
variable:inverse_forecast <- forecast
inverse_forecast <- column_to_rownames(inverse_forecast, var =
"ds")
inverse_forecast
$yhat_untransformed = InvBoxCox(forecast
$yhat, lam)
Ahora
que sus valores pronosticados se transforman nuevamente a sus unidades
originales, puede visualizar los valores pronosticados junto con los valores
históricos:

Nuestros consultores experimentados, que tienen competencias profundas dentro del sector PYME, capacitan a los clientes para tomar decisiones informadas a través de soluciones centradas en procesos y les ayudan a alcanzar una visión global unificada de su negocio para estimular el crecimiento continuo.
Agendar su cita para hacer el diagnóstico integral de su PYME gratis.
Solicite el o los cursos de capacitación que su PYME requiere para una mejor gestión.
Ing. Juan José Crespo Hernández.
https://youtu.be/My3bSQwxqME
Whatsapp 7712160740
Cel. 7712160740 Pachuca Hgo.
consultoriadeprocesos53@gmail.com
https://crespoconsultoriadeprocesos.blogspot.com
No hay comentarios.:
Publicar un comentario