1 . Latar Belakang dan Pemahaman Masalah

1.1 Latar Belakang

Perilaku Konsumen E-Commerce Secara Global

Memahami perilaku konsumen penting bagi bisnis karena ini memungkinkan mereka untuk lebih efektif memasarkan produk mereka dan menyesuaikan strategi mereka sesuai dengan kebutuhan dan preferensi target konsumen mereka. Perilaku konsumen merujuk pada tindakan dan keputusan yang diambil oleh individu dan keluarga saat mereka mempertimbangkan, membeli, menggunakan, dan membuang produk dan jasa.

Secara global, perilaku konsumen dapat sangat bervariasi karena faktor-faktor budaya, ekonomi, dan lainnya. Misalnya, konsumen di negara berkembang mungkin lebih menekankan pada harga dan praktisitas, sementara konsumen di negara maju mungkin lebih preokupasi dengan estetika dan prestise merek. Selain itu, tren ekonomi global dan peristiwa dapat mempengaruhi perilaku konsumen, seperti resesi yang menyebabkan penurunan pengeluaran atau peningkatan belanja online karena pandemi COVID-19.

Secara keseluruhan, penting bagi bisnis untuk memahami dan mempertimbangkan faktor-faktor spesifik yang dapat mempengaruhi perilaku konsumen di pasar global agar dapat dengan efektif mencapai dan menarik target konsumen mereka.

Perubahan Perilaku Pengguna Terhadap Internet Semenjak Pandemi Global di USA

Pandemi COVID-19 telah memiliki dampak signifikan pada perilaku konsumen dalam membeli produk di Amerika Serikat. Beberapa contoh dampak yang terlihat adalah:

  1. Peningkatan belanja online: Banyak orang yang lebih memilih untuk berbelanja online karena takut terinfeksi virus di toko fisik atau karena adanya pembatasan mobilitas.

  2. Perubahan kebiasaan belanja: Beberapa orang mungkin mulai membeli produk-produk yang sebelumnya tidak pernah mereka beli, seperti produk kebersihan atau makanan ringan, karena takut kekurangan di masa depan.

  3. Penurunan pengeluaran: Beberapa orang mungkin membatasi pengeluaran mereka karena merasa tidak yakin tentang keadaan ekonomi di masa depan.

  4. Peningkatan kepedulian terhadap produk yang aman dan bersih: Banyak orang yang lebih memperhatikan produk yang aman dan bersih untuk dikonsumsi atau digunakan, terutama produk yang dapat membantu mencegah penyebaran virus.

Secara keseluruhan, pandemi COVID-19 telah memiliki dampak yang signifikan pada perilaku konsumen dalam membeli produk di Amerika Serikat, dengan peningkatan belanja online, perubahan kebiasaan belanja, penurunan pengeluaran, dan peningkatan kepedulian terhadap produk yang aman dan bersih.

Respond Industri Terkait Perubahan Perilaku Konsumen dan Pandemi

Setelah pandemi COVID-19, beberapa tindakan umum yang dapat diambil oleh industri untuk menanggapi perubahan perilaku konsumen adalah:

  1. Menyesuaikan strategi pemasaran: Industri harus menyesuaikan strategi pemasaran mereka sesuai dengan perubahan kebiasaan belanja konsumen, seperti peningkatan belanja online.

  2. Menawarkan produk yang sesuai dengan kebutuhan baru konsumen: Industri harus memperhatikan produk-produk yang dibutuhkan konsumen setelah pandemi, seperti produk kebersihan atau perlengkapan rumah tangga untuk kerja di rumah.

  3. Menyesuaikan model bisnis: Industri harus menyesuaikan model bisnis mereka sesuai dengan perubahan kebiasaan belanja konsumen, seperti menawarkan layanan pengiriman yang lebih efisien atau menyediakan opsi kontakless payment.

  4. Menjaga kepercayaan konsumen: Industri harus mempertahankan kepercayaan konsumen dengan terus memberikan produk dan layanan yang berkualitas dan memenuhi kebutuhan konsumen.

  5. Menyesuaikan kebijakan pembatalan dan pengembalian: Industri harus menyesuaikan kebijakan pembatalan dan pengembalian sesuai dengan kebutuhan konsumen yang mungkin berubah setelah pandemi.

Secara keseluruhan, tindakan umum yang dapat diambil oleh industri untuk menanggapi perubahan perilaku konsumen setelah pandemi COVID-19 adalah menyesuaikan strategi pemasaran, menawarkan produk yang sesuai dengan kebutuhan baru konsumen, menyesuaikan model bisnis, menjaga kepercayaan konsumen, dan menyesuaikan kebijakan pembatalan dan pengembalian.

Pentingnya Optimisasi Persediaan untuk Industri

Pentingnya optimisasi persediaan untuk industri setelah pandemi COVID-19 juga terkait dengan perubahan perilaku konsumen setelah pandemi. Sebagai contoh, terdapat kemungkinan bahwa konsumen mungkin lebih memilih untuk berbelanja secara online daripada datang ke toko fisik setelah pandemi. Hal ini dapat menyebabkan perubahan dalam kebutuhan persediaan untuk toko-toko fisik dan pengiriman barang ke pelanggan secara online.

Selain itu, terdapat kemungkinan bahwa konsumen mungkin lebih memilih untuk membeli barang-barang yang dianggap penting atau esensial selama pandemi, seperti produk kebersihan atau produk makanan tahan lama. Hal ini dapat berdampak pada permintaan terhadap produk-produk tertentu yang harus dioptimalkan dalam persediaan industri. Oleh karena itu, penting bagi industri untuk memahami perubahan perilaku konsumen setelah pandemi dan menyesuaikan strategi optimisasi persediaannya sesuai dengan perubahan tersebut untuk memastikan kelangsungan bisnis yang sehat.

