Read & Explor Data

data <-  read.csv("telco_churn_sample.csv")
str(data)
## 'data.frame':    5000 obs. of  16 variables:
##  $ MSISDN           : int  31441 31944 82538 86957 27618 96313 21363 85847 56880 83060 ...
##  $ los              : int  534 589 1223 1221 60 188 255 594 3190 357 ...
##  $ voice_rev        : num  5860 0 3744 231 12073 ...
##  $ voice_trx        : int  57 0 6 52 36 7 8 1 0 37 ...
##  $ voice_mou        : int  251 0 5 188 588 261 207 0 0 67 ...
##  $ voice_dou        : int  7 0 2 6 6 3 4 1 0 7 ...
##  $ sms_rev          : int  3465 0 2475 0 2100 0 20430 0 1505 2150 ...
##  $ sms_trx          : int  16 0 13 2 20 0 97 0 7 16 ...
##  $ sms_dou          : int  5 0 5 2 5 0 7 0 4 6 ...
##  $ broadband_rev    : num  35000 0 0 0 0 0 0 9000 0 0 ...
##  $ broadband_usg    : num  1713 0 0 342 0 ...
##  $ broadband_dou    : int  6 0 0 7 0 0 0 7 0 7 ...
##  $ voice_package_rev: int  34200 8350 8200 7950 26600 4550 15800 17900 16650 8700 ...
##  $ voice_package_trx: int  8 2 2 2 6 1 4 4 4 2 ...
##  $ voice_package_dou: int  6 2 2 2 5 1 4 2 4 2 ...
##  $ churn            : int  0 1 0 0 1 0 0 0 0 0 ...
skim(data)
Data summary
Name data
Number of rows 5000
Number of columns 16
_______________________
Column type frequency:
numeric 16
________________________
Group variables None

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
MSISDN 0 1 49783.95 28834.86 23 24787.5 49572.5 75005.00 99992.00 ▇▇▇▇▇
los 0 1 1223.96 978.52 19 341.0 956.0 2097.25 3220.00 ▇▃▂▃▂
voice_rev 0 1 7961.59 13940.01 0 435.0 3663.5 9954.75 397101.00 ▇▁▁▁▁
voice_trx 0 1 28.57 39.36 0 4.0 15.0 37.00 507.00 ▇▁▁▁▁
voice_mou 0 1 117.77 211.79 0 4.0 44.0 137.00 3477.00 ▇▁▁▁▁
voice_dou 0 1 3.94 2.40 0 2.0 4.0 6.00 7.00 ▅▂▅▃▇
sms_rev 0 1 4550.66 6907.21 0 415.0 1980.0 5746.25 72430.00 ▇▁▁▁▁
sms_trx 0 1 35.26 82.39 0 3.0 12.0 34.00 1449.00 ▇▁▁▁▁
sms_dou 0 1 3.91 2.50 0 2.0 4.0 6.00 7.00 ▅▂▅▂▇
broadband_rev 0 1 3952.54 16562.07 0 0.0 0.0 0.00 424720.00 ▇▁▁▁▁
broadband_usg 0 1 104.87 497.16 0 0.0 0.0 0.01 9882.61 ▇▁▁▁▁
broadband_dou 0 1 1.21 2.30 0 0.0 0.0 1.00 7.00 ▇▁▁▁▁
voice_package_rev 0 1 12064.80 11291.16 0 4350.0 8200.0 16475.00 88000.00 ▇▂▁▁▁
voice_package_trx 0 1 3.20 2.88 1 1.0 2.0 4.00 24.00 ▇▂▁▁▁
voice_package_dou 0 1 2.63 1.88 1 1.0 2.0 4.00 7.00 ▇▂▁▁▂
churn 0 1 0.34 0.47 0 0.0 0.0 1.00 1.00 ▇▁▁▁▅
summary(data)
##      MSISDN           los         voice_rev        voice_trx     
##  Min.   :   23   Min.   :  19   Min.   :     0   Min.   :  0.00  
##  1st Qu.:24788   1st Qu.: 341   1st Qu.:   435   1st Qu.:  4.00  
##  Median :49573   Median : 956   Median :  3664   Median : 15.00  
##  Mean   :49784   Mean   :1224   Mean   :  7962   Mean   : 28.57  
##  3rd Qu.:75005   3rd Qu.:2097   3rd Qu.:  9955   3rd Qu.: 37.00  
##  Max.   :99992   Max.   :3220   Max.   :397101   Max.   :507.00  
##    voice_mou        voice_dou        sms_rev         sms_trx       
##  Min.   :   0.0   Min.   :0.000   Min.   :    0   Min.   :   0.00  
##  1st Qu.:   4.0   1st Qu.:2.000   1st Qu.:  415   1st Qu.:   3.00  
##  Median :  44.0   Median :4.000   Median : 1980   Median :  12.00  
##  Mean   : 117.8   Mean   :3.941   Mean   : 4551   Mean   :  35.26  
##  3rd Qu.: 137.0   3rd Qu.:6.000   3rd Qu.: 5746   3rd Qu.:  34.00  
##  Max.   :3477.0   Max.   :7.000   Max.   :72430   Max.   :1449.00  
##     sms_dou      broadband_rev    broadband_usg      broadband_dou  
##  Min.   :0.000   Min.   :     0   Min.   :   0.000   Min.   :0.000  
##  1st Qu.:2.000   1st Qu.:     0   1st Qu.:   0.000   1st Qu.:0.000  
##  Median :4.000   Median :     0   Median :   0.000   Median :0.000  
##  Mean   :3.915   Mean   :  3952   Mean   : 104.874   Mean   :1.207  
##  3rd Qu.:6.000   3rd Qu.:     0   3rd Qu.:   0.012   3rd Qu.:1.000  
##  Max.   :7.000   Max.   :424720   Max.   :9882.606   Max.   :7.000  
##  voice_package_rev voice_package_trx voice_package_dou     churn      
##  Min.   :    0     Min.   : 1.000    Min.   :1.000     Min.   :0.000  
##  1st Qu.: 4350     1st Qu.: 1.000    1st Qu.:1.000     1st Qu.:0.000  
##  Median : 8200     Median : 2.000    Median :2.000     Median :0.000  
##  Mean   :12065     Mean   : 3.201    Mean   :2.625     Mean   :0.337  
##  3rd Qu.:16475     3rd Qu.: 4.000    3rd Qu.:4.000     3rd Qu.:1.000  
##  Max.   :88000     Max.   :24.000    Max.   :7.000     Max.   :1.000

