1. Pendahuluan

Latar Belakang

  • Data yang digunakan adalah data Petrokimia Gresik.
  • PT Petrokimia Gresik merupakan produsen pupuk terbesar dan terlengkap di Indonesia yang merupakan anak perusahaan dari PT. Pupuk Indonesia, juga berkewajiban memberikan jaminan pupuk yang berkualitas dengan biaya terjangkau kepada semua petani di Indonesia. Oleh karena itu PT Petrokimia Gresik (PG) menaruh perhatian secara khusus terhadap kegiatan manajemen rantai pasok (supply chain management/SCM), Alur SCM PT Petrokimia Gresik dimulai dari Alur SCM Masuk (Inbound Logistic) dari pengiriman bahan baku dari rekanan sampai dengan bahan baku diterima di Pelabuhan untuk kepentingan sendiri (TUKS) PG, kemudian dikirim ke Gudang Bahan Baku dan dikonsumsi sampai dengan menjadi produk siap jual. Adapun alur SCM Keluar (Outbound) dimulai dari penerimaan produk di Gudang Gresik (Lini I), untuk kemudian dikirim ke Distribution Center (DC/Lini II) atau langsung ke Gudang Penyangga (GD/Lini III) Dari GP Lini III, maka produk akan dilakukan pengambilan oleh Distributor untuk disimpan di Gudang Distributor, sebelum akhirnya dilakukan pengambilan oleh Kios Pengecer akhir.
  • PG memiliki jaringan SCM Outbound Logistik yang besar dalam memastikan kelancaran penyaluran pupuk di Seluruh Indonesia Dengan jumlah sarana dan prasaran SCM yang meliputi 333 Gudang Penyangga (GP) dan Distribution Center (DC) di seluruh Indonesia.
  • Total kapasitas penyimpanan Gudang Distribution Center (DC) Lini II dan Gudang Penyangga (GP) Lini III PG adalah sebesar 1.360.106 ton yang terbagi dalam 6 (enam) area penyaluran utama yaitu Jawa - Bali, Sumatera, Kalimantan, Sulawesi, Maluku Papua dan Nusa Tenggara. Dari pembagian area penyaluran (Distribusi) diketahui bahwa Area Jawa dan Bali memiliki kapasitas penyimpanan Gudang DC dan GP yang paling besar dengan total kapasitas 615.688 ton.
  • Dengan Kapasitas jaringan SCM PG terbesar adalah di area Jawa - Bali sebagai salah satu parameter bahwa terdapatnya pergerakan produk pupuk yang besar disana, hal ini membutuhkan adanya manajemen SCM yang baik. Pergerakan produk (Product Flow) yang tinggi juga tercermin dari target penyaluran tinggi sebagaimana disajikan pada gambar 4 bahwa rencana penyaluran pupuk tertinggi sesuai Rencana Kerja dan Anggaran Perusahaan (RKAP Tahun 2020) adalah di area Jawa Bali.
  • Dengan Kapasitas jaringan SCM PG terbesar adalah di area Jawa - Bali sebagai salah satu parameter bahwa terdapatnya pergerakan produk pupuk yang besar disana, hal ini membutuhkan adanya manajemen SCM yang baik.
  • Pergerakan produk (Product Flow) yang tinggi juga tercermin dari target penyaluran tinggi sebagaimana disajikan pada gambar 4 bahwa rencana penyaluran pupuk tertinggi sesuai Rencana Kerja dan Anggaran Perusahaan (RKAP Tahun 2020) adalah di area Jawa Bali.

Variabel yang digunakan:

  • POSTO : Order Pengangkutan
  • GI : Order diambil di Gudang Gresik
  • GR : Good Receipt (Order diterima di gudang tujuan)
  • Tanggal POSTO : Tanggal Order Terbit
  • Tanggal GI : Tanggal diambil di gudang
  • No. POSTO: Nomor dokumen perintah kerja pengiriman pupuk
  • Produk: Deskripsi produk yang menjadi obyek angkut oleh transporter
  • Plan Asal/Tujuan: Deskripsi gudang asal dan gudang tujuan penyimpanan pupuk
  • Tgl. POSTO: Tanggal penerbitan dokumen perintah kerja untuk transporter
  • Tgl. GI: Tanggal truk melakukan pengambilan pupuk di gudang asal

