Menaikkan Pencapaian Lead Time Pengiriman Armada

Pendahuluan

Dalam era bisnis yang kompetitif dan dinamis saat ini, efisiensi operasional dan kepuasan pelanggan adalah dua aspek kunci yang menjadi fokus utama bagi perusahaan logistik PT. Fastana Logistik Indonesia (FLI).Kecepatan dan ketepatan waktu pengiriman adalah faktor utama yang mempengaruhi kepuasan pelanggan dan daya saing perusahaan di pasar. Perusahaan logistik yang mampu memberikan layanan pengiriman yang cepat dan dapat diandalkan akan memiliki keunggulan kompetitif yang signifikan.

PT. Fastana Logistik Indonesia mengalami berbagai tantangan dan hambatan yang dapat menghambat pencapaian lead time pengiriman yang diinginkan dan informasi yang tidak akurat adalah beberapa contoh masalah yang mungkin dihadapi.Dalam rangka mengatasi tantangan-tantangan ini dan meningkatkan pencapaian lead time pengiriman armada, PT. Fastana Logistik Indonesia memandang penting untuk mengembangkan sebuah solusi yang efektif. Oleh karena itu, data ini bertujuan untuk mengusulkan pengembangan sebuah dashboard analisis history yang dapat membantu perusahaan dalam memonitor, menganalisis, dan mengambil tindakan berdasarkan data terkait lead time pengiriman armada.

Judul Gambar

Dashboard analisis history yang efektif dapat menjadi alat berharga dalam mengatasi tantangan operasional dalam industri logistik. Ini memungkinkan perusahaan untuk membuat keputusan yang lebih baik berdasarkan data historis yang akurat dan terkini.

Load Library

library(ggplot2) # Untuk membuat plot statis
library(ggpubr) # melakukan eksport plot
library(scales) # melakukan edit di plot
library(glue) # menambah tooltip
library(plotly) # eksport plot statis menjadi interaktif
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
library(lubridate) # bermain dengan tipe data tanggal
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(fmsb)
library(readxl)
library(stringr)

Load Data

msm <- read_excel("datainput/MSM.xlsx")
glimpse(msm)
## Rows: 5,304
## Columns: 14
## $ Week               <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
## $ TANGGAL            <dttm> 2023-01-02, 2023-01-02, 2023-01-02, 2023-01-03, 20…
## $ PROJECT            <chr> "PT SANGHIANG PERKASA", "PT SANGHIANG PERKASA", "PT…
## $ NOPOL              <chr> "B9254TEN", "B9181TEN", "B9220TEN", "B9166TEN", "B9…
## $ DRIVER             <chr> "KOSMAS GEONG", "PUTRO", "ERI SAPUTRA", "ENDI K", "…
## $ `VENDOR OS DRIVER` <chr> "PT BSP", "PT IPI", "PT IPI", "PT BSP", "PT IPI", "…
## $ PHONE              <chr> NA, NA, NA, NA, NA, NA, NA, NA, "0823-2209-7054", N…
## $ TYPE               <chr> "WINGBOX", "WINGBOX", "WINGBOX", "WINGBOX", "WINGBO…
## $ SHIPMENT           <chr> "KNS 22124170", "KNS 22124169", "8700027956", "TRS …
## $ FROM               <chr> "PT SANGHIANG PERKASA", "PT SANGHIANG PERKASA", "PT…
## $ TO                 <chr> "PT SANGHIANG PERKASA - PT NETANIA KARUNIA PASURUAN…
## $ VENDOR             <chr> "FLI", "FLI", "FLI", "FLI", "FLI", "FLI", "FLI", "F…
## $ Jarak              <dbl> 750, 750, 135, 510, 750, 750, 750, 750, 840, 285, 7…
## $ `HIT/MISS`         <chr> "MISS", "MISS", "MISS", "MISS", "MISS", "HIT", "MIS…
head(msm)

Data Cleansing

msm <- msm %>% 
  select(Week,TANGGAL,PROJECT,NOPOL,DRIVER,`VENDOR OS DRIVER`,TYPE,VENDOR,TO,Jarak,`HIT/MISS`) %>% 
  filter(PROJECT %in% c("PT FRISIAN FLAG INDONESIA","PT PROPAN RAYA ICC","PT SANGHIANG PERKASA","PT AMERTA INDAH OTSUKA","PT ICI PAINT INDONESIA"),
         VENDOR %in% c("FLI"))
head(msm)
msm_cleaning <- msm %>% 
  select(PROJECT,NOPOL,DRIVER,`VENDOR OS DRIVER`,TYPE,Jarak,TO,`HIT/MISS`) %>% 
  mutate(Project = as.character(PROJECT),
         Nopol = as.character(NOPOL),
         Driver = as.character(DRIVER),
         Vendor = as.character(`VENDOR OS DRIVER`),
         Type = as.character(TYPE),
         Hasil = as.character(`HIT/MISS`),
         Jarak = as.numeric(Jarak)) %>% 
  select(Project,Nopol,Driver,Vendor,Type,Jarak,TO,Hasil)
