1 Load Library

library(readxl)
library(tidyverse)
library(dplyr)
library(lubridate)

2 Overview

2.1 Dataset

Dataset: merupakan dataset dengan format .xlsx yang didapat dari kelas Google Spreadsheet di BWA, rawdata telah di preprocessing excel sebelumnya sesuai kebutuhan. Dataset berisikan databsase penjualan yang dilakukan di berbagai stasiun kereta api jabodetabek periode tahun 2021 pada bulan January sampai Desember.

# xlsx files
sales <- read_excel("LAPORAN PENJUALAN 2021.xlsx", sheet = 3)
head(sales)

3 Data Preprocessing

3.1 Mengubah nama kolom

names(sales)
#> [1] "Tanggal"           "Nama Customer"     "Pesanan"          
#> [4] "Pembayaran"        "Lokasi Penjualan"  "Status Pembayaran"
#> [7] "Total Pesanan"     "Biaya Layanan"     "Total Pembayaran"
# dplyr
sales <- sales %>% 
  rename(
      Nama_customer = `Nama Customer`, # kolom output = kolom asal
      Lokasi_penjualan = `Lokasi Penjualan`,
      Status_pembayaran = `Status Pembayaran` ,
      Total_pesanan = `Total Pesanan`,
      Biaya_layanan = `Biaya Layanan`,
      Total_pembayaran = `Total Pembayaran`
  )
names(sales)
#> [1] "Tanggal"           "Nama_customer"     "Pesanan"          
#> [4] "Pembayaran"        "Lokasi_penjualan"  "Status_pembayaran"
#> [7] "Total_pesanan"     "Biaya_layanan"     "Total_pembayaran"

3.2 Tipe Data

str(sales)
#> tibble [1,998 × 9] (S3: tbl_df/tbl/data.frame)
#>  $ Tanggal          : POSIXct[1:1998], format: "2021-01-13" "2021-01-13" ...
#>  $ Nama_customer    : chr [1:1998] "Rara" "Adin" "Rina" "Vian" ...
#>  $ Pesanan          : chr [1:1998] "Kwetiau Seafood" "Nasi Goreng Ayam" "Bakso Jumbo" "Nasi Goreng Seafood" ...
#>  $ Pembayaran       : chr [1:1998] "Cash" "QRIS" "Cash" "Cash" ...
#>  $ Lokasi_penjualan : chr [1:1998] "Stasiun Bogor" "Stasiun Bogor" "Stasiun Depok" "Stasiun Manggarai" ...
#>  $ Status_pembayaran: chr [1:1998] "Berhasil" "Berhasil" "Berhasil" "Gagal" ...
#>  $ Total_pesanan    : num [1:1998] 25000 20000 23000 25000 23000 20000 20000 20000 20000 18000 ...
#>  $ Biaya_layanan    : num [1:1998] 0 2500 0 0 2500 2500 2500 0 0 2500 ...
#>  $ Total_pembayaran : num [1:1998] 25000 22500 23000 25000 25500 22500 22500 20000 20000 20500 ...
# base
sales$Bulan <- month(sales$Tanggal, label = T, abbr = F)
sales$Pembayaran <- as.factor(sales$Pembayaran)
sales$Lokasi_penjualan <- as.factor(sales$Lokasi_penjualan)
sales$Status_pembayaran <- as.factor(sales$Status_pembayaran)
sales$Biaya_layanan <- as.factor(sales$Biaya_layanan)
glimpse(sales) #dplyr
#> Rows: 1,998
#> Columns: 10
#> $ Tanggal           <dttm> 2021-01-13, 2021-01-13, 2021-01-13, 2021-01-13, 202…
#> $ Nama_customer     <chr> "Rara", "Adin", "Rina", "Vian", "Andre", "Geri", "Ri…
#> $ Pesanan           <chr> "Kwetiau Seafood", "Nasi Goreng Ayam", "Bakso Jumbo"…
#> $ Pembayaran        <fct> Cash, QRIS, Cash, Cash, OVO, Shopeepay, QRIS, Cash, …
#> $ Lokasi_penjualan  <fct> Stasiun Bogor, Stasiun Bogor, Stasiun Depok, Stasiun…
#> $ Status_pembayaran <fct> Berhasil, Berhasil, Berhasil, Gagal, Berhasil, Gagal…
#> $ Total_pesanan     <dbl> 25000, 20000, 23000, 25000, 23000, 20000, 20000, 200…
#> $ Biaya_layanan     <fct> 0, 2500, 0, 0, 2500, 2500, 2500, 0, 0, 2500, 2500, 2…
#> $ Total_pembayaran  <dbl> 25000, 22500, 23000, 25000, 25500, 22500, 22500, 200…
#> $ Bulan             <ord> January, January, January, January, January, January…
summary(sales)
#>     Tanggal                      Nama_customer        Pesanan         
#>  Min.   :2021-01-05 00:00:00.0   Length:1998        Length:1998       
#>  1st Qu.:2021-02-19 00:00:00.0   Class :character   Class :character  
#>  Median :2021-04-18 00:00:00.0   Mode  :character   Mode  :character  
#>  Mean   :2021-06-12 09:14:57.2                                        
#>  3rd Qu.:2021-09-20 00:00:00.0                                        
#>  Max.   :2021-12-31 00:00:00.0                                        
#>                                                                       
#>      Pembayaran              Lokasi_penjualan Status_pembayaran Total_pesanan  
#>  Cash     :826   Stasiun Bogor       :346     Berhasil:1376     Min.   :10000  
#>  Gopay    :146   Stasiun Depok       :310     Gagal   : 622     1st Qu.:13000  
#>  OVO      :270   Stasiun Duri        :356                       Median :17000  
#>  QRIS     :416   Stasiun Jakarta Kota:450                       Mean   :17633  
#>  Shopeepay:340   Stasiun Manggarai   :536                       3rd Qu.:20000  
#>                                                                 Max.   :25000  
#>                                                                                
#>  Biaya_layanan Total_pembayaran      Bulan    
#>  0   : 826     Min.   :10000    November:364  
#>  2500:1172     1st Qu.:15500    February:308  
#>                Median :19500    March   :302  
#>                Mean   :19100    January :236  
#>                3rd Qu.:22500    April   :224  
#>                Max.   :27500    August  :224  
#>                                 (Other) :340