Metode yang digunakan:

  • Y = Data Keterlambatan
  • X1 = Alokasi/Kuota Kontrak
  • X2 = Jumlah kapasitas armada truk
  • X3 = Grade/Kelas Rekanan (A,B,C)
  • X4 = Tujuan Gudang
  • X5 = bulan diterbitkan order (POSTO)

Data

choose.files()
## [1] "D:\\MMT-ITS\\Materi Kuliah Semester 3\\Analytics Projects\\anpro.csv"
setwd("D://MMT-ITS//Materi Kuliah Semester 3//Analytics Projects")
library(stats)
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(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.0 --
## v ggplot2 3.3.2     v purrr   0.3.4
## v tibble  3.0.4     v stringr 1.4.0
## v tidyr   1.1.2     v forcats 0.5.0
## v readr   1.4.0
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(ggplot2)
library(lubridate)
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
anpro <- read.csv("anpro.csv", sep = ";")
anpro <- data.frame(anpro)
str(anpro)
## 'data.frame':    156296 obs. of  69 variables:
##  $ No.POSTO             : num  5.12e+09 5.12e+09 5.12e+09 5.12e+09 5.12e+09 ...
##  $ Tgl.POSTO            : chr  "01/01/2019" "01/01/2019" "01/01/2019" "01/01/2019" ...
##  $ Produk               : chr  "NPK 15-15-15 SUB @50KG" "NPK 15-15-15 SUB @50KG" "NPK 15-15-15 SUB @50KG" "NPK 15-15-15 SUB @50KG" ...
##  $ PlantAsal            : chr  "PLANT GUDANG LINI 1 PEMASARAN" "PLANT GUDANG LINI 1 PEMASARAN" "PLANT GUDANG LINI 1 PEMASARAN" "PLANT GUDANG LINI 1 PEMASARAN" ...
##  $ PlantTujuan          : chr  "BANYUWANGI 1 - SINGOJURUH" "BANYUWANGI 1 - SINGOJURUH" "BANYUWANGI 1 - SINGOJURUH" "BANYUWANGI 1 - SINGOJURUH" ...
##  $ Qty.POSTO            : num  272500 272500 272500 272500 272500 ...
##  $ Ekspeditur           : chr  "SASA TANI TRANSPORT" "SASA TANI TRANSPORT" "SASA TANI TRANSPORT" "SASA TANI TRANSPORT" ...
##  $ ItemPO               : int  10 10 10 10 10 10 10 10 10 10 ...
##  $ KodeProduk.          : int  1000147 1000147 1000147 1000147 1000147 1000147 1000147 1000147 1000147 1000147 ...
##  $ UoM                  : chr  "TO" "TO" "TO" "TO" ...
##  $ DeliveryDate         : chr  "01/01/2019" "01/01/2019" "01/01/2019" "01/01/2019" ...
##  $ TotalDeliveryCost    : num  3.5e+07 3.5e+07 3.5e+07 3.5e+07 3.5e+07 ...
##  $ CurrencyDeliveryCost : chr  "IDR" "IDR" "IDR" "IDR" ...
##  $ KodePlantAsal        : chr  "B101" "B101" "B101" "B101" ...
##  $ KodeProvinsiAsal     : int  35 35 35 35 35 35 35 35 35 35 ...
##  $ ProvinsiAsal         : chr  "Jawa Timur" "Jawa Timur" "Jawa Timur" "Jawa Timur" ...
##  $ KodeKabupatenAsal    : int  3525 3525 3525 3525 3525 3525 3525 3525 3525 3525 ...
##  $ KabupatenAsal        : chr  "Kab. Gresik" "Kab. Gresik" "Kab. Gresik" "Kab. Gresik" ...
##  $ KodePlantTujuan      : chr  "B366" "B366" "B366" "B366" ...
##  $ KodeProvinsiTujuan   : int  35 35 35 35 35 35 35 35 35 35 ...
##  $ ProvinsiTujuan       : chr  "Jawa Timur" "Jawa Timur" "Jawa Timur" "Jawa Timur" ...
##  $ KodeKabupatenTujuan  : int  3510 3510 3510 3510 3510 3510 3510 3510 3510 3510 ...
##  $ KabupatenTujuan      : chr  "Kab. Banyuwangi" "Kab. Banyuwangi" "Kab. Banyuwangi" "Kab. Banyuwangi" ...
##  $ KodeEkspeditur       : num  1e+09 1e+09 1e+09 1e+09 1e+09 ...
##  $ KodeAlatAngkut       : chr  "T001" "T001" "T001" "T001" ...
##  $ RealisasiCost        : num  5140000 5140000 5140000 5140000 5140000 ...
##  $ CurrencyRealisasiCost: chr  "IDR" "IDR" "IDR" "IDR" ...
##  $ No.DO                : int  81256538 81256538 81256832 81256832 81256851 81256851 81256854 81256854 81258091 81258091 ...
##  $ ItemDO               : int  10 10 10 10 10 10 10 10 10 10 ...
##  $ KuantumDO            : num  40 40 40 40 40 40 40 40 32500 32500 ...
##  $ Tgl.DO               : chr  "03/01/2019" "03/01/2019" "04/01/2019" "04/01/2019" ...
##  $ Pengemudi            : chr  "YANI" "YANI" "SUKIRMAN" "SUKIRMAN" ...
##  $ AlatAngkut           : chr  "Truck" "Truck" "Truck" "Truck" ...
##  $ IDAlatAngkut         : chr  "P 9459 UW" "P 9459 UW" "P 8723 UV" "P 8723 UV" ...
##  $ ETA                  : chr  "03/01/2019" "03/01/2019" "05/01/2019" "05/01/2019" ...
##  $ MovementType         : chr  "641" "101" "641" "101" ...
##  $ DeskripsiMovementType: chr  "Goods Issue" "Goods Receipt" "Goods Issue" "Goods Receipt" ...
##  $ No.GI                : num  4.91e+09 4.91e+09 4.91e+09 4.91e+09 4.91e+09 ...
##  $ Tgl.GI               : chr  "03/01/2019" "03/01/2019" "04/01/2019" "04/01/2019" ...
##  $ KuantumGI            : num  40 40 40 40 40 40 40 40 32500 32500 ...
##  $ No.GR                : num  NA 5e+09 NA 5e+09 5e+09 ...
##  $ Tgl.GR               : chr  "" "05/01/2019" "" "07/01/2019" ...
##  $ KuantumGR            : num  0 40 0 40 40 0 40 0 32500 0 ...
##  $ PengemudiGR          : chr  "" "YANI" "" "SUKIRMAN" ...
##  $ AlatAngkutGR         : chr  "" "Truck" "" "Truck" ...
##  $ IDAlatAngkutGR       : chr  "" "P 9459 UW" "" "P 8723 UV" ...
##  $ No.GRBlockedStock    : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ Tgl.GRBlockedStock   : chr  "" "" "" "" ...
##  $ Kuan.GRBlockedStock  : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ No.ReturnGRDO        : logi  NA NA NA NA NA NA ...
##  $ Tgl.ReturnGRDO       : logi  NA NA NA NA NA NA ...
##  $ Kuan.ReturnGRDO      : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ No.GRSelisihLebih    : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ Tgl.GRSelisihLebih   : chr  "" "" "" "" ...
##  $ Kuan.GRSelisihLebih  : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ No.GIBlockedStock    : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ Tgl.GIBlockedStock   : chr  "" "" "" "" ...
##  $ Kuan.GIBlockedStock  : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ StatusPOSTO          : chr  "3 - Fully Received" "3 - Fully Received" "3 - Fully Received" "3 - Fully Received" ...
##  $ StatusDO             : chr  "6 - Completely Processed" "6 - Completely Processed" "6 - Completely Processed" "6 - Completely Processed" ...
##  $ POCreatedby          : chr  "B4120000S24" "B4120000S24" "B4120000S24" "B4120000S24" ...
##  $ DOCreatedby          : chr  "SYS_APG" "SYS_APG" "SYS_APG" "SYS_APG" ...
##  $ GICreatedby          : chr  "SYS_APG" "SYS_APG" "SYS_APG" "SYS_APG" ...
##  $ GRCreatedby          : chr  "" "SYS_APG" "" "SYS_APG" ...
##  $ GRBlockedCreatedby   : chr  "" "" "" "" ...
##  $ ReturnGRCreatedby    : logi  NA NA NA NA NA NA ...
##  $ GRLebihCreatedby     : chr  "" "" "" "" ...
##  $ GIBlockedCreatedby   : chr  "" "" "" "" ...
##  $ Keterangan           : chr  "" "" "" "" ...
head(anpro, n = 10)
anpro$Tgl.POSTO <- as.Date(anpro$Tgl.POSTO, format = "%d/%m/%Y")
anpro$DeliveryDate <- as.Date(anpro$DeliveryDate, format = "%d/%m/%Y")
anpro$Tgl.DO <- as.Date(anpro$Tgl.DO, format = "%d/%m/%Y")
anpro$ETA <- as.Date(anpro$ETA, format = "%d/%m/%Y")
anpro$Tgl.GI <- as.Date(anpro$Tgl.GI, format = "%d/%m/%Y")
anpro$Tgl.GR <- as.Date(anpro$Tgl.GR, format = "%d/%m/%Y")
anpro$Tgl.GRBlockedStock <- as.Date(anpro$Tgl.GRBlockedStock, format = "%d/%m/%Y")
anpro$Tgl.ReturnGRDO <- as.Date(anpro$Tgl.ReturnGRDO, format = "%d/%m/%Y")
anpro$Tgl.GRSelisihLebih <- as.Date(anpro$Tgl.GRSelisihLebih, format = "%d/%m/%Y")
anpro$Tgl.GIBlockedStock <- as.Date(anpro$Tgl.GIBlockedStock, format = "%d/%m/%Y")

2. Preprocessing Data

Seleksi Data

  • No.POSTO, Tgl.POSTO, Produk, PlantAsal, PlantTujuan, Qty.POSTO, Ekspeditur, ItemPO, KodeProduk., UoM, DeliveryDate, TotalDeliveryCost, ProvinsiAsal, KabupatenAsal, ProvinsiTujuan, KodeKabupatenTujuan, KabupatenTujuan, RealisasiCost

  • No.DO, ItemDO, KuantumDO, Tgl.DO, Pengemudi, AlatAngkut, ETA, MovementType

  • No.GI, Tgl.GI, KuantumGI

  • No.GR, Tgl.GR, KuantumGR

  • No.GRBlockedStock, Tgl.GRBlockedStock, Kuan.GRBlockedStock

  • No.ReturnGRDO, Tgl.ReturnGRDO, Kuan.ReturnGRDO

  • No.GRSelisihLebih, Tgl.GRSelisihLebih, Kuan.GRSelisihLebih

  • No.GIBlockedStock, Tgl.GIBlockedStock, Kuan.GIBlockedStock

  • StatusPOSTO, StatusDO

df.anpro <- anpro %>%
            select(No.POSTO, Tgl.POSTO, Produk, PlantAsal, PlantTujuan, Qty.POSTO,
                  Ekspeditur, ItemPO, KodeProduk., UoM, DeliveryDate, 
                  TotalDeliveryCost, ProvinsiAsal, KabupatenAsal, ProvinsiTujuan,
                  KodeKabupatenTujuan, KabupatenTujuan, RealisasiCost, No.DO,
                  ItemDO, KuantumDO, Tgl.DO, Pengemudi, AlatAngkut, ETA,
                  MovementType, No.GI, Tgl.GI, KuantumGI, No.GR, Tgl.GR,
                  KuantumGR, No.GRBlockedStock, Tgl.GRBlockedStock,
                  Kuan.GRBlockedStock, No.ReturnGRDO, Tgl.ReturnGRDO,
                  Kuan.ReturnGRDO, No.GRSelisihLebih, Tgl.GRSelisihLebih,
                  Kuan.GRSelisihLebih, No.GIBlockedStock, Tgl.GIBlockedStock,
                  Kuan.GIBlockedStock, StatusPOSTO, StatusDO)
head(df.anpro, n = 10)

3. Supply Chain Analytics

Descriptive

  • Visualisasi
  • Exploratory Data Analysis
  • Clustering (Data keterlambatan untuk Pengelompokan/grading Rekanan Transportir)

Predictive

  • Regresi (Jumlah armada >< Performa)
  • Korelasi
  • Classification (Performa Rekanan/terlambat atau tidak dengan dibandingkan grade transporter dan jumlah armada)

Prescriptive

  • Simulasi Jadwal Penerbitan POSTO
  • Information sharing dan aggregate planning
  • Penerapan standarisasi ketersediaan armada untuk Rekanan Transportir