Vous êtes sur la page 1sur 8

Ecole Hassania des Travaux Publics MSDE (Edition 2)

Master Spécialisé « Data Engineering » (MSDE)

Projet Module 5 :

Musicly – Big Data Capstone Project

1. Introduction

Le churn des clients

Le taux de désabonnement (ou attrition de clients) est une tendance des clients à abandonner une
marque et à cesser d'être un client payant d'une entreprise particulière.
Le pourcentage de clients qui cessent d’utiliser les produits ou services d’une entreprise au cours
d’une période donnée est appelé taux de désabonnement (attrition).

Contexte business de Musicly

Musicly est un service de streaming musical. Des millions d'utilisateurs jouent


quotidiennement leurs chansons préférées via ces services, soit via un niveau gratuit qui lit des
publicités, soit en utilisant un modèle d'abonnement premium qui offre des fonctionnalités
supplémentaires et est généralement sans publicité.
Les utilisateurs peuvent mettre à niveau ou rétrograder leur plan d'abonnement à tout moment,
mais également l'annuler complètement. Il est donc très important de s'assurer que les
utilisateurs aiment le service.

L'engagement, la fidélisation et le taux de désabonnement des clients ont toujours été des sujets
cruciaux pour les entreprises. De ce fait, l'analyse prédictive aide les entreprises à prendre des
mesures proactives telles que des offres et des remises pour fidéliser leurs clients et, dans
certains cas, améliorer la fidélité.

Chaque fois qu'un utilisateur interagit avec une application de diffusion de musique, des
données sont générées :
• en train de lire des chansons,
• de les ajouter à des listes de lecture,
• de les noter avec le pouce vers le bas / haut,
• d'ajouter un ami,
• de se connecter ou de se déconnecter,
• de modifier les paramètres.
Ecole Hassania des Travaux Publics MSDE (Edition 2)

Les journaux d'activité (logfiles) des utilisateurs contiennent des informations clés pour aider
les entreprises à comprendre si les utilisateurs sont satisfaits du service.

Afin de rester sur la bonne voie avec ses objectifs financiers, il est essentiel pour les entreprises
de streaming musical d'identifier les utilisateurs susceptibles de se désabonner. C'est-à-dire les
utilisateurs qui risquent de passer du niveau premium au niveau gratuit ou d'annuler le service.
Si une entreprise de Streaming de musique identifie avec précision ces utilisateurs à l'avance,
elle peut leur offrir des remises ou d'autres incitations similaires et économiser des millions de
revenus. C'est un fait bien connu qu'il est plus coûteux d'acquérir un nouveau client que de
conserver un client existant.

2. Enoncé du problème

L'objectif final de l’entreprise Musicly est de créer un modèle d'apprentissage automatique


capable de prédire le moment où il est probable qu'un client va se désister, de pouvoir prendre
des mesures à ce sujet et d'empêcher les clients d'annuler leurs comptes.

Pour aider à atteindre cette phase de prédiction d’attrition des clients, vous devez en premier
degré effectuer une exploration et un prétraitement rigoureux des données, notamment :
• Définir ce qu'est le taux de désabonnement (churn)
• Explorez comment les utilisateurs actifs et les utilisateurs actifs diffèrent selon les
données
• Trouver les colonnes d'intérêt à utiliser dans la modélisation et créer de nouvelles
fonctionnalités basées sur les données disponibles (ingénierie des fonctionnalités)
• Sélectionner les fonctionnalités les plus adaptées à la modélisation (sélection des
fonctionnalités)

✓ N.B : Le projet doit se faire avec pyspark sur un notebook ayant un moteur de calcul Spark
(voir la section pré-requis)
✓ N.B : Le livrable du projet doit être sous format html et ipynb, en exportant le notebook
une fois que vous avez fini.
✓ N.B : Chaque tache doit se faire sur une cellule indépendante (sauf si elles sont groupées).
Vos interprétations, analyses, commentaires et conclusions doivent se faire dans des
cellules apparts.
✓ N.B : Le deadline pour votre projet est pour le Vendredi 26 Mars à 23H

Pré-requis

• Plateforme requise:
o Databricks Community Edition
https://community.cloud.databricks.com/login.html
Ecole Hassania des Travaux Publics MSDE (Edition 2)

• Required cluster:
o Databricks Runtime Version
6.4 (includes Apache Spark 2.4.5, Scala 2.11)

• Dataset:
o Musicly-event-data.json (sur le drive)
L'ensemble de données se présente sous la forme d'un fichier JSON
contenant 543705 échantillons de données du journal des événements
d'octobre à décembre 2018 pour la plate-forme de streaming de
musique Musicly, similaire à des sociétés comme Spotify et Pandora.