Apa yang Harusnya ADIDAS Lakukan

Sebagai perusahaan pakaian, sepatu olahraga, dan sepatu jalan, Adidas harus memprediksi jumlah unit yang terjual dengan tepat sebagai bagian dari strategi optimisasi persediaan mereka setelah pandemi COVID-19. Hal ini penting untuk memastikan bahwa perusahaan memiliki cukup stok barang untuk memenuhi permintaan pelanggan di semua lini produk yang ditawarkan.

Sebagai tambahan, Adidas juga harus mempertimbangkan perubahan perilaku konsumen di Amerika Serikat setelah pandemi COVID-19 dalam memprediksi jumlah unit yang terjual. Sebagai contoh, jika terdapat kecenderungan peningkatan permintaan terhadap produk pakaian yang bisa dikenakan di rumah selama pandemi, maka Adidas harus memastikan bahwa mereka memiliki cukup stok produk tersebut untuk memenuhi permintaan tersebut. Demikian juga, jika terdapat kecenderungan peningkatan permintaan terhadap sepatu jalan yang nyaman dan mudah dikenakan selama pandemi, maka Adidas harus memastikan bahwa mereka memiliki cukup stok sepatu tersebut untuk memenuhi permintaan tersebut.

Dengan mempertimbangkan perubahan perilaku konsumen di Amerika Serikat setelah pandemi COVID-19, Adidas dapat memprediksi jumlah unit yang terjual dengan lebih tepat dan menyesuaikan strategi optimisasi persediaan mereka sesuai dengan perubahan tersebut.

1.2 Business Impact Project

Optimisasi persediaan yang dilakukan dalam projek ini dapat memiliki dampak yang positif bagi perusahaan. Beberapa dampak positif tersebut antara lain:

  1. Meningkatkan efisiensi bisnis: Optimisasi persediaan dapat membantu mengurangi jumlah stok barang yang tidak terpakai atau kadaluarsa, sehingga dapat menghemat biaya bagi perusahaan.

  2. Meningkatkan kemampuan memenuhi kebutuhan pelanggan: Dengan memiliki cukup stok barang yang diinginkan pelanggan, perusahaan dapat memenuhi kebutuhan pelanggan dengan lebih baik dan meningkatkan kepuasan pelanggan.

  3. Menurunkan resiko kelangkaan barang: Optimisasi persediaan dapat membantu menentukan jumlah stok yang tepat untuk setiap barang, sehingga dapat mengurangi resiko terjadinya kelangkaan barang yang dapat menyebabkan kegagalan dalam memenuhi kebutuhan pelanggan.

  4. Meningkatkan keuntungan: Dengan mengoptimalkan persediaan, perusahaan dapat meningkatkan keuntungan dengan cara menghemat biaya dan meningkatkan penjualan.

1.3 Target Pengguna dan Manfaat

Optimisasi persediaan yang dilakukan dalam projek ini dapat memiliki dampak yang positif bagi pemangku kepentingan perusahaan. Beberapa pemangku kepentingan yang dapat terpengaruh oleh optimisasi persediaan antara lain:

  1. Pelanggan: Optimisasi persediaan dapat membantu meningkatkan kemampuan perusahaan untuk memenuhi kebutuhan pelanggan, sehingga dapat meningkatkan kepuasan pelanggan.

  2. Pemasok: Optimisasi persediaan dapat membantu meningkatkan efisiensi dalam pembelian bahan baku, sehingga dapat meningkatkan keuntungan pemasok dan mengurangi resiko terjadinya kelangkaan barang.

  3. Karyawan: Optimisasi persediaan dapat membantu meningkatkan efisiensi kerja karyawan dengan mengurangi waktu yang dihabiskan untuk mengelola stok barang yang tidak terpakai atau kadaluarsa.

  4. Pemegang saham: Optimisasi persediaan dapat meningkatkan keuntungan perusahaan, sehingga dapat memberikan nilai tambah bagi pemegang saham.

1.4 Implementasi Business Serupa

Industri yang paling mungkin terpengaruh oleh optimisasi persediaan adalah industri yang memiliki tingkat permintaan yang tinggi dan sangat dipengaruhi oleh faktor-faktor seperti musim, trend, dan peristiwa-peristiwa khusus. Sebagai contoh, industri pakaian, sepatu, dan aksesoris mungkin akan sangat terpengaruh oleh optimisasi persediaan, karena permintaan terhadap produk-produk tersebut dipengaruhi oleh faktor-faktor seperti musim, trend, dan peristiwa-peristiwa khusus seperti acara atau festival. Selain itu, industri makanan dan minuman juga mungkin terpengaruh oleh optimisasi persediaan, karena permintaan terhadap produk-produk tersebut dipengaruhi oleh faktor-faktor seperti musim, trend, dan peristiwa-peristiwa khusus seperti hari besar atau festival.

1.5 Tujuan dan Output Project

Project ini bertujuan untuk menghasilkan:

  • Pengolahan data unit penjualan.

  • Menemukan model machine learning yang sesuai.

  • Membangun dashboard visualisasi dengan fitur input output data.

2 . Data Collection (Pengumpulan Data)

2.1 Informasi Singkat Data

library(readxl)
adi <- read_excel("Adidas US Sales Datasets.xlsx")
head(adi)
## # A tibble: 6 × 13
##   ...1       Adida…¹ ...3  ...4  ...5  ...6  ...7  ...8  ...9  ...10 ...11 ...12
##   <chr>      <chr>   <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
## 1 <NA>       <NA>    <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA> 
## 2 <NA>       <NA>    <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA> 
## 3 Retailer   Retail… Invo… Regi… State City  Prod… Pric… Unit… Tota… Oper… Oper…
## 4 Foot Lock… 1185732 43831 Nort… New … New … Men'… 50    1200  6000… 3000… 0.5  
## 5 Foot Lock… 1185732 43832 Nort… New … New … Men'… 50    1000  5000… 1500… 0.3  
## 6 Foot Lock… 1185732 43833 Nort… New … New … Wome… 40    1000  4000… 1400… 0.35 
## # … with 1 more variable: ...13 <chr>, and abbreviated variable name
## #   ¹​`Adidas Sales Database`

