SEPHORA COSMETIC WEBSITE

By Delvia

Photo by Kaleigh Fasanella

1 INTRODUCTION

Sephora Cosmetic Website merupakan situs belanja online berbagai produk-produk kecantikan termasuk skin care dan make up dan berpusat di USA. Toko yang pertama kali dibangun terletak di New York tahun 1998, perusahaan ini kemudian terus berkembang dan kini telah mengoperasikan lebih dari 2.700 retail shop di 35 negara di seluruh dunia, dengan berpusat di lebih dari 500 toko di Amerika, serta situs ecommerce kelas dunia. Beberapa faktor yang menjadikan Sephora Cosmetic menjadi juara industri brand kecantikan di antaranya adalah lingkungan belanja yang interaktif serta inovasi tanpa henti dan terus melakukan perkembangan. Sephora telah diakui oleh Forbes sebagai salah satu yang terbaik di Amerika selama empat tahun berturut-turut, dari tahun 2018-2021.

Sephora telah memelopori penggunaan seluler, menciptakan konten inovatif baik di aplikasi maupun media sosial seperti YouTube, Instagram, Facebook, Twitter, dan TikTok. Pergeseran perilaku konsumen yang dinamis akibat pandemi COVID-19, menghasilkan berbagai kemitraan digital dalam meningkatkan cara pelanggan dalam berbelanja, dengan mengutamakan kemudahan dan kenyamanan, termasuk Facebook Live Shopping, Same Day Delivery, Buy Online Pick Up In Store dan Instagram Checkout.

Dalam evolusi terbaru Color iQ yang menjadi terdepan saat ini di industri, Sephora telah meluncurkan kembali alat pencocokan skin complexion atau corak kulit dengan teknologi AI. Teknologi AI Sephora mencakup penggunaan algoritma dengan kumpulan data eksklusif lebih dari 10000 jenis warna kulit, cocok untuk berbagai rentang warna, serta dipersonalisasikan untuk setiap orang.

Berikut adalah dataset yang digunakan pada pembahasan Rpubs kali ini. Data ini dapat diakses dari Kaggle.

2 DATA PREPARATION

2.1 Prerequisites

2.1.1 Importing Libraries

library(rmdformats)
# for reading data
library(readxl)
# for data wrangling
library(tidyr)
# visualization
library(ggplot2)
library(dplyr)
library(GGally)
library(scales)

2.1.2 Importing Dataset

sephora <- read.csv("data input sephora_website_dataset/sephora_website_dataset.csv") # import dataset
rmarkdown::paged_table(sephora)

Description
- brand : nama brand produk
- category : kategori produk
- name : nama detail produk
- size : ukuran produk
- rating : rating produk
- numberofreviews : jumlah review produk
- love : jumlah orang yang menyukai produk
- price : harga produk
- value_price : harga produk setelah di diskon
- MarketingFlags : marketing Flag produk di website apakah exclusive atau hanya terjual online
- MarketingFlags_content : jenis Marketing Flag produk
- options : aneka pilihan produk yang tersedia di website seperti warna dan ukuran
- details : keterangan detail produk
- howtouse : instruksi cara penggunaan produk
- ingredients : komposisi produk
- online_only : apakah produk hanya terjual online atau tidak
- exclusive : apakah produk hanya terjual eksklusif atau tidak
- limited_edition : apakah produk limited edition atau tidak
- limitedtimeoffer : apakah produk memiliki time limited atau tidak

3 DATA PROCESSING

Dari deskripsi dan hasil inspeksi di atas, kita tidak akan membutuhkan beberapa kolom. Kolom ini tidak terlalu informatif dan dapat kita buang menggunakan fungsi subset(). Kita juga akan mengubah tipe data beberapa kolom menjadi faktor sebgai berikut.

sephora_clean <- sephora[,-c(1,11,14,15,16,18,19,20,21)] # menghapus kolom
sephora_clean$category <- as.factor(sephora_clean$category) #ubah tipe data menjadi factor
sephora_clean$MarketingFlags <- as.factor(sephora_clean$MarketingFlags) #ubah tipe data menjadi factor
sephora_clean$MarketingFlags_content <- as.factor(sephora_clean$MarketingFlags_content) #ubah tipe data menjadi factor

