Hola muy buenos días , tardes o noches.
En el mundo actual, los servicios de entrega de alimentos han experimentado un crecimiento significativo. Los restaurantes se esfuerzan por proporcionar un servicio eficiente y satisfactorio a sus clientes, y el análisis de datos juega un papel crucial en este proceso. En este artículo, nos centraremos en el análisis de un conjunto de datos fascinante: «RESTAURANT FOOD DELIVERY ANALYSIS». Exploraremos cómo podemos aprovechar la granularidad temporal para obtener información valiosa sobre los patrones de entrega y mejorar la eficiencia operativa. Mediante la creación de dimensiones de fecha y hora, y estableciendo relaciones adecuadas, podemos realizar análisis detallados y específicos para tomar decisiones informadas. Veamos cómo este enfoque puede brindar flexibilidad y capacidad en el análisis de datos de entrega de alimentos.
El día de hoy abordaremos la primera fase del reto de https://fp20analytics.com/challenge, el reto número 6, el cual trae un maravilloso data set CHALLENGE 6 «RESTAURANT FOOD DELIVERY ANALYSIS». En este caso, tenemos un maravilloso data set en el cual tenemos diferente granularidad en los cuales vamos manejando en cada uno de estos casos, dado que tiene una columna de fecha y varias de tiempo. Cuando nos referimos a tiempo, es decir horas, minutos y segundos, tenemos dos niveles de granularidad.
Para este tipo de casos, ¿qué es lo que debemos realizar? Bueno, al separar la dimensión de fecha y la dimensión de hora en tablas separadas, podemos tener un mayor nivel de flexibilidad y granularidad en este análisis de este conjunto de datos que realizaremos. Además, podemos aprovechar las capacidades de jerarquías y relaciones en Power BI para realizar análisis más detallados y específicos.
La tabla de dimensión de fechas contendría información como el año, mes, día, trimestre. Podemos, claro está, añadir o tener atributos adicionales según nuestras necesidades o preguntas de negocio, como días festivos.
La tabla de dimensión de horas contendría información relacionada con la hora del día, como la hora exacta, el minuto, el período del día (mañana, tarde, noche). Este tipo de columnas son las que podemos manejar o, como en este caso, crear franjas horarias para ampliar nuestro análisis de datos.
Luego, puedes establecer relaciones entre estas tablas de dimensiones y la tabla de hechos utilizando las columnas correspondientes de fecha y hora. Esto nos dará o nos permitirá realizar análisis en diferentes niveles de granularidad, como desglosar los datos por día, mes o año, o incluso analizar el comportamiento a lo largo del día en función de las horas.
Este enfoque nos brinda más flexibilidad y capacidad para realizar análisis basados en fechas y horas, y es compatible con las funcionalidades de Power BI para explorar y visualizar los datos de manera más eficiente.
Así que, teniendo claro el marco de trabajo que utilizaremos para este modelado de datos, empecemos creando la dimensión tiempo.
Paso 1) Creamos una consulta totalmente en blanco.
Paso 2) Se crea una lista que tenga todos los minutos del día List.Times(#time(0,0,0),1440,#duration(0,0,1,0)).
Paso 3) Ahora esta lista la paso a una tabla Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error), para poder empezar a crear las diferentes columnas que utilizaremos en nuestra dimensión de tiempo.
Paso 4) Es importante entender que se debe pasar a columna de tipo hora Table.TransformColumnTypes(#»Renamed Columns»,{{«Hora», type time}}).
Paso 5) Creamos la primera columna, las horas del día #time(Time.Hour([Hora]),0,0), pero esta será con la columna calculada.
Paso 6) En este caso, ahora crearemos una columna que nos dé el intervalo de cada media hora del día. Si Time.Minute([Hora])>=30 then #time(Time.Hour([Hora]),30,0) else #time(Time.Hour([Hora]),0,0). Esto es ya enfocando en pensar cómo deseamos profundizar nuestro
Paso 7) En este caso, crearemos la columna «turno» para saber en qué turno recibimos más pedidos, en la mañana o por la tarde. If Time.Hour([Hora])>=12 then «Tarde» else «Mañana».
Paso 8) Para la última columna, que puedes crear otras, pero en mi caso deseo observar el comportamiento de cada dos horas, cómo se mueve el flujo de llamadas para pedidos y analizar las capacidades de respuesta y tiempos de entrega. If Number.Mod(Time.Hour([Intervalo_Hora]),2)=1 then #time(Time.Hour([Intervalo_Hora])-1,0,0) else [Intervalo_Hora].
Ahora, luego de haber creado esta tabla de dimensión, repito, puedes agregar tiempos como, por ejemplo, el comportamiento de llamadas cada 15 minutos o cada 45 minutos.
Pero ahora realizaremos la relación con qué columna lo relacionaremos. Analizando la data que tenemos, debemos relacionarla con la columna primero que no tenga vacías y, sumado a ello, que la columna tenga lógica para responder las preguntas de negocio. Es decir, la columna predilecta para mi análisis es la columna llamada «Time customer placed order» primero, completo en que no tiene vacíos y, segundo, que tiene efectivamente, dado que según la lógica de negocios que estamos analizando, el primer contacto desde que el cliente ejecutó la llamada es importante para generar, en base a este, la trazabilidad de tiempos, porque es el contacto seguro y ver desde este punto de partida toda la evolución de la transacción de la llamada.
El análisis de datos desempeña un papel fundamental en la optimización de los servicios de entrega de alimentos en restaurantes. En este artículo, hemos explorado cómo la granularidad temporal puede ser una herramienta poderosa para comprender los patrones de entrega y mejorar la eficiencia operativa. Al separar la dimensión de fecha y la dimensión de hora, y establecer relaciones adecuadas en Power BI, podemos desglosar los datos en diferentes niveles de granularidad, como días, meses, horas y minutos. Esto nos permite obtener información detallada sobre el comportamiento de los clientes, los períodos de mayor demanda y los tiempos de entrega. Además, la flexibilidad de agregar atributos adicionales, como días festivos, nos brinda una visión más completa del negocio. Al implementar este enfoque, los restaurantes pueden tomar decisiones basadas en datos sólidos y optimizar su proceso de entrega de alimentos, brindando un servicio excepcional a sus clientes.
Por ultimo completo el código completo en lenguaje M
let
Source = List.Times(#time(0,0,0),1440,#duration(0,0,1,0)),
#»Converted to Table» = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
#»Renamed Columns» = Table.RenameColumns(#»Converted to Table»,{{«Column1», «Hora»}}),
#»Changed Type» = Table.TransformColumnTypes(#»Renamed Columns»,{{«Hora», type time}}),
#»Added Custom» = Table.AddColumn(#»Changed Type», «Custom», each #time(Time.Hour([Hora]),0,0)),
#»Renamed Columns1″ = Table.RenameColumns(#»Added Custom»,{{«Custom», «Intervalo_Hora»}}),
#»Changed Type1″ = Table.TransformColumnTypes(#»Renamed Columns1″,{{«Intervalo_Hora», type time}}),
#»Added Custom1″ = Table.AddColumn(#»Changed Type1″, «Medias horas», each if Time.Minute([Hora])>=30 then
#time(Time.Hour([Hora]),30,0)
else
#time(Time.Hour([Hora]),0,0)),
#»Changed Type2″ = Table.TransformColumnTypes(#»Added Custom1″,{{«Medias horas», type time}}),
#»Added Custom2″ = Table.AddColumn(#»Changed Type2″, «Turno», each if Time.Hour([Hora])>=12 then
«Tarde»
else
«Mañana»),
#»Changed Type3″ = Table.TransformColumnTypes(#»Added Custom2″,{{«Turno», type text}}),
#»Added Custom3″ = Table.AddColumn(#»Changed Type3″, «Custom», each if Number.Mod(Time.Hour([Intervalo_Hora]),2)=1
then
#time(Time.Hour([Intervalo_Hora])-1,0,0)
else
[Intervalo_Hora]),
#»Renamed Columns2″ = Table.RenameColumns(#»Added Custom3″,{{«Custom», «Cada dos horas»}}),
#»Changed Type4″ = Table.TransformColumnTypes(#»Renamed Columns2″,{{«Cada dos horas», type time}})
in
#»Changed Type4″
Para los siguientes post creare la dimensión de tiempos para empezar a crear nuestro modelo de datos dimensional para afrontar de la mejor manera este maravilloso reto.
Vicente Antonio Juan Magallanes
Business Intelligence Technical.
Perfil linkedin.