Dataset terlihat belum rapi. Pada baris ketiga seharusnya menjadi nama kolom untuk tabel. Maka perlu mengganti nama kolom menggunakan baris ketiga dan menghapus tiga baris pertama. Kemudian tiap kolom dikoersikan sesuai dengan jenis datanya.

library(dplyr)
library(lubridate)

colnames(adi) <- adi[3,]

adi <- adi %>%
  slice(-(1:3))

adi <- adi %>% 
  mutate_at(vars(Retailer,
                 `Retailer ID`,
                 Region,
                 State,
                 City,
                 Product,
                 `Sales Method`
                 ), as.factor) %>% 
  mutate_at(vars(`Price per Unit`,
                 `Units Sold`,
                 `Total Sales`,
                 `Operating Profit`,
                 `Operating Margin`), as.numeric) %>% 
  mutate(`Invoice Date` = as.numeric(`Invoice Date`)) 
  
adi$`Invoice Date` <- as_date(adi$`Invoice Date`, origin ="1899-12-30" )

head(adi)
## # A tibble: 6 × 13
##   Retailer Retai…¹ Invoice …² Region State City  Product Price…³ Units…⁴ Total…⁵
##   <fct>    <fct>   <date>     <fct>  <fct> <fct> <fct>     <dbl>   <dbl>   <dbl>
## 1 Foot Lo… 1185732 2020-01-01 North… New … New … Men's …      50    1200  600000
## 2 Foot Lo… 1185732 2020-01-02 North… New … New … Men's …      50    1000  500000
## 3 Foot Lo… 1185732 2020-01-03 North… New … New … Women'…      40    1000  400000
## 4 Foot Lo… 1185732 2020-01-04 North… New … New … Women'…      45     850  382500
## 5 Foot Lo… 1185732 2020-01-05 North… New … New … Men's …      60     900  540000
## 6 Foot Lo… 1185732 2020-01-06 North… New … New … Women'…      50    1000  500000
## # … with 3 more variables: `Operating Profit` <dbl>, `Operating Margin` <dbl>,
## #   `Sales Method` <fct>, and abbreviated variable names ¹​`Retailer ID`,
## #   ²​`Invoice Date`, ³​`Price per Unit`, ⁴​`Units Sold`, ⁵​`Total Sales`

Dari dataset diketahui bahwa ada beberapa angka dataset yang tidak representatif. Dari hasil cek mandiri ditemukan bahwa ada beberapa data yang kelebihan 0 satu pada Total Sales dan Operating Profit. Oleh karena itu diperlukan perbaikan manual untuk memperbaiki nilai data.

adi <- adi %>% mutate(`Total Sales` = `Price per Unit`*`Units Sold`,
               `Operating Profit` = `Total Sales`*`Operating Margin`
               )
adi
## # A tibble: 9,648 × 13
##    Retai…¹ Retai…² Invoice …³ Region State City  Product Price…⁴ Units…⁵ Total…⁶
##    <fct>   <fct>   <date>     <fct>  <fct> <fct> <fct>     <dbl>   <dbl>   <dbl>
##  1 Foot L… 1185732 2020-01-01 North… New … New … Men's …      50    1200   60000
##  2 Foot L… 1185732 2020-01-02 North… New … New … Men's …      50    1000   50000
##  3 Foot L… 1185732 2020-01-03 North… New … New … Women'…      40    1000   40000
##  4 Foot L… 1185732 2020-01-04 North… New … New … Women'…      45     850   38250
##  5 Foot L… 1185732 2020-01-05 North… New … New … Men's …      60     900   54000
##  6 Foot L… 1185732 2020-01-06 North… New … New … Women'…      50    1000   50000
##  7 Foot L… 1185732 2020-01-07 North… New … New … Men's …      50    1250   62500
##  8 Foot L… 1185732 2020-01-08 North… New … New … Men's …      50     900   45000
##  9 Foot L… 1185732 2020-01-21 North… New … New … Women'…      40     950   38000
## 10 Foot L… 1185732 2020-01-22 North… New … New … Women'…      45     825   37125
## # … with 9,638 more rows, 3 more variables: `Operating Profit` <dbl>,
## #   `Operating Margin` <dbl>, `Sales Method` <fct>, and abbreviated variable
## #   names ¹​Retailer, ²​`Retailer ID`, ³​`Invoice Date`, ⁴​`Price per Unit`,
## #   ⁵​`Units Sold`, ⁶​`Total Sales`

Data sudah diperbaiki berikut penjelasan dari isi dari dataset.

glimpse(adi)
## Rows: 9,648
## Columns: 13
## $ Retailer           <fct> Foot Locker, Foot Locker, Foot Locker, Foot Locker,…
## $ `Retailer ID`      <fct> 1185732, 1185732, 1185732, 1185732, 1185732, 118573…
## $ `Invoice Date`     <date> 2020-01-01, 2020-01-02, 2020-01-03, 2020-01-04, 20…
## $ Region             <fct> Northeast, Northeast, Northeast, Northeast, Northea…
## $ State              <fct> New York, New York, New York, New York, New York, N…
## $ City               <fct> New York, New York, New York, New York, New York, N…
## $ Product            <fct> Men's Street Footwear, Men's Athletic Footwear, Wom…
## $ `Price per Unit`   <dbl> 50, 50, 40, 45, 60, 50, 50, 50, 40, 45, 60, 50, 50,…
## $ `Units Sold`       <dbl> 1200, 1000, 1000, 850, 900, 1000, 1250, 900, 950, 8…
## $ `Total Sales`      <dbl> 60000, 50000, 40000, 38250, 54000, 50000, 62500, 45…
## $ `Operating Profit` <dbl> 30000.00, 15000.00, 14000.00, 13387.50, 16200.00, 1…
## $ `Operating Margin` <dbl> 0.50, 0.30, 0.35, 0.35, 0.30, 0.25, 0.50, 0.30, 0.3…
## $ `Sales Method`     <fct> In-store, In-store, In-store, In-store, In-store, I…