3.1 Missing Value

is.na(sephora_clean) %>% colSums()
#>                  brand               category                   name 
#>                      0                      0                      0 
#>                   size                 rating      number_of_reviews 
#>                      0                      0                      0 
#>                   love                  price            value_price 
#>                      0                      0                      0 
#>         MarketingFlags MarketingFlags_content            ingredients 
#>                      0                      0                      0

Angka 0 menunjukkan bahwa tidak terdapat missing value pada data. Sehingga kita bisa lanjut ke step berikutnya yaitu cek duplikat data.

3.2 Duplicates

anyDuplicated(sephora_clean)
#> [1] 0

Angka 0 menunjukkan bahwa tidak terdapat duplikat pada pada data.

4 EXPLORATORY DATA ANALYSIS

Mari kita lihat persebaran data kita menggunakan fungsi summary()

summary(sephora_clean)
#>     brand                            category        name          
#>  Length:9168        Perfume              : 665   Length:9168       
#>  Class :character   Moisturizers         : 451   Class :character  
#>  Mode  :character   Face Serums          : 384   Mode  :character  
#>                     Value & Gift Sets    : 378                     
#>                     Face Wash & Cleansers: 247                     
#>                     Face Masks           : 230                     
#>                     (Other)              :6813                     
#>      size               rating     number_of_reviews      love        
#>  Length:9168        Min.   :0.00   Min.   :    0.0   Min.   :      0  
#>  Class :character   1st Qu.:4.00   1st Qu.:   10.0   1st Qu.:   1600  
#>  Mode  :character   Median :4.00   Median :   46.0   Median :   4800  
#>                     Mean   :3.99   Mean   :  282.1   Mean   :  16279  
#>                     3rd Qu.:4.50   3rd Qu.:  210.0   3rd Qu.:  13800  
#>                     Max.   :5.00   Max.   :19000.0   Max.   :1300000  
#>                                                                       
#>      price         value_price     MarketingFlags
#>  Min.   :  2.00   Min.   :  2.00   False:4786    
#>  1st Qu.: 24.00   1st Qu.: 25.00   True :4382    
#>  Median : 35.00   Median : 35.00                 
#>  Mean   : 50.06   Mean   : 51.82                 
#>  3rd Qu.: 59.00   3rd Qu.: 60.00                 
#>  Max.   :549.00   Max.   :549.00                 
#>                                                  
#>                  MarketingFlags_content ingredients       
#>  0                          :4786       Length:9168       
#>  exclusive                  :1692       Class :character  
#>  online only                :1528       Mode  :character  
#>  exclusive · online only    : 318                         
#>  limited edition · exclusive: 297                         
#>  limited edition            : 237                         
#>  (Other)                    : 310

Selanjutnya, kita dapat mengecek jumlah data unik pada kolom dengan tipe data faktor.

n_distinct(sephora_clean$category)
#> [1] 143
n_distinct(sephora_clean$MarketingFlags_content)
#> [1] 10
n_distinct(sephora_clean$brand)
#> [1] 324

Ada 143 jenis kategori produk, 10 jenis marketingflags content dan 324 jenis brand produk.

Mari kita lihat frekuensinya persebaran data price secara visual dengan melakukan exploratory visualization. Exploratory visualization adalah visualisasi yang kita lakukan untuk mengenal data kita. Untuk melihat distribusi frekuensi, kita dapat membuat histogram menggunakan fungsi hist().

hist(sephora_clean$price)

Dari grafik histogram, diketahui bahwa nilai price produk paling banyak berada pada < 50 dollar.

5 Explanatory Visualization

Pada laporan ini, kita akan mencoba menganalisis 9168 varian brand kecantikan Sephora yang terjual melalui situs web Sephora Cosmetic. Berdasarkan informasi summary, kita dapat menemukan bahwa parfum adalah kategori produk yang paling banyak terjual, lalu disusul oleh Moisturizers dan face serum. Nilai rata-rata rating untuk seluruh produk adalah sekitar 4 untuk skala 1-5, dimana ada sekitar 16279 pelanggan yang memberikan “love”. Untuk mempermudah dalam membaca trend penjualan, kita dapat melakukan visualisasi seperti di bawah ini.

