1 Introduction

Perkenalkan nama saya Bagas. Pada kesempatan kali ini, saya akan melakukan explanatory data analysis pada dataset retail. Explanatroy data analysis atau biasa disebut EDA adalah proses kritis uji investigasi awal pada sebuah data untuk mengidentifikasi pola, menemukan anomali, menguji hipotesis, dan memeriksa asumsi melalui statistik ringkasan dan representasi grafis (visual).

Data yang akan digunakan merupakan data penjualan dari sebuah perusahaan retaul yang kedepannya akan kita sebut dengan PT ABCDE. PT ABCDE merupakan perusahaan retail yang menjual berbagai jenis barang seperti Office Supllies, furniture, dan barang-barang teknologi. Perushaan menyediakan berbagai layanan distribusi. Segmen pelanggan yang dilayani PT ABCDE teridi dari corporate, home office, dan juga individual.

2 Read Data

Pertama-tama, kita akan memanggil data yang tersimpan devices atau storage kita. Karena data retail berbentuk csv atau comma-separated values, kita akan menggunankan perintah read.csv untuk memanggil data tersebut dan jangan lupa di assign ke object yang diinginkan.

retail <- read.csv("data_input/retail.csv")

2.1 Data Inspection

Tahapan selanjutannya adalah melakukan data inspection dengan memanggil sejumlah baris data set yang ingin di analysis

head(retail,n=5)

Lalu dengan menggunakan fungsi glimpse yang terdapat dalam library dplyr, kita bisa melihat tipe data, jumlah baris, jumlah kolom, nama kolom, dan value yang ada di setiap kolommnya.

glimpse(retail)
## 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.…

Dari penggunaan fungsi glimpse, kita dapat mengetahui bahwa data set retail terdiri dari 15 kolom dan 9.994 baris, yang kolom-kolomnya terdiri dari:

  • Order.ID: Id Pemesanan.
  • Order.Date: Tanggal Pemesanan.
  • Ship.Date: Tanggal Pengiriman.
  • Ship.Mode: Jenis Pengiriman.
  • Customer.ID: Id Pelanggan.
  • Segment : Segmen Pelanggan.
  • Product.ID: Id Produk.
  • Category : Kategori Produk; memilki 3 jenis/levels (“Furniture”, “Office Supplies”, “Technology”).
  • Sub.Category: Kategori produk yang lebih spesifik.
  • Product.Name: Nama produk yang terjual.
  • Sales: Penghasilan yang didapatkan setiap penjualan.
  • Quantity: Jumlah barang yang terjual.
  • Discount: Besarnya diskon yang diberikan untuk setiap penjualan.
  • Profit: Keuntungan yang didapatkan perusahaan untuk setiap penjualan.

2.2 Check Missing Values

colSums(is.na(retail))
##       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

Dari hasil colSums(is.na(retail)) dapat disimpulkan bahwa data retail tidak memiliki missing values.

2.3 Data Cleaning

Dari hasil inspeksi kita dapat menyimpulkan bahwa dataset retail :

  1. Tidak memiliki missing values
  2. Ada beberapa kolom yang bisa dihilangkan karena tidak mempengaruhi proses selanjutnya
  3. ada beberapa kolom yang harus diubah tipe datanya untuk mempermudah proses selanjutnya

Oleh sebab itu kita akan menghilankan kolom Row.ID, Order.ID, Customer.ID, Product.ID. Kita juga akan mengubah tipe data dari kolom Order.Date, Ship.Date, Ship.Mode, Segment, Category, dan Sub.Category.

Kemudian akan kita assign ke objek bernama retail_clean

retail_clean <- retail %>% 
  select(-Row.ID , -Order.ID , -Customer.ID , -Product.ID) %>% 
  mutate(Order.Date = mdy(Order.Date),
         Ship.Date = mdy(Ship.Date),
         Ship.Mode = as.factor(Ship.Mode),
         Segment = as.factor(Segment),
         Category = as.factor(Category),
         Sub.Category = as.factor(Sub.Category),
         Year = year(Order.Date)
         )

3 Explanatory Data Analysis

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

Dari hasil summary tersebut kita dapat melihat bahwa:

  1. order date pertama pada tanggal 03-01-2014 dan order date terakhir pada tanggal 30-12-2017.
  2. Ship mode paling sering digunakan adalah standard class dan same day menjadi ship mode yang paling jarang digunakan
  3. Penjualan terbanyak diraih oleh segment consumer dan home office merupakan segment dengan penjualan terkecil.
  4. Category Office Supplies meraih penjualan terbanyak dan technology penjualannnya terkecil dianta category lainnya
  5. Rata-rata sales selama 4 tahun ini sebesar 229.856
  6. Rata-rata profit selama 4 tahun ini sebesar 28.657

