Esempi di Business Analytics/Gruppi di clienti

Caricamento librerie

modifica
library(dplyr)
library(ggplot2)
library(factoextra)

Parte 1: Dati

modifica

Il 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

modifica

Si vogliono suddividere i clienti in clusters simili in modo da inviare ad ogni cluster offerte simili che possono loro interessare.

Parte 3: Creazione clusters

modifica

Si 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