1 Terkait Dataset

1.1 Konteks

Pertumbuhan supermarket di kota-kota terpadat semakin meningkat dan persaingan pasar juga tinggi. Dataset tersebut merupakan salah satu history penjualan perusahaan supermarket yang tercatat di 3 cabang berbeda selama 3 bulan data.

1.2 Ucapan Terima Kasih

Terima kasih kepada semua yang meluangkan waktu dan energi untuk melakukan Kernel dengan dataset dan reviewer ini.

Dataset berasal dari : https://www.kaggle.com/datasets/aungpyaeap/supermarket-sales

2 Tujuan Pelatihan

Tujuan utama dari kursus ini adalah untuk memberikan pengenalan yang komprehensif untuk ilmu pemrograman statistik dan alat-alat yang diperlukan untuk berhasil dengan pekerjaan ilmu data.

3 Preparation Data

Data Preparation atau bisa disebut juga dengan data preprocessing adalah suatu proses/langkah yang dilakukan untuk membuat data mentah menjadi data yang berkualitas.

Mengapa data perlu di-preprocessing?

Karena dalam data mentah masih terdapat data yang : Incomplete, Noisy, Inconcistent.

Sehingga “Jika data masukan tidak berkualitas, maka hasil data mining juga tidak akan berkualitas.” dan “Keputusan yang berkualitas pasti berasal/berdasarkan data yang berkualitas.”

Langkah-Langkah dalam data preparation :

  1. Data Cleaning

Dalam data cleaning yang akan kita lakukan antara lain mengisi missing value, mengidentifikasi outlier, menangani data noise, mengoreksi data yang tidak konsisten, dan menyelesaikan masalah redudansi data akibat integrasi data.

  1. Data Integration

Data integration adalah suatu langkah untuk menggabungkan data dari beberapa sumber. Data integration hanya dilakukan jika data berasal dari tempat yang berbeda-beda (sumber data tidak hanya dari 1 tempat). Langkah yang dilakukan antara lain mengintegrasikan skema, mengidentifikasi masalah entitas, dan mendeteksi sekaligus menyelesaikan konflik pada nilai data.

  1. Data Transformation

Data transformation yaitu mengubah suatu data supaya diperoleh data yang lebih berkualitas. Yang akan dilakukan antara lain menghilangkan noise dari data (smoothing), meng-agregasi data, generalisasi data, normalisasi data, dan pembentukan atribut/fitur.

  1. Data Reduction

Data Reduction yaitu langkah untuk mereduksi dimensi, atribut ataupun jumlah data. Yang akan dilakukan antara lain agregasi data cube, reduksi dimensi, diskretisasi, dan kompresi data.

4 Langkah-langkah dalam melakukan R’ Program:

4.1 Extract / Input Data

Pertama-tama pastikan data yang ingin Anda gunakan, juga ada di direktori Anda saat ini, dan gunakan read.csv() untuk membaca file csv ke global enviroment Anda.

Namun, untuk menjaga agar proyek tetap teratur, saya sarankan Anda menyimpan skrip, file yang berfungsi, dan data dependennya di direktori yang sama.

supermaket_sales <- read.csv("supermarket_sales - Sheet1.csv")

4.2 Data Inspection

4.2.1 Melihat Tabel Data

Melihat Tabel Data dari 6 baris paling atas dengan code ‘head()’ atau melihat 6 baris paling bawah dengan code ‘tail()’

Melihat 6 baris paling atas:

head(supermaket_sales)

Melihat 6 baris paling bawah:

tail(supermaket_sales)

Penjelasan Variable / Kolom:(terdapat 17 kolom)

1 Invoice ID = Computer generated sales slip invoice identification number.

2 Branch = Branch of supercenter (3 branches are available identified by A, B and C).

3 City = Location of supercenters.

4 Customer.type = Type of customers, recorded by Members for customers using member card and Normal for without member card.

5 Gender = Gender type of customer.

6 Product.line = General item categorization groups.

7 Unit.price = Price of each product in $.

8 Quantity = Number of products purchased by customer.

9 Tax.5. = 5% tax fee for customer buying.

10 Total = Total price including tax.

11 Date = Date of purchase.

12 Time = Purchase time.

13 Payment = Payment used by customer for purchase.

14 cogs = Cost of goods sold.