sephora_brand <- sephora_clean %>% 
      group_by(brand) %>% 
      summarise(count = n()) %>% 
      ungroup() %>% 
      arrange(-count) %>% 
      head(20)
      
      
ggplot(data=sephora_brand, mapping=aes(y= count, x=reorder(brand,count), fill=brand)) +
  geom_bar(stat="identity") +
  scale_fill_hue(c=45, l=80) +
  xlab(NULL) +
  coord_flip()+
  labs(x = "Count",
       y = "Brand",
       title = "Sephora Cosmetic: Ranking Brand Produk")+
  theme(legend.position="none")

Dari visualisasi di atas, dapat terlihat lebih jelas bahwa SEPHORA COLLECTION merupakan brand yang paling banyak terjual, diikuti CLINIQUE dan tarte. Selanjutnya, mari kita lihat rangking kategori produk dengan visualisasi di bawah ini.

sephora_category <- sephora_clean %>% 
      group_by(category) %>% 
      summarise(count = n()) %>% 
      ungroup() %>% 
      arrange(-count) %>% 
      head(20)
      
ggplot(data=sephora_category, mapping=aes(y= count, x=reorder(category,count), fill=category)) +
  geom_bar(stat="identity") +
  scale_fill_hue(c=45, l=80) +
  xlab(NULL) +
  coord_flip()+
  labs(x = "Count",
       y = "Category",
       title = "Sephora Cosmetic: Ranking Kategori Produk")+
  theme(legend.position="none")

ggplot(data = sephora_clean, mapping = aes(x = rating)) +
  geom_histogram(fill = "#7393B3") +
  
  labs(x = "rating",
     y = "Frequency",
     title = "Sephora Cosmetic: Rating Distribution")+
  
  theme(legend.position="none")

Terlihat bahwa para pelanggan condong memberikan nilai yang cukup tinggi, yaitu di sekitar 4 s.d 4.5. Meskipun demikian, beberapa kritikus berani memberi nilai di bawah 1

sephora_rating <- sephora_clean %>% 
      group_by(category) %>% 
      summarise(mean_rating=mean(rating)) %>%
      mutate_if(is.numeric, round,
            digits=1) %>% 
      ungroup() %>% 
      arrange(-mean_rating) %>% 
      head(20)
      
ggplot(data=sephora_rating, mapping=aes(x= mean_rating, y=reorder(category,mean_rating))) + #u/ ubah urutan bar nya dri kecil ke besar, freq nya dikasih minus (-)
  geom_col(mapping = aes(fill=mean_rating)) +
  geom_text(mapping=aes(label=mean_rating), color="white", nudge_x=-1) + #u/ ubah warna angka nya jadi putih, lalu digeser ke kiri sbnyak 1 satuan pakai -1 
  scale_fill_gradient(low="lightblue", high="darkblue") + #lihat cheatsheet di grdevices
  labs(x = "Rating",
       y = "Category VS Rating",
       title = "Sephora Cosmetic: Ranking Kategori Produk Berdasarkan Rating")+
  theme(legend.position="none")

Berdasarkan nilai rating, kategori yang memiliki nilai rating tertinggi adalah Lid shadow brush, kemudian Cologne dan Wellness.

Agar dapat membandingkan jumlah reviewer dan jumlah love dengan lebih terperinci, mari kita gunakan boxplot

score_longer <-
  pivot_longer(data = sephora_clean[, c("number_of_reviews", "love")], 
               cols = c("number_of_reviews", "love"),
               names_to = "variable", values_to = "value")

score_longer$variable <- ifelse(score_longer$variable == "number_of_reviews", 
                                yes = "number_of_reviews", 
                                no = "love")