Insight:

  • rerata Total_pesanan harga satuan untuk makanan ATAU minuman yakni Rp 17.633
  • dengan maksimal harga Total_pesanan untuk satuan makanan ATAU minuman sebanyak Rp 25.000
  • Jika terdapat biaya layanan, dikenakan fee sebesar Rp 2.500
  • rerata pembeli membayar Total_pembayaran sebesar Rp 19.100
  • dengan harga maksimal yang harus dibayar pada Total_pembayaran yakni Rp 27.500

3.3 Check Missing Value

colSums(is.na(sales))
#>           Tanggal     Nama_customer           Pesanan        Pembayaran 
#>                 0                 0                 0                 0 
#>  Lokasi_penjualan Status_pembayaran     Total_pesanan     Biaya_layanan 
#>                 0                 0                 0                 0 
#>  Total_pembayaran             Bulan 
#>                 0                 0

Kesimpulan: Data sales tidak memiliki missing value

4 Conditional Subsetting

1️⃣ Dari data sales, ambil baris yang memiliki Total_pembayaran lebih dari 20000 lalu ambil kolom Pesanan, Lokasi_penjualan, dan Pembayaran

sales[sales$Total_pembayaran > 20000, c("Pesanan", "Lokasi_penjualan", "Pembayaran")]

2️⃣ Berapa banyak pesanan di Stasiun Bogor dan Manggarai berdasarkan Lokasi_penjualan yang pembayaran menggunakan Gopay dan Shopeepay?

nrow(sales[sales$Lokasi_penjualan  %in% c("Stasiun Bogor", "Stasiun Manggarai") & 
        sales$Pembayaran  %in% c("Gopay", "Shopeepay"),])
#> [1] 200

Insight:

Ada 360 entry data

