1 Preface

1.1 Pendahuluan

Dalam menjalankan marketing research banyak hal yang dilakukan demi menarik perhatian dari konsumen. Mulai dari memberikan tampilan platform yang menarik, menambahkan fitur yang sesuai dengan keinginan konsumen, hingga kemudahan yang diberikan ketika konsumen ingin melakukan suatu transaksi. Namun, dalam menjalankannya seringkali banyak cost yang akan dikeluarkan dibandingkan outcome yang diharapkan.

Statistika merupakan salah satu alat yang paling penting dalam melakukan suatu penelitian. Tidak hanya dalam penelitian ilmiah, namuan statistika dapat dimanfaatkan dalam dunia marketing. Salah satunya yaitu mengevaluasi marketing research yang sedang dilakukan. Salah satu metode statistika yang dapat dimanfaatkan terutama dalam menguji keefektifitasan suatu treatment yang dilakukan yaitu A/B testing.

Materi ini bertujuan memberikan pemahaman kepada peserta workshop terkait penggunaan A/B testing dalam mengevaluasi performa dalam landing page. Adapun setelah mempelajari materi ini peserta diharapkan dapat memahami kegunaan dan potensi pemanfaatan A/B testing sesuai dengan proses bisnis yang ada di bidang industri yang dijalani oleh peserta.

1.2 Library dan Setup

Untuk dapat mengikuti materi ini, peserta diharapkan sudah menginstall beberapa packages di bawah ini. Apabila package tersebut belum terinstall, silahkan jalankan chunk atau baris kode berikut. Apabila sudah ter-install, lewati chunk berikut dan muat package yang dibutuhkan dengan menjalankan chunk selanjutnya.

# install.packages(c("tidyverse","rmarkdown", "lubridate", plotly", "scales", "glue"))
# data cleaning
library(tidyverse)
library(lubridate)

# visualization
library(plotly)
library(scales)
library(glue)

2 Measure of Central Tendecy

measure of central tendency (ukuran pemusatan data) adalah suatu nilai yang cukup untuk mewakili seluruh nilai pada data. Ukuran pemusatan data biasanya digunakan untuk melihat gambaran dari data secara general seperti apa. Oleh karena itu, nilai ukuran pemusatan data dibuat agar memperoleh informasi yang cukup untuk mewakili seluruh nilai yang ada pada data. Ada beberapa acuan yang dapat digunakan untuk menggambarkan data secara umum; yaitu: mean, median, dan modus.

2.1 Mean

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

  • Formula:

\[\bar x = \frac{\sum{x_i}}{n}\]

  • Fungsi pada R: mean()

Contoh:

Dalam 20 hari terakhir, 2 jenis emiten saham memiliki perubahan harga. Apabila terdapat orang awam yang menanyakan gambaran harga saham dari kedua emiten tersebut, bagaimanakah sebaiknya kita memberikan informasi?

saham_A <- c(1000,1200,1100,1400,1500,1450,1300,1250,1400,1500,2000,1900,1800,1750,1500,1900,1850,1000,1900, 1850)
saham_B <- c(1000,999,995,1001,990,1002,998,1001,1010,1012,1011,989,1012,1010,1013,995,994,990,1000,1015)

Disini kita dapat memanfaatkan nilai mean / rata-rata untuk menggambarkan besaran harga saham dalam 20 hari terakhir yang sudah kita ketahui.

mean(saham_A)
#> [1] 1527.5
mean(saham_B)
#> [1] 1001.85

Dapat disimpulkan bahwa berdasarkan pergerakan harga saham dalam 20 hari terakhir, harga saham B lebih kecil dibandingkan harga saham A dengan besara 1001.85. Sedangkan harga saham A memiliki nilai sekitar 1527.5.

  • Karakteristik dari mean

Tidak cocok untuk mendeskripsikan suatu data ketika data tersebut terdapat nilai ekstrem atau outlier karena hasil mean akan sangat bias bisa saja lebih kecil dari data general atau lebih besar. Solusinya jika kita ingin mendeskripsikan data namun terdapat nilai ekstrem kita bisa menggunakan menggunakan nilai trimmed mean atau nilai median.

Outlier adalah nilai ekstrim yang jauh dari observasi lainnya. Kurang tepat apabila menggunakan nilai mean yang diketahui ada data outliernya.

Contoh lain:

Ada emiten lain yang mana terdapat harga saham yang tiba-tiba melonjak turun dalam kurun waktu 20 hari terakhir.

Dengan nilai mean:

saham_C <- c(4600,4500,4660,4770,4600,4660,4800,4890,4300,4500,4550,4670,4620,4700,4600,4620,4500,2300,2400,2110)
mean(saham_C)
#> [1] 4267.5

Apakah nilai mean di atas dapat diandalkan?

Tidak dapat diandalkan, karena rata-rata sensitif terhadap nilai outlier, jika dilihat terdapat outlier pada 3 hari terakhir.

Masalah ini dapat diatasi oleh nilai median.

2.1.1 Boxplot

Boxplot merupakan plot yang menggambarkan sebaran data

Beberapa hal yang harus diperhatikan dalam boxplot:

  1. Bila nilai median (Q2) semakin mendekati Q1 tandanya data mengumpul di bagian bawah (kiri), begitu juga sebaliknya
  2. Banyaknya data dari Q1 ke nilai minimum adalah 25%
  3. Banyaknya data dari Q3 ke nilai maksimum adalah 25%
  4. Banyaknya data dari Q1 ke nilai Q3 (IQR) adalah 50 %
boxplot(saham_C, horizontal = T)$out

#> [1] 2300 2400 2110

2.2 Median

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

  • Baik untuk data yang memiliki outlier atau berdistribusi skewed (condong kiri/kanan)
  • Fungsi pada R: median()

Mari hitung ulang nilai pusat data saham_C dengan median:

median(saham_C)
#> [1] 4600

Nilai mean saham C = 4267.5, sedangkan median profit = 4600

# opsional: cara kerja nilai median
sort(saham_C)
#>  [1] 2110 2300 2400 4300 4500 4500 4500 4550 4600 4600 4600 4620 4620 4660 4660
#> [16] 4670 4700 4770 4800 4890

Kesimpulan: Pemusatan data saham_C lebih baik diwakilkan dengan nilai median

Cek distribusi data (histogram akan dibahas lebih dalam di course Data Visualization):

# run chunk keseluruhan secara bersamaan
hist(saham_C, breaks = 25)
abline(v = mean(saham_C), col = "red")
abline(v = median(saham_C), col = "blue")

2.3 Modus (Mode)

Modus untuk mencari nilai data yang paling sering muncul. Biasanya digunakan untuk data yang kategorik.

  • R tidak memiliki fungsi built-in

Contoh:

Dalam satu hari teradapat beberapa transaksi pembelian saham dari berbagai jenis emiten. Berikut data yang diperoleh.

df <- data.frame("jenis_emiten" = c("TLKM", "BBCA", "BBRI", "TLKM", "TLKM", "BBCA", "TLKM", "ANTM", "BBCA", "TLKM", "TLKM"))
df

Berdasarkan informasi tersebut, jika kita diminta untuk memberikan gambaran transaksi terbanyak, kita dapat menggunakan nilai modus.

Dengan kata lain: untuk masing-masing jenis_emiten ada berapa transaksi yang terjadi?

sort(table(df$jenis_emiten), decreasing=TRUE)
#> 
#> TLKM BBCA ANTM BBRI 
#>    6    3    1    1

Artinya dapat disimpulkan bahwa transaksi yang lebih banyak terjadi dalam 1 hari tersebut adalah pada emiten TLKM.

Kita juga 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():

most(df$jenis_emiten)
#> [1] "TLKM"

3 Inference Statistics

3.1 Probability Mass Function

Probabilitas yang digunakan ketika data yang dimiliki adalah data diskrit. Contoh data diskrit : banyak student, banyak barang yang dibeli, dsb. Misalkan kita ingin mencari peluang muncul dadu, jumlah pemain yang mengalami cidera, travel booking tiap customer, banyak nya produk yang terjual, dll.

Contoh kasus :

Dalam satu hari banyak terjadi transaksi jual beli saham. Dengan adanya fitur tambahan pada aplikasi broker yaitu berita terkini mengenai saham, terdapat beberapa pengguna yang memutuskan untuk melakukan transaksi beli saham. Berdasarkan 100 user yang ada, ternyata terdapat 80 user yang memutuskan melakukan transaksi, sedangkan 20 user yang lain hanya sebatas membuka aplikasi saja. Berapakah proporsi user yang melakukan transaksi?

Untuk mencari peluang data diskrit dapat dicari dengan formula: \(p(P) = \frac{n}{S}\)

dimana :

  • \(p(P)\) : peluang kejadian yang ingin dicari
  • \(n\) : banyaknya kejadian yang ingin dicari peluangnya
  • \(S\) : total seluruh kejadian yang ada

Diketahui:

  • jumlah user: 100
  • user melakukan transaksi: 80
  • user tidak melakukan transaksi: 20
80/100
#> [1] 0.8