Dataset berisi 13 variabel dengan penjelasan sebagai berikut:

  1. Retailer: toko yang menyetok barang Adidas.

  2. Retailer ID: nomor ID dari toko.

  3. Invoice Date: tanggal penjualan.

  4. Region: wilayah bagian Amerika.

  5. State: wilayah negara bagian Amerika.

  6. City: wilayah kota Amerika.

  7. Product: jenis produk yang dijual.

  8. Price per Unit: harga produk yang dijual.

  9. Units Sold: jumlah produk yang terjual.

  10. Total Sales: total jumlah penjualan dari harga produk dikali jumlah produk terjual.

  11. Operating Profit: total profit dari total penjualan.

  12. Operating Margin: total margin profit dari penjualan.

  13. Sales Method: metode penjualan berdasarkan jenis kanalnya.

2.2 Sumber datanya dan Teknik Pengumpulannya

Data yang akan digunakan bersumber dari Kaggle “Adidas Sales Dataset” https://www.kaggle.com/datasets/heemalichaudhari/adidas-sales-dataset. Data ini berasal dari data komersial tergolong bronze dan di update dengan sering.

2.3 Kesesuaian Data Dengan Kebutuhan Bisnis

Data yang digunakan sudah sesuai dengan kebutuhan bisnis karena isi dari data yang ada cukup lengkap menggambarkan kondisi data penjualan yang dilakukan dari tahun 2020-2022. Timeline dari produk terkategorik dan terurut rapi. Dalam optimisasi persediaan pengetahuan tentang kebutuhan permintaan produksi tercantum pada units sold dan waktu kapan penjualan pada Invoice Date.

3 . Product Design

3.1 Algoritma Machine Learning yang akan digunakan

GMM (Generalized Method of Moments) merupakan metode yang digunakan untuk mengestimasi parameter model dengan menggunakan momen yang dihitung dari data. Momen adalah nilai rata-rata dari produk antara observasi dengan sebuah fungsi dari parameter yang diestimasi. Metode ini dapat digunakan untuk mengestimasi parameter model yang tidak terbatas pada model linear saja, sehingga lebih umum digunakan daripada metode Ordinary Least Squares (OLS).

Salah satu kelemahan dari GMM adalah bahwa ia tidak dapat digunakan untuk model yang memiliki distribusi tidak normal. Selain itu, GMM juga memerlukan asumsi tentang distribusi error yang mungkin tidak terpenuhi dalam data yang sebenarnya.

GMM dan PGMM sering digunakan dalam penelitian ekonometrik untuk mengestimasi parameter model yang dianggap tepat untuk menjelaskan hubungan antara variabel yang diuji. GMM dan PGMM dapat digunakan dengan variabel yang bersifat numerik maupun kategorik. Namun, ada beberapa persyaratan yang harus dipenuhi untuk menggunakan GMM dan PGMM, di antaranya adalah exogeneity, yaitu asumsi bahwa error tidak terkorelasi dengan variabel independent.

3.2 Fitur Dashboard

  1. Input untuk menambahkan data baru. Harapannya pengguna dashboard yang adalah pemilik bisnis dapat melakukan input data mandiri menggunakan data milik mereka sendiri. Elemen ini bertujuan agar para pengguna dashboard mengerti struktur data yang dibutuhkan dan tahapan input data secara lengkap dan jelas untuk menghindari error pada output.

  2. Units Sold Forecast: Fitur untuk melihat prediksi kemungkinan penjualan produk pada periode tertentu yang bisa terkategorikan dalam wilayah tertentu.

  3. Highest Products Sold: Fitur untuk melihat jenis produk yang mendapatkan penjualan tertinggi pada periode tertentu dan wilayah tertentu. Bisa menggunakan basis data real atau forecast.

  4. Highest Products Profit: Fitur untuk melihat jenis produk yang mendapatkan profit tertinggi pada periode tertentu dan wilayah tertentu. Bisa menggunakan basis data real atau forecast.

4 Persiapan & Eksplorasi Data

4.1 Variabel Target/Prediktor

Variabel target yang dijadikan dalam projek ini adalah Units Sold. Projek ini akan memprediksi berapa banyak produk terjual dalam jangka waktu tertentu. Prediktor yang dipakai antara lain:

  1. sales: total penjualan per bulan untuk tiap item

  2. m_price: rata-rata harga produk terjual per bulan

  3. m_profit: rata-rata profit per produk terjual per bulan

  4. m_margin: rata-rata margin profit per produk per bulan

4.2 Memeriksa struktur data

