Prédiction de désabonnement

Photo de Mantas Hesthaven sur Unsplash

Le désabonnement des clients, également appelé attrition des clients, se produit lorsque les clients cessent de faire affaire avec une entreprise. Les entreprises sont intéressées à identifier des segments de ces clients car le prix pour acquérir un nouveau client est généralement plus élevé que pour conserver l’ancien. Par exemple, si Netflix connaissait un segment de clients à risque de désabonnement, il pourrait les engager de manière proactive avec des offres spéciales au lieu de simplement les perdre.

Dans cet article, nous allons créer un modèle de prédiction de désabonnement des clients simple à l’aide de l’ensemble de données de désabonnement des clients des compagnies de téléphone. Nous avons choisi un arbre de décision pour modéliser les clients désabonnés, les pandas pour le crunching des données et matplotlib pour les visualisations. Nous ferons tout cela ci-dessus en Python.
Le code peut être utilisé avec un autre jeu de données avec quelques ajustements mineurs pour entraîner le modèle de base. Nous fournissons également quelques références et donnons des idées de nouvelles fonctionnalités et améliorations.

Vous pouvez exécuter ce code en téléchargeant ce bloc-notes Jupyter.

Voici quelques liens qui pourraient vous intéresser:

- Labeling and Data Engineering for Conversational AI and Analytics- Data Science for Business Leaders - Intro to Machine Learning with PyTorch - Become a Growth Product Manager - Deep Learning (Adaptive Computation and ML series) - Free skill tests for Data Scientists & Machine Learning Engineers

Certains des liens ci-dessus sont des liens d’affiliation et si vous les parcourez pour effectuer un achat, je gagnerai une commission. Gardez à l’esprit que je relie les cours en raison de leur qualité et non à cause de la commission que je reçois de vos achats.

Nous utilisons des pandas pour lire l’ensemble de données et le prétraiter. L’ensemble de données Telco a un client par ligne avec de nombreuses colonnes (fonctionnalités). Il n’y a pas de lignes avec toutes les valeurs manquantes ou les doublons (cela se produit rarement avec des ensembles de données réels). Il y a 11 échantillons qui ont TotalCharges défini sur «  », ce qui semble être une erreur dans les données. Nous supprimons ces échantillons et définissons le type sur numeric (float).

df = pd.read_csv('data/WA_Fn-UseC_-Telco-Customer-Churn.csv')df = df.dropna(how=”all”) # remove samples with all missing values
df = df # remove duplicatestotal_charges_filter = df.TotalCharges == " "
df = df
df.TotalCharges = pd.to_numeric(df.TotalCharges)

Premiers échantillons dans l’ensemble de données de désabonnement des clients de la compagnie de téléphone

Analyse exploratoire des données

Nous avons 2 types de fonctionnalités dans l’ensemble de données: catégorielles (deux valeurs ou plus et sans ordre) et numériques. La plupart des noms de fonctionnalités sont explicites, à l’exception de:

  • Partenaire : que le client ait un partenaire ou non (Oui, Non),
  • Personnes à charge: si le client a des personnes à charge ou non (Oui, Non),
  • OnlineBackup: Si le client a une sauvegarde en ligne ou non (Oui, Non, Pas de service Internet),
  • durée: nombre de mois que le client a séjourné dans l’entreprise,
  • Mensuellement Charges: le montant facturé mensuellement au client,
  • TotalCharges: le montant total facturé au client.

Il y a 7032 clients dans l’ensemble de données et 19 fonctionnalités sans customerID (non informatif) et colonne Churn (variable cible). La plupart des fonctionnalités catégorielles ont 4 valeurs uniques ou moins.

Résumé de l’ensemble de données

Nous combinons les entités en deux listes afin de pouvoir les analyser conjointement.

categorical_features = 
numerical_features =
target = "Churn”

Distribution des caractéristiques numériques

Techniques de synthèse numérique (moyenne, écart type, etc.) ne nous montre pas de pointes, de formes de distributions et il est difficile d’observer des valeurs aberrantes avec elle. C’est la raison pour laquelle nous utilisons des histogrammes.

df.describe()

