Analisis Data Ritel pada PT. XYZ

Profil Perusahaan

  • PT XYZ Tbk didirikan pada bulan November 2013. Sesuai dengan Anggaran Dasar Perusahaan, ruang lingkup kegiatan Perseroan antara lain bergerak dalam bidang perdagangan umum yaitu perdagangan toserba atau minimart (Ezy Mart).

  • Konsep Ezy Mart diciptakan untuk menyesuaikan perubahan belanja konsumen dari belanja bulanan menjadi belanja mingguan/harian.

  • Dinamika bisnis ritel terus mengalami perkembangan seiring dengan pertumbuhan segmen middle market. Oleh karena itu, Perseroan perlu melakukan analisis data terkait perkembangan penjualan selama tahun 2014 – 2017, yang bertujuan untuk meningkatkan profit dan rencana pengembangan usaha.

Tahap Persiapan

Dataset dalam format CSV, maka perlu dilakukan pembacaan (import) ke dalam R dan di olah, agar lebih mudah untuk di analisis.

1. Data Penjualan

- format awal                 = 'CSV'
- nama file                   = 'xyz.csv'
- nama object                 = 'xyz'
- fungsi di R     
    - membaca data/import     = `read.csv()`
    - menampilkan data        = 'head()' atau 'tail()'
xyz <- read.csv("data_input/retail.csv")
head(xyz, 3)
#>   Row.ID       Order.ID Order.Date Ship.Date    Ship.Mode Customer.ID   Segment
#> 1      1 CA-2016-152156    11/8/16  11/11/16 Second Class    CG-12520  Consumer
#> 2      2 CA-2016-152156    11/8/16  11/11/16 Second Class    CG-12520  Consumer
#> 3      3 CA-2016-138688    6/12/16   6/16/16 Second Class    DV-13045 Corporate
#>        Product.ID        Category Sub.Category
#> 1 FUR-BO-10001798       Furniture    Bookcases
#> 2 FUR-CH-10000454       Furniture       Chairs
#> 3 OFF-LA-10000240 Office Supplies       Labels
#>                                                  Product.Name  Sales Quantity
#> 1                           Bush Somerset Collection Bookcase 261.96        2
#> 2 Hon Deluxe Fabric Upholstered Stacking Chairs, Rounded Back 731.94        3
#> 3   Self-Adhesive Address Labels for Typewriters by Universal  14.62        2
#>   Discount   Profit
#> 1        0  41.9136
#> 2        0 219.5820
#> 3        0   6.8714

2. Cek tipe data

Tahapan ini perlu dilakukan pengecekan tipe data agar pengolahan datanya lebih mudah, efektif dan cepat. Dalam R ada beberapa fungsi untuk melakukan cek tipe data.

2.1. Opsi A

Salah satu fungsi untuk mengecek tipe data, sebagai berikut:

- fungsi di R     
    - cek tipe data     = `str()`
str(xyz)
#> 'data.frame':    9994 obs. of  15 variables:
#>  $ Row.ID      : int  1 2 3 4 5 6 7 8 9 10 ...
#>  $ Order.ID    : chr  "CA-2016-152156" "CA-2016-152156" "CA-2016-138688" "US-2015-108966" ...
#>  $ Order.Date  : chr  "11/8/16" "11/8/16" "6/12/16" "10/11/15" ...
#>  $ Ship.Date   : chr  "11/11/16" "11/11/16" "6/16/16" "10/18/15" ...
#>  $ Ship.Mode   : chr  "Second Class" "Second Class" "Second Class" "Standard Class" ...
#>  $ Customer.ID : chr  "CG-12520" "CG-12520" "DV-13045" "SO-20335" ...
#>  $ Segment     : chr  "Consumer" "Consumer" "Corporate" "Consumer" ...
#>  $ Product.ID  : chr  "FUR-BO-10001798" "FUR-CH-10000454" "OFF-LA-10000240" "FUR-TA-10000577" ...
#>  $ Category    : chr  "Furniture" "Furniture" "Office Supplies" "Furniture" ...
#>  $ Sub.Category: chr  "Bookcases" "Chairs" "Labels" "Tables" ...
#>  $ Product.Name: chr  "Bush Somerset Collection Bookcase" "Hon Deluxe Fabric Upholstered Stacking Chairs, Rounded Back" "Self-Adhesive Address Labels for Typewriters by Universal" "Bretford CR4500 Series Slim Rectangular Table" ...
#>  $ Sales       : num  262 731.9 14.6 957.6 22.4 ...
#>  $ Quantity    : int  2 3 2 5 2 7 4 6 3 5 ...
#>  $ Discount    : num  0 0 0 0.45 0.2 0 0 0.2 0.2 0 ...
#>  $ Profit      : num  41.91 219.58 6.87 -383.03 2.52 ...