summary(adi)
##           Retailer     Retailer ID    Invoice Date              Region    
##  Amazon       : 949   1128299:2370   Min.   :2020-01-01   Midwest  :1872  
##  Foot Locker  :2637   1185732:5265   1st Qu.:2021-02-17   Northeast:2376  
##  Kohl's       :1030   1189833: 360   Median :2021-06-04   South    :1728  
##  Sports Direct:2032   1197831:1653   Mean   :2021-05-10   Southeast:1224  
##  Walmart      : 626                  3rd Qu.:2021-09-16   West     :2448  
##  West Gear    :2374                  Max.   :2021-12-31                   
##                                                                           
##         State               City                           Product    
##  California: 432   Portland   : 360   Men's Apparel            :1606  
##  Texas     : 432   Charleston : 288   Men's Athletic Footwear  :1610  
##  Florida   : 360   Albuquerque: 216   Men's Street Footwear    :1610  
##  New York  : 360   Atlanta    : 216   Women's Apparel          :1608  
##  Alabama   : 216   Birmingham : 216   Women's Athletic Footwear:1606  
##  Arizona   : 216   Boise      : 216   Women's Street Footwear  :1608  
##  (Other)   :7632   (Other)    :8136                                   
##  Price per Unit     Units Sold      Total Sales    Operating Profit
##  Min.   :  7.00   Min.   :   0.0   Min.   :    0   Min.   :    0   
##  1st Qu.: 35.00   1st Qu.: 106.0   1st Qu.: 4065   1st Qu.: 1753   
##  Median : 45.00   Median : 176.0   Median : 7804   Median : 3263   
##  Mean   : 45.22   Mean   : 256.9   Mean   :12455   Mean   : 4895   
##  3rd Qu.: 55.00   3rd Qu.: 350.0   3rd Qu.:15864   3rd Qu.: 6192   
##  Max.   :110.00   Max.   :1275.0   Max.   :82500   Max.   :39000   
##                                                                    
##  Operating Margin   Sales Method 
##  Min.   :0.100    In-store:1740  
##  1st Qu.:0.350    Online  :4889  
##  Median :0.410    Outlet  :3019  
##  Mean   :0.423                   
##  3rd Qu.:0.490                   
##  Max.   :0.800                   
## 

Insight

  1. Data tanggal paling awal tanggal 2020-01-01 dan paling akhir tanggal 2021-12-31. Data ini adalah data penjualan selama 2 tahun dari 2020 hingga akhir 2021.

  2. Ada data penjualan sejumlah 0 pada Units Sold. Data ini tidak sebaiknya digunakan kemungkinan nanti akan dibuang.

  3. Data Operating Profit tertinggi senilai 39000 sedangkan rata-rata hanya 4895. Fenomena ini mirip dengan data Total Sales dengan nilai tertinggi 82500 sedangkan rata-rata 12455. Hal ini akan menjadi pertimbangan apakah perlu adanya treatment outlier atau tidak.

# membuang transaksi yang nilai unit jualnya adalah 0
adi <- adi[adi$`Units Sold` != 0,]
# Jumlah unit terkecil dan verifikasi apakah nilai 0 sudah terbuang
adi[adi$`Units Sold` == min(adi$`Units Sold`),]
## # A tibble: 1 × 13
##   Retailer Retai…¹ Invoice …² Region State City  Product Price…³ Units…⁴ Total…⁵
##   <fct>    <fct>   <date>     <fct>  <fct> <fct> <fct>     <dbl>   <dbl>   <dbl>
## 1 Foot Lo… 1185732 2021-06-12 Midwe… Nebr… Omaha Men's …      42       6     252
## # … with 3 more variables: `Operating Profit` <dbl>, `Operating Margin` <dbl>,
## #   `Sales Method` <fct>, and abbreviated variable names ¹​`Retailer ID`,
## #   ²​`Invoice Date`, ³​`Price per Unit`, ⁴​`Units Sold`, ⁵​`Total Sales`
# Cek Missing Value
adi %>% 
  is.na() %>% 
  colSums()
##         Retailer      Retailer ID     Invoice Date           Region 
##                0                0                0                0 
##            State             City          Product   Price per Unit 
##                0                0                0                0 
##       Units Sold      Total Sales Operating Profit Operating Margin 
##                0                0                0                0 
##     Sales Method 
##                0

Tidak ditemukan adanya missing value, maka bisa dilakukan proses selanjutnya.

# Nilai transaksi sales tertinggi
adi[adi$`Total Sales` == max(adi$`Total Sales`),]
## # A tibble: 2 × 13
##   Retailer Retai…¹ Invoice …² Region State City  Product Price…³ Units…⁴ Total…⁵
##   <fct>    <fct>   <date>     <fct>  <fct> <fct> <fct>     <dbl>   <dbl>   <dbl>
## 1 Walmart  1128299 2021-06-17 South… Flor… Orla… Women'…     110     750   82500
## 2 West Ge… 1128299 2021-06-17 South  Loui… New … Women'…     110     750   82500
## # … with 3 more variables: `Operating Profit` <dbl>, `Operating Margin` <dbl>,
## #   `Sales Method` <fct>, and abbreviated variable names ¹​`Retailer ID`,
## #   ²​`Invoice Date`, ³​`Price per Unit`, ⁴​`Units Sold`, ⁵​`Total Sales`
# Nilai transaski profit tertinggi
adi[adi$`Operating Profit` == max(adi$`Operating Profit`),]
## # A tibble: 1 × 13
##   Retailer Retai…¹ Invoice …² Region State City  Product Price…³ Units…⁴ Total…⁵
##   <fct>    <fct>   <date>     <fct>  <fct> <fct> <fct>     <dbl>   <dbl>   <dbl>
## 1 Walmart  1185732 2020-05-03 North… New … New … Men's …      65    1200   78000
## # … with 3 more variables: `Operating Profit` <dbl>, `Operating Margin` <dbl>,
## #   `Sales Method` <fct>, and abbreviated variable names ¹​`Retailer ID`,
## #   ²​`Invoice Date`, ³​`Price per Unit`, ⁴​`Units Sold`, ⁵​`Total Sales`
# Mengubah invoice date menjadi data per bulan

adi$`Invoice Date` <- ((floor_date(adi$`Invoice Date`, unit = "month")))