Total quantity product yang terjual selama tahun 2014-2017

sum(retail_clean$Quantity)
## [1] 37873

Total Sales selama tahun 2014-2017

sum(retail_clean$Sales)
## [1] 2297201

Total Profit Selamat tahun 2014-2017

sum(retail_clean$Profit)
## [1] 286397

3.1 Sales

Pertama-tama kita mau melihat total sales dari setiap segment

aggregate(Sales ~ Segment,
          data = retail_clean,
          FUN = sum)

Kita juga dapat melihat total sales tiap segment dari tahun ke tahun

sales_year <- aggregate(Sales ~ Year + Segment,
          data = retail_clean, 
          FUN = sum)
sales_year
ggplot(sales_year, aes(x = Year, y = Sales)) +
  geom_col(aes(fill = Segment), position = "dodge") +
  scale_fill_brewer(palette = "Set2")

Dari visualisasi tersebut kita dapat mengetahui bahwa :

  • Segment consumer memilik sales terbesar di tiap tahunnya
  • Sales terbesar diperoleh dari segment consumer pada tahun 2017 yaitu sebesar 331904.70
  • Dari tahun 2015-2017 semua segment mengalami penaikan dari sisi sales
  • Sales segment home office terkecil di tiap tahunnya

3.2 Profit

profit_year <-  aggregate(Profit ~Year + Segment,
          data = retail_clean, 
          FUN = sum)
head(profit_year,n=5)
ggplot(profit_year, aes(x = Year, y = Profit)) +
  geom_col(aes(fill = Segment), position = "dodge") +
  scale_fill_brewer(palette = "Set2")

Dari visualisasi tersebut kita dapat mengetahui bahwa :

  • Segment consumer mengalami penaikan profit dari tahun ke tahun
  • Profit terbesar diperoleh dari segment consumer pada tahun 2017 yaitu sebesar 45568.24
  • Segmen corporate mengelami penuruna profit dari tahun 2016 ke tahun 2017
  • Segment home office menghasilan profit terkecil di tiap tahunnya

3.3 Apakah sales berpengaruh terhadap profit dari perusahaan tersebut???

Dari kedua visualisasi plot diatas kita sekilas dapat melihat bahwa sales berpengaruh terhadap profti dari perusahaan.

Hal tersebut bisa di buktikan dengan fungsi cor

Semakin mendekati 1 menunjukan siginifikansi dari kedua kolom. Tanda - menggambarkan korelasi yang negatif atau berbanding terbalik, apabila tidak ada tanda - maka korelasinya positif

cor(retail_clean$Profit,retail_clean$Sales)
## [1] 0.4790643

Dari hasil tersebut dapat disimpulkan bahwa sales dan profit memiliki korelasi yang positif namun signifikansinya tidak terlalu kuat yaitu sebesar 0.48

3.4 Category

Category apa yang paling banyak terjual dari tahun 2014 sampai 2017?

aggregate(Quantity ~ Category,
          data = retail_clean, 
          FUN = sum)

Office suplies merupakan jenis category yang paling banyak terjual yaitu sebanyak 22906

Apakah office supplies juga yang menghasilkan profit terbanyak? mari kita lihat

aggregate(Profit ~Category,
          data = retail_clean, 
          FUN = sum)

Ternyata walaupun office supplies paling banyak terjual secara quantity-nya, namun category technology menghasilkan profit terbesar selama tahun 2014-2017

4 Conclusion

Perusahaan retail tersebut tahun 2014- 2017 telah menjual produk sebanyak 37873 dengan nilai sales sebesar 2297201 dan menghasilkan profit sebesar 286397. Jenis produk yang di jual perusahaan terdiri dari 3 category yaitu furniture, office suplles, dan technology. Perusahaan retail memiliki 3 segment pasar yang terbagi kedalam segment consumer, home office, dan corporate.

Penjualan di setiap segmentnya memiliki kecenderungan meningkat dari tahun ke tahun dilihat dari sales dan profit tiap tahunnya, artinya perusahaan tersebut memiliki growth yang cukup baik. Sales dan profit terbesar diberikan oleh segment consumer. Office supplies merupakan category yang jumlah penjualan terbanyak secara quantity, namun category technology menghasilkan profit yang paling besar dari kedua category lainnya.