2.2. Opsi B

Terdapat fungsi lain untuk mengecek tipe data, namun perlu menginstal library, seperti dibawah ini:

- library               = 'dplyr'
- fungsi di R     
    - cek tipe data     = `glimpse()`
library(dplyr)
glimpse(xyz)
#> Rows: 9,994
#> Columns: 15
#> $ Row.ID       <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17…
#> $ Order.ID     <chr> "CA-2016-152156", "CA-2016-152156", "CA-2016-138688", "US…
#> $ Order.Date   <chr> "11/8/16", "11/8/16", "6/12/16", "10/11/15", "10/11/15", …
#> $ Ship.Date    <chr> "11/11/16", "11/11/16", "6/16/16", "10/18/15", "10/18/15"…
#> $ Ship.Mode    <chr> "Second Class", "Second Class", "Second Class", "Standard…
#> $ Customer.ID  <chr> "CG-12520", "CG-12520", "DV-13045", "SO-20335", "SO-20335…
#> $ Segment      <chr> "Consumer", "Consumer", "Corporate", "Consumer", "Consume…
#> $ Product.ID   <chr> "FUR-BO-10001798", "FUR-CH-10000454", "OFF-LA-10000240", …
#> $ Category     <chr> "Furniture", "Furniture", "Office Supplies", "Furniture",…
#> $ Sub.Category <chr> "Bookcases", "Chairs", "Labels", "Tables", "Storage", "Fu…
#> $ Product.Name <chr> "Bush Somerset Collection Bookcase", "Hon Deluxe Fabric U…
#> $ Sales        <dbl> 261.9600, 731.9400, 14.6200, 957.5775, 22.3680, 48.8600, …
#> $ Quantity     <int> 2, 3, 2, 5, 2, 7, 4, 6, 3, 5, 9, 4, 3, 3, 5, 3, 6, 2, 2, …
#> $ Discount     <dbl> 0.00, 0.00, 0.00, 0.45, 0.20, 0.00, 0.00, 0.20, 0.20, 0.0…
#> $ Profit       <dbl> 41.9136, 219.5820, 6.8714, -383.0310, 2.5164, 14.1694, 1.…

3. Ubah & Cek tipe data

Setelah dilakukan pengecekan tipe data, kolom/field yang perlu diubah tipe datanya ke dalam DATE dan FACTOR yaitu:

  1. Order.Date, Ship.Date –> semula CHR diubah menjadi DATE
  2. Ship.Mode, Segment, Category, Sub.Category –> semula CHR diubah menjadi FACTOR

3.1. Ubah menjadi DATE

Untuk merubah data dari CHR ke DATE menggunakan fungsi sebagai berikut:

- fungsi di R     
    - ubah tipe data DATE     = `as.Date()`
# mengubah tipe data chr menjadi date
xyz$Ship.Date <- as.Date(xyz$Ship.Date, format = "%m/%d/%y")
xyz$Order.Date <- as.Date(xyz$Order.Date, format = "%m/%d/%y")

3.2. Ubah menjadi FACTOR

Untuk merubah data dari CHR ke FACTOR menggunakan fungsi sebagai berikut:

- fungsi di R     
    - ubah tipe data FACTOR   = `as.factor()`
# mengubah tipe data chr menjadi factor
xyz$Ship.Mode <- as.factor(xyz$Ship.Mode)
xyz$Segment <- as.factor(xyz$Segment)
xyz$Category <- as.factor(xyz$Category)
xyz$Sub.Category <- as.factor(xyz$Sub.Category)

3.3. Cek tipe data

Setelah dilakukan perubahan tipe data, maka perlu dicek kembali tipe datanya, apakah sudah sesuai yang diharapkan