• Documentation Spark
o Pyspark
https://spark.apache.org/docs/2.4.3/api/python/pyspark.sql.html

o Import de libraries
Vous pouvez importer les bibliothèques ci-dessous pour effectuer votre
exploration et analyse de données, ainsi que certaines configurations de
base :
from pyspark import SparkConf
from pyspark.sql import SparkSession
from pyspark.sql import Window

from pyspark.sql.functions import *


from pyspark.sql.types import *

import numpy as np
import pandas as pd
import datetime
from time import time
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
import seaborn as sns

%matplotlib inline

sns.set_palette('pastel')

pd.set_option('display.max_columns', None)
pd.set_option('display.expand_frame_repr', False)
pd.set_option('max_colwidth', -1)

spark = SparkSession \
.builder \
.appName("Sparkify") \
.getOrCreate()

spark.sparkContext.getConf().getAll()

df = spark.read.format("json").load("……..json")
df.printSchema()
Ecole Hassania des Travaux Publics MSDE (Edition 2)

Comprehension de données

Avant de commencer à sélectionner les fonctionnalités à utiliser et à configurer les modèles


pour l’equipe de l’IA, vous devriez comprendre vos données. Lorsque vous chargez l'ensemble
de données en tant que dataframe, il a la structure suivante, affichant les noms des colonnes et
leurs types de données:

root
|-- artist: string (nullable = true)
|-- auth: string (nullable = true)
|-- firstName: string (nullable = true)
|-- gender: string (nullable = true)
|-- itemInSession: long (nullable = true)
|-- lastName: string (nullable = true)
|-- length: double (nullable = true)
|-- level: string (nullable = true)
|-- location: string (nullable = true)
|-- method: string (nullable = true)
|-- page: string (nullable = true)
|-- registration: long (nullable = true)
|-- sessionId: long (nullable = true)
|-- song: string (nullable = true)
|-- status: long (nullable = true)
|-- ts: long (nullable = true)
|-- userAgent: string (nullable = true)
|-- userId: string (nullable = true)’

Les 543 705 lignes de l'ensemble de données appartiennent à un total de 448 utilisateurs
uniques, dont 99 sont des utilisateurs désabonnés et 349 sont des utilisateurs actifs. Il y a
quelques colonnes où les données sont manquantes, et elles sont liées à des colonnes contenant
des informations utilisateur et des colonnes liées à un type d'événement spécifique, à savoir les
événements où une chanson a été jouée.

To Do :
1. Quel est le nombre de colonnes dans le dataframe ?
2. Quel est le nombre d'échantillons dans le dataframe ?
3. Afficher les 10 premières lignes en tant que dataframe pandas
4. Détecter les anomalies au niveau Artist et faire un reformattage de ces valeurs.
5. Faire une description sur le groupement des champs suivants de votre dataset :
a. 'auth', 'firstName', 'gender', 'itemInSession', 'lastName', 'length', 'level', 'location'
b. 'method', 'page', 'registration', 'sessionId'
c. 'status', 'ts', 'userAgent', 'userId'
Ecole Hassania des Travaux Publics MSDE (Edition 2)

6. Faire un compte séparé des champs suivants :


a. Auth
b. Gender
c. Level
d. Method
e. Page
f. Song
g. Status
7. Détecter les valeurs ‘None’ et ‘NaN’ et interpréter leurs significations
8. Trouver des chaînes vides dans dataframe et interpréter leurs significations
9. Afficher les 10 premières lignes avec les 'userId' vides en tant que dataframe pandas
10. Afficher les valeurs distinctes pour la colonne 'auth' où 'userId' qui est vide
11. Afficher les 10 premières lignes avec des valeurs manquantes dans "artiste" en tant que
dataframe pandas
12. Afficher les valeurs distinctes pour la colonne «page» où «artiste» ont une valeur
manquante
13. Comparer les valeurs distinctes pour la colonne «page» pour l'ensemble de données et
le sous-ensemble en incluant uniquement les lignes où «artiste» a une valeur manquante
14. Supprimer les lignes sans données utilisateur (déconnecté ou invité), et afficher nombre
de lignes après suppression
15. Maintenant, vérifier les NaN et les Nulls dans la nouvelle trame de données. Qu’est-ce
que vous pouvez en conclure.
16. Faire une conversion du timestamp, et afficher les nouveaux champs registration et ts.
a. Utiliser udf pour convertir l'horodatage au format correct
# source: https://stackoverflow.com/questions/45977449/convert-times
tamp-to-date-in-spark-dataframe
get_timestamp = udf(lambda x: datetime.datetime.fromtimestamp(x/1000
.0).strftime('%Y-%m-%d %H:%M:%S'))
17. Imprimer toutes les périodes de temps pour tous les événements de l'ensemble de
données