3.2 Normal Distribution

Karakteristik:

  • Kurva berbentuk lonceng simetris, artinya puncaknya adalah titik pusat (mean = median)
  • Luas area di bawah kurva = 1 (menyatakan probabilitas)
  • Persebaran data:
    • 68% data berada di rentang +- 1 standar deviasi dari mean
    • 95% data berada di rentang +- 2 standar deviasi dari mean
    • 99.7% data berada di rentang +- 3 standar deviasi dari mean
  • Standar normal baku adalah distribusi normal dimana mean = 0 dan standar deviasi = 1.

Distribusi normal banyak digunakan pada inferensial statistik karena dicetuskannya Central Limit Theorem. Semakin bertambahnya jumlah sampel yang diambil secara acak (random), maka distribusi rata-rata sampel akan mengikuti distribusi normal.

Kunjungi link berikut untuk mengerti lebih dalam terkait Central Limit Theorem melalui animasi: https://seeing-theory.brown.edu/probability-distributions/index.html

3.3 Uji Hipotesis

Uji hipotesis bertujuan untuk menguji dugaan. Uji hipotesis sering disebut juga sebagai uji signifikansi yang digunakan untuk menguji apakah suatu treatment memberikan perubahan/pengaruh signifikan terhadap suatu kondisi.

Istilah-istilah:

  • Hipotesis: dugaan sementara terhadap populasi yang harus diuji kebenarannya
  • \(H_0\) / hipotesis nul: dugaan awal sebelum dilakukan pengujian, selalu memiliki unsur tanda kesamaan (=, >=, <=)
  • \(H_1\) / hipotesis alternatif: dugaan yang berlawan dari \(H_0\)
  • \(\alpha\): tingkat signifikansi yaitu tingkat kesalahan yang masih bisa ditoleransi
  • \(1-\alpha\): tingkat kepercayaan (confidence level)
  • \(p-value\): hasil perhitungan statistik yang menunjukkan peluang data sampel terjadi dengan kondisi H0.

Pengambilan kesimpulan:

  • Jika \(p-value\) < \(\alpha\), maka tolak \(H_0\)
  • Jika \(p-value\) > \(\alpha\), maka gagal tolak \(H_0\)

Contoh hipotesis:

  1. Hipotesis dua arah (!=)
  • \(H_0\): Pemakaian masker tidak memberikan pengaruh pada laju penyebaran virus corona (=)
  • \(H_1\): Pemakaian masker memberikan pengaruh pada laju penyebaran virus corona (!=)
  1. Hipotesis satu arah (<)
  • \(H_0\): Penambahan kasir tidak memberikan perbedaan durasi pembayaran (>=)
  • \(H_1\): Penambahan kasir menurunkan durasi pembayaran (<)
  1. Hipotesis satu arah (>)
  • \(H_0\): Penerapan diskon tidak memberikan perbedaan jumlah pembelian produk (<=)
  • \(H_1\): Penerapan diskon meningkatkan jumlah pembelian produk (>)

4 A/B Testing

A/B testing adalah suatu kerangka kerja untuk menguji apakah strategi alternatif lebih baik dalam menghasilkan efek tertentu atau mencapai tujuan. A/B testing akan dimulai dengan menguji ide baru, menjalankan eksperimen, menganalisis output secara statistik lalu melihat apakah desainnya berbeda secara signifikan atau tidak. Setelah menentukan strategi mana yang lebih baik, proses A/B testing akan dilanjutkan dengan mengeksplorasi dan memperbarui ide baru. Pembaruan di sini dapat digunakan untuk meningkatkan pembaruan kecil sebelum mengambil keputusan akhir.

A/B testing sangat umum di bidang teknologi informasi, terutama yang terkait dengan pengembangan web, pengalaman pengguna, dan pemasaran digital. Misalnya, Facebook telah mengubah halaman arahannya beberapa kali di masa lalu. Pada gambar berikut, terdapat dua jenis halaman arahan Facebook. Sebagai manajer produk Facebook, Anda ingin mengajak sebanyak mungkin orang untuk bergabung dan membuat akun baru untuk Facebook. Anda dapat menggunakan A/B testing untuk melihat halaman arahan mana yang akan memberi Anda lebih banyak conversion rate.

Conversion rate situs web adalah salah satu metrik untuk A/B testing. Memahami Key Performance Index (KPI) untuk kasus bisnis adalah penting karena ada banyak faktor yang dapat dievaluasi. Mengidentifikasi KPI yang bermakna adalah kunci A/B testing karena A/B testing harus menjalankan eksperimen secara efektif untuk mendapatkan data yang memadai.