str(xyz)
#> 'data.frame':    9994 obs. of  15 variables:
#>  $ Row.ID      : int  1 2 3 4 5 6 7 8 9 10 ...
#>  $ Order.ID    : chr  "CA-2016-152156" "CA-2016-152156" "CA-2016-138688" "US-2015-108966" ...
#>  $ Order.Date  : Date, format: "2016-11-08" "2016-11-08" ...
#>  $ Ship.Date   : Date, format: "2016-11-11" "2016-11-11" ...
#>  $ Ship.Mode   : Factor w/ 4 levels "First Class",..: 3 3 3 4 4 4 4 4 4 4 ...
#>  $ Customer.ID : chr  "CG-12520" "CG-12520" "DV-13045" "SO-20335" ...
#>  $ Segment     : Factor w/ 3 levels "Consumer","Corporate",..: 1 1 2 1 1 1 1 1 1 1 ...
#>  $ Product.ID  : chr  "FUR-BO-10001798" "FUR-CH-10000454" "OFF-LA-10000240" "FUR-TA-10000577" ...
#>  $ Category    : Factor w/ 3 levels "Furniture","Office Supplies",..: 1 1 2 1 2 1 2 3 2 2 ...
#>  $ Sub.Category: Factor w/ 17 levels "Accessories",..: 5 6 11 17 15 10 3 14 4 2 ...
#>  $ Product.Name: chr  "Bush Somerset Collection Bookcase" "Hon Deluxe Fabric Upholstered Stacking Chairs, Rounded Back" "Self-Adhesive Address Labels for Typewriters by Universal" "Bretford CR4500 Series Slim Rectangular Table" ...
#>  $ Sales       : num  262 731.9 14.6 957.6 22.4 ...
#>  $ Quantity    : int  2 3 2 5 2 7 4 6 3 5 ...
#>  $ Discount    : num  0 0 0 0.45 0.2 0 0 0.2 0.2 0 ...
#>  $ Profit      : num  41.91 219.58 6.87 -383.03 2.52 ...

4. Cek data kosong

Untuk memastikan hasil pengolahan data sesuai yang diharapkan, maka perlu dilakukan pengecekan kondisi data yang kosong/hilang pada setiap kolom

4.1. Opsi A

Untuk menguji apakah suatu vektor (atau objek lain) mengandung nilai yang hilang

- fungsi di R     
    - cek nilai kosong/hilang      = `anyNA()`
anyNA(xyz)
#> [1] FALSE

4.2. Opsi B

Dan fungsi lain untuk menguji apakah suatu vektor (atau objek lain) mengandung nilai yang hilang dan kemudian dijumlahkan

- fungsi di R     
    - cek nilai kosong/hilang     = `is.na()`
    - jumlahkan nilai pada kolom  = 'colSums()'
colSums(is.na(xyz))
#>       Row.ID     Order.ID   Order.Date    Ship.Date    Ship.Mode  Customer.ID 
#>            0            0            0            0            0            0 
#>      Segment   Product.ID     Category Sub.Category Product.Name        Sales 
#>            0            0            0            0            0            0 
#>     Quantity     Discount       Profit 
#>            0            0            0

Berdasarkan pengecekan diatas, tidak ditemukan data yang bernilai kosong

Data Exploration

Proses eksplorasi data untuk mengidentifikasi pola, anomali, hipotesis, hubungan, dan informasi yang tersembunyi di dalam data.

Statistik Sederhana

Dalam menganalisis data, data exploration sangat penting karena dapat memberikan gambaran awal tentang data dan membantu dalam menentukan pendekatan analisis data yang tepat.

- fungsi di R     
    - statistik sederhan    = `summary()`
summary(xyz)
#>      Row.ID       Order.ID           Order.Date           Ship.Date         
#>  Min.   :   1   Length:9994        Min.   :2014-01-03   Min.   :2014-01-07  
#>  1st Qu.:2499   Class :character   1st Qu.:2015-05-23   1st Qu.:2015-05-27  
#>  Median :4998   Mode  :character   Median :2016-06-26   Median :2016-06-29  
#>  Mean   :4998                      Mean   :2016-04-30   Mean   :2016-05-03  
#>  3rd Qu.:7496                      3rd Qu.:2017-05-14   3rd Qu.:2017-05-18  
#>  Max.   :9994                      Max.   :2017-12-30   Max.   :2018-01-05  
#>                                                                             
#>           Ship.Mode    Customer.ID               Segment      Product.ID       
#>  First Class   :1538   Length:9994        Consumer   :5191   Length:9994       
#>  Same Day      : 543   Class :character   Corporate  :3020   Class :character  
#>  Second Class  :1945   Mode  :character   Home Office:1783   Mode  :character  
#>  Standard Class:5968                                                           
#>                                                                                
#>                                                                                
#>                                                                                
#>             Category         Sub.Category  Product.Name      
#>  Furniture      :2121   Binders    :1523   Length:9994       
#>  Office Supplies:6026   Paper      :1370   Class :character  
#>  Technology     :1847   Furnishings: 957   Mode  :character  
#>                         Phones     : 889                     
#>                         Storage    : 846                     
#>                         Art        : 796                     
#>                         (Other)    :3613                     
#>      Sales              Quantity        Discount          Profit         
#>  Min.   :    0.444   Min.   : 1.00   Min.   :0.0000   Min.   :-6599.978  
#>  1st Qu.:   17.280   1st Qu.: 2.00   1st Qu.:0.0000   1st Qu.:    1.729  
#>  Median :   54.490   Median : 3.00   Median :0.2000   Median :    8.666  
#>  Mean   :  229.858   Mean   : 3.79   Mean   :0.1562   Mean   :   28.657  
#>  3rd Qu.:  209.940   3rd Qu.: 5.00   3rd Qu.:0.2000   3rd Qu.:   29.364  
#>  Max.   :22638.480   Max.   :14.00   Max.   :0.8000   Max.   : 8399.976  
#> 

