Abstrak Customer Churn adalah sebuah istilah yang digunakan untuk pelanggan yang telah menghentikan layanan provider tertentu atau pindah ke layanan provider lain. Salah satu contoh perusahaan yang melakukan penelitian customer Churn adalah perusahaan telekomunikasi. Tujuan dilakukan prediksi ini adalah untuk melihat Churn pelanggan menggunakan klasifikasi secara data mining, sebelumnya dilakukan pre-processing agar menghasilkan analisis dengan informasi yang optimal. Pre-processing yang digunakan adalah dengan mendeteksi Missing Value. Missing value atau yang disebut data hilang adalah nilai dimana satu atau lebih dari suatu variabel tidak tersedia untuk dianalisis. Pada laporan ini data yang digunakan untuk analisis adalah data Telecome Churn yang didapat dari situs kaggle.com. Data tersebut menyatakan beberapa variabel yang diduga seseorang terindikasi Churn dari layananan telekomunikasi. Dari semua variabel tidak terdapat variabel yang terdeteksi missing value. Sehingga tidak perlu dilakukan penanganan missing value. Metode Clustering yang digunakan antara lain metode machine learning.
Sumber data yang digunakan dalam penelitian ini adalah data sekunder yang diperoleh dari website kaggle berjudul Telecome Churn. Pengambilan data dilakukan pada hari Selasa, 4 Desember 2018 pukul 13.00 WIB.
Statistika deskriptif adalah metode-metode yang berkaitan dengan pengumpulan dan penyajian suatu gugus data sehingga memberikan informasi yang berguna. Dalam statistika deskriptif, terdapat dua jenis ukuran data yaitu ukuran pemusatan dan penyebaran data. Ukuran pemusatan data adalah sembarang ukuran yang menunjukkan pusat segugus data, yang telah diurutkan dari yang terkecil sampai yang terbesar atau sebaliknya dari yang terbesar sampai yang terkecil. Ukuran penyebaran data adalah berbagai macam ukuran statistik yang dapat digunakan untuk mengetahui luas penyebaran data atau variasi data atau homogenitas data atau stabilitas data. Namun dalam data dibawah ini hanya ditampilkan ukuran pemusatan data sebagai berikut :
Variabel | Keterangan |
---|---|
1 | Account length |
2 | Area code |
3 | Churn |
4 | Voice mail plan |
5 | Number vmail messages |
6 | Total day minutes |
7 | Total day calls |
8 | Total day charge |
9 | Total eve minutes |
10 | Total eve calls |
11 | Total eve charge |
12 | Total night minutes |
13 | Total night calls |
14 | Total night charge |
15 | Total intl minutes |
16 | Total intl calls |
17 | Total intl charge |
18 | Customer service calls |
19 | International plan |
20 | State |
data<-read.csv("telecom_churn.csv",header=TRUE,sep=";")
summary(data)
## Account.length Area.code Churn Voice.mail.plan
## Min. : 1.0 Min. :408.0 Min. :0.0000 Min. :0.0000
## 1st Qu.: 74.0 1st Qu.:408.0 1st Qu.:0.0000 1st Qu.:0.0000
## Median :101.0 Median :415.0 Median :0.0000 Median :0.0000
## Mean :101.1 Mean :437.2 Mean :0.1449 Mean :0.2766
## 3rd Qu.:127.0 3rd Qu.:510.0 3rd Qu.:0.0000 3rd Qu.:1.0000
## Max. :243.0 Max. :510.0 Max. :1.0000 Max. :1.0000
## Number.vmail.messages Total.day.minutes Total.day.calls Total.day.charge
## Min. : 0.000 Min. : 0.0 Min. : 0.0 Min. : 0.00
## 1st Qu.: 0.000 1st Qu.:143.7 1st Qu.: 87.0 1st Qu.:24.43
## Median : 0.000 Median :179.4 Median :101.0 Median :30.50
## Mean : 8.099 Mean :179.8 Mean :100.4 Mean :30.56
## 3rd Qu.:20.000 3rd Qu.:216.4 3rd Qu.:114.0 3rd Qu.:36.79
## Max. :51.000 Max. :350.8 Max. :165.0 Max. :59.64
## Total.eve.minutes Total.eve.calls Total.eve.charge Total.night.minutes
## Min. : 0.0 Min. : 0.0 Min. : 0.00 Min. : 23.2
## 1st Qu.:166.6 1st Qu.: 87.0 1st Qu.:14.16 1st Qu.:167.0
## Median :201.4 Median :100.0 Median :17.12 Median :201.2
## Mean :201.0 Mean :100.1 Mean :17.08 Mean :200.9
## 3rd Qu.:235.3 3rd Qu.:114.0 3rd Qu.:20.00 3rd Qu.:235.3
## Max. :363.7 Max. :170.0 Max. :30.91 Max. :395.0
## Total.night.calls Total.night.charge Total.intl.minutes Total.intl.calls
## Min. : 33.0 Min. : 1.040 Min. : 0.00 Min. : 0.000
## 1st Qu.: 87.0 1st Qu.: 7.520 1st Qu.: 8.50 1st Qu.: 3.000
## Median :100.0 Median : 9.050 Median :10.30 Median : 4.000
## Mean :100.1 Mean : 9.039 Mean :10.24 Mean : 4.479
## 3rd Qu.:113.0 3rd Qu.:10.590 3rd Qu.:12.10 3rd Qu.: 6.000
## Max. :175.0 Max. :17.770 Max. :20.00 Max. :20.000
## Total.intl.charge Customer.service.calls International.plan
## Min. :0.000 Min. :0.000 Min. :0.00000
## 1st Qu.:2.300 1st Qu.:1.000 1st Qu.:0.00000
## Median :2.780 Median :1.000 Median :0.00000
## Mean :2.765 Mean :1.563 Mean :0.09691
## 3rd Qu.:3.270 3rd Qu.:2.000 3rd Qu.:0.00000
## Max. :5.400 Max. :9.000 Max. :1.00000
library(shiny)
## Warning: package 'shiny' was built under R version 3.5.1
library(shinydashboard)
## Warning: package 'shinydashboard' was built under R version 3.5.1
##
## Attaching package: 'shinydashboard'
## The following object is masked from 'package:graphics':
##
## box
library(plotly)
## Warning: package 'plotly' was built under R version 3.5.1
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 3.5.1
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
library(readxl)
## Warning: package 'readxl' was built under R version 3.5.1
library(dplyr)
## Warning: package 'dplyr' was built under R version 3.5.1
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(reshape2)
## Warning: package 'reshape2' was built under R version 3.5.1
library(lubridate)
## Warning: package 'lubridate' was built under R version 3.5.1
##
## Attaching package: 'lubridate'
## The following object is masked from 'package:base':
##
## date
library(DT)
## Warning: package 'DT' was built under R version 3.5.1
##
## Attaching package: 'DT'
## The following objects are masked from 'package:shiny':
##
## dataTableOutput, renderDataTable
library(e1071)
## Warning: package 'e1071' was built under R version 3.5.1
library(ggplot2)
library(stats)
library(caret)
## Warning: package 'caret' was built under R version 3.5.1
## Loading required package: lattice
library(randomForest)
## Warning: package 'randomForest' was built under R version 3.5.1
## randomForest 4.6-14
## Type rfNews() to see new features/changes/bug fixes.
##
## Attaching package: 'randomForest'
## The following object is masked from 'package:dplyr':
##
## combine
## The following object is masked from 'package:ggplot2':
##
## margin
Salah satu kegunaan visualisasi data adalah untuk menghadirkan bentuk komunikasi data yang konstruktif. Visualisasi data memberikan informasi yang sangat berguna untuk kepentingan bisnis. Pengambil keputusan di perusahaan akan dapat dengan mudah melihat dan mengerti hubungan antar beberapa variabel data, dan lebih canggihnya adalah hubungan ini dapat dilihat dari segi multi dimensi. Contoh visualisasi data digunakan scatterplot, boxplot, Histogram dan Line.
library(ggplot2)
ggplot(data = data) +
aes(x = Total.intl.charge, y = Total.intl.calls, color = Total.intl.minutes) +
geom_point() +
scale_color_distiller(palette = "RdYlGn") +
theme_minimal()
library(ggplot2)
ggplot(data = data) +
aes(x = Total.night.charge, y = Total.night.calls, color = Total.night.minutes) +
geom_point() +
scale_color_distiller(palette = "PRGn") +
theme_minimal()
#### Hubungan Antara Total Night Charge dan Total Night Calls
library(ggplot2)
ggplot(data = data) +
aes(x = Total.eve.charge, y = Total.eve.calls, color = Total.eve.minutes) +
geom_point() +
scale_color_distiller(palette = "Pink") +
theme_minimal()
## Warning in pal_name(palette, type): Unknown palette Pink
#### Hubungan Antara Total Day Charge dan Total Day Calls
library(ggplot2)
ggplot(data = data) +
aes(x = Total.day.charge, y = Total.day.calls, color = Total.day.minutes) +
geom_point() +
scale_color_distiller(palette = "#Ab7c9d") +
theme_minimal()
## Warning in pal_name(palette, type): Unknown palette #Ab7c9d
Sebaran data Account Length, Total Day Calls, Total Eve Calls, Total Eve Charge, Total Nigt Minutes, Total Night Charge antara costumer yang churn dan tidak hampir berimbang diketahui dari sebarannya yang hampir sama. sedangkan, pada Number Vmail Messages, Total Day Minutes, Total Day Charge, Total Eve Minutes, Total Intl Minutes, Total Intl Calls, Total Intl Charges sebaran data costumer yang mengalami churn dan tidak, tidak sama dan tidak membentuk distribusi normal, membuktikan bahwa sebaran data tidak begitu seimbang dantidak berpola. Setiap call minutes dan call charge berkorelasi sempurna, variabel yang saling berkorelasi linear dengan Churn adalah number service calls,total day charge dan internasional plan.
ggplot(data = data) +
aes(x = Total.intl.charge, y = Total.intl.charge) +
geom_boxplot(fill = "#807dba") +
theme_grey()
## Warning: Continuous x aesthetic -- did you forget aes(group=...)?
ggplot(data = data) +
aes(x = Total.night.charge, y = Total.night.charge) +
geom_boxplot(fill = "#e31a1c") +
theme_grey()
## Warning: Continuous x aesthetic -- did you forget aes(group=...)?
ggplot(data = data) +
aes(x = Total.day.charge, y = Total.day.charge) +
geom_boxplot(fill = "#Ab7c9d") +
theme_grey()
## Warning: Continuous x aesthetic -- did you forget aes(group=...)?
ggplot(data = data) +
aes(x = Total.intl.charge) +
geom_histogram(bins = 10, fill = "#74c476") +
theme_grey()
ggplot(data = data) +
aes(x = Total.night.charge) +
geom_histogram(bins = 10, fill = "#fb9a99") +
theme_grey()
ggplot(data = data) +
aes(x = Total.day.charge) +
geom_histogram(bins = 10, fill = "#ff7f00") +
theme_grey()
Dari data dibuat boxplot dan histogram berdasarkan churn ataupun yang tidak churn, dapat dilihat bahwa ukuran pemusatan dari setiap variabel berbeda, sehingga tidak dilakukan penghapusan untuk data-data yang terindikasi outlier.
ggplot(data = data) +
aes(y = Customer.service.calls, color = International.plan, x = seq_along(Number.vmail.messages)) +
geom_line() +
scale_color_distiller(palette = "BrBG") +
theme_grey()
Analisis korelasi adalah metode statistika yang digunakan untuk menentukan kuatnya atau derajat hubungan linier antara dua variabel atau lebih. Semakin nyata hubungan linier (garis lurus), maka semakin kuat atau tinggi derajat hubungan garis lurus antara kedua variabel atau lebih.
library(corrplot)
## corrplot 0.84 loaded
corrplot.mixed(cor(data[,3:5]), number.cex = .7, tl.cex=.6)
Dari data gambar diatas maka dapat diketahui bahwa korelasi terbesar adalah antara variabel Charge dan Calls, yaitu mendekati 1 sehingga korelasinya akan sangat kuat
Tujuan pengelompokan adalah untuk melihat apakah ada profil pelanggan yang menarik muncul dari kumpulan data. Bisakah kita mengelompokkan pelanggan ke dalam grup yang menarik?
Hal pertama yang harus dilakukan adalah hanya mengambil data yang terdiri dari variabel kontinu, yang kemudian kita sebut data.numerik. Kemudian, kita harus skala angka menggunakan fungsi skala.
set.seed(1)
rowindices <- sample(nrow(data))
data_shuffled <- data[rowindices,]
split <- round(nrow(data_shuffled) * 0.7)
split
## [1] 2333
train <- data_shuffled[1:split,]
test <- data_shuffled[(split+1):nrow(data_shuffled),]
dim(train)
## [1] 2333 19
library(caret)
data.numeric <- data[,2:8] #Take only the numeric values from the data set
data.numeric <- scale(data.numeric)
ratios = sapply(1:20, function(k) {
with(kmeans(data.numeric, k, nstart = 20), betweenss / totss)
})
plot(ratios, type = "l", xlab = "k", ylab = "Variance Explained")
tidak ada cluster nyata yang muncul di sini. lalu di lanjutkan dan mulai dengan k = 3 dan melihat apakah kami dapat dengan mudah menggambarkan kluster ini.
Seberapa baik cluster ini memprediksi “tetap berlangganan” atau “memutuskan langganan”?
set.seed(1)
data.kmeans <- kmeans(data.numeric, 3, nstart = 20)
data <- cbind(data, data.kmeans$cluster)
data$cluster <- as.factor(data$`data.kmeans$cluster`)
data$`data.kmeans$cluster` <- NULL
ggplot(data, aes(x = cluster)) + geom_bar(aes(fill = Churn))
Berdasar Klaster 3, maka pelnggan yang pergi lebih banyak daripada di klaster 2 dan klaster 1.