5 Data Aggregation

5.1 table()

Fungsi table(): untuk menampilkan frekuensi tiap kategori

1️⃣ Mencari tahu jenis pembayaran apa yang paling paling sering digunakandi semua lini

table(sales$Pembayaran)
#> 
#>      Cash     Gopay       OVO      QRIS Shopeepay 
#>       826       146       270       416       340

Jenis pembayaran yang paling banyak digunakan di semua lini yakni dengan cara CASH

2️⃣ Pembayaran apa yang paling banyak digunakan customerdi tiap lokasi penjualan

table(sales$Lokasi_penjualan,sales$Pembayaran)
#>                       
#>                        Cash Gopay OVO QRIS Shopeepay
#>   Stasiun Bogor         170    18  40   66        52
#>   Stasiun Depok         116    28  32   76        58
#>   Stasiun Duri          126    28  68   72        62
#>   Stasiun Jakarta Kota  178    24  54  108        86
#>   Stasiun Manggarai     236    48  76   94        82

Insight:

  • metode pembayaran CASH masih dominan digunakan pada tiap lokasi penjualan
  • metode pembayaran dengan QRIS tertinggi mencapai frekuensi 108 pada stasiun Jakarta Kota
  • Dengan hal ini, maka penggunaan E-wallet di tiap lokasi dapat di maksimalkan dengan pengadaan campaign yg harus dilakukan

5.2 prop.table()

Fungsi prop.table(): untuk mengubah tabel frekuensi menjadi tabel proporsi/persentase untuk tiap kategori.

❓ Tampilkan proporsi transaksi untuk masing-masing Status_pembayaran.

round(prop.table(table(sales$Status_pembayaran)),2)
#> 
#> Berhasil    Gagal 
#>     0.69     0.31

Insight:

Proporsi transaksi yang masuk ke database yakni 699% transaksi berhasil berbanding 31% transaksi yang gagal, hal ini tentunya sangat disayangkan dan harus dianalisis lebih lanjut lagi.

5.3 Cross Tabulation

Fungsi xtabs(): untuk menampilkan jumlah (sum) suatu variabel numerik untuk tiap kategori.

❓ Berapa Total_pembayaran yang dihasilkan untuk setiap Lokasi_penjualan

xtabs(formula = Total_pembayaran ~ Lokasi_penjualan , data = sales)
#> Lokasi_penjualan
#>        Stasiun Bogor        Stasiun Depok         Stasiun Duri 
#>              6453000              5942000              6857000 
#> Stasiun Jakarta Kota    Stasiun Manggarai 
#>              8678000             10231000

Insight:

Top 3 Lokasi penjualan dengan total pembayaran tertinggi

  1. Stasiun Manggarai
  2. Stasiun Jakarta Kota
  3. Stasiun Duri

Fungsi xtabs() tidak hanya bisa digunakan untuk satu value saja.

❓ Berapa Total_pembayaran yang dihasilkan untuk setiap Lokasi_penjualan berdasarkan metode Pembayaran yang dilakukan

xtabs(Total_pembayaran ~ Lokasi_penjualan + Pembayaran, sales)
#>                       Pembayaran
#> Lokasi_penjualan          Cash   Gopay     OVO    QRIS Shopeepay
#>   Stasiun Bogor        2957000  362000  838000 1288000   1008000
#>   Stasiun Depok        2036000  558000  649000 1522000   1177000
#>   Stasiun Duri         2222000  583000 1342000 1442000   1268000
#>   Stasiun Jakarta Kota 3143000  474000 1099000 2204000   1758000
#>   Stasiun Manggarai    4170000  992000 1511000 1907000   1651000

Insight:

  • Rata-rata customer di tiap stasiun masih dominan menggunakan CASH untuk melakukan pembayaran
  • metode pembayaran QRIS dan Shopeepay banyak peminat terlihat dari total transaksi di tiap stasiun yang melebihi jt
  • Di sektor E-wallet, hanya transaksi metode Gopay di stasiun Bogor dan stasiun Jakarta Kota yang mendapat jumlah transaksi dibawah 500K