score_longer
#> # A tibble: 18,336 × 2
#>    variable          value
#>    <chr>             <int>
#>  1 number_of_reviews     4
#>  2 love               3002
#>  3 number_of_reviews    76
#>  4 love               2700
#>  5 number_of_reviews    26
#>  6 love               2600
#>  7 number_of_reviews    23
#>  8 love               2900
#>  9 number_of_reviews     2
#> 10 love                943
#> # … with 18,326 more rows
ggplot(data = score_longer, mapping = aes(x = variable, y = value)) +
  geom_boxplot(fill = "#7393B3", color = "#36454F") +
  coord_flip() +
  
  labs(x = "",
       y = "Score",
       title = "Sephora Cosmetic: Score Distribution Comparison",
       subtitle = "Rating vs. Love Score") +
  
  theme_light()

Dari visualisasi di atas, kita dapat menarik informasi:
- Median, median number_of_reviews lebih rendah daripada love
- IQR/Lebar Kotak, kotak love lebih lebar daripada kotak number_of_reviews, yang berarti jumlah love lebih variatif sementara number_of_reviews lebih terpusat
- Outlier, outlier pada number_of_reviews tidak ada, sedangkan outlier pada love ada namun jumlahnya sedikit, yang berarti ada sedikit pelanggan yang memberikan nilai love tinggi

sephora_love <- sephora_clean %>% 
      group_by(category) %>% 
      summarise(sum_love=sum(love)) %>%
      ungroup() %>% 
      arrange(-sum_love) %>% 
      head(20)
      
ggplot(data=sephora_love, mapping=aes(y= sum_love, x=reorder(category,sum_love), fill=category)) + #u/ ubah urutan bar nya dri kecil ke besar, freq nya dikasih minus (-)
  geom_bar(stat="identity") +
  scale_fill_hue(c=45, l=80) +
  xlab(NULL) +
  coord_flip()+
  labs(x = "Love",
       y = "Category VS Jumlah love",
       title = "Sephora Cosmetic: Ranking Kategori Produk Berdasarkan jumlah love")+
  theme(legend.position="none")

Berdasarkan nilai love, kategori yang memiliki nilai rating tertinggi diantaranya adalah lipstick, Foundation, dan eye pallettes

compare_marketing <- aggregate(price~category+MarketingFlags,
      sephora_clean,
      FUN=sum)

compare_marketing <- compare_marketing %>%
     group_by(category) %>%
     slice(which.max(price))

compare_marketing_order <- compare_marketing[order(compare_marketing$price, decreasing =T),]
marketing_flags_true <- compare_marketing_order[compare_marketing_order$MarketingFlags=="True",]
head(marketing_flags_true)
#> # A tibble: 6 × 3
#> # Groups:   category [6]
#>   category                  MarketingFlags  price
#>   <fct>                     <fct>           <dbl>
#> 1 Value & Gift Sets         True           20111.
#> 2 Perfume Gift Sets         True            8134 
#> 3 Eye Palettes              True            6326.
#> 4 Rollerballs & Travel Size True            4619 
#> 5 Anti-Aging                True            4482 
#> 6 Candles & Home Scents     True            3765
marketing_flags_false <- compare_marketing_order[compare_marketing_order$MarketingFlags=="False",]
head(marketing_flags_false)
#> # A tibble: 6 × 3
#> # Groups:   category [6]
#>   category                MarketingFlags  price
#>   <fct>                   <fct>           <dbl>
#> 1 Perfume                 False          52201 
#> 2 Moisturizers            False          20166.
#> 3 Face Serums             False          17409 
#> 4 Cologne                 False          12548 
#> 5 Eye Creams & Treatments False           8827 
#> 6 Face Masks              False           6128.

Dari 143 kategori produk, 62 produk diantaranya mengalami peningkatan penjualan dengan teknik MarketingFlags, diantaranya adalah Value & Gift Sets, Perfume Gift Sets, Eye Palettes, Rollerballs & Travel Size dan Anti-Aging. Sisanya ada 81 kategori yang tidak memerlukan teknik MarketingFlags untuk meningkatkan penjualan, diantaranya adalah Perfume, Moisturizers, Face Serums, Cologne dan Eye Creams & Treatments.

Jika ditelusuri lebih dalam, kita akan mencari MarketingFlags_content manakah yang paling meningkatkan penjualan