head(adi)
## # A tibble: 6 × 13
##   Retailer Retai…¹ Invoice …² Region State City  Product Price…³ Units…⁴ Total…⁵
##   <fct>    <fct>   <date>     <fct>  <fct> <fct> <fct>     <dbl>   <dbl>   <dbl>
## 1 Foot Lo… 1185732 2020-01-01 North… New … New … Men's …      50    1200   60000
## 2 Foot Lo… 1185732 2020-01-01 North… New … New … Men's …      50    1000   50000
## 3 Foot Lo… 1185732 2020-01-01 North… New … New … Women'…      40    1000   40000
## 4 Foot Lo… 1185732 2020-01-01 North… New … New … Women'…      45     850   38250
## 5 Foot Lo… 1185732 2020-01-01 North… New … New … Men's …      60     900   54000
## 6 Foot Lo… 1185732 2020-01-01 North… New … New … Women'…      50    1000   50000
## # … with 3 more variables: `Operating Profit` <dbl>, `Operating Margin` <dbl>,
## #   `Sales Method` <fct>, and abbreviated variable names ¹​`Retailer ID`,
## #   ²​`Invoice Date`, ³​`Price per Unit`, ⁴​`Units Sold`, ⁵​`Total Sales`

Data di-round up ke bulanan untuk melakukan prediksi menggunakan metode GMM (Generalized Method of Moments). Ini berarti bahwa data akan dibulatkan menjadi nilai bulanan (misalnya, tanggal 7 Januari akan dibulatkan menjadi 1 Januari) sebelum dilakukan prediksi menggunakan metode GMM. Tujuannya adalah untuk menyederhanakan data sebelum melakukan prediksi, karena GMM dapat menjadi rumit jika data yang dimasukkan terlalu banyak atau terlalu detil.

state <- adi %>%
  
  group_by(date = `Invoice Date`, area = State, product = Product) %>% 
  
  summarise(unit_sold = sum(`Units Sold`))
            
state$date <- ymd(state$date)

state
## # A tibble: 3,030 × 4
## # Groups:   date, area [509]
##    date       area     product                   unit_sold
##    <date>     <fct>    <fct>                         <dbl>
##  1 2020-01-01 Nevada   Men's Apparel                  1644
##  2 2020-01-01 Nevada   Men's Athletic Footwear        2534
##  3 2020-01-01 Nevada   Men's Street Footwear          3482
##  4 2020-01-01 Nevada   Women's Apparel                3307
##  5 2020-01-01 Nevada   Women's Athletic Footwear      1871
##  6 2020-01-01 Nevada   Women's Street Footwear        2604
##  7 2020-01-01 New York Men's Apparel                  4258
##  8 2020-01-01 New York Men's Athletic Footwear        4555
##  9 2020-01-01 New York Men's Street Footwear          7707
## 10 2020-01-01 New York Women's Apparel                4741
## # … with 3,020 more rows
state_rank <- state %>%
  
  group_by(area) %>% 
  
  summarise(unit_sold = sum(unit_sold)) %>% 
  
  arrange(desc(unit_sold))

head(state_rank, 10)
## # A tibble: 10 × 2
##    area           unit_sold
##    <fct>              <dbl>
##  1 New York          169140
##  2 California        163284
##  3 Texas             159500
##  4 Florida           133430
##  5 South Carolina     72610
##  6 Tennessee          66077
##  7 Idaho              63827
##  8 Alabama            63327
##  9 North Carolina     62936
## 10 Louisiana          57615
month_rank <- state %>%
  
  group_by(date) %>% 
  
  summarise(unit_sold = sum(unit_sold)) %>% 
  
  arrange(desc(unit_sold))

head(month_rank, 10)
## # A tibble: 10 × 2
##    date       unit_sold
##    <date>         <dbl>
##  1 2021-08-01    195414
##  2 2021-09-01    182425
##  3 2021-07-01    180481
##  4 2021-01-01    179299
##  5 2021-05-01    178900
##  6 2021-12-01    171246
##  7 2021-06-01    164745
##  8 2021-04-01    161717
##  9 2021-02-01    156113
## 10 2021-10-01    152834

4.2.1 Memeriksa Struktur Melalui Plotting

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.2.2
plot_sales_by_area <- function(start, end) {
  state %>% 
  filter(area %in% sort(unique(state$area))[start:end]) %>%
ggplot( aes(x = date, y = unit_sold, fill = product)) + 
  geom_bar(stat = "identity", position = "stack") + 
  facet_wrap(~area) + 
  scale_x_date(limits = as.Date(c("2019-12-15", "2022-01-01")), date_breaks = "1 month", date_labels = "%b %Y") +
  scale_y_continuous(limits = c(0, 42000)) +  
  ggtitle("Units Sold per Month per States per Product") +
  theme(axis.title.x = element_blank(),
        axis.title.y = element_blank(),
        axis.text.x = element_text(angle = 90, size =5),
        legend.position="none")
}

plot_sales_by_area(1, 4)

plot_sales_by_area(5, 8)

plot_sales_by_area(9, 12)

plot_sales_by_area(13, 16)

plot_sales_by_area(17, 20)

plot_sales_by_area(21, 24)

plot_sales_by_area(25, 28)

plot_sales_by_area(29, 32)

plot_sales_by_area(33, 36)

plot_sales_by_area(37, 40)

plot_sales_by_area(41, 44)

plot_sales_by_area(45, 48)

plot_sales_by_area(49, 50)

Insight

  • data untuk tahun 2020 banyak region yang tidak melakukan penjualan dikarenakan covid
  • wilayah dengan penjualan terbaik juga mengalami kesulitan penjualan pada bulan-bulan tertentu
region <- adi %>%
  
  group_by(date = `Invoice Date`, area = Region, product = Product) %>% 
  
  summarise(unit_sold = sum(`Units Sold`))
            
region$date <- ymd(region$date)