💡 Insight : - Penggunaan layanan suara (voice) rata-rata sekitar 28.57 transaksi per pelanggan, dengan rata-rata durasi per transaksi (Mou) sekitar 117.8 menit. Sementara itu penggunaan layanan SMS memiliki rata-rata sekitar 35.26 transaksi per pelanggan. - Rata-rata pelanggan menggunakan sekitar 3.201 paket suara per bulan. - Rata-rata penggunaan broadband adalah sekitar 104.874 unit per pelanggan, dengan rata-rata pendapatan (revenue) sekitar 3952. - Sekitar 33.7% pelanggan cenderung untuk melakukan churn (menghentikan layanan).

# Menampilkan distribusi variabel
ggplot(data, aes(x = voice_mou)) +
  geom_histogram(binwidth = 50, fill = "navy", color = "black") +
  labs(title = "Distribusi Durasi Layanan Suara (voice_mou)")

# Menampilkan hubungan antar variabel dengan scatter plot dan trend line
ggplot(data, aes(x = voice_mou, y = voice_rev)) +
  geom_point(color = "blue", alpha = 0.5) +
  geom_smooth(method = "lm", color = "red", se = FALSE) +
  labs(title = "Hubungan Durasi Layanan Suara dengan Pendapatan Layanan Suara",
       x = "Durasi Layanan Suara (voice_mou)",
       y = "Pendapatan Layanan Suara (voice_rev)") +
  theme_minimal()

Analisis

# Analisis karakteristik pelanggan yang churn dan stay
churn_vs_stay <- data %>%
  mutate(churn_status = ifelse(churn == 1, "Churn", "Stay")) %>%
  select(-churn) %>%
  gather(key = "feature", value = "value", -churn_status) %>%
  group_by(churn_status, feature) %>%
  summarize(mean_value = mean(value)) %>%
  arrange(desc(mean_value))

head(churn_vs_stay)
## # A tibble: 6 × 3
## # Groups:   churn_status [2]
##   churn_status feature           mean_value
##   <chr>        <chr>                  <dbl>
## 1 Stay         MSISDN                50102.
## 2 Churn        MSISDN                49159.
## 3 Stay         voice_package_rev     14636.
## 4 Stay         voice_rev              9052.
## 5 Churn        voice_package_rev      7006.
## 6 Churn        voice_rev              5815.

Menampilkan karakteristik yang mempengaruhi churn vs. stay