marketing_content_true <- sephora_clean[sephora_clean$MarketingFlags=="True",]

compare_marketing_content <- aggregate(price~MarketingFlags_content,
      marketing_content_true,
      FUN=sum)

compare_marketing_content <- compare_marketing_content %>%
     group_by(MarketingFlags_content) %>%
     slice(which.max(price))

compare_marketing_content_order <- compare_marketing_content[order(compare_marketing_content$price, decreasing =T),]
head(compare_marketing_content_order)
#> # A tibble: 6 × 2
#> # Groups:   MarketingFlags_content [6]
#>   MarketingFlags_content         price
#>   <fct>                          <dbl>
#> 1 online only                   95412.
#> 2 exclusive                     55127.
#> 3 limited edition · online only 12596.
#> 4 exclusive · online only       12436.
#> 5 limited edition               11641 
#> 6 limited edition · exclusive   10964

Dari 9 jenis teknik MarketingFlags_content, teknik Online only adalah yang paling banyak meningkatkan penjualan, lalu di peringkat kedua dan ketiga adalah teknik marketing untuk produk-produk exclusive dan limited edition-online only.

Mari kita visualisasikan menggunakan geom_point() berdasarkan rating produk. Kali ini kita akan menggunakan fungsi geom_label_repel() dari library ggrepel untuk membuat label brand. Selain itu, karena sumbu y merupakan angka, kita akan menggunakan fungsi scale_y_continuous() untuk mengatur skala pada sumbu y agar label tidak terlalu berdempetan.

top_love_score <- marketing_content_true[order(marketing_content_true$love, decreasing=T),]
top_love_score <- head(top_love_score,10)
library(ggrepel)

ggplot(data = top_love_score, mapping = aes(x = rating, y = love)) +
  geom_point(size = 3) +
  geom_label_repel(aes(label = brand), 
                   size = 3.5,
                   segment.size = 0.1,       # ukuran garis label
                   segment.color = "black",  # warna garis label
                   fill = "tomato",          # warna isi kotak label
                   color = "white",          # warna teks
                   box.padding = 0.6) +      # jarak antar kotak
  
  scale_y_continuous(limits = c(300000, 1500000)) +
  
  labs(x = "Rating",
       y = "Love score",
       title = "Sephora Cosmetic: Recommended brand by love score") +
  
  theme_light()

top_overall <- marketing_content_true[marketing_content_true$love >= 300000, ]
top_overall <- top_overall[order(top_overall$love, decreasing=T),]
ggplot(data = top_overall, mapping = aes(x = price, y = love)) +
  geom_point(aes(size = rating)) +
  geom_label_repel(data = head(top_overall, 4),
                   mapping = aes(label = name),
                   size = 3.5,
                   segment.size = 0.1,
                   segment.color = "black",
                   fill = "tomato",
                   color = "white",
                   box.padding = 0.7) +
  
  scale_x_continuous(breaks = seq(10, 50, 5)) +
  
  labs(x = "price",
       y = "Love score",
       size = "rating",
       title = "Sephora Cosmetic: Recommended Product Name by Rating & Love") +
  
  theme_light()

Dari visualisasi di atas, dapat kita lihat bahwa terdapat empat titik dengan love terbesar pada garis teratas, yang berarti keempat titik ini memiliki love skor tertinggi dari para pelanggan. Keempat nama produk tersebut adalah:
- Everlasting Liquid Lipstick: brand KVD Vegan Beauty
- Cream Lip Stain Liquid Lipstick: brand SEPHORA COLLECTION
- Pro Filt’r Soft Matte Longwear Foundation: brand FENTY BEAUTY by Rihanna
- Obsessions Eyeshadow Palette : brand HUDA BEAUTY

6 Conclusion

Dari hasil analisa dan visualisasi tersebut, banyak informasi yang dapat diperoleh, seperti adanya perbedaan distribusi harga produk dan nilai rating produk serta Ranking Brand produk, Kategori produk berdasarkan nilai count, rating dan jumlah love. Selain itu, juga dilakukan rekomendasi brand dan nama produk berdasarkan nilai rating dan jumlah love dari pelanggan.