Résumé des caractéristiques numériques

À première vue, il n’y a pas de valeurs aberrantes dans les données. Aucun point de données n’est déconnecté de la distribution ou trop éloigné de la valeur moyenne. Pour confirmer que nous aurions besoin de calculer la plage interquartile (IQR) et de montrer que les valeurs de chaque caractéristique numérique se situent dans les 1,5 IQR du premier et du troisième quartile.

Nous pourrions convertir des caractéristiques numériques en intervalles ordinaux. Par exemple, la tenure est numérique, mais souvent, nous ne nous soucions pas des petites différences numériques et regroupons plutôt la tenure aux clients ayant une tenure à court, moyen et long terme. Une raison de le convertir serait de réduire le bruit, souvent les petites fluctuations ne sont que du bruit.

df.hist(bins=30, figsize=(10, 7))

Histogrammes de caractéristiques numériques

Nous examinons les distributions de caractéristiques numériques par rapport à la variable cible. Nous pouvons observer que plus les charges totales et la durée d’occupation sont élevées, moins la probabilité de désabonnement est grande.

fig, ax = plt.subplots(1, 3, figsize=(14, 4))
df.hist(bins=30, color="blue", alpha=0.5, ax=ax)
df.hist(bins=30, color="red", alpha=0.5, ax=ax)

Caractéristiques numériques par rapport à la variable cible

Distribution des caractéristiques catégorielles

Pour analyser les caractéristiques catégorielles, nous utilisons des graphiques à barres. Nous observons que les seniors et les clients sans service téléphonique sont moins représentés dans les données.

ROWS, COLS = 4, 4
fig, ax = plt.subplots(ROWS, COLS, figsize=(18, 18))
row, col = 0, 0
for i, categorical_feature in enumerate(categorical_features):
if col == COLS - 1:
row += 1
col = i % COLS
df.value_counts().plot('bar', ax=ax).set_title(categorical_feature)

Distribution des entités catégorielles

L’étape suivante consiste à examiner les entités catégorielles par rapport à la variable cible. Nous le faisons uniquement pour les fonctionnalités contractuelles. Les utilisateurs qui ont un contrat mensuel sont plus susceptibles de désabonner que les utilisateurs avec des contrats à long terme.

feature = ‘Contract’
fig, ax = plt.subplots(1, 2, figsize=(14, 4))
df.value_counts().plot(‘bar’, ax=ax).set_title(‘not churned’)
df.value_counts().plot(‘bar’, ax=ax).set_title(‘churned’)

div>

Caractéristique de contrat par rapport à la variable cible

Distribution de variable cible

La distribution de variable cible montre que nous avons affaire à un problème déséquilibré car il y a beaucoup plus d’utilisateurs non-barattés en tant qu’utilisateurs barattés. Le modèle atteindrait une grande précision car il prédisait principalement les utilisateurs de classe majoritaire qui ne se sont pas désabonnés dans notre exemple.

Peu de choses que nous pouvons faire pour minimiser l’influence d’un ensemble de données déséquilibré:
– rééchantillonner les données (déséquilibré-apprendre),
– collecter plus d’échantillons,
– utiliser la précision et le rappel comme métriques de précision.

df.value_counts().plot('bar').set_title('churned')

Distribution de variables cibles

Caractéristiques

L’ensemble de données Telco est déjà groupé par customerID, il est donc difficile d’ajouter de nouvelles fonctionnalités. Lorsque nous travaillons sur la prédiction de désabonnement, nous obtenons généralement un ensemble de données qui a une entrée par session client (activité du client dans un certain temps). Ensuite, nous pourrions ajouter des fonctionnalités telles que:

  • nombre de sessions avant d’acheter quelque chose,
  • temps moyen par session,
  • décalage horaire entre les sessions (client fréquent ou moins fréquent),
  • est un client uniquement dans un pays.

Parfois, nous avons même des données sur les événements clients, ce qui nous permet de trouver des modèles de comportement des clients par rapport au résultat (désabonnement).

Caractéristiques d’encodage