Dengan merancang alur kerja A/B testing yang tepat, perusahaan dapat mencapai hasil yang lebih baik dan dapat menyenangkan konsumen dengan lebih baik. A/B testing dimulai dengan menentukan tujuan bisnis yang ingin dicapai. Misalnya, sebagai karyawan Youtube ingin orang menghabiskan lebih banyak waktu dan meningkatkan waktu menonton mereka di Youtube. Kita ingin menguji tampilan baru aplikasi seluler Youtube yang memiliki algoritma dalam merekomendasikan video yang baru. Kemudian, user Youtube akan diarahkan secara acak ke aplikasi lama, sedangkan sisanya akan diarahkan ke tampilan baru. Pengambilan sampel user secara acak ini dilakukan untuk menghindari bias dalam pemilihan user. Dalam beberapa waktu kita akan memantau lama waktu menonton setiap tampilan, katakanlah selama seminggu. Kemudian, kita akan mengevaluasi dengan menggunakan pengujian hipotesis tampilan mana yang memiliki kinerja lebih baik dan seberapa baik itu. Apakah hal tersebut akan sama dengan resiko yang diberikan? Apakah tampilan yang baru memberikan efek sedikit saja atau bahkan lebih baik dibandingkan dengan tampilan yang lama?

Berikut ini beberapa alur kerja A/B testing yang digunakan ketika ingin menjalankan pengujian:

  • Data collection Dalam melakukan pengujian, data yang tepat sasaran cukup penting dalam mengoptimalkan hasil pengujian. Misalnya ingin mengoptimalkan conversion rate, maka bisa dicoba mengoptimalkan halaman yang memiliki tingkat coversion rate yang cukup rendah.

  • Identify goals Dalam mengoptimalkan conversion rate, Anda perlu mencari tahu metrik apa yang akan digunakan untuk menentukan variasi halaman yang baru lebih berhasil dengan yang lama. Sebagai contoh, variasi halaman baru dikatakan berhasil ketika seorang user melakukan klik subscribe pada suatu landing page yang baru.

  • Generate Hypothesis Setelah memperoleh tujuan, perlu dibuatlah sebuah hipotesis dalam A/B testing untuk memberikan sebuah alasan mengapa variasi baru lebih baik dibandingkan yang lama.

  • Create Variations Pada tahap ini, A/B testing dapat digunakan untuk melakukan perubahan atau variasi pada objek pengujian, misalnya menambahkan tampilan baru pada landing page.

  • Run Experiment Saat menjalankan pengujian, diperlukan beberapa waktu, misalnya satu minggu atau satu bulan agar mngetahui interaksi dari user terhadap landing page tersebut. Setiap user akan dipilih secara acak untuk masuk pada landing page yang lama atau yang baru. Dari sini, setiap aktifitas user akan dianalisa untuk mengetahui keefektifitasannya.

  • Analyze Result Setelah pengujian dilakukan, maka terakhir yaitu menganilisis hasil. Apakah hipotesis awal yang dibuat sesuai dengan hasil? Apakah variasi landing page baru memiliki kinerja yang cukup signifikan dalam meningkatkan conversion rate secara statistik?

4.1 Studi Kasus: A/B Testing for Evaluating Landing Page Performance

Pada A/B testing kali ini akan digunakan data sebuah landing page dari Udacity Course. Adapun berikut data yang akan digunakan.

data_ab <- read.csv("data_input/ab_data.csv", stringsAsFactors = F)
head(data_ab)

Berikut deskripsi dari data_ab:

  • user_id : id unik dari user
  • timestamp : catatan waktu dari user ketika mengunjungi landing page
  • group : apakah kelompok user termasuk dalam control group atau treatment group
  • landing_page : landing page yang dilihat user
  • converted : apakah user mengkonversi atau berlangganan secara khusus atau tidak

Berdasarkan data tersebut, kita ingin mengetahui apakah penggunaan varian pada landing page yang baru dapat meningkatkan nilai conversion rate oleh user. Berdasarkan alur kerja A/B testing, berikut ini beberapa variabel yang akan dipertimbangkan:

  1. Data collection: menggunakan data landing page lama dan baru pada Udacity Course
  2. Identify goals: menggunakan landing page yang baru apakah dapat meningkatkan conversion rate?
  3. Hipotesis: menggunakan landing page yang baru akan meningkatkan conversion rate
  4. Variabel dependen: user akan melakukan subscribe course pada landing page
  5. Variabel independen: landing page dengan variasi yang berbeda

