library(tibble)
library('readr')
library('data.table')
library('tidyr')
library('dplyr')
library('stringr')
library('forcats')
Setiap bisnis bertujuan untuk mendapatkan pendapatan yang sustainable dalam jangka panjang. Hal ini didasarkan dengan cost untuk mendapatkan customer baru lebih mahal dibandingkan dengan mempertahankan customer yang sudtoh ada. Sehingga perusahaan merancang marketing program untuk meningkatkan loyalty dari customer contoh meningkatkan status customer dari first time subscriber menjadi loyal subscriber. Dalam menjalankan marketing campaign dimana retention campaign, mempertahankan existing customer, perlu untuk mengetahui churn rate dari customer yaitu berapa banyak customer tidak membeli / subscribe produk. Penyebab dari churn dari customer adalah ketidakpuasan customer terhadap produk yang digunakan. Pada project ini, saya menggunakan model yang terbaik dalam melakukan klasifikasi (Logistic regression, random forest dan decicion tree) dan survival analysis pada KKBOX, online music streaming yang membutuhkan prediksi untuk menjawab pertanyaan sebagai berikut :
Apakah model dapat memprediksi secara akurat churn rate dari subscriber setelah 30 hari ?
Faktor apa saja yang dapat mempengaruhi churn rate dari subscriber?
Berapa bulan customer menjadi subscriber?
Churn rate merupakan bagian yang digunakan dalam perhitungan CLTV (Customer Life Time Value) yang merupakan prediksi revenue yang akan didapatkan dari customer. Berikut adalah perhitungan dari CLTV :
Pada perhitungan diatas, dapat diketahui jika churn rate makin besar akan menurunkan rata rata waktu penggunaan produk dari customer (Average Lifespan of Customer) sehingga akan menurunkan CLTV yang dimana bisnis akan berusaha untuk mencapai CLTV yang lebih besar daripada Customer Acquisition Cost (CAC) yaitu cost yang dikeluarkan untuk mendapatkan new customer. churn rate juga merupakan indikator dari loyalitas konsumen terhadap suatu produk, CLTV yang tinggi akan menurunkan biaya untuk mendapatkan konsumen baru. Perusahaan berusaha untuk mampu meningkatkan CLTV agar lebih besar dibandingkan dengan CAC (Consumen Acquisition Cost.), dimana CLTV yang ideal minimal lebih besar dari 1. churn rate timbul karena beberapa faktor diantaranya kepuasaan konsumen terhadap produk yang berkurang, tidak ada fitur baru yang ditawarkan, harga yang kurang bersaing. Dengan model ini selain dapat memprediksi berapa churn rate juga dapat memberikan informasi faktor- faktor yang berkontribusi besar (Variable lmportance) terhadap churn rate sehingga dapat menjadi bahan evaluasi pada produk dan strategi marketing yang dilakukan oleh perusahaan
Output dari project ini adalah klasifikasi customer yang digolongkan customer yang diprediksi churn dan no_churn dan prediksi waktu (in month) customer menjadi churn customer
Project ini diharapkan dapat menghasilkan model yang akurat memprediksi churn rate sehingga dapat menjadi bahan evaluasi bagi divisi marketing untuk melakukan langkah- langkah untuk mengurangi churn rate dan selain model ini dapat menjelaskan faktor -faktor yang mempengaruhi churn rate, divisi marketing dapat melakukan mitigasi pada faktor tersebut sehingga churn rate dapat diturunkan sekaligus meningkatkan CLTV pada akhirnya.
Data yang digunakan dalam DCD ini merupakan data yang berasal dari perusahaan layanan music streaming yaitu KKBOX. KKBOX membutuhkan model yang dapat membuat prediksi jumlah **CHURN CUSTOMER*. Pada proses EDA, perlu dilakukan pengurangan sampel yang ada karena mempertimbangkan kapasitas memori yanng ada. Sehingga data train dikurangi menjadi 50%
Setelah dikurangi sampel, maka perlu dilakukan inner join yaitu menggabungkan dua dataframe, dan hanya menggabungkan atribut yang ada pada dua data frame tersebut. Dalam dataset ini, dataframe digabungkan dengan menggunakan key msno. Dataset ini terdiri dari 4 dataframe yaitu :
*In train.csv : Berisi id dan status customer churn atau
tidak
*transactions.csv : Berisi metode pembayaran dan apakah
customer berhenti berlangganan atau tidak
*user_logs.csv : listening behaviour customer based on
the song
*members.csv : Customers Demogrhaphics
wsdm <-read.csv("wsdm.csv")
head(wsdm)
## X msno is_churn
## 1 1 waLDQMmcOu2jLDaV1ddDkgCrB/jl6sD66Xzs0Vqax1Y= 1
## 2 2 QA7uiXy8vIbUSPOkCf9RwQ3FsT8jVq2OxDr8zqa7bRQ= 1
## 3 3 fGwBva6hikQmTJzrbz/2Ezjm5Cth5jZUNvXigKK2AFA= 1
## 4 4 mT5V8rEpa+8wuqi6x0DoVd3H5icMKkE9Prt49UlmK+4= 1
## 5 5 XaPhtGLk/5UvvOYHcONTwsnH97P4eGECeq+BARGItRw= 1
## 6 6 GBy8qSz16X5iYWD+3CMxv/Hm6OPSrXBYtmbnlRtknW0= 1
wsdm_members <- read.csv("File csv/members_v3.csv",sep=";")
head(wsdm_members)
## msno city bd gender registered_via
## 1 Rb9UwLQTrxzBVwCB6+bCcSQWZ9JiNLC9dXtM1oEsZA8= 1 0 11
## 2 +tJonkh+O1CA796Fm5X60UMOtB6POHAwPjbTRVl/EuU= 1 0 7
## 3 cV358ssn7a0f7jZOwGNWS07wCKVqxyiImJUX6xcIwKw= 1 0 11
## 4 9bzDeJP6sQodK73K5CBlJ6fgIQzPeLnRl0p5B77XP+g= 1 0 11
## 5 WFLY3s7z4EZsieHCt63XrsdtfTEmJ+2PnnKLH5GY4Tk= 6 32 female 9
## 6 yLkV2gbZ4GLFwqTOXLVHz0VGrMYcgBGgKZ3kj9RiYu8= 4 30 male 9
## registration_init_time
## 1 20110911
## 2 20110914
## 3 20110915
## 4 20110915
## 5 20110915
## 6 20110916
wsdm_members <- wsdm %>%
inner_join(wsdm_members,by= c("msno"))
head(wsdm_members)
## X msno is_churn city bd gender
## 1 1 waLDQMmcOu2jLDaV1ddDkgCrB/jl6sD66Xzs0Vqax1Y= 1 18 36 female
## 2 6 GBy8qSz16X5iYWD+3CMxv/Hm6OPSrXBYtmbnlRtknW0= 1 6 23 female
## 3 14 wEUOkYvyz3xTOx2p9z2Xcs4OzYsH/ZrNFUKZ+KFPf0M= 1 4 27 female
## 4 16 QS3ob4zLlWcWzBIlbsd6lQIA3nJusPs6rNDVSEpQO2k= 1 4 25 female
## 5 18 d7QVMhAzjj4yc1Ojjbf2SFJam90RaUcwNDe3NxHVluA= 1 13 23 male
## 6 25 0GRiDbTd5wZPaFzO5CFnSUzZ/96Tbi5cbRzlV4Ts/Q8= 1 5 20 male
## registered_via registration_init_time
## 1 9 20050406
## 2 9 20060331
## 3 9 20070417
## 4 9 20070905
## 5 9 20070922
## 6 9 20090520
wsdm_transactions <- read.csv("File csv/transactions.csv")
head(wsdm_transactions)
## msno payment_method_id
## 1 YyO+tlZtAXYXoZhNr3Vg3+dfVQvrBVGO8j1mfqe4ZHc= 41
## 2 AZtu6Wl0gPojrEQYB8Q3vBSmE2wnZ3hi1FbK1rQQ0A4= 41
## 3 UkDFI97Qb6+s2LWcijVVv4rMAsORbVDT2wNXF0aVbns= 41
## 4 M1C56ijxozNaGD0t2h68PnH2xtx5iO5iR2MVYQB6nBI= 39
## 5 yvj6zyBUaqdbUQSrKsrZ+xNDVM62knauSZJzakS9OW4= 39
## 6 KN7I82kjY0Tn76Ny95ncqBUVbO7b8AXrOPqZutKpxIM= 21
## payment_plan_days plan_list_price actual_amount_paid is_auto_renew
## 1 30 129 129 1
## 2 30 149 149 1
## 3 30 129 129 1
## 4 30 149 149 1
## 5 30 149 149 1
## 6 30 149 149 1
## transaction_date membership_expire_date is_cancel
## 1 20150930 20151101 0
## 2 20150930 20151031 0
## 3 20150930 20160427 0
## 4 20150930 20151128 0
## 5 20150930 20151121 0
## 6 20150930 20151107 0
wsdm_members_transactions <- wsdm_members %>%
inner_join(wsdm_transactions,by= c("msno"))
head(wsdm_members_transactions)
## X msno is_churn city bd gender
## 1 1 waLDQMmcOu2jLDaV1ddDkgCrB/jl6sD66Xzs0Vqax1Y= 1 18 36 female
## 2 1 waLDQMmcOu2jLDaV1ddDkgCrB/jl6sD66Xzs0Vqax1Y= 1 18 36 female
## 3 6 GBy8qSz16X5iYWD+3CMxv/Hm6OPSrXBYtmbnlRtknW0= 1 6 23 female
## 4 6 GBy8qSz16X5iYWD+3CMxv/Hm6OPSrXBYtmbnlRtknW0= 1 6 23 female
## 5 6 GBy8qSz16X5iYWD+3CMxv/Hm6OPSrXBYtmbnlRtknW0= 1 6 23 female
## 6 6 GBy8qSz16X5iYWD+3CMxv/Hm6OPSrXBYtmbnlRtknW0= 1 6 23 female
## registered_via registration_init_time payment_method_id payment_plan_days
## 1 9 20050406 38 7
## 2 9 20050406 38 30
## 3 9 20060331 33 30
## 4 9 20060331 33 0
## 5 9 20060331 33 30
## 6 9 20060331 33 30
## plan_list_price actual_amount_paid is_auto_renew transaction_date
## 1 0 0 0 20161031
## 2 149 149 0 20170107
## 3 149 149 1 20160331
## 4 0 149 1 20151031
## 5 149 149 1 20160930
## 6 149 149 1 20170215
## membership_expire_date is_cancel
## 1 20161107 0
## 2 20170206 0
## 3 20160430 0
## 4 20151130 0
## 5 20161031 0
## 6 20170215 1
glimpse(wsdm_members_transactions)
## Rows: 730,532
## Columns: 16
## $ X <int> 1, 1, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,…
## $ msno <chr> "waLDQMmcOu2jLDaV1ddDkgCrB/jl6sD66Xzs0Vqax1Y=",…
## $ is_churn <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ city <int> 18, 18, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, …
## $ bd <int> 36, 36, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,…
## $ gender <chr> "female", "female", "female", "female", "female…
## $ registered_via <int> 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,…
## $ registration_init_time <int> 20050406, 20050406, 20060331, 20060331, 2006033…
## $ payment_method_id <int> 38, 38, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,…
## $ payment_plan_days <int> 7, 30, 30, 0, 30, 30, 30, 0, 30, 30, 30, 30, 0,…
## $ plan_list_price <int> 0, 149, 149, 0, 149, 149, 149, 0, 149, 149, 149…
## $ actual_amount_paid <int> 0, 149, 149, 149, 149, 149, 149, 149, 149, 149,…
## $ is_auto_renew <int> 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ transaction_date <int> 20161031, 20170107, 20160331, 20151031, 2016093…
## $ membership_expire_date <int> 20161107, 20170206, 20160430, 20151130, 2016103…
## $ is_cancel <int> 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
logs<- as.tibble(fread('File csv/user_logs.csv', nrows = 5e6))
head(logs)
## # A tibble: 6 × 9
## msno date num_25 num_50 num_75 num_985 num_100 num_unq total_secs
## <chr> <int> <int> <int> <int> <int> <int> <int> <dbl>
## 1 rxIP2f2aN0rYNp… 2.02e7 0 0 0 0 1 1 280.
## 2 rxIP2f2aN0rYNp… 2.02e7 9 1 0 0 7 11 1659.
## 3 yxiEWwE9VR5utp… 2.02e7 3 3 0 0 68 36 17365.
## 4 yxiEWwE9VR5utp… 2.02e7 1 0 1 1 97 27 24667.
## 5 yxiEWwE9VR5utp… 2.02e7 3 0 0 0 38 38 9649.
## 6 yxiEWwE9VR5utp… 2.02e7 4 0 1 1 33 10 10022.
wsdm_join <- wsdm_members_transactions %>%
inner_join(logs,by= c("msno"))
head(wsdm_join)
## X msno is_churn city bd gender
## 1 6 GBy8qSz16X5iYWD+3CMxv/Hm6OPSrXBYtmbnlRtknW0= 1 6 23 female
## 2 6 GBy8qSz16X5iYWD+3CMxv/Hm6OPSrXBYtmbnlRtknW0= 1 6 23 female
## 3 6 GBy8qSz16X5iYWD+3CMxv/Hm6OPSrXBYtmbnlRtknW0= 1 6 23 female
## 4 6 GBy8qSz16X5iYWD+3CMxv/Hm6OPSrXBYtmbnlRtknW0= 1 6 23 female
## 5 6 GBy8qSz16X5iYWD+3CMxv/Hm6OPSrXBYtmbnlRtknW0= 1 6 23 female
## 6 6 GBy8qSz16X5iYWD+3CMxv/Hm6OPSrXBYtmbnlRtknW0= 1 6 23 female
## registered_via registration_init_time payment_method_id payment_plan_days
## 1 9 20060331 33 30
## 2 9 20060331 33 30
## 3 9 20060331 33 30
## 4 9 20060331 33 30
## 5 9 20060331 33 30
## 6 9 20060331 33 30
## plan_list_price actual_amount_paid is_auto_renew transaction_date
## 1 149 149 1 20160331
## 2 149 149 1 20160331
## 3 149 149 1 20160331
## 4 149 149 1 20160331
## 5 149 149 1 20160331
## 6 149 149 1 20160331
## membership_expire_date is_cancel date num_25 num_50 num_75 num_985
## 1 20160430 0 20150124 1 2 3 1
## 2 20160430 0 20150325 1 0 1 1
## 3 20160430 0 20150524 1 1 0 1
## 4 20160430 0 20150715 0 0 0 0
## 5 20160430 0 20150907 6 3 0 0
## 6 20160430 0 20151030 1 0 0 1
## num_100 num_unq total_secs
## 1 16 13 4963.426
## 2 39 14 10676.770
## 3 16 15 4339.072
## 4 3 3 648.124
## 5 59 42 14196.191
## 6 52 41 11995.500