head(msm_cleaning)
msm_cleaning %>% is.na() %>% colSums()
## Project   Nopol  Driver  Vendor    Type   Jarak      TO   Hasil 
##       0       0       0       0       0       0       0       0

Agregasi Data dan Visualisasi

Membuat Visualisasi Top MISS berdasarkan Project

top_project <- msm_cleaning %>% 
  filter(Hasil %in% "MISS") %>% 
  group_by(Project) %>% 
  summarise(Freq = n()) %>% 
  arrange(-Freq)
  head(5)
## [1] 5
top_project
top_project <-  top_project %>% 
   mutate(label = glue(" {Project}
                      Frequency: {Freq}"))
top_project
plot_top_project <- ggplot(top_project, 
                     aes(x = reorder(Project, Freq), 
                         y = Freq, 
                         text = label, 
                         color = Freq)) + 
  geom_point(size = 6) + 
  geom_segment(aes(x = reorder(Project, Freq),
                   xend = reorder(Project, Freq),
                   y = 0,
                   yend = Freq), linewidth = 2) + 
  scale_color_gradient(low = "#8B0000",
                       high = "#00008B") +
  coord_flip() + 
  labs(title = "Highest Occurrence Project On MISS",
       x = NULL,
       y = "Frequency") +
  theme_minimal() +
  theme(plot.title = element_text(hjust=0.5))
plot_top_project

ggplotly(plot_top_project, tooltip = "text")

Membuat Visualisasi Top MISS berdasarkan Nopol

top_nopol <- msm_cleaning %>% 
  filter(Hasil %in% "MISS") %>%
  group_by(Nopol) %>% 
  summarise(Freq = n()) %>% 
  arrange(-Freq) %>% 
  head(10)
top_nopol
top_nopol <-  top_nopol %>% 
   mutate(label = glue(" {Nopol}
                      Frequency: {Freq}"))
top_nopol
plot_top_nopol <- ggplot(top_nopol, 
                     aes(x = reorder(Nopol, Freq), 
                         y = Freq, 
                         text = label, 
                         color = Freq)) + 
  geom_point(size = 6) + 
  geom_segment(aes(x = reorder(Nopol, Freq),
                   xend = reorder(Nopol, Freq),
                   y = 0,
                   yend = Freq), linewidth = 2) + 
  scale_color_gradient(low = "#8B0000",
                       high = "#00008B") +
  coord_flip() + 
  labs(title = "Highest Occurrence Nopol On MISS",
       x = NULL,
       y = "Frequency") +
  theme_minimal() +
  theme(plot.title = element_text(hjust=0.5))
plot_top_nopol

ggplotly(plot_top_nopol, tooltip = "text")

Membuat Visualisasi Top MISS berdasarkan Driver

top_driver <- msm_cleaning %>% 
  filter(Hasil %in% "MISS") %>%
  group_by(Driver) %>% 
  summarise(Freq = n()) %>% 
  arrange(-Freq) %>% 
  head(10)
top_driver
top_driver <-  top_driver %>% 
   mutate(label = glue(" {Driver}
                      Frequency: {Freq}"))
top_driver
plot_top_driver <- ggplot(top_driver, 
                     aes(x = reorder(Driver, Freq), 
                         y = Freq, 
                         text = label, 
                         color = Freq)) + 
  geom_point(size = 6) + 
  geom_segment(aes(x = reorder(Driver, Freq),
                   xend = reorder(Driver, Freq),
                   y = 0,
                   yend = Freq), linewidth = 2) + 
  scale_color_gradient(low = "#8B0000",
                       high = "#00008B") +
  coord_flip() + 
  labs(title = "Highest Occurrence Driver On MISS",
       x = NULL,
       y = "Frequency") +
  theme_minimal() +
  theme(plot.title = element_text(hjust=0.5))
plot_top_driver

ggplotly(plot_top_driver, tooltip = "text")

Membuat Visualisasi Top MISS berdasarkan Vendor OS

top_vendor <- msm_cleaning %>% 
  filter(Hasil %in% "MISS") %>%
  group_by(Vendor) %>% 
  summarise(Freq = n()) %>% 
  arrange(-Freq) %>% 
  head()
top_vendor
top_vendor <-  top_vendor %>% 
   mutate(label = glue(" {Vendor}
                      Frequency: {Freq}"))
top_vendor
plot_top_vendor <- ggplot(data = top_vendor, aes(x = reorder(Vendor, Freq), 
                                             y = Freq,
                                             text = label)) +
  geom_col(aes(fill = Freq)) + 
  scale_fill_gradient(low = "#8B0000", high = "#00008B") + 
  labs(title = "Highest Occurrence Vendor On MISS", 
       x = "Frequency", 
       y = NULL) + 
  theme_minimal() + 
  theme(plot.title = element_text(hjust = 0.5))
plot_top_vendor

ggplotly(plot_top_vendor, tooltip = "text")

Membuat Visualisasi Top MISS berdasarkan Jarak

top_jarak <- msm_cleaning %>% 
  mutate(Jarak = as.character(Jarak)) %>% 
  filter(Project %in% "PT AMERTA INDAH OTSUKA",
         Hasil %in% "MISS") %>% 
  group_by(Jarak) %>% 
  summarise(Freq = n()) %>% 
  arrange(-Freq) %>% 
  head()
top_jarak
top_jarak <-  top_jarak %>% 
   mutate(label = glue("{Jarak} km
                      Frequency: {Freq}"))
top_jarak
plot_top_jarak <- ggplot(top_jarak, 
                     aes(x = reorder(Jarak, Freq), 
                         y = Freq, 
                         text = label, 
                         color = Freq)) + 
  geom_point(size = 6) + 
  geom_segment(aes(x = reorder(Jarak, Freq),
                   xend = reorder(Jarak, Freq),
                   y = 0,
                   yend = Freq), linewidth = 2) + 
  scale_color_gradient(low = "#8B0000",
                       high = "#00008B") +
  coord_flip() + 
  labs(title = "Highest Occurrence Jarak MISS On PT AMERTA INDAH OTSUKA",
       x = NULL,
       y = "Frequency") +
  theme_minimal() +
  theme(plot.title = element_text(hjust=0.5))
plot_top_jarak

ggplotly(plot_top_jarak, tooltip = "text")

Membuat Visualisasi Top MISS berdasarkan Tujuan

top_tujuan <- msm_cleaning %>% 
  filter(Project %in% "PT AMERTA INDAH OTSUKA",
         Hasil %in% "MISS") %>% 
  group_by(TO) %>% 
  summarise(Freq = n()) %>% 
  arrange(-Freq) %>% 
  head(10)
top_tujuan
top_tujuan <- top_tujuan %>% 
  mutate(label = glue("{str_split(TO, '-')[[1]][2]}
                       Frequency: {Freq}"))
top_tujuan
plot_top_tujuan <- ggplot(top_tujuan, 
                     aes(x = reorder(TO, Freq), 
                         y = Freq, 
                         text = label, 
                         color = Freq)) + 
  geom_point(size = 6) + 
  geom_segment(aes(x = reorder(TO, Freq),
                   xend = reorder(TO, Freq),
                   y = 0,
                   yend = Freq), linewidth = 2) + 
  scale_color_gradient(low = "#8B0000",
                       high = "#00008B") +
  coord_flip() + 
  labs(title = "Highest Occurrence Jarak MISS On PT AMERTA INDAH OTSUKA",
       x = NULL,
       y = "Frequency") +
  theme_minimal() +
  theme(plot.title = element_text(hjust=0.5))
plot_top_tujuan

ggplotly(plot_top_tujuan, tooltip = "text")

Membuat Visualisasi Top MISS berdasarkan Weekday

msm_hari <- msm %>%
  select(TANGGAL,PROJECT,VENDOR,`HIT/MISS`) %>% 
  filter(PROJECT %in% c("PT FRISIAN FLAG INDONESIA","PT PROPAN RAYA ICC","PT SANGHIANG PERKASA","PT AMERTA INDAH OTSUKA","PT ICI PAINT INDONESIA"),
         VENDOR %in% c("FLI")) %>% 
  mutate(
    Weekday = factor(weekdays(TANGGAL), levels = c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"))) %>% 
  select(PROJECT, Weekday, `HIT/MISS`)
head(msm_hari)
top_hari <- msm_hari %>% 
  filter(PROJECT %in% "PT AMERTA INDAH OTSUKA",
         `HIT/MISS` %in% "MISS") %>% 
  group_by(Weekday) %>% 
  summarise(Freq = n()) %>% 
  arrange(-Freq) %>% 
  head()
top_hari
top_hari <-  top_hari %>% 
   mutate(label = glue(" {Weekday}
                      Frequency: {Freq}"))
top_hari
plot_top_hari <- ggplot(top_hari, 
                     aes(x = reorder(Weekday, Freq), 
                         y = Freq, 
                         text = label, 
                         color = Freq)) + 
  geom_point(size = 6) + 
  geom_segment(aes(x = reorder(Weekday, Freq),
                   xend = reorder(Weekday, Freq),
                   y = 0,
                   yend = Freq), linewidth = 2) + 
  scale_color_gradient(low = "#8B0000",
                       high = "#00008B") +
  coord_flip() + 
  labs(title = "Highest Occurrence Weekday MISS On PT AMERTA INDAH OTSUKA",
       x = NULL,
       y = "Frequency") +
  theme_minimal() +
  theme(plot.title = element_text(hjust=0.5))
plot_top_hari

ggplotly(plot_top_hari, tooltip = "text")