15 gross.margin.percentage = Gross margin percentage.

16 gross.income = Gross income.

17 Rating = Customer stratification rating on their overall shopping experience (On a scale of 1 to 10).

4.2.2 Mengetahui dimensi Data Frame

Fungsi dim() untuk mengetahui dimensi dari dataframe.

dim(supermaket_sales)
#> [1] 1000   17

Terdapat 1000 baris dan 17 kolom pada dataframe tersebut.

4.3 Data Cleansing & Explicit Coertions

4.3.1 Melihat Struktur Data

Panggil str() pada dataset ‘supermarket_sales’.

str(supermaket_sales)
#> 'data.frame':    1000 obs. of  17 variables:
#>  $ Invoice.ID             : chr  "750-67-8428" "226-31-3081" "631-41-3108" "123-19-1176" ...
#>  $ Branch                 : chr  "A" "C" "A" "A" ...
#>  $ City                   : chr  "Yangon" "Naypyitaw" "Yangon" "Yangon" ...
#>  $ Customer.type          : chr  "Member" "Normal" "Normal" "Member" ...
#>  $ Gender                 : chr  "Female" "Female" "Male" "Male" ...
#>  $ Product.line           : chr  "Health and beauty" "Electronic accessories" "Home and lifestyle" "Health and beauty" ...
#>  $ Unit.price             : num  74.7 15.3 46.3 58.2 86.3 ...
#>  $ Quantity               : int  7 5 7 8 7 7 6 10 2 3 ...
#>  $ Tax.5.                 : num  26.14 3.82 16.22 23.29 30.21 ...
#>  $ Total                  : num  549 80.2 340.5 489 634.4 ...
#>  $ Date                   : chr  "1/5/2019" "3/8/2019" "3/3/2019" "1/27/2019" ...
#>  $ Time                   : chr  "13:08" "10:29" "13:23" "20:33" ...
#>  $ Payment                : chr  "Ewallet" "Cash" "Credit card" "Ewallet" ...
#>  $ cogs                   : num  522.8 76.4 324.3 465.8 604.2 ...
#>  $ gross.margin.percentage: num  4.76 4.76 4.76 4.76 4.76 ...
#>  $ gross.income           : num  26.14 3.82 16.22 23.29 30.21 ...
#>  $ Rating                 : num  9.1 9.6 7.4 8.4 5.3 4.1 5.8 8 7.2 5.9 ...

Penjelasan tipe data pada setiap kolom:

  • ‘chr’ merupakan tipe data yang berisi huruf / character.

  • ‘num’ merupakan tipe data numeric yang berisi angka yang dapat berupa angka kontinu (ada koma/pecahan), maupun diskrit (bilangan bulat tanpa koma).

  • ‘int’ merupakan tipe data integer yang berisi angka yang berupa angka diskrit (bilangan bulat tanpa koma). Untuk memaksa numeric menjadi integer, dapat gunakan L dibelakang angka.

Dari Tipe data diatas ada beberapa yang tidak sesuai, sehingga harus diubah tipe datanya seperti:

  • Branch merupakan data factor, terdiri dari 3 levels saja.
  • City merupakan data factor, terdiri dari 3 levels saja.
  • Customer.type merupakan data factor, terdiri dari 2 levels saja.
  • Gender merupakan data factor, terdiri dari 2 levels saja.
  • Product.line merupakan data factor, terdiri dari 6 levels saja.
  • Payment merupakan data factor, terdiri dari 3 levels saja.
  • Date merupakan data date, bukan character.
  • Time merupakan data time, bukan character. Namun untuk mengubahnya membutuhkan library ’lubridate(), sehingga untuk saat ini time tidak usah diganti dahulu tipe datanya.

Coding untuk melihat tipe data factor dapat melakukan seperti ini: (salah satu contoh)

length(supermaket_sales$Payment)
#> [1] 1000
length(unique(supermaket_sales$Payment))
#> [1] 3

Dimana artinya terdapat 1000 data ‘Payment’, namun unique nya cuma ada 3 levels saja.

4.3.2 Mengubah tipe data