Sebelum melakukan pengujian, data akan terlebih dahulu dilakukan data wrangling dan eksplorasi data untuk mengetahui perbedaan jumlah user yang termasuk grup control maupun treatment.

4.1.1 Data Wrangling

Untuk dapat menganalisa conversion rate dengan baik, kita akan coba melakukan wrangling data untuk menambahkan informasi pada data.

data_ab <- data_ab %>% 
  mutate(day = wday(timestamp, label = T, abbr = T),
         hour = hour(timestamp),
         month = month(timestamp, label = T, abbr = T),
         landing_page = str_replace(landing_page, "_", " ") %>% 
           str_to_title()) %>% 
  mutate_if(is.character, as.factor)
summary(data_ab)
#>     user_id                            timestamp            group       
#>  Min.   :630000   2017-01-02 13:42:05.378582:     1   control  :147202  
#>  1st Qu.:709032   2017-01-02 13:42:15.234051:     1   treatment:147276  
#>  Median :787934   2017-01-02 13:42:21.786186:     1                     
#>  Mean   :787974   2017-01-02 13:42:26.640581:     1                     
#>  3rd Qu.:866912   2017-01-02 13:42:27.851110:     1                     
#>  Max.   :945999   2017-01-02 13:42:28.522322:     1                     
#>                   (Other)                   :294472                     
#>    landing_page      converted       day             hour      
#>  New Page:147239   Min.   :0.0000   Sun:40436   Min.   : 0.00  
#>  Old Page:147239   1st Qu.:0.0000   Mon:46060   1st Qu.: 6.00  
#>                    Median :0.0000   Tue:47777   Median :12.00  
#>                    Mean   :0.1197   Wed:40122   Mean   :11.51  
#>                    3rd Qu.:0.0000   Thu:39739   3rd Qu.:17.00  
#>                    Max.   :1.0000   Fri:40159   Max.   :23.00  
#>                                     Sat:40185                  
#>      month       
#>  Jan    :294478  
#>  Feb    :     0  
#>  Mar    :     0  
#>  Apr    :     0  
#>  May    :     0  
#>  Jun    :     0  
#>  (Other):     0

Yang menarik pada sampel data ini yaitu data diambil pada bulan Januari saja.

Cek terlebih dahulu apakah terdapat duplicasi pada data yang ada.

data_ab %>% duplicated() %>% sum()
#> [1] 0

Terlihat bahwa data_ab terbebas dari duplikasi, maka selanjutnya kita akan coba mengetahui lebih dalam banyaknya user yang termasuk grup control dan treatment.

table("Group" = data_ab$group, "Landing Page" = data_ab$landing_page)
#>            Landing Page
#> Group       New Page Old Page
#>   control       1928   145274
#>   treatment   145311     1965

Terlihat bahwa masih terdapat beberapa user yang masuk pada landing page yang keliru, oleh sebab itu akan dicoba filter data untuk mengambil data yang tepat.

data_ab_clean <- data_ab %>% 
  filter((group == "control" & landing_page == "Old Page") |
           (group == "treatment" & landing_page == "New Page")
           )

Apabila sudah, maka dilanjutkan dengan pengecekan missing value.

anyNA(data_ab_clean)
#> [1] FALSE

4.1.2 Data Exploration

KPI di sini akan menganalisis seberapa banyak user yang melakukan konfersi dengan berlangganan (subscribe) pada dua jenis landing page yang berbeda. Hasil analisa nantinya akan digunakan untuk menjawab apakah dengan adanya pembaruan landing page akan meningkatkan conversion rate user. Perbedaan pemberian landing page pada setiap user yang akan dianalisa untuk mengetahui perbedaannya. Perlu diingat bahwa setiap user dipilih secara acak untuk masuk pada landing page baru ataupun yang lama. Landing page yang baru akan dimasukkan sebagai grup treatment sedangkan landing page lama akan dijadikan sebagai grup control.

Kita akan coba cek terlebih dahulu proporsi untuk masing-masing grup.

prop.table(table(data_ab_clean$group))
#> 
#>   control treatment 
#> 0.4999363 0.5000637

Jika dilihat dari proporsi masing-masing grup masih cukup seimbang pada nilai 50%:50%. Hal ini cukup baik dalam pengujian yang akan dilakukan.

Selanjutnya kita coba cek nilai conversion rate berdasarkan waktu per jam dan per hari untuk setiap user untuk melihat apakah terdapat waktu khusus dimana nilai conversion rate meningkat.