region
## # A tibble: 531 × 4
## # Groups:   date, area [89]
##    date       area      product                   unit_sold
##    <date>     <fct>     <fct>                         <dbl>
##  1 2020-01-01 Northeast Men's Apparel                  4258
##  2 2020-01-01 Northeast Men's Athletic Footwear        5257
##  3 2020-01-01 Northeast Men's Street Footwear          8437
##  4 2020-01-01 Northeast Women's Apparel                5182
##  5 2020-01-01 Northeast Women's Athletic Footwear      4390
##  6 2020-01-01 Northeast Women's Street Footwear        5367
##  7 2020-01-01 West      Men's Apparel                  1644
##  8 2020-01-01 West      Men's Athletic Footwear        2534
##  9 2020-01-01 West      Men's Street Footwear          3482
## 10 2020-01-01 West      Women's Apparel                3307
## # … with 521 more rows
region %>% 
  filter(area %in% sort(unique(region$area))) %>%
ggplot( aes(x = date, y = unit_sold, fill = product)) + 
  geom_bar(stat = "identity", position = "stack") + 
  facet_wrap(~area) + 
  scale_x_date(limits = as.Date(c("2019-12-15", "2022-01-01")), date_breaks = "1 month", date_labels = "%b %Y") +
  ggtitle("Units Sold per Month per Region per Product") +
  theme(axis.title.x = element_blank(),
        axis.title.y = element_blank(),
        axis.text.x = element_text(angle = 90, size =5),
        legend.position="none")

4.3 Melakukan Data Preprocessing

adi <- adi %>%
  
  #menggrupkan data menjadi `date` per bulan dan `product` dengan jenisnya
  group_by(date = `Invoice Date`, product = Product) %>% 
  
  #membuat nilai total dengan kolom baru
  summarise(sales = sum(`Total Sales`), 
            profit = sum(`Operating Profit`), 
            unit = sum(`Units Sold`)
            
            ) %>% 
  
  #membuat nilai rata-rata untuk harga, profit, dan margin
  mutate(m_price = sales/unit,
         m_profit = profit/unit,
         m_margin = profit/sales
         )

#mengubah date menjadi factor
adi$date <- as.factor(adi$date)

adi
## # A tibble: 144 × 8
## # Groups:   date [24]
##    date       product                 sales profit  unit m_price m_pro…¹ m_mar…²
##    <fct>      <fct>                   <dbl>  <dbl> <dbl>   <dbl>   <dbl>   <dbl>
##  1 2020-01-01 Men's Apparel          326362 1.30e5  5902    55.3    22.0   0.398
##  2 2020-01-01 Men's Athletic Footwe… 377583 1.19e5  7791    48.5    15.2   0.314
##  3 2020-01-01 Men's Street Footwear  544120 2.69e5 11919    45.7    22.6   0.495
##  4 2020-01-01 Women's Apparel        437588 1.17e5  8489    51.5    13.7   0.267
##  5 2020-01-01 Women's Athletic Foot… 282431 1.08e5  6261    45.1    17.3   0.384
##  6 2020-01-01 Women's Street Footwe… 344662 1.41e5  7971    43.2    17.7   0.409
##  7 2020-02-01 Men's Apparel          326016 1.50e5  5400    60.4    27.8   0.460
##  8 2020-02-01 Men's Athletic Footwe… 438053 1.26e5  7694    56.9    16.4   0.288
##  9 2020-02-01 Men's Street Footwear  410476 1.85e5  7205    57.0    25.7   0.450
## 10 2020-02-01 Women's Apparel        302611 7.43e4  4641    65.2    16.0   0.245
## # … with 134 more rows, and abbreviated variable names ¹​m_profit, ²​m_margin

Pertama, data di-group menjadi bulan berdasarkan tanggal (Invoice Date) dan produk (Product). Kemudian, nilai total penjualan (Total Sales), keuntungan operasional (Operating Profit), dan unit yang terjual (Units Sold) dihitung dengan menggunakan fungsi summarise(). Selanjutnya, nilai rata-rata harga, keuntungan, dan margin dihitung dengan menggunakan fungsi mutate(). Terakhir, tanggal diubah menjadi factor dengan menggunakan fungsi as.factor().

Tujuannya agar data menjadi terurut dan seusai dengan waktunya sehingga dapat dibentuk panel data frame dengan waktu yang terurut.

Menyesuaikan Varians

Salah satu langkah penting dalam melakukan prediksi menggunakan metode GMM (Generalized Method of Moments) adalah mengecek varian dari setiap variabel yang akan digunakan. Hal ini penting karena GMM mengasumsikan bahwa setiap variabel yang digunakan memiliki varian yang sama. Jika varian dari variabel tersebut tidak sama, maka hasil prediksi dari GMM mungkin tidak akurat. Oleh karena itu, perlu dilakukan perubahan pada nilai varian dari setiap variabel agar sesuai dengan asumsi yang ditentukan oleh GMM.

melakukan pengecekkan variansi untuk menyeimbangkan momen

var(adi$sales)
## [1] 355465805451
var(adi$profit)
## [1] 62535822435
var(adi$unit)
## [1] 149032173
var(adi$m_price)
## [1] 77.80524
var(adi$m_profit)
## [1] 16.37763
var(adi$m_margin)
## [1] 0.003298823

mengukur variansi yang tepat agar momen tidak terlalu jauh

var(adi$sales/100000)
## [1] 35.54658
var(adi$profit/100000)
## [1] 6.253582
var(adi$unit/10000)
## [1] 1.490322
var(adi$m_price/1)
## [1] 77.80524
var(adi$m_profit/1)
## [1] 16.37763
var(adi$m_margin*100)
## [1] 32.98823

memasukkan nilai variansi yang disesuaikan kedalam data frame

adi$sales <- (adi$sales/100000)
adi$profit <- (adi$profit/100000)
adi$unit <- (adi$unit/10000)
adi$m_price <- (adi$m_price/1)
adi$m_profit <- (adi$m_profit/1)
adi$m_margin <- (adi$m_margin*100)