Pour préparer l’ensemble de données pour la modélisation du désabonnement, nous devons encoder les caractéristiques catégorielles en nombres. Cela signifie encoder « Oui », « Non » à 0 et 1 afin que l’algorithme puisse fonctionner avec les données. Ce processus est appelé encodage onehot.

Un hot caractéristiques catégorielles codées

Classificateur

Nous utilisons sklearn, une bibliothèque d’apprentissage automatique en Python, pour créer un classificateur.
La méthode sklearn consiste à utiliser des pipelines qui définissent le traitement des entités et le classificateur. Dans notre exemple, le pipeline prend un ensemble de données dans l’entrée, il prétraite les entités et forme le classificateur.
Une fois entraîné, il prend la même entrée et renvoie des prédictions dans la sortie.

Dans le pipeline, nous traitons séparément les caractéristiques catégorielles et numériques. Nous codons à chaud des caractéristiques catégorielles et mettons à l’échelle des caractéristiques numériques en supprimant la moyenne et en les mettant à l’échelle en variance unitaire.
Nous avons choisi un modèle d’arbre de décision en raison de son interprétabilité et avons défini la profondeur maximale à 3 (arbitrairement).

Le pipeline prend un jeu de données dans l’entrée, il prétraite les caractéristiques et entraîne le classificateur

Formation du modèle

Nous divisons l’ensemble de données pour former (75% d’échantillons) et tester (25% d’échantillons).
Nous entraînons (ajustons) le pipeline et faisons des prédictions. Avec classification_report, nous calculons la précision et le rappel avec des valeurs réelles et prédites.

from sklearn.model_selection import train_test_splitdf_train, df_test = train_test_split(df, test_size=0.25, random_state=42)pipeline.fit(df_train, df_train)
pred = pipeline.predict(df_test)

Tester le modèle

Avec classification_report, nous calculons la précision et le rappel avec les valeurs réelles et prédites.

Pour la classe 1 (utilisateurs barattés), le modèle atteint une précision de 0,67 et un rappel de 0,37. La précision nous indique combien d’utilisateurs désabonnés notre classificateur a-t-il prédit correctement. De l’autre côté, rappelez-nous combien d’utilisateurs désabonnés il a manqué.

En termes simples, le classificateur n’est pas très précis pour les utilisateurs désabonnés.

from sklearn.metrics import classification_reportprint(classification_report(df_test, pred))

Rapport de classification pour le modèle d’arbre de décision

Interprétabilité du modèle

Le modèle d’arbre de décision utilise des fonctionnalités de contrat, de charges mensuelles, d’InternetService, de charges totales et de tenure pour prendre une décision si un client va désabonner ou non. Ces fonctionnalités séparent bien les clients désabonnés des autres en fonction des critères de répartition dans l’arbre de décision.

Chaque échantillon de client traverse l’arborescence et le nœud final donne la prédiction.
Par exemple, si Contract_Month-to-month est :

  • égal à 0, continuez à parcourir l’arbre avec la Vraie branche,
  • égal à 1, continuez à parcourir l’arbre avec la Fausse branche,
  • non défini, il affiche la classe 0.

C’est une excellente approche pour voir comment le modèle prend une décision ou si des fonctionnalités se sont faufilées dans notre modèle qui ne devraient pas être là.

Interprétation de la Modèle d’arbre de décision

Pour en savoir plus

  1. Gestion du déséquilibre de classe dans la prédiction du désabonnement des clients — comment pouvons-nous mieux gérer le déséquilibre de classe dans la prédiction du désabonnement.
  2. Une enquête sur la prédiction du taux de désabonnement des clients à l’aide de Techniques d’apprentissage automatique] — Cet article passe en revue les algorithmes d’apprentissage automatique les plus populaires utilisés par les chercheurs pour prédire le taux de désabonnement.
  3. Désabonnement des clients des compagnies de téléphone sur Kaggle – Analyse de désabonnement sur Kaggle.
  4. WTTE-RNN-Hackless-churn-modeling — Prédiction de churn basée sur les événements.

Avant de partir

Suivez-moi sur Twitter, où je tweete régulièrement sur la Science des données et l’Apprentissage automatique.

Photo par Courtney Hedger sur Unsplash

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.