Analisa sederhana

Berdasarkan eksplorasi data menggunakan fungsi ‘summary()’ dapat ditampilkan analisa sedarhana sebagai berikut:

  1. Jumlah data penjualan PT. XYZ
    • sebanyak 9.994 baris/data
  2. Tanggal Pemesanan
    • Tgl pertama 3 Januari 2014
    • Tgl terakhir 30 Desember 2017
  3. Tanggal Pengiriman
    • Tgl pertama 7 Januari 2014
    • Tgl terakhir 5 Januari 2018
  4. Metode pengiriman terbanyak-terkecil yaitu :
    • Standard Class =5.968,
    • Second Class = 1.945,
    • First Class = 1.538 dan
    • Same Day = 543
  5. Kategori pelanggan terbanyak-te
    • pertama dari pelanggan Consumer sebanyak 51% atau 5.191,
    • kedua dari pelanggan Corporate sebesar 3.020,
    • ketiga dari pelanggan Home Office sebesar 1.783
  6. Nilai penjualan
    • terbesar USD 22,638.480
    • dengan rata-rata USD 229.858
  7. Jumlah diskon terbesar adalah 80%
  8. Jumlah keuntungan
    • terbesar USD 8.399,976
    • dengan rata-rata USD 28.657
    • namun ada 1 penjualan yang minus (- USD 6,599.978)

Data Explanation

Statistik yang dihasilkan dari PT. XYZ

Grafik

Kategori

Berikut adalah grafik penjualan berdasarkan kategori, dimana penjualan Office Supplies yang terbesar

plot(xyz$Category, col = rainbow(3), )

xyz_frn <- xyz[ xyz$Category == "Furniture", ]
dim(xyz_frn)
#> [1] 2121   15
xyz_ofs <- xyz[ xyz$Category == "Office Supplies", ]
dim(xyz_ofs)
#> [1] 6026   15
xyz_tec <- xyz[ xyz$Category == "Technology", ]
dim(xyz_tec)
#> [1] 1847   15

Segment

Grafik penjualan berdasarkan Segment, dimana penjualan ke Segment Consumer yang terbesar

plot(xyz$Segment, col=c("deeppink1", "cadetblue1", "azure3"))

xyz_con <- xyz[ xyz$Segment == "Consumer", ]
dim(xyz_con)
#> [1] 5191   15
xyz_cor <- xyz[ xyz$Segment == "Corporate", ]
dim(xyz_cor)
#> [1] 3020   15
xyz_hom <- xyz[ xyz$Segment == "Home Office", ]
dim(xyz_hom)
#> [1] 1783   15

Pilihan Pengiriman

Jika dilihat dari grafik dibawah ini, metode pengiriman yang terbesar melalui pengiriman ‘Standard Class’ karena adanya ongkos kirim gratis

plot(xyz$Ship.Mode, col="cornsilk", )

xyz_frc <- xyz[ xyz$Ship.Mode == "First Class", ]
dim(xyz_frc)
#> [1] 1538   15
xyz_sdc <- xyz[ xyz$Ship.Mode == "Same Day", ]
dim(xyz_sdc)
#> [1] 543  15
xyz_sec <- xyz[ xyz$Ship.Mode == "Second Class", ]
dim(xyz_sec)
#> [1] 1945   15
xyz_stc <- xyz[ xyz$Ship.Mode == "Standard Class", ]
dim(xyz_stc)
#> [1] 5968   15