5.4 Aggregate

❓ Hitung nilai rata-rata Total_pesanan untuk setiap Status_pembayaran

aggregate(x = Total_pesanan ~ Status_pembayaran,
          FUN = "mean",
          data = sales
          )

Insight:

  • Ternyata rerata total pesanan untuk transaksi yang gagal cukup tinggi
  • Hal ini perlu ditindak lanjut, apakah customer yang gagal untuk membayar menggunakan metode lain untuk melakukan pembayaran atau tidak

❓ Hitung nilai rata-rata Total_pesanan untuk setiap Status_pembayaran dan Pembayaran

agg_data <- aggregate(x = Total_pesanan ~ Status_pembayaran + Pembayaran,
          FUN = "mean",
          data = sales
          )

agg_data[order(x = agg_data$Total_pesanan, decreasing = T), ]

❓ Data sales adalah data transaksi di bulan 1-12 pada tahun 2021. Anda diminta untuk menghitung Total_pembayaran yang diperoleh pada setiap Lokasi_penjualan, namun hanya untuk order yang terjadi pada bulan January saja

mei_sales <-  sales[sales$Bulan == "January",]

aggregate(x = Total_pembayaran ~ Lokasi_penjualan,
          data = mei_sales,
          FUN = "sum")

6 Descriptive Statistics

6.1 Measure of Central Tendency

6.1.1 Mean

Cara paling umum untuk membuat perkiraan nilai tunggal dari data yang banyak adalah dengan merata-ratakannya.

6.1.2 Median

Median atau nilai tengah diperoleh dengan mengurutkan data terlebih dahulu kemudian mencari nilai tengah dari data.

6.1.3 Modus (Mode)

Pada kali ini hanya akan menjelaskan modus, karena mean dan median kebanyakan telah digunakan pada langkah sebelumnya:

Modus tidak mendapat fungsi built-in di R, maka kita dapat membuat fungsi custom untuk mendapatkan nilai Modus.

# PENTING: run chunk keseluruhan secara bersamaan
most <- function(x){
  # membuat tabel frekuensi
  table_x <- table(x)
  
  # mengurutkan tabel
  sort_table_x <- sort(table_x, decreasing = TRUE)
  
  # mengambil kategori
  name <- names(sort_table_x)
  
  # mengambil kategori dengan frekuensi terbesar
  name[1]
}

Menggunakan fungsi most() :

❓ Mengetahui pesanan apa yang paling sering di pesan oleh customer

most(sales$Pesanan)
#> [1] "Es Teh Manis"

6.2 Measure of Spread

6.2.1 Variance

Variance menggambarkan seberapa beragam suatu data numerik tunggal menyebar dari pusat datanya.

6.2.2 Standard Deviation

Standard deviation menggambarkan seberapa jauh simpangan nilai yang dianggap umum, dihitung dari titik pusat (mean) nya. Kita dapat menentukan apakah suatu nilai dikatakan menyimpang dari rata-rata namun masih dikatakan umum, atau sudah tidak umum.

6.2.3 Range and IQR (Five Number Summary)

Five number summary (ringkasan lima angka) adalah satu set statistika deskriptif numerik yang terdiri dari lima angka:

  • Minimum: nilai terkecil
  • Kuartil 1 (Q1): nilai ke 25%
  • Kuartil 2 (Q2 atau median): nilai ke 50% (nilai tengah)
  • Kuartil 3 (Q3): nilai ke 75%
  • Maksimum: nilai terbesar

6.2.4 Boxplot

Subset Status_pembayaran hanya yang Berhasil

sales_succes <- sales[sales$Status_pembayaran == "Berhasil",]
boxplot(formula = Total_pembayaran ~ Bulan, data = sales_succes,las=3)

Insight:

  • Menggunakan median, distribusi yang diharapkan adalah pada bulan April dan November bisa dimanfaatkan untuk nilai penjualan yang lebih besar
  • Menggunakan IQR, sebaran data yang paling besar adalah pada bulan Desember
  • Tidak terdapat outlier pada data