Afin de comprendre tous les événements de l'ensemble de données qui se sont produites entre
octobre et décembre 2018.
18. Diviser la colonne location en deux, une colonne avec le nom de l’emplacement et une
colonne avec state/etat. Garder que le premier state/etat et afficher séparément le nom
de l’emplacement et le champ etat.

L'analyse exploratoire des données

Une fois que vous avez effectué une analyse préliminaire, créez une colonne Churn à utiliser
comme étiquette pour le modèle. Il est recommandé d'utiliser les événements de confirmation
d'annulation pour définir votre taux de désabonnement, qui se produisent à la fois pour les
utilisateurs payants et gratuits.
Ecole Hassania des Travaux Publics MSDE (Edition 2)

Une fois que vous avez défini le taux de désabonnement, effectuez une analyse exploratoire
des données pour observer le comportement des utilisateurs qui sont restés par rapport aux
utilisateurs qui ont abandonné. Vous pouvez commencer par explorer les agrégats sur ces deux
groupes d'utilisateurs, en observant le degré d'action spécifique qu'ils ont vécu par unité de
temps ou nombre de chansons jouées.

To Do :

1. Créer une nouvelle colonne «churn»


a. churn = 1 (oui) si la colonne page = Cancellation Confirmation', sinon 0 (Non)
2. Afficher les décomptes par valeur du «churn»

Il est recommandé d'utiliser une définition assez stricte mais simple pour le taux de
désabonnement, où un utilisateur est considéré comme étant désabonné seulement quand il
a supprimé son compte et a complètement cessé d'utiliser le service. Ceci est facilement
accessible dans les données comme 'page == Cancellation Confirmation' et s'applique aux
plans gratuits et payants de la même manière.

3. Obtenir l'ID utilisateur où le taux de désabonnement = 1


4. Conserver que les valeurs de la colonne 'userId' et les stocker sous forme de liste
5. Afficher les userId pour les utilisateurs désabonnés
6. Définir la colonne 'churn' en 1 pour toutes les lignes d'un utilisateur désabonné
7. Afficher les décomptes par valeur pour la colonne «churn»
8. Afficher tous les événements liés à un utilisateur désabonné
a. Ici, vous pouvez voir tous les événements liés à un utilisateur spécifique qui
s'est désabonné. L'ordre montre les événements menant à la confirmation
d'annulation.
9. Afficher les éléments suivants :
a. Nombre de lignes / événements dans la dataframe
b. Nombre de userId uniques dans la dataframe
c. Nombre d'utilisateurs qui se sont désabonnés
d. Nombre d'utilisateurs actifs (non désabonnés)

Si nous analysons le nombre d'utilisateurs désabonnés et actifs, nous allons voir qu’il y a
environ trois fois plus d'échantillons avec des utilisateurs actifs. Et afin de comprendre mieux
pourquoi ces utilisateurs ont choisi de se désabonner, vous allez faire l’analyse suivante et
interpréter le résultat :
10. Convertir votre dataframe en pandas dataframe
11. Créer un filtre sur les lignes qui ont la valeur «Annuler» dans la colonne «page»
12. Utiliser le filtre pour sélectionner les lignes/évènements avant les lignes du filtre créé
pour voir ce que l'utilisateur a fait avant l'événement 'Annuler'.
13. Quelle est votre interprétation du résultat ?
Afin de mieux comprendre le comportement de l’utilisateur ainsi que la relation de son activité
et son désabonnement, vous allez afficher les informations suivantes et interpréter le résultat :
Ecole Hassania des Travaux Publics MSDE (Edition 2)

14. Nombre moyen d'événements / d'interactions par utilisateur


15. Nombre moyen de sessions par utilisateur
16. Nombre moyen d'éléments dans une session par utilisateur
17. Quelle est votre interprétation du résultat ?
18. Durée moyenne de session pour les utilisateurs désabonnés / actifs via un graphe
a. Utiliser udf pour convertir l'horodatage au format correct
# source: https://stackoverflow.com/questions/45977449/convert-times
tamp-to-date-in-spark-dataframe
get_timestamp = udf(lambda x: datetime.datetime.fromtimestamp(x/1000
.0).strftime('%Y-%m-%d %H:%M:%S'))

a. Créer une dataframe avec le premier timestamp (ts) par session


