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:
Peningkatan belanja online: Banyak orang yang lebih memilih untuk berbelanja online karena takut terinfeksi virus di toko fisik atau karena adanya pembatasan mobilitas.
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.
Penurunan pengeluaran: Beberapa orang mungkin membatasi pengeluaran mereka karena merasa tidak yakin tentang keadaan ekonomi di masa depan.
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:
Menyesuaikan strategi pemasaran: Industri harus menyesuaikan strategi pemasaran mereka sesuai dengan perubahan kebiasaan belanja konsumen, seperti peningkatan belanja online.
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.
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.
Menjaga kepercayaan konsumen: Industri harus mempertahankan kepercayaan konsumen dengan terus memberikan produk dan layanan yang berkualitas dan memenuhi kebutuhan konsumen.
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.
Optimisasi persediaan yang dilakukan dalam projek ini dapat memiliki dampak yang positif bagi perusahaan. Beberapa dampak positif tersebut antara lain:
Meningkatkan efisiensi bisnis: Optimisasi persediaan dapat membantu mengurangi jumlah stok barang yang tidak terpakai atau kadaluarsa, sehingga dapat menghemat biaya bagi perusahaan.
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.
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.
Meningkatkan keuntungan: Dengan mengoptimalkan persediaan, perusahaan dapat meningkatkan keuntungan dengan cara menghemat biaya dan meningkatkan penjualan.
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:
Pelanggan: Optimisasi persediaan dapat membantu meningkatkan kemampuan perusahaan untuk memenuhi kebutuhan pelanggan, sehingga dapat meningkatkan kepuasan pelanggan.
Pemasok: Optimisasi persediaan dapat membantu meningkatkan efisiensi dalam pembelian bahan baku, sehingga dapat meningkatkan keuntungan pemasok dan mengurangi resiko terjadinya kelangkaan barang.
Karyawan: Optimisasi persediaan dapat membantu meningkatkan efisiensi kerja karyawan dengan mengurangi waktu yang dihabiskan untuk mengelola stok barang yang tidak terpakai atau kadaluarsa.
Pemegang saham: Optimisasi persediaan dapat meningkatkan keuntungan perusahaan, sehingga dapat memberikan nilai tambah bagi pemegang saham.
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.
Project ini bertujuan untuk menghasilkan:
Pengolahan data unit penjualan.
Menemukan model machine learning yang sesuai.
Membangun dashboard visualisasi dengan fitur input output 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:
Retailer: toko yang menyetok barang Adidas.
Retailer ID: nomor ID dari toko.
Invoice Date: tanggal penjualan.
Region: wilayah bagian Amerika.
State: wilayah negara bagian Amerika.
City: wilayah kota Amerika.
Product: jenis produk yang dijual.
Price per Unit: harga produk yang dijual.
Units Sold: jumlah produk yang terjual.
Total Sales: total jumlah penjualan dari harga
produk dikali jumlah produk terjual.
Operating Profit: total profit dari total
penjualan.
Operating Margin: total margin profit dari
penjualan.
Sales Method: metode penjualan berdasarkan jenis
kanalnya.
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.
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.
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.
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.
Units Sold Forecast: Fitur untuk melihat prediksi kemungkinan penjualan produk pada periode tertentu yang bisa terkategorikan dalam wilayah tertentu.
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.
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.
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:
sales: total penjualan per bulan untuk tiap item
m_price: rata-rata harga produk terjual per bulan
m_profit: rata-rata profit per produk terjual per bulan
m_margin: rata-rata margin profit per produk per bulan
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
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.
Ada data penjualan sejumlah 0 pada Units Sold. Data
ini tidak sebaiknya digunakan kemungkinan nanti akan dibuang.
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
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
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")
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
#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.