data_ab_clean %>% 
  group_by(day, hour, landing_page) %>% 
  summarise(converted = mean(converted)) %>% 
  ungroup() %>% 
  ggplot(aes(hour, day)) +
  geom_tile(aes(fill = converted)) +
  scale_fill_gradient(low = "firebrick", high = "pink", 
                    labels = scales::percent_format(accuracy = 1)) +
  scale_x_continuous(breaks = seq(0,22,2)) +
  facet_wrap(~landing_page, nrow = 2) +
  labs(y = NULL, title = "Convertion Rate", fill = NULL) +
  theme_minimal()+
  theme(legend.key.width = unit(15, "mm"),
        legend.position = "top",
        plot.title = element_text(hjust = 0.5))

Berdasarkan visualisasi conversion rate diatas ternyata tidak terdapat waktu spesifik yang membuat nilai conversion rate meningkat baik pada landing page lama maupun baru.

Tidak adanya pola tersebut bisa saja disebabkan oleh:

  • Udacity course dapat diakses oleh seluruh user didunia yang bisa saja memiliki zona waktu berbeda
  • Kegiatan seorang user yang berbeda menyebabkan tidak adanya pola khusus dalam mengakses halaman course
  • Banyaknya pilihan course yang disediakan dapat menyebabkan user ingin mengetahui lebih dalam isi dari course sebelum memutuskan untuk melakukan subscribe

Tujuan pada suatu website yang menyediakan course pembelajaran yaitu user bisa berlangganan course yang disajikan. Metrik yang menunjukkan bahwa halaman landing page berhasil meningkatkan conversion rate dapat dianalisis berdasarkan jumlah user yang melakukan konversi (subscribe).Kita akan menghitung persentase user yang berlangganan berdasarkan landing page yang ada.

prop.table(table(data_ab_clean$converted))*100
#> 
#>        0        1 
#> 88.04033 11.95967

Berdasarkan seluruh user yang ada, ternyata hanya sebesar 11.96% yang berlangganan. Angka tersebut masih sangat kecil dibandingkan dari user yang memilih tidak berlangganan. Apabila dilihat dari persentase conversion rate berdasarkan jenis landing page yang ada sebagai berikut.

ratio_per_group <- data_ab_clean %>% 
  group_by(landing_page, converted) %>% 
  summarize(count =n()) %>% 
  mutate(percentage = round(count/sum(count)*100,2)) %>% 
  ungroup() 

ratio_per_group

Untuk kedua jenis landing page, jumlah user yang berlangganan hampir sama yaitu sekitar ~12% walaupun secara angka pastinya lebih tinggi landing page yang lama.

4.1.3 Analisis Probability

Hal pertama untuk melihat perbedaan antara dua jenis landing page yaitu akan dilihat distribusi untuk masing-masing jenis landing page dan melihat seberapa jauh kesenjangan untuk kedua jenis landing page.

Persentase user memutuskan berlangganan untuk kedua jenis landing page cukup berbeda sekita 0.16% lebih tinggi halaman yang lama. Untuk lebih memastikan adanya perbedaan tersebut, kita dapat menggunakan bootstrap untuk meningkatkan pandangan kita seberapa kecil angka ini mempengaruhi masa depan.

Pertama, kita akan membagi data menjadi dua kelompok. User di grup control (old page) dan di grup treatment (new page) akan ditugaskan ke grupnya masing-masing.

old_page <- data_ab_clean %>%
  filter(landing_page == "Old Page")

new_page <- data_ab_clean %>%
  filter(landing_page == "New Page")

Prosedur bootstrap akan mereplikasi data dengan mengizinkan adanya replikasi. Untuk mendapatkan kepercayaan lebih iterasi akan direplikasi ke 5000 sampel.

sampling <- 5000
old_page_new <- NULL 
new_page_new <- NULL
set.seed(100)

for(i in 1:sampling)
{
   n_old <- length(old_page$converted)
boot_old <- old_page[sample(1:n_old,replace=TRUE),]
old_page_number <- sum(boot_old$converted == 1)/n_old

old_page_new <- c(old_page_new,old_page_number) 
} 

for(i in 1:sampling)
{
   n_new <- length(new_page$converted)
boot_new <- new_page[sample(1:n_new,replace=TRUE),]
new_page_number <- sum(boot_new$converted == 1)/n_new

new_page_new <- c(new_page_new,new_page_number) 
}
# saveRDS(new_page_new, "data_input/data_new3.rds")
# saveRDS(old_page_new, "data_input/data_old3.rds")
data_new <- readRDS("data_input/data_new3.rds")
data_old <- readRDS("data_input/data_old3.rds")
data_converted <- data.frame(
  landing_page = c( rep("Old Page", length(data_old)), rep("New Page", length(data_new)) ),
  value = c(data_old, data_old)
)
data_converted %>%
  ggplot(aes(x = value)) +
  geom_density(aes(col = landing_page), alpha=0.7) +
  xlab("Convertion Rate")+
  ggtitle("Convertion Rate Distribution") +
  labs(fill="")+
  theme_minimal()