supermaket_sales$Branch <- as.factor(supermaket_sales$Branch)
supermaket_sales$City <- as.factor(supermaket_sales$City)
supermaket_sales$Customer.type <- as.factor(supermaket_sales$Customer.type)
supermaket_sales$Gender <- as.factor(supermaket_sales$Gender)
supermaket_sales$Product.line <- as.factor(supermaket_sales$Product.line)
supermaket_sales$Payment <- as.factor(supermaket_sales$Payment)

supermaket_sales$Date <- as.Date(supermaket_sales$Date, "%m/%d/%Y")

str(supermaket_sales)
#> 'data.frame':    1000 obs. of  17 variables:
#>  $ Invoice.ID             : chr  "750-67-8428" "226-31-3081" "631-41-3108" "123-19-1176" ...
#>  $ Branch                 : Factor w/ 3 levels "A","B","C": 1 3 1 1 1 3 1 3 1 2 ...
#>  $ City                   : Factor w/ 3 levels "Mandalay","Naypyitaw",..: 3 2 3 3 3 2 3 2 3 1 ...
#>  $ Customer.type          : Factor w/ 2 levels "Member","Normal": 1 2 2 1 2 2 1 2 1 1 ...
#>  $ Gender                 : Factor w/ 2 levels "Female","Male": 1 1 2 2 2 2 1 1 1 1 ...
#>  $ Product.line           : Factor w/ 6 levels "Electronic accessories",..: 4 1 5 4 6 1 1 5 4 3 ...
#>  $ Unit.price             : num  74.7 15.3 46.3 58.2 86.3 ...
#>  $ Quantity               : int  7 5 7 8 7 7 6 10 2 3 ...
#>  $ Tax.5.                 : num  26.14 3.82 16.22 23.29 30.21 ...
#>  $ Total                  : num  549 80.2 340.5 489 634.4 ...
#>  $ Date                   : Date, format: "2019-01-05" "2019-03-08" ...
#>  $ Time                   : chr  "13:08" "10:29" "13:23" "20:33" ...
#>  $ Payment                : Factor w/ 3 levels "Cash","Credit card",..: 3 1 2 3 3 3 3 3 2 2 ...
#>  $ cogs                   : num  522.8 76.4 324.3 465.8 604.2 ...
#>  $ gross.margin.percentage: num  4.76 4.76 4.76 4.76 4.76 ...
#>  $ gross.income           : num  26.14 3.82 16.22 23.29 30.21 ...
#>  $ Rating                 : num  9.1 9.6 7.4 8.4 5.3 4.1 5.8 8 7.2 5.9 ...

4.3.3 Check Missing Value

Fungsi anyNA() digunakan untuk mengetahui apakah pada data terdapat missing value.

anyNA(supermaket_sales)
#> [1] FALSE

Fungsi is.na() digunakan untuk mengecek missing value pada setiap nilai. Fungsi colSums() digunakan untuk menjumlahkan nilai pada setiap kolom.

colSums(is.na(supermaket_sales))
#>              Invoice.ID                  Branch                    City 
#>                       0                       0                       0 
#>           Customer.type                  Gender            Product.line 
#>                       0                       0                       0 
#>              Unit.price                Quantity                  Tax.5. 
#>                       0                       0                       0 
#>                   Total                    Date                    Time 
#>                       0                       0                       0 
#>                 Payment                    cogs gross.margin.percentage 
#>                       0                       0                       0 
#>            gross.income                  Rating 
#>                       0                       0

Ketika tipe data kolom sudah tepat, dan data no missing value. Maka summary lebih informatif, dan data siap untuk diproses lebih lanjut dan dianalisa.

4.4 Data Explanation

4.4.1 Mengetahui ringkasan Data Frame

Fungsi summary() untuk mengetahui ringkasan/rangkuman statistik dari dataframe.