Persentase

Berdasarkan tabel dibawah ini, penggunaan metode pengiriman ‘Same Day’ masih kecil dibandingkan ‘First Class’, namun dari sisi biaya lebih besar dan kecepatan tidak terlalu beda jauh.

prop.table(table(xyz$Ship.Mode, xyz$Segment, xyz$Category))*100
#> , ,  = Furniture
#> 
#>                 
#>                    Consumer  Corporate Home Office
#>   First Class     1.6409846  1.0406244   0.5903542
#>   Same Day        0.6603962  0.2801681   0.2501501
#>   Second Class    2.3614169  1.2107264   0.7004203
#>   Standard Class  6.4738843  3.9323594   2.0812487
#> 
#> , ,  = Office Supplies
#> 
#>                 
#>                    Consumer  Corporate Home Office
#>   First Class     4.5627376  2.9117470   1.6309786
#>   Same Day        1.9311587  0.6904142   0.6403842
#>   Second Class    6.0336202  3.7222333   1.7710626
#>   Standard Class 18.7612568 10.8865319   6.7540524
#> 
#> , ,  = Technology
#> 
#>                 
#>                    Consumer  Corporate Home Office
#>   First Class     1.4908945  0.9005403   0.6203722
#>   Same Day        0.5803482  0.1701021   0.2301381
#>   Second Class    1.8110867  1.1606964   0.6904142
#>   Standard Class  5.6333800  3.3119872   1.8811287

Profit

Profit

Profit yang dihasilkan untuk setiap Category

xtabs(formula = Profit ~ Category, data = xyz)
#> Category
#>       Furniture Office Supplies      Technology 
#>        18451.27       122490.80       145454.95

Profit yang dihasilkan untuk setiap Segment

xtabs(formula = Profit ~ Segment, data = xyz)
#> Segment
#>    Consumer   Corporate Home Office 
#>   134119.21    91979.13    60298.68

Profit Minus

Furniture

xyz_mfrn <-xyz[ xyz$Category == "Furniture" & xyz$Profit < 0, ]
dim(xyz_mfrn )
#> [1] 714  15

Office Supplies

xyz_mofs <- xyz[ xyz$Category == "Office Supplies" & xyz$Profit < 0, ]
dim(xyz_mofs)
#> [1] 886  15

Technology

xyz_mtec <- xyz[ xyz$Category == "Technology" & xyz$Profit < 0, ]
dim(xyz_mtec)
#> [1] 271  15

Diskon

xyz_dis <- xyz[ xyz$Discount > "0.5000" & xyz$Profit < 1, ]
dim(xyz_dis)
#> [1] 856  15

Rata2 Sales

Nilai rata-rata Sales untuk setiap Segment

aggregate(x = Sales ~ Segment, data = xyz, FUN = mean)
#>       Segment    Sales
#> 1    Consumer 223.7336
#> 2   Corporate 233.8233
#> 3 Home Office 240.9720

Nilai rata-rata Sales untuk setiap Segment dan Category

aggregate(x = Sales ~ Segment + Category, data = xyz, FUN = mean)
#>       Segment        Category    Sales
#> 1    Consumer       Furniture 351.3471
#> 2   Corporate       Furniture 354.5198
#> 3 Home Office       Furniture 336.8251
#> 4    Consumer Office Supplies 116.3902
#> 5   Corporate Office Supplies 126.7453
#> 6 Home Office Office Supplies 115.3090
#> 7    Consumer      Technology 427.3395
#> 8   Corporate      Technology 444.8558
#> 9 Home Office      Technology 535.9767

Rekomendasi

  • Penjualan terbanyak pada kategori Office Supplies, oleh karena itu perlu ditingkat penjualan untuk kategori Furniture & Technology melalui pemasang iklan dan promosi

  • Metode pengiriman terbanyak melalui ‘Standard Class’ karena ada promo gratis ongkir. Untuk meningkatkan kepuasan konsumen dengan mempercepat proses pengiriman yang semula 3-4 hari, menjadi 1-2 melalui kerjasama dengan beberapa perusahaan kurir, agar biaya paket pengiriman ‘Second Class’ lebih terjangkau.

  • Tidak selamanya pemberian diskon yang besar menguntungkan, perlu strategi promo yang tepat untuk tetap ada keuntungan (tidak rugi)