Dari plot di atas, kita dapat melihat perbedaan antara kedua kelompok. Kita juga bisa melihat distribusi dari masing-masing kelompok dengan melihat perbedaan persentasenya. Untuk melakukan ini, kita dapat membuat kolom baru yang berisi informasi selisih dari rata-rata nilai conversion rate pada kedua jenis page.

data_difference1 <- as.data.frame(cbind(data_new, data_old)) %>% 
  mutate(diff1 = round(abs(data_new - data_old)*100,2))

head(data_difference1)
data_difference1 %>%
  ggplot( aes(x=diff1)) +
    geom_density( color="#e9ecef", fill = "#c90076", alpha=0.7) +
    scale_fill_manual(values="#8fce00") +
    xlab("Conversion Rate Diff")+
  ggtitle("Conversion Rate Distribution")+
    theme_minimal() +
    labs(fill="")

Dari plot di atas, selisih tertinggi antara grup control dan grup treatment terletak antara 0 - 0.5%. Selisih tertinggi antara 0.1% sampai 0.2%.

4.1.4 Statistical Significant Different Variant

Kita telah menganalisis perbedaan antara grup control dan grup treatment sebelumnya dengan melihat distribusi masing-masing grup. Untuk lebih meyakinkan seberapa yakin perbedaan tersebut, kita akan menggunakan uji statistik untuk melihat apakah grup treatment lebih baik dari grup control atau tidak. Untuk melakukan ini, kita akan menggunakan uji chi-square dengan menggunakan alpha 5%. Nilai p-value yang diinginkan untuk conversion rate harus lebih rendah dari 0.05.

Hipotesis untuk uji signifikansi dijelaskan sebagai berikut:

\(H_0: Tidak\ ada\ perbedaan\ signifikan\ antara\ grup\ control\ dan\ grup\ treatment\\\)

\(H_1: Ada\ perbedaan\ signifikan\ antara\ grup\ control\ dan\ grup\ treatment\)

Uji Chi-Square untuk conversion rate dapat diperoleh p-value sebagai berikut:

chi_square <-  table(data_ab_clean$landing_page, data_ab_clean$converted)

chisq.test(chi_square)
#> 
#>  Pearson's Chi-squared test with Yates' continuity correction
#> 
#> data:  chi_square
#> X-squared = 1.7054, df = 1, p-value = 0.1916

Dari hasil di atas, diperoleh p-value yang lebih besar dari 0.05 yaitu sebesar 0.19. Interpretasi untuk p-value tersebut adalah perbedaan antara grup control dan grup treatment tidak terdapat perbedaan yang signifikan dalam menghasilkan conversion rate, yang mana dapat dikatakan dengan menggunakan landing page baru dan lama, nilai conversion rate yang diperoleh tidak jauh berbeda atau sama.

4.1.5 Confidence Interval

Kita telah mengetahui perbedaan antara landing page baru dan lama hanya dengan mencari selisih dari conversion rate-nya. Kita memiliki nilai conversion rate pada landing page baru sebesar 11.88% sedangkan pada landing page lama sebesar 12.04%. Berdasarkan nilai tersebut, kita ingin mengetahui berapa rentang conversion rate yang akan diperoleh jika menerapkan landing page yang baru.

data_ab_clean %>% 
  group_by(landing_page, converted) %>% 
  summarise(freq = n()) %>% 
  mutate(percentage = round(freq/sum(freq)*100,2))

Formula yang digunakan dalam mencari confidence interval dalam A/B testing yaitu sebagai berikut.

di mana:

  • \(\hat{p}_c\): probabilitas sampel grup control
  • \(\hat{p}_v\): probabilitas sampel grup treatment
  • \(X_c\): jumlah sampel grup control yang berlangganan
  • \(X_v\): jumlah sampel grup treatment yang berlangganan
  • \(N_c\): jumlah seluruh sampel grup control
  • \(N_v\): jumlah seluruh sampel grup treatment
  • \(\hat{d}\): perbedaan nilai conversion rate
  • \(\alpha\): tingkat signifikansi, biasa yang digunakan adalah 5%

SE mengukur kebaikan sampel dalam mewakilkan populasi. Semakin kecil, maka sampel semakin representatif (baik).

d <- 0.1188 - 0.1204