ggplot(churn_vs_stay, aes(x = reorder(feature, mean_value), y = mean_value, fill = churn_status)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Perbedaan Karakteristik Pelanggan yang Churn dan Stay",
       x = "Fitur",
       y = "Rata-rata Nilai") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Dari diagram diatas dapat disimpulkan pelanggan lebih memilih untuk stay.

Membuat Model

Untuk memprediksi pelanggan yang berpotensi akan churn (berhenti berlangganan) paket telepon pascabayar di bulan depan, kita dapat menggunakan model prediktif seperti regresi logistik.

# Contoh: Membangun model prediksi menggunakan regresi logistik
library(caTools)
split <- sample.split(data$churn, SplitRatio = 0.7)
train_data <- subset(data, split == TRUE)
test_data <- subset(data, split == FALSE)

# Membangun model regresi logistik
model <- glm(churn ~ ., data = train_data, family = binomial)

# Menampilkan ringkasan model
summary(model)
## 
## Call:
## glm(formula = churn ~ ., family = binomial, data = train_data)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -1.7482  -0.8429  -0.2953   0.9052   3.2866  
## 
## Coefficients:
##                       Estimate   Std. Error z value             Pr(>|z|)    
## (Intercept)        1.586176769  0.130058027  12.196 < 0.0000000000000002 ***
## MSISDN             0.000000406  0.000001450   0.280             0.779494    
## los               -0.000108194  0.000045677  -2.369             0.017850 *  
## voice_rev          0.000022046  0.000004511   4.887       0.000001023886 ***
## voice_trx         -0.026746547  0.004318426  -6.194       0.000000000588 ***
## voice_mou         -0.001921201  0.000541439  -3.548             0.000388 ***
## voice_dou         -0.105948324  0.030303551  -3.496             0.000472 ***
## sms_rev            0.000019879  0.000010971   1.812             0.069994 .  
## sms_trx           -0.000183348  0.000848450  -0.216             0.828911    
## sms_dou           -0.132455599  0.025114743  -5.274       0.000000133469 ***
## broadband_rev     -0.000002550  0.000003211  -0.794             0.427111    
## broadband_usg      0.000006400  0.000110313   0.058             0.953739    
## broadband_dou      0.018773246  0.021561401   0.871             0.383925    
## voice_package_rev -0.000001565  0.000014954  -0.105             0.916667    
## voice_package_trx  0.040400685  0.064925622   0.622             0.533770    
## voice_package_dou -0.458080144  0.088481438  -5.177       0.000000225322 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 4473.9  on 3499  degrees of freedom
## Residual deviance: 3408.1  on 3484  degrees of freedom
## AIC: 3440.1
## 
## Number of Fisher Scoring iterations: 6
# Mengevaluasi model
predicted_churn <- predict(model, test_data, type = "response")

💡 Insight ? : - Durasi penggunaan layanan suara (voice_mou) memiliki pengaruh negatif terhadap kecenderungan churn, artinya semakin lama durasi penggunaan, semakin kecil kemungkinan untuk melakukan churn. - Jumlah transaksi suara (voice_trx) juga memiliki pengaruh negatif, menunjukkan bahwa pelanggan dengan lebih banyak transaksi suara cenderung tetap berlangganan. - Jumlah penggunaan paket layanan suara (voice_package_dou) memiliki pengaruh negatif yang signifikan, menandakan bahwa penggunaan paket suara dapat menahan pelanggan untuk tidak melakukan churn. - Sebaliknya, variabel voice_package_trx memiliki pengaruh positif, menunjukkan bahwa pelanggan yang sering menggunakan paket suara memiliki kecenderungan lebih tinggi untuk melakukan churn. - Beberapa variabel memiliki nilai p-value yang signifikan (p-value < 0.05), seperti voice_rev, voice_trx, voice_mou, voice_dou, sms_dou, dan voice_package_dou, menandakan pengaruh yang signifikan terhadap prediksi churn.

Ide Busines?

Untuk mengoptimalkan retensi pelanggan dapat dilakukan ide business seperti berikut : - Segmentasi Pelanggan : Identifikasi segmen pelanggan berdasarkan prediksi churn. Pisahkan pelanggan yang berpotensi churn dengan yang kemungkinan akan tetap berlangganan. - Penyesuaian Penawaran dan Layanan : Berikan penawaran khusus atau diskon untuk meningkatkan nilai layanan bagi pelanggan potensial yang akan churn. - Kampanye Komunikasi : Lakukan kampanye komunikasi yang jelas dan efektif untuk memberitahu pelanggan tentang manfaat layanan, penawaran spesial, atau perubahan yang akan dilakukan untuk mempertahankan mereka.