Sebuah analisa data untuk melihat perilaku pelanggan sebuah perusahaan Telekomunikasi, Sample data telecomunikasi diambil dari IMB Watson Analytic Website.
Layanan berbasis langganan biasanya mendapatkan profit dengan tiga cara berikut:
1. Mencari pelanggan baru
2. Menaikkan transaksi pelanggan
3. Mempertahankan pelanggan existing.
Dalam analisa ini saya akan fokus pada retensi pelanggan, melakukan eksplorasi data, dengan mengawali cleaning data.
Beberapa pertanyaan yang berfokus pada segmen pelanggan untuk membantu memandu analisis, seperti siapa saja mudah berhenti berlangganan?, kenapa berhenti? bagaimana caranya agar mereka tidak berhenti? Terus promosi apa yang wajib dilakukan? Setelah pertanyaan ini terjawab, selanjutnya akan dibahas model prediktif churn pelanggan, dengan menggunakan berbagai model machine learning.
Berikut script R nya:
#---Library
library(tidyverse)
library(miscset)
#---Wrangling the Data
Sample data telecomunikasi diambil dari IMB Watson Analytic Website
df <- read.csv("d:/churn/WA_Fn-UseC_-Telco-Customer-Churn.csv")
Ubah variable SeniorCitizen menjadi factor
df$SeniorCitizen <- as.factor(df$SeniorCitizen)
#---Check missing value
df %>% map(~ sum(is.na(.)))
#---Masukkan data median ke data yang kosong
df <- df %>%
mutate(TotalCharges = replace(TotalCharges,
is.na(TotalCharges),
median(TotalCharges, na.rm = T)))
# checking that the imputation worked
sum(is.na(df$TotalCharges))
#[1] 0 Ok
#---Exploring the Data
#Let’s start by taking a look at the unique values of the factor variables.
df_tbl <- df %>%
select_if(is.factor) %>%
summarise_all(n_distinct)
df_tbl[1:8] %>%
print(width = Inf)
## # A tibble: 1 x 8
## customerID gender SeniorCitizen Partner Dependents PhoneService MultipleLines InternetService
## <int> <int> <int> <int> <int> <int> <int> <int>
## 1 7043 2 2 2 2 2 3 3
df_tbl[9:15] %>%
print(width = Inf)
## # A tibble: 1 x 7
## OnlineSecurity OnlineBackup DeviceProtection TechSupport StreamingTV StreamingMovies Contract
## <int> <int> <int> <int> <int> <int> <int>
## 1 3 3 3 3 3 3 3
df_tbl[16:18] %>%
print(width = Inf)
## # A tibble: 1 x 3
## PaperlessBilling PaymentMethod Churn
## <int> <int> <int>
## 1 2 4 2
#---Untuk menganalisa , saya akan menjawab pertanyaan
1. Apakah pelanggan pria cenderung lebih sering berhenti daripada pelanggan wanita?
2. Apakah senior citizen cenderung lebih banyak berhenti?
3. Apakah individu yg punya pasangan cenderung lebih sering berhenti berlangganan drpd pelanggan singgle?
4. Apakah pelanggan dependent people lebih banyak berhenti? daripada yang no dependent?
#---Gender plot
ggplot(df) +
geom_bar(aes(x = gender, fill = Churn), position = "dodge")#ok smilar
df %>%
group_by(gender,Churn) %>%
summarise(n=n())
## # A tibble: 4 x 3
## # Groups: gender [?]
## gender Churn n
## <fctr> <fctr> <int>
## 1 Female No 2549
## 2 Female Yes 939
## 3 Male No 2625
## 4 Male Yes 930
#---Senior Citizen plot
ggplot(df) +
geom_bar(aes(x = SeniorCitizen, fill = Churn), position = "dodge")#ok
df %>%
group_by(SeniorCitizen) %>%
summarise(n = n()) %>%
mutate(freq = n / sum(n))
## # A tibble: 2 x 3
## SeniorCitizen n freq
## <fctr> <int> <dbl>
## 1 0 5901 0.8378532
## 2 1 1142 0.1621468
df %>%
group_by(SeniorCitizen, Churn) %>%
summarise(n = n()) %>%
mutate(freq = n / sum(n))
## # A tibble: 4 x 4
## # Groups: SeniorCitizen [2]
## SeniorCitizen Churn n freq
## <fctr> <fctr> <int> <dbl>
## 1 0 No 4508 0.7639383
## 2 0 Yes 1393 0.2360617
## 3 1 No 666 0.5831874
## 4 1 Yes 476 0.4168126
# Dari variable realtiaonship dapat dilihat,kira kira 16% of the customers are senior citizens, dan
# 42% dari senior citizens berhenti. Di sisi yang lain 84% of customers bukan senior citizens, hanya # 24% churn. Hasilnya
# Menunjukkan bahwa senior citizen lebih banyak berhenti.
# Sekarang lihat people with partners
#---Partner plot
ggplot(df) +
geom_bar(aes(x=Partner, fill = Churn), position = "dodge")
df %>%
group_by(Partner) %>%
summarise(n = n()) %>%
mutate(freq = n / sum(n))
## # A tibble: 2 x 3
## Partner n freq
## <fctr> <int> <dbl>
## 1 No 3641 0.5169672
## 2 Yes 3402 0.4830328
df %>%
group_by(Partner, Churn) %>%
summarise(n = n()) %>%
mutate(freq = n / sum(n))
## # A tibble: 4 x 4
## # Groups: Partner [2]
## Partner Churn n freq
## <fctr> <fctr> <int> <dbl>
## 1 No No 2441 0.6704202
## 2 No Yes 1200 0.3295798
## 3 Yes No 2733 0.8033510
## 4 Yes Yes 669 0.1966490
# Kira2 separo pelanggan punya pasangan, 20% nya berhenti, sisanya 33% tanpa pasangan tidak
# berhenti.
#---Dependents category.
ggplot(df) +
geom_bar(aes_string(x="Dependents", fill="Churn"), position = "dodge")
df %>% group_by(Dependents, Churn) %>%
summarise(n=n()) %>%
mutate(freq = n / sum(n))
## # A tibble: 4 x 4
## # Groups: Dependents [2]
## Dependents Churn n freq
## <fctr> <fctr> <int> <dbl>
## 1 No No 3390 0.6872086
## 2 No Yes 1543 0.3127914
## 3 Yes No 1784 0.8454976
## 4 Yes Yes 326 0.1545024
df %>% group_by(Dependents) %>%
summarise(n = n()) %>%
mutate(freq = n / sum(n))
## # A tibble: 2 x 3
## Dependents n freq
## <fctr> <int> <dbl>
## 1 No 4933 0.7004118
## 2 Yes 2110 0.2995882
# Hampir 30% pelanggan dependent ,15% nya berhenti. Lainnya 70% bukan dependent 31 %
# berhenti.
#---vizualisation blackbox-whiskers
# Senior Citizens
ggplot(df, aes(x = SeniorCitizen, y = TotalCharges)) +
geom_boxplot() #ok
# Partner
ggplot(df, aes(x = Partner, y = TotalCharges)) +
geom_boxplot()
# Bandingkan total charges of senior citizens, people without partners,
# dan people without dependents.
#--- Lets compare them so that we can identify where we would potentially focus our efforts.
# ---Total charges and tenure of senior citizens
df %>%
select(SeniorCitizen, Churn, TotalCharges, tenure) %>%
filter(SeniorCitizen == 1, Churn == "Yes") %>%
summarize(n = n(),
total = sum(TotalCharges),
avg_tenure = sum(tenure)/n)
## # A tibble: 1 x 3
## n total avg_tenure
## <int> <dbl> <dbl>
## 1 476 882405.2 21.03361
# Total charges and tenure of people without a partner
df %>%
select(Partner, Churn, TotalCharges, tenure) %>%
filter(Partner == "No", Churn == "Yes") %>%
summarise(n = n(),
total = sum(TotalCharges),
avg_tenure = sum(tenure)/n)
## # A tibble: 1 x 3
## n total avg_tenure
## <int> <dbl> <dbl>
## 1 1200 1306776 13.17667
# Total charges and tenure of people without dependents
df %>%
select(Dependents, Churn, TotalCharges, tenure) %>%
filter(Dependents == "No", Churn == "Yes") %>%
summarise(n = n(),
total = sum(TotalCharges),
avg_tenure = sum(tenure)/n)
## # A tibble: 1 x 3
## n total avg_tenure
## <int> <dbl> <dbl>
## 1 1543 2261840 17.12314
#---Summary
# Customer Segment Total Charges
# Senior Citizens 900,000
# No Partners 1,300,000
# No Dependents 2,300,000
#---Analisa akan difokuskan di variable Dependent yang mempunyai Total Charges 2,300,000.
dependents <- df %>% filter(Dependents == "No")
ggplotGrid(ncol=2,
lapply(c("PhoneService","MultipleLines","InternetService","OnlineSecurity","OnlineBackup",
"DeviceProtection"),
function(col){
ggplot(dependents,aes_string(col)) + geom_bar(aes(fill=Churn),position="dodge")
}))
ggplotGrid(ncol=2,
lapply(c("TechSupport","StreamingTV","StreamingMovies","Contract",
"PaperlessBilling"),
function(col){
ggplot(dependents,aes_string(col)) + geom_bar(aes(fill=Churn),position="dodge")
}))
ggplot(dependents) +
geom_bar(aes(x=PaymentMethod,fill=Churn), position = "dodge")
Rekomendasi:
Melihat hasilnya, kami mendapatkan beberapa wawasan potensial. Berdasarkan wawasan ini, berikut adalah beberapa rekomendasi untuk meningkatkan retensi pelanggan:
1. Banyak orang dengan phone service churned. Pindah ke paket tanpa layanan untuk menhemat biaya.
2. Orang-orang dengan internet serat optik lebih banyak berhenti, dibandingkan dengan paket DSL, promosi penguranga harga untuk paket serat optik akan mengurangi pelanggan serat optik berhenti.
3. Pelanngan tanpa OnlineBackup ,device protection, and online security lebih sering berhenti, mungkin karena crash dan sering kehilangan file, bahkan mengalami fraud, dan hacked, jadi promosi keamanan jaringan mereka akan mencegah churn.
4. Demikian pula untuk OnlineBackup dan OnlineSecurity, mereka yang tanpa OnlineSecurity cenderung menghasilkan lebih banyak daripada yang berlangganan layanan ini. Menambahkan OnlineBackup ke paket mereka mungkin merupakan cara yang baik untuk mencegah churn.
5. Mereka yang tidak memiliki TechSupport cenderung churn lebih sering daripada mereka yang memiliki TechSupport. Memindahkan pelanggan ke akun InternetService mungkin merupakan cara potensial lain untuk mencegah churn.
Ada sejumlah wawasan berbeda lainnya yang dapat kita peroleh dari data, tetapi ini akan menjadi daftar awal yang baik untuk menyelidiki lebih lanjut jika perusahaan memiliki set data yang lebih rinci.
Pada artikel berikutnya, saya akan mengembangkan model prediksi. Saya akan membuat beberapa asumsi tentang akuisisi pelanggan dan biaya retensi pelanggan. Ini akan memungkinkan saya untuk menempatkan jumlah biaya aktual di belakang penghematan biaya potensial dari model saya.
Referensi:
www.rstudio.com
Layanan berbasis langganan biasanya mendapatkan profit dengan tiga cara berikut:
1. Mencari pelanggan baru
2. Menaikkan transaksi pelanggan
3. Mempertahankan pelanggan existing.
Dalam analisa ini saya akan fokus pada retensi pelanggan, melakukan eksplorasi data, dengan mengawali cleaning data.
Beberapa pertanyaan yang berfokus pada segmen pelanggan untuk membantu memandu analisis, seperti siapa saja mudah berhenti berlangganan?, kenapa berhenti? bagaimana caranya agar mereka tidak berhenti? Terus promosi apa yang wajib dilakukan? Setelah pertanyaan ini terjawab, selanjutnya akan dibahas model prediktif churn pelanggan, dengan menggunakan berbagai model machine learning.
Gb1 |
Gb2 |
Berikut script R nya:
#---Library
library(tidyverse)
library(miscset)
#---Wrangling the Data
Sample data telecomunikasi diambil dari IMB Watson Analytic Website
df <- read.csv("d:/churn/WA_Fn-UseC_-Telco-Customer-Churn.csv")
Ubah variable SeniorCitizen menjadi factor
df$SeniorCitizen <- as.factor(df$SeniorCitizen)
#---Check missing value
df %>% map(~ sum(is.na(.)))
#---Masukkan data median ke data yang kosong
df <- df %>%
mutate(TotalCharges = replace(TotalCharges,
is.na(TotalCharges),
median(TotalCharges, na.rm = T)))
# checking that the imputation worked
sum(is.na(df$TotalCharges))
#[1] 0 Ok
#---Exploring the Data
#Let’s start by taking a look at the unique values of the factor variables.
df_tbl <- df %>%
select_if(is.factor) %>%
summarise_all(n_distinct)
df_tbl[1:8] %>%
print(width = Inf)
## # A tibble: 1 x 8
## customerID gender SeniorCitizen Partner Dependents PhoneService MultipleLines InternetService
## <int> <int> <int> <int> <int> <int> <int> <int>
## 1 7043 2 2 2 2 2 3 3
df_tbl[9:15] %>%
print(width = Inf)
## # A tibble: 1 x 7
## OnlineSecurity OnlineBackup DeviceProtection TechSupport StreamingTV StreamingMovies Contract
## <int> <int> <int> <int> <int> <int> <int>
## 1 3 3 3 3 3 3 3
df_tbl[16:18] %>%
print(width = Inf)
## # A tibble: 1 x 3
## PaperlessBilling PaymentMethod Churn
## <int> <int> <int>
## 1 2 4 2
#---Untuk menganalisa , saya akan menjawab pertanyaan
1. Apakah pelanggan pria cenderung lebih sering berhenti daripada pelanggan wanita?
2. Apakah senior citizen cenderung lebih banyak berhenti?
3. Apakah individu yg punya pasangan cenderung lebih sering berhenti berlangganan drpd pelanggan singgle?
4. Apakah pelanggan dependent people lebih banyak berhenti? daripada yang no dependent?
#---Gender plot
ggplot(df) +
geom_bar(aes(x = gender, fill = Churn), position = "dodge")#ok smilar
df %>%
group_by(gender,Churn) %>%
summarise(n=n())
## # A tibble: 4 x 3
## # Groups: gender [?]
## gender Churn n
## <fctr> <fctr> <int>
## 1 Female No 2549
## 2 Female Yes 939
## 3 Male No 2625
## 4 Male Yes 930
#---Senior Citizen plot
ggplot(df) +
geom_bar(aes(x = SeniorCitizen, fill = Churn), position = "dodge")#ok
df %>%
group_by(SeniorCitizen) %>%
summarise(n = n()) %>%
mutate(freq = n / sum(n))
## # A tibble: 2 x 3
## SeniorCitizen n freq
## <fctr> <int> <dbl>
## 1 0 5901 0.8378532
## 2 1 1142 0.1621468
df %>%
group_by(SeniorCitizen, Churn) %>%
summarise(n = n()) %>%
mutate(freq = n / sum(n))
## # A tibble: 4 x 4
## # Groups: SeniorCitizen [2]
## SeniorCitizen Churn n freq
## <fctr> <fctr> <int> <dbl>
## 1 0 No 4508 0.7639383
## 2 0 Yes 1393 0.2360617
## 3 1 No 666 0.5831874
## 4 1 Yes 476 0.4168126
# Dari variable realtiaonship dapat dilihat,kira kira 16% of the customers are senior citizens, dan
# 42% dari senior citizens berhenti. Di sisi yang lain 84% of customers bukan senior citizens, hanya # 24% churn. Hasilnya
# Menunjukkan bahwa senior citizen lebih banyak berhenti.
# Sekarang lihat people with partners
#---Partner plot
ggplot(df) +
geom_bar(aes(x=Partner, fill = Churn), position = "dodge")
df %>%
group_by(Partner) %>%
summarise(n = n()) %>%
mutate(freq = n / sum(n))
## # A tibble: 2 x 3
## Partner n freq
## <fctr> <int> <dbl>
## 1 No 3641 0.5169672
## 2 Yes 3402 0.4830328
df %>%
group_by(Partner, Churn) %>%
summarise(n = n()) %>%
mutate(freq = n / sum(n))
## # A tibble: 4 x 4
## # Groups: Partner [2]
## Partner Churn n freq
## <fctr> <fctr> <int> <dbl>
## 1 No No 2441 0.6704202
## 2 No Yes 1200 0.3295798
## 3 Yes No 2733 0.8033510
## 4 Yes Yes 669 0.1966490
# Kira2 separo pelanggan punya pasangan, 20% nya berhenti, sisanya 33% tanpa pasangan tidak
# berhenti.
#---Dependents category.
ggplot(df) +
geom_bar(aes_string(x="Dependents", fill="Churn"), position = "dodge")
df %>% group_by(Dependents, Churn) %>%
summarise(n=n()) %>%
mutate(freq = n / sum(n))
## # A tibble: 4 x 4
## # Groups: Dependents [2]
## Dependents Churn n freq
## <fctr> <fctr> <int> <dbl>
## 1 No No 3390 0.6872086
## 2 No Yes 1543 0.3127914
## 3 Yes No 1784 0.8454976
## 4 Yes Yes 326 0.1545024
df %>% group_by(Dependents) %>%
summarise(n = n()) %>%
mutate(freq = n / sum(n))
## # A tibble: 2 x 3
## Dependents n freq
## <fctr> <int> <dbl>
## 1 No 4933 0.7004118
## 2 Yes 2110 0.2995882
# Hampir 30% pelanggan dependent ,15% nya berhenti. Lainnya 70% bukan dependent 31 %
# berhenti.
#---vizualisation blackbox-whiskers
# Senior Citizens
ggplot(df, aes(x = SeniorCitizen, y = TotalCharges)) +
geom_boxplot() #ok
# Partner
ggplot(df, aes(x = Partner, y = TotalCharges)) +
geom_boxplot()
# Bandingkan total charges of senior citizens, people without partners,
# dan people without dependents.
#--- Lets compare them so that we can identify where we would potentially focus our efforts.
# ---Total charges and tenure of senior citizens
df %>%
select(SeniorCitizen, Churn, TotalCharges, tenure) %>%
filter(SeniorCitizen == 1, Churn == "Yes") %>%
summarize(n = n(),
total = sum(TotalCharges),
avg_tenure = sum(tenure)/n)
## # A tibble: 1 x 3
## n total avg_tenure
## <int> <dbl> <dbl>
## 1 476 882405.2 21.03361
# Total charges and tenure of people without a partner
df %>%
select(Partner, Churn, TotalCharges, tenure) %>%
filter(Partner == "No", Churn == "Yes") %>%
summarise(n = n(),
total = sum(TotalCharges),
avg_tenure = sum(tenure)/n)
## # A tibble: 1 x 3
## n total avg_tenure
## <int> <dbl> <dbl>
## 1 1200 1306776 13.17667
# Total charges and tenure of people without dependents
df %>%
select(Dependents, Churn, TotalCharges, tenure) %>%
filter(Dependents == "No", Churn == "Yes") %>%
summarise(n = n(),
total = sum(TotalCharges),
avg_tenure = sum(tenure)/n)
## # A tibble: 1 x 3
## n total avg_tenure
## <int> <dbl> <dbl>
## 1 1543 2261840 17.12314
#---Summary
# Customer Segment Total Charges
# Senior Citizens 900,000
# No Partners 1,300,000
# No Dependents 2,300,000
#---Analisa akan difokuskan di variable Dependent yang mempunyai Total Charges 2,300,000.
dependents <- df %>% filter(Dependents == "No")
ggplotGrid(ncol=2,
lapply(c("PhoneService","MultipleLines","InternetService","OnlineSecurity","OnlineBackup",
"DeviceProtection"),
function(col){
ggplot(dependents,aes_string(col)) + geom_bar(aes(fill=Churn),position="dodge")
}))
ggplotGrid(ncol=2,
lapply(c("TechSupport","StreamingTV","StreamingMovies","Contract",
"PaperlessBilling"),
function(col){
ggplot(dependents,aes_string(col)) + geom_bar(aes(fill=Churn),position="dodge")
}))
ggplot(dependents) +
geom_bar(aes(x=PaymentMethod,fill=Churn), position = "dodge")
Rekomendasi:
Melihat hasilnya, kami mendapatkan beberapa wawasan potensial. Berdasarkan wawasan ini, berikut adalah beberapa rekomendasi untuk meningkatkan retensi pelanggan:
1. Banyak orang dengan phone service churned. Pindah ke paket tanpa layanan untuk menhemat biaya.
2. Orang-orang dengan internet serat optik lebih banyak berhenti, dibandingkan dengan paket DSL, promosi penguranga harga untuk paket serat optik akan mengurangi pelanggan serat optik berhenti.
3. Pelanngan tanpa OnlineBackup ,device protection, and online security lebih sering berhenti, mungkin karena crash dan sering kehilangan file, bahkan mengalami fraud, dan hacked, jadi promosi keamanan jaringan mereka akan mencegah churn.
4. Demikian pula untuk OnlineBackup dan OnlineSecurity, mereka yang tanpa OnlineSecurity cenderung menghasilkan lebih banyak daripada yang berlangganan layanan ini. Menambahkan OnlineBackup ke paket mereka mungkin merupakan cara yang baik untuk mencegah churn.
5. Mereka yang tidak memiliki TechSupport cenderung churn lebih sering daripada mereka yang memiliki TechSupport. Memindahkan pelanggan ke akun InternetService mungkin merupakan cara potensial lain untuk mencegah churn.
Ada sejumlah wawasan berbeda lainnya yang dapat kita peroleh dari data, tetapi ini akan menjadi daftar awal yang baik untuk menyelidiki lebih lanjut jika perusahaan memiliki set data yang lebih rinci.
Pada artikel berikutnya, saya akan mengembangkan model prediksi. Saya akan membuat beberapa asumsi tentang akuisisi pelanggan dan biaya retensi pelanggan. Ini akan memungkinkan saya untuk menempatkan jumlah biaya aktual di belakang penghematan biaya potensial dari model saya.
Referensi:
www.rstudio.com
Tidak ada komentar:
Posting Komentar