Contoh Kasus

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

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

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 Digunakan

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

Visualisasi Data

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.

a) Scatter Plot

Hubungan Antara Total International Charge dan Total International Calls

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()

Hubungan Antara Total Eve Charge dan Total Eve Calls

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.

b) Boxplot

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=...)?

c) Histogram

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.

d) Line

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

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

K-Means Clustering

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.

End~