b. Ajoutez la colonne 'churn' et définissez-la sur 1 pour les lignes avec un
utilisateur désabonné
c. Créer une dataframe avec le dernier timestamp (ts) par session
d. Joindre les dataframes
e. appliquer udf lors du calcul et de la création d'une nouvelle colonne avec
décalage horaire
f. Créer un graph de la durée de session par groupe d'utilisateurs
g. Stocker les colonnes à utiliser comme dataframe pandas
h. Faire plot pour afficher les résultats obtenus
i. Afficher la durée moyenne des sessions pour les utilisateurs désabonnés
j. Afficher la durée moyenne des sessions pour les utilisateurs actifs
k. Quelle est votre interprétation du résultat ?
19. Afficher le nombre moyen de jours enregistrés pour les utilisateurs actifs / désabonnés
a. Afficher la durée moyenne d'inscription / d'utilisation par utilisateur (jours entre
la date d'inscription et le dernier événement)
b. Créer une dataframe avec le dernier timestamp (ts) par utilisateur
c. Faire une jointure des dataframes et ajoutez la colonne ‘ jours_enregistrés’ avec
le nombre de jours entre la date d'inscription et le timpestamp/ts pour le dernier
événement.
d. Créer un graph du nombre de jours enregistrés par groupe d'utilisateurs
e. Stocker les colonnes à utiliser comme dataframe pandas
f. Faire plot pour afficher les résultats obtenus
g. Afficher le nombre moyen de jours enregistrés pour les utilisateurs désabonnés
h. Afficher le nombre moyen de jours enregistrés pour les utilisateurs actifs
i. Quelle est votre interprétation du résultat ?
20. Afficher les éléments suivants pour les utilisateurs actifs / désabonnés :
j. Nombre moyen d'artistes uniques joués par utilisateur
k. Nombre moyen de chansons uniques jouées par utilisateur
21. Afficher les éléments suivants pour les utilisateurs actifs / désabonnés :
l. Nombre moyen d'artistes uniques joués par session
m. Nombre moyen de chansons uniques jouées par session
22. Quelle est votre interprétation du résultat ?
23. Afficher les éléments suivants pour les utilisateurs actifs / désabonnés :
Ecole Hassania des Travaux Publics MSDE (Edition 2)

a. Pourcentage de plans payants et gratuits d'utilisateurs désabonnés


b. Pourcentage d'abonnements payants et gratuits d'utilisateurs actifs
24. Quelle est votre interprétation du résultat ?
25. Afficher le nombre d'événements par type de page pour tous les événements avec les
utilisateurs actifs / désabonnés
a. Créer un graph du nombre d'événements par type de page par groupe
d'utilisateurs
b. Faire plot pour tracer les résultats sous forme de proportions au lieu de
décomptes
c. Afficher le nombre d'événements par type de page pour tous les événements
avec les utilisateurs désabonnés
d. Afficher le nombre d'événements par type de page pour tous les événements
avec les utilisateurs actifs
e. Quelle est votre interprétation du résultat ?
26. Afficher le nombre moyen de chansons jouées pour les utilisateurs actifs / désabonnés
27. Afficher le nombre moyen de thumbs up pour les utilisateurs actifs / désabonnés
28. Afficher le nombre moyen de visites de la page d'accueil pour les utilisateurs actifs /
désabonnés
29. Afficher le nombre moyen d'amis ajoutés pour les utilisateurs actifs / désabonnés
30. Quelle est votre interprétation du résultat ?
31. Afficher le nombre moyen d'annonces reçues pour les utilisateurs actifs / désabonnés
32. Afficher le nombre moyen de déconnexion reçu pour les utilisateurs actifs / désabonnés
33. Afficher le nombre moyen de thumbs down pour les utilisateurs actifs / désabonnés
34. Afficher le nombre moyen de visites de la page de paramètres pour les utilisateurs actifs
/ désabonnés
35. Afficher le nombre moyen de visites de mises à niveau de plan pour les utilisateurs
actifs / désabonnés
36. Quelle est votre interprétation du résultat ?
37. Afficher le nombre d'utilisateurs féminins dans l'ensemble de données
38. Afficher le nombre d'utilisateurs masculins dans l'ensemble de données
39. Afficher le pourcentage de tous les événements réalisés par des femmes
40. Afficher le pourcentage de tous les événements réalisés par des hommes
41. Quelle est votre interprétation du résultat ?
42. Afficher la part des utilisateurs actifs / désabonnés qui sont des femmes / hommes
a. Faire un graphique de la proportion de genre pour tous les événements par
groupe d'utilisateurs
b. Afficher le pourcentage d'hommes et de femmes des utilisateurs désabonnés
c. Afficher le pourcentage d'hommes et de femmes des utilisateurs actifs
d. Quelle est votre interprétation du résultat ?

Vous aimerez peut-être aussi