head(adi)
## # A tibble: 6 × 8
## # Groups:   date [1]
##   date       product                  sales profit  unit m_price m_pro…¹ m_mar…²
##   <fct>      <fct>                    <dbl>  <dbl> <dbl>   <dbl>   <dbl>   <dbl>
## 1 2020-01-01 Men's Apparel             3.26   1.30 0.590    55.3    22.0    39.8
## 2 2020-01-01 Men's Athletic Footwear   3.78   1.19 0.779    48.5    15.2    31.4
## 3 2020-01-01 Men's Street Footwear     5.44   2.69 1.19     45.7    22.6    49.5
## 4 2020-01-01 Women's Apparel           4.38   1.17 0.849    51.5    13.7    26.7
## 5 2020-01-01 Women's Athletic Footwe…  2.82   1.08 0.626    45.1    17.3    38.4
## 6 2020-01-01 Women's Street Footwear   3.45   1.41 0.797    43.2    17.7    40.9
## # … with abbreviated variable names ¹​m_profit, ²​m_margin

Setelah data sudah dibuat maka bisa dimasukkan langsung kedalam panel dataframe. Variabel yang digunakan adalah product dan date.

library(plm)
#membuat panel data frame
adi_p <- pdata.frame(x = adi, index = c("product","date"))
head(adi_p)
##                                date       product   sales    profit   unit
## Men's Apparel-2020-01-01 2020-01-01 Men's Apparel 3.26362 1.3001730 0.5902
## Men's Apparel-2020-02-01 2020-02-01 Men's Apparel 3.26016 1.5011609 0.5400
## Men's Apparel-2020-03-01 2020-03-01 Men's Apparel 3.08592 1.3029815 0.5320
## Men's Apparel-2020-04-01 2020-04-01 Men's Apparel 5.02349 2.1468625 0.8258
## Men's Apparel-2020-05-01 2020-05-01 Men's Apparel 3.91951 1.6601218 0.6064
## Men's Apparel-2020-06-01 2020-06-01 Men's Apparel 1.04088 0.2904822 0.1499
##                           m_price m_profit m_margin
## Men's Apparel-2020-01-01 55.29685 22.02936 39.83837
## Men's Apparel-2020-02-01 60.37333 27.79928 46.04562
## Men's Apparel-2020-03-01 58.00602 24.49213 42.22344
## Men's Apparel-2020-04-01 60.83180 25.99737 42.73647
## Men's Apparel-2020-05-01 64.63572 27.37668 42.35534
## Men's Apparel-2020-06-01 69.43829 19.37840 27.90737

5 . Membuat Model GMM

#membuat rumus GMM
adi_gmm <- pgmm(unit ~   sales   + m_price + m_profit + m_margin | lag(unit, 2:24),
               data = adi_p, effect = "individual" , model = "onestep",
               transformation = "d")

summary(adi_gmm)
## Oneway (individual) effect One-step model Difference GMM 
## 
## Call:
## pgmm(formula = unit ~ sales + m_price + m_profit + m_margin | 
##     lag(unit, 2:24), data = adi_p, effect = "individual", model = "onestep", 
##     transformation = "d")
## 
## Balanced Panel: n = 6, T = 24, N = 144
## 
## Number of Observations Used: 132
## Residuals:
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## -0.432239 -0.094458 -0.013724 -0.009119  0.068604  0.617895 
## 
## Coefficients:
##            Estimate Std. Error z-value  Pr(>|z|)    
## sales     0.1926150  0.0037361 51.5556 < 2.2e-16 ***
## m_price   0.0521614  0.0137067  3.8055 0.0001415 ***
## m_profit -0.2421457  0.0399733 -6.0577 1.381e-09 ***
## m_margin  0.1262415  0.0219191  5.7594 8.440e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Sargan test: chisq(253) = 6 (p-value = 1)
## Autocorrelation test (1): normal = -1.635512 (p-value = 0.10194)
## Autocorrelation test (2): normal = -0.6735997 (p-value = 0.50057)
## Wald test for coefficients: chisq(4) = 36491.62 (p-value = < 2.22e-16)

Ringkasan di atas merupakan hasil dari analisis panel data menggunakan metode GMM (Generalized Method of Moments). Analisis ini menggunakan model satu tahap (one-step model) dengan efek individu (individual effect) dan transformasi first differences (d).

Model yang digunakan adalah unit ~ sales + m_price + m_profit + m_margin, yang berarti bahwa variabel unit diprediksi berdasarkan variabel sales, m_price, m_profit, dan m_margin. Data panel yang digunakan adalah data adi_p yang terdiri dari 6 individu (n = 6) dengan 24 periode waktu (T = 24) dan total 144 observasi (N = 144).

Dari ringkasan di atas, kita dapat melihat bahwa semua koefisien yang diestimasi oleh model GMM signifikan, dengan nilai p-value yang sangat kecil. Hal ini menunjukkan bahwa semua variabel yang tercantum dalam model memiliki pengaruh yang signifikan terhadap variabel unit. Koefisien dari variabel sales, m_price, m_profit, dan m_margin masing-masing bernilai 0.1926150, 0.0521614, -0.2421457, dan 0.1262415. Nilai standar error yang tercantum untuk setiap koefisien menunjukkan tingkat ketidakpastian dari estimasi tersebut.

Sedangkan untuk uji Sargan, nilai p-value-nya sebesar 1, yang berarti asumsi yang dibuat oleh model GMM terkait kebiasaan dari error yang dianggap homoskedastik dan tidak terautokorelasi valid. Namun demikian, nilai p-value dari uji autokorelasi adalah 0.10194 dan 0.50057, yang berarti terdapat kemungkinan autokorelasi pada error. Sebaiknya dilakukan uji lanjutan untuk memastikan validitas asumsi yang dibuat oleh model GMM.