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