Mencari tahu sampel dari masing-masing grup untuk retensi 1 hari.

table(data_ab_clean$landing_page, data_ab_clean$converted)
#>           
#>                 0      1
#>   New Page 128047  17264
#>   Old Page 127785  17489
  • conversion rate old page: 12.04%
  • conversion rate new page: 11.88%
  • sampel yang melakukan conversion di old page: 17489
  • sampel yang melakukan conversion di new page: 17264
  • jumlah keseluruhan sampel old page: 17489+127785
  • jumlah keseluruhan sampel new page: 17264+128047

Menghitung \(\hat{p}_{pool}\).

p_pool <- (17489+17264)/nrow(data_ab_clean)
se_pool <- sqrt(p_pool * (1 - p_pool) * (1/(17489+127785) + 1/(17264+128047)))

Menghitung batas atas dan batas bawah.

upper_conversion <- d + 1.96*se_pool
lower_conversion <- d - 1.96*se_pool

lower_conversion*100 ; upper_conversion*100
#> [1] -0.3959662
#> [1] 0.07596624

Kita mendapat confidence interval antara -0.39% - 0.08%. Rentang ini menunjukkan 95% dari varian baru yaitu dengan menggunakan landing page yang baru menambah tingkat conversion antara -0.39% hingga 0.08%. Di sini kita lihat titik 0% berada di antara rentang tersebut, sehingga tidak layak untuk dijalankan landing page yang baru tersebut karena kita akan memiliki kemungkinan conversion rate yang rendah bahkan bisa menambah bounce rate.

Notes: Ketika kita mendapatakan sebuah interfal conversion rate yang bernilai negatif artinya treatment landing page yang baru tidak lebih baik dibandingkan dengan yang lama. Sedangkan jika range nya terdapat nilai 0% conversion ratenya maka bisa kita anggap bahwa proses evaluasi tersebut tidak terlalu baik dan bisa menimbulkan bounce rate yang baru.

4.1.6 Statistical Power

Dalam pengujian statistik terdapat type I error atau yang lebih sering dikenal dengan \(\alpha\) dimana fungsinya yaitu mencari tahu probabilitas suatu pengujian menunjukkan perbedaan namun pada kenyataannya hasilnya sebenarnya tidak terdapat perbedaan. Sedangkan, type II error atau lebih sering dinotasikan sebagai \(\beta\) adalah suatu probabilitas dalam mengidentifikasi apabila terdapat varian A dan B yang sebenarnya berbeda, namun dalam pengujian gagal mendeteksinya. Simpelnya type II error biasanya disebut sebagai statistical power di mana fungsinya adalah untuk mengetahui probabilitas suatu pengujian dalam mendeteksi “true” efek ketika efek tersebut memang benar-benar terjadi.

library(pwr)
prob <- prop.table(table(data_ab_clean$landing_page, data_ab_clean$converted), margin = 1)
ES.w2(prob)
#> [1] 1.000003
pwr.chisq.test(w = ES.w2(prob), N = nrow(data_ab_clean), df = 1, sig.level = 0.05)
#> 
#>      Chi squared power calculation 
#> 
#>               w = 1.000003
#>               N = 290585
#>              df = 1
#>       sig.level = 0.05
#>           power = 1
#> 
#> NOTE: N is the number of observations

Power test pada kasus ini sebesar 100%. Interpretasi untuk angka ini adalah kemungkinan pengujian untuk dapat mendeteksi non-zero effect atau adanya perbedaan, pada kasus ini penggunaan landing page yang baru, jika tidak adanya efek perbedaan signifikansi tersebut benar-benar ada adalah sebesar 100%. Secara rule of thumb nilai dari power analisis yang baik adalah 80%. Artinya ketika ingin menggunakan landing page yang baru untuk menggantikan yang lama dakan memberikan efek yang sangat tidak signifikan, sehingga akan lebih baik jika tetap menggunakan landing page yang lama saja.

4.2 Conclusion

Berdasarkan hasil dari conversion rate pada dua jenis landing page yang diterapkan pada beberapa user apabila hanya dilihat dari rata-rata kedua halaman memiliki perbedaan nilai conversion rate hanya sekitar 0.16%. Jika dilihat dari tingkat signifikansi secara statistik perbedaannya tidak cukup signifikan, yang dapat diartikan bahwa landing page lama dengan yang baru masih memiliki kemungkinan mendapatkan jumlah conversion rate yang sama. Hal ini dapat dijadikan sebagai bahan diskusi kembali mengenai design landing page yang dibuat agar lebih meningkatkan jumlah conversion rate lagi kedepannya.