summary(supermaket_sales)
#>   Invoice.ID        Branch         City     Customer.type    Gender   
#>  Length:1000        A:340   Mandalay :332   Member:501    Female:501  
#>  Class :character   B:332   Naypyitaw:328   Normal:499    Male  :499  
#>  Mode  :character   C:328   Yangon   :340                             
#>                                                                       
#>                                                                       
#>                                                                       
#>                  Product.line   Unit.price       Quantity         Tax.5.       
#>  Electronic accessories:170   Min.   :10.08   Min.   : 1.00   Min.   : 0.5085  
#>  Fashion accessories   :178   1st Qu.:32.88   1st Qu.: 3.00   1st Qu.: 5.9249  
#>  Food and beverages    :174   Median :55.23   Median : 5.00   Median :12.0880  
#>  Health and beauty     :152   Mean   :55.67   Mean   : 5.51   Mean   :15.3794  
#>  Home and lifestyle    :160   3rd Qu.:77.94   3rd Qu.: 8.00   3rd Qu.:22.4453  
#>  Sports and travel     :166   Max.   :99.96   Max.   :10.00   Max.   :49.6500  
#>      Total              Date                Time                  Payment   
#>  Min.   :  10.68   Min.   :2019-01-01   Length:1000        Cash       :344  
#>  1st Qu.: 124.42   1st Qu.:2019-01-24   Class :character   Credit card:311  
#>  Median : 253.85   Median :2019-02-13   Mode  :character   Ewallet    :345  
#>  Mean   : 322.97   Mean   :2019-02-14                                       
#>  3rd Qu.: 471.35   3rd Qu.:2019-03-08                                       
#>  Max.   :1042.65   Max.   :2019-03-30                                       
#>       cogs        gross.margin.percentage  gross.income         Rating      
#>  Min.   : 10.17   Min.   :4.762           Min.   : 0.5085   Min.   : 4.000  
#>  1st Qu.:118.50   1st Qu.:4.762           1st Qu.: 5.9249   1st Qu.: 5.500  
#>  Median :241.76   Median :4.762           Median :12.0880   Median : 7.000  
#>  Mean   :307.59   Mean   :4.762           Mean   :15.3794   Mean   : 6.973  
#>  3rd Qu.:448.90   3rd Qu.:4.762           3rd Qu.:22.4453   3rd Qu.: 8.500  
#>  Max.   :993.00   Max.   :4.762           Max.   :49.6500   Max.   :10.000

Kesimpulan:

  1. Penjualan terbanyak terjadi di cabang A > B > C.

  2. Penjualan terbanyak terjadi di kota Yangon > Mandalay > Naypyitaw.

  3. Customer.type yang Member lebih banyak daripada Normal.

  4. Pembeli terbanyak bergender Female.

  5. Product yang paling laku adalah Fashion accessories, dan yang kurang laku adalah Home and lifestyle.

  6. Rata-rata harga product adalah $55.67

  7. Rata-rata quantity product yang terjual 5.51 atau dibulatkan 6

  8. Pembayarannya banyak menggunakan Ewallet.

  9. Penilaian / rating terhadap supermarket tersebut memiliki rata-rata 6.973, sehingga perlu ditingkatkan lagi pelayanannya.

4.5 Data Manipulation

Melakukan Conditional Subsetting adalah teknik untuk mengambil sebagian data yang diperlukan untuk proses analisis. Gunakan kurung siku [] setelah nama object Untuk melakukan subsetting.

Berikut ilustrasinya:

  1. Dari data supermaket_sales, ambil baris yang memiliki Total lebih dari $200 lalu ambil kolom Product.line beserta nilai Totalnya.
supermaket_sales[supermaket_sales$Total > 200,
                 c("Product.line","Total")]
  1. Berapa banyak transaksi yang pembayaran Payment menggunakan Credit card dan Ewallet?
trans_1 <- supermaket_sales[supermaket_sales$Payment %in% c("Credit card", "Ewallet"), 
                 c("Invoice.ID","Payment")]
trans_1
nrow(trans_1)
#> [1] 656

Jawaban: Terdapat 656 transaksi.

  1. Berapa % Gender perempuan yang membeli Product.line Fashion accessories?
persen_fa <- supermaket_sales[supermaket_sales$Product.line == "Fashion accessories", ]
round(prop.table(table(persen_fa$Gender))*100,2)
#> 
#> Female   Male 
#>  53.93  46.07

Jawaban: Female dengan persentase 53.93%.

  1. Berapa jumlah Total yang dihasilkan dari masing-masing Product.line dari setiap Customer.type.
xtabs(formula = Total ~ Product.line + Customer.type,
      data = supermaket_sales)
#>                         Customer.type
#> Product.line               Member   Normal
#>   Electronic accessories 24498.49 29839.04
#>   Fashion accessories    26323.96 27981.93
#>   Food and beverages     31357.62 24787.22
#>   Health and beauty      25831.04 23362.70
#>   Home and lifestyle     27978.03 25883.89
#>   Sports and travel      28234.30 26888.53

