Esempi di Business Analytics/Gruppi di clienti
Caricamento librerie
modificalibrary(dplyr)
library(ggplot2)
library(factoextra)
Parte 1: Dati
modificaIl dataset WA_Fn-UseC_-Telco-Customer-Churn.csv scaricabile da qui: https://community.ibm.com/accelerators/catalog/content/Customer-churn contiene 7032 osservazioni relative ai clienti di una società di telecomunicazioni . In particolare le 21 variabili del dataset sono :
- customerID: ID cliente
- gender: genere (femmina, maschio)
- SeniorCitizen: se il cliente è un anziano o meno (1, 0)
- PartnerWhether: il cliente ha un partner o meno (Sì, No)
- Dependents: se il cliente ha dipendenti o meno (Sì, No)
- tenure: numero di mesi in cui il cliente è rimasto in azienda
- PhoneService: se il cliente dispone o meno di un servizio telefonico (Sì, No)
- MultipleLines: se il cliente ha più linee o meno (Sì, No, Nessun servizio telefonico)
- InternetService: provider di servizi Internet del cliente (DSL, fibra ottica, no)
- OnlineSecurity: se il cliente dispone o meno della sicurezza online (Sì, No, Nessun servizio Internet)
- OnlineBackup: se il cliente ha o meno un backup online (Sì, No, Nessun servizio Internet)
- DeviceProtection: se il cliente dispone o meno della protezione del dispositivo (Sì, No, Nessun servizio Internet)
- TechSupport: se il cliente ha o meno supporto tecnico (Sì, No, Nessun servizio Internet)
- StreamingTV: se il cliente ha o meno la TV in streaming (Sì, No, Nessun servizio Internet)
- StreamingMovies: se il cliente ha o meno film in streaming (Sì, No, Nessun servizio Internet)
- Contract: la durata del contratto del cliente (mese per mese, un anno, due anni)
- PaperlessBilling: se il cliente ha o meno la fatturazione senza carta (Sì, No)
- PaymentMethod: il metodo di pagamento del cliente (assegno elettronico, assegno postale, bonifico bancario (automatico), carta di credito (automatico))
- MonthlyCharges: l'importo addebitato mensilmente al cliente
- TotalCharges: L'importo totale addebitato al cliente
- Churn: se il cliente ha abbandonato o meno (Sì o No)
Caricamento dati:
data=read.table('WA_Fn-UseC_-Telco-Customer-Churn.csv',header = T,sep=',')
Parte 2: Domanda di ricerca
modificaSi vogliono suddividere i clienti in clusters simili in modo da inviare ad ogni cluster offerte simili che possono loro interessare.
Parte 3: Creazione clusters
modificaSi eliminano le osservazioni contenenti valori mancanti NA
colSums(is.na(data))
data <- data[-which(is.na(data$TotalCharges)),]
Si converte il dataset in una matrice normalizzata essendo le variabili misurabili in maniera diversa:
mat<- data.matrix(data[,-1])
scale_data <- scale(mat)
Si applicano i metodi elbow e silhouette con l'algoritmo k-means per calcolare il numero migliore di clusters in cui suddividere il dataset e si ottiene che tale numero è 4:
fviz_nbclust(scale_data, kmeans, method = "wss") +
geom_vline(xintercept = 4, linetype = 2) +
labs(subtitle = "Elbow method")
# Silhouette method
fviz_nbclust(scale_data, kmeans, method = "silhouette") +
labs(subtitle = "Silhouette method")
Si applica l'algoritmo k-means suddividendo il dataset in 4 clusters:
cl <- kmeans(scale_data,4)
data2<- as.data.frame(mat)
data2$groups = cl$cluster
Calcolo la media delle variabili, il numero totale di osservazioni e la percentuale per ogni cluster :
df1<-data2 %>%
group_by(groups) %>%
summarise_all(mean)
df2<-data2 %>%
group_by(groups) %>%
summarise_all(length)
df1$total <- df2$gender
df1$proportion <-df1$total*100/sum(df1$total)
Visualizzo la trasposta del dataframe per consentire una migliore analisi dei dati e l'esportazione in un foglio di calcolo:
df3<-df1 %>%
arrange(desc(total))
n<- df3$groups
df4 <- as.data.frame(t(df3[,-1]))
colnames(df4)<-n
write.csv(df4, file = "clusters.csv", row.names = F)
df4
2 1 3 4 gender 1.4985391 1.5059895 1.509665e+00 1.5145038 SeniorCitizen 0.2187728 0.1887877 3.157216e-02 0.1526718 Partner 1.3144631 1.7110685 1.489046e+00 1.4412214 Dependents 1.1723886 1.3703881 1.427191e+00 1.2916031 tenure 15.8352812 56.1739339 3.062629e+01 30.3297710 PhoneService 2.0000000 1.9880211 2.000000e+00 1.0000000 MultipleLines 1.8108108 2.4676569 1.435567e+00 2.0000000 InternetService 1.6541271 1.6257786 2.958119e+00 1.0000000 OnlineSecurity 1.3922571 2.1427887 2.013531e+00 1.7908397 OnlineBackup 1.5040175 2.3919502 2.005799e+00 1.8000000 DeviceProtection 1.4470416 2.4523239 1.995490e+00 1.8488550 TechSupport 1.3586560 2.2089123 2.012242e+00 1.8000000 StreamingTV 1.6515705 2.4849066 1.983892e+00 1.7877863 StreamingMovies 1.6501096 2.4992813 1.983892e+00 1.8335878 Contract 1.0883857 2.2050791 2.076675e+00 1.6320611 PaperlessBilling 1.7063550 1.6818400 1.285438e+00 1.5618321 PaymentMethod 2.7750183 2.0982271 2.830541e+00 2.6335878 MonthlyCharges 73.9750913 91.8849066 2.216859e+01 41.1416031 TotalCharges 1195.1118882 5176.7989219 6.919161e+02 1383.3881679 Churn 1.4842951 1.1264974 1.070232e+00 1.2595420 total 2738.0000000 2087.0000000 1.552000e+03 655.0000000 proportion 38.9362912 29.6786121 2.207053e+01 9.3145620
Cluster 3 : Contratto mese per mese Fedele da poco cliente
Cluster 2 Ha un partner Da molti mesi cliente Ha più linee Dsl o fibra ottica Contratto annuale Molto redditizio
Cluster 1 Non ha internet Contratto annuale Da pochi mesi cliente
Cluster 4 Ha più linee Fibra ottica Streaming TV e film Contratto mese per mese Molto redditizio Potrebbe andarsene Da pochi mesi cliente