library(readxl)
library(tidyverse)
library(dplyr)
library(lubridate)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)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"
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:
Total_pesanan harga satuan untuk makanan ATAU
minuman yakni Rp 17.633Total_pesanan untuk satuan
makanan ATAU minuman sebanyak Rp 25.000colSums(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
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
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:
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.
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
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:
Gopay di
stasiun Bogor dan stasiun Jakarta Kota yang mendapat jumlah transaksi
dibawah 500K❓ Hitung nilai rata-rata Total_pesanan untuk setiap
Status_pembayaran
aggregate(x = Total_pesanan ~ Status_pembayaran,
FUN = "mean",
data = sales
)Insight:
❓ 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")Cara paling umum untuk membuat perkiraan nilai tunggal dari data yang banyak adalah dengan merata-ratakannya.
Median atau nilai tengah diperoleh dengan mengurutkan data terlebih dahulu kemudian mencari nilai tengah dari data.
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"
Variance menggambarkan seberapa beragam suatu data numerik tunggal menyebar dari pusat datanya.
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.
Five number summary (ringkasan lima angka) adalah satu set statistika deskriptif numerik yang terdiri dari lima angka:
Subset Status_pembayaran hanya yang
Berhasil
sales_succes <- sales[sales$Status_pembayaran == "Berhasil",]boxplot(formula = Total_pembayaran ~ Bulan, data = sales_succes,las=3)Insight:
Desember