Jawaban: Cutomer.type: Member dengan Product.line: Food and beverages, berjumlah 31357.62

  1. Data supermaket_sales adalah data transaksi dari tahun 2019-01-01 sampai 2019-03-30. Anda diminta untuk menghitung jumlah Total yang diperoleh pada setiap Product.line, namun hanya untuk order yang terjadi pada bulan 02 tahun 2019 saja (Hint: Date di antara tanggal “2019-02-01” dan “2019-02-28”)
# conditional subsetting
supermaket_sales_feb <- supermaket_sales[supermaket_sales$Date >= "2019-02-01" & supermaket_sales$Date <= "2019-02-28",]
supermaket_sales_feb
  1. Mengetahui banyaknya jenis pembayaran Paymentdi setiap kotannya City
pembayaran <- table(supermaket_sales$Payment, supermaket_sales$City)
pembayaran
#>              
#>               Mandalay Naypyitaw Yangon
#>   Cash             110       124    110
#>   Credit card      109        98    104
#>   Ewallet          113       106    126

Jawaban: Di kota Mandalay: Ewallet, kota Naypyitaw: Cash, dan kota Yangon: Ewallet

  1. Mengetahui rata-rata penilaian Ratingdi setiap cabang Branch
rating_bran <- aggregate(x = Rating ~ Branch,
          data = supermaket_sales,
          FUN = mean)

rating_branc <- order(rating_bran$Rating, decreasing = T)

rating_branch <- rating_bran[rating_branc, ]
rating_branch

4.6 Data Transformation

Beberapa bentuk grafik untuk melihat data yang ada, seperti:

  1. Melihat Persentase City
graphics::pie(xtabs(formula = ~City,
                    data = supermaket_sales))

  1. Melihat Persentase Product.line
graphics::pie(xtabs(formula = ~Product.line,
                    data = supermaket_sales))

  1. Melihat grafik dari masing-masing Gender dari setiap Customer.type.
plot(xtabs(Total ~ Gender + Customer.type,
      supermaket_sales))

5 Explanatory Text & Business Recomendation

Dataset terdiri dari history penjualan supermarket yang tercatat di 3 cabang berbeda selama 3 bulan, dapat digunakan untuk membantu pemilik / pengelola analisa.

Analisa yang digunakan seperti: Bagaimana penjualan yang terjadi, apa saja yang terjual, bagaimana rating supermarketnya, dan sebagainya.

Beberapa informasi dasar yang dapat diambil dari pengolahan data diatas, salah satunya adalah:

  • Terdapat 3 supermarket yaitu A, B, C

  • Tersebar di 3 lokasi yaitu Mandalay, Naypyitaw, Yangon.

  • Terdiri dari 2 tipe pembeli yaitu Member dan Normal.

  • Jenis pembayaran yang bisa digunakan yaitu Cash, Credit card, dan Ewallet.

Dan beberapa informasi menarik lainnya yang lebih mendetail, seperti:

  • Data terdiri dari 1000 transaksi(Invoice) selama 3 bulan.

  • Jenis Product yang paling laku adalah Fashion accessories, dengan persentasi pembelinya adalah female sebesar 53.93%. Sedangkan untuk jenis yang kurang diminati adalah Health and beauty.

  • Untuk rata-rata harga per barangnya adalah 55.23, dan harga barang termahalnya adalah 99.96 sedangkan harga yang termurahnya adalah 10.08.

  • Untuk rata-rata barang yang terjual adalah 5.51 pcs, dan paling banyak adalah 10pcs.

  • Total pendapatan dari 3 bulan dan 3 supermarket tersebut adalah 1042.65.

  • Untuk urutan penilaian dari masing masing branch adalah C dengan 7.07, A dengan 7.03, dan B dengan 6.82

Rekomendasi: Sebagai seorang data Analysist dapat memberikan insight sederhana kepada pengelola supermarket tersebut, dengan meningkatkan kinerja supermarket di setiap branch nya. Karena dirasa penilaian tersebut masih bisa untuk ditingkatkan lagi. Bisa dilakukannya kerjasama dengan pihak lainnya agar penjualan dan penilaian nya meningkat. Mungkin dengan melakukan promosi / discount / advertising dan lain sebagainya.