Règles d’association avec R

lovely analytics règles d'association avec R.png

Je vous propose de regarder comment utiliser les règles d’association avec R en utilisant l’algorithme apriori.

Pour cet exemple, j’ai choisi le dataset movie, disponible sur Kaggle. On a un ensemble de films notés par les utilisateurs, comme  ça pourrait être le cas par exemple sur Netflix ou sur une autre plateforme de VOD.

Au programme de ce petit tutoriel, nous allons voir les étapes suivantes :

  • Chargement et préparation des données
  • Statistiques descriptives
  • Règles d’association

1) Pour commencer nous allons charger les librairies que nous allons utiliser dans ce tuto :

readr : pour charger facilement les données
stringr : pour transformer des chaines de caractères
plyr : pour transformer des données au format « basket »
arules : pour calculer les règles d’association
arulesViz : pour afficher des graphiques en lien avec les règles d’association
plotly : pour des graphiques plus visuels

library("readr")
library("stringr")
library("plyr")
library("arules")
library("arulesViz")
library("plotly")

2) Nous chargeons maintenant les données
Nous utilisons 2 datasets :
– movies_metadata : qui contient les détails des films (identifiant et titre)
– watching : qui contient les notes de chaque utilisateurs pour les films qu’ils ont visionnés

Pour movies_metadata, on remarque que certains titres de films contiennent des virgules, ce qui risque de poser problème par la suite lorsque nous convertirons nos données dans un format « basket ». Pour y remédier, on utiliser la fonction str_replace_all pour remplacer les virgules par des espaces.

A part ce léger problème les données sont propres, on filtrera un peu par la suite pour réduire la taille de la base en supprimant les films mal notés et les films peu visionnés.

# Chargement des données

# Données sur les films
movies_metadata <- read_csv("C:/Users/MJ & Romain/Downloads/movies_metadata.csv")
movies_metadata <- subset(movies_metadata, select=c("id" ,"title"))

#on supprime les virgules dans les titres
movies_metadata $title<- str_replace_all(movies_metadata$title, ",", " ")

# Données sur les films regardés par client
watching <- read.table("C:/Users/MJ & Romain/Downloads/ratings.dat",header=FALSE,sep=":",colClasses = c(NA, "NULL"))
colnames(watching)<-c("userId", "movieId", "rating","timestamp")
watching <- subset(watching, select=c("userId" ,"movieId", "rating"))

#changement de format
watching$movieId<-as.character(watching$movieId)
watching$userId<-as.character(watching$userId)

3) Quelques statistiques descriptives
J’ai voulu supprimer les films peu visionnés et les films mal notés. Avant de le faire, nous allons donc regarder la répartition du nombre de vues par films et la répartition des notes.

#----- Statistiques descriptives -----
#Nombre de visionnage par film
freq_movie <-count(watching,c("movieId"))
names(freq_movie)<-c("movieId","Number_view")   plot_ly (x=freq_movie$Number_view, type = "histogram")%>%
layout(title = 'Nombre de vues par film',
xaxis = list(title = 'Nombre de vues'),
yaxis = list(title = 'Nombre de films'))

Nombre de vues par films

#Répartition des notes moyennes
freq_rate <-as.data.frame(tapply(watching$rating,watching$movieId,mean))
names(freq_rate)<-c("Notes_moyennes")
freq_rate$movieId<-rownames(freq_rate)   plot_ly (x=freq_rate$Notes_moyennes, type = "histogram")%>%
layout(title = 'Notes moyennes par films',
xaxis = list(title = 'Notes moyennes'),
yaxis = list(title = 'Nombre de films'))

Notes moyennes par film.png

4) On filtre les données

#On en conserve que les films avec des notes supérieures ou égales à 4
watching <- watching[watching$rating>=4,]

# On filtre les films peu visonnés (500 vues)
watching<-merge(x = watching, y = freq_movie, by = "movieId", all.x = TRUE)
watching<-watching[watching$Number_view>500,]

5) On ajoute le nom des films à la table watching
D’ailleurs, j’ai remarqué que certains films de la table watching n’avaient pas de correspondance dans la table movies_metadata. Pour la suite, on ne conserve que les films qui ont bel et bien un titre

#On ajoute le nom des films et on ne conserve que les films qui ont un nom
names(movies_metadata)=c("movieId", "titre")
watching<-merge(x = watching, y = movies_metadata, by = "movieId")

6) On transforme les données en données « basket »
Pour pouvoir utiliser la fonction arules qui permet de calculer les règles d’association, nous devons mettre nos données au format transactions. Et l’étape préliminaire pour le faire et de transformer nos données en données « basket » ou « panier ».

Voici le format de nos données actuellement :

head(watching)

Table watching avant.png

On transforme donc nos données et on exporte le résultat dans un fichier csv

#On transforme les données en données "panier"
watching_itemList <- ddply(watching,c("userId"),
function(df1)paste(df1$titre,
collapse = ","))
watching_itemList<-watching_itemList$V1

write.csv(watching_itemList,"ItemList.csv", quote = FALSE, row.names = TRUE)

Et voici le résultat, on voit qu’on a maintenant pour chaque utilisateur, la liste de tous les films qu’il a visionnés et pour lesquels il a attribué une note supérieure ou égale à 4 :

head(watching_itemList)

Table watching itemList.png

7) Il ne reste plus qu’à calculer les règles d’association
Il y a 2 paramètres à définir selon le niveau d’exigence sur les règles :
– sup : pour le support – indique la fiabilité de la règle
– conf : pour la confiance – indique la précision de la règle

txn = read.transactions(file="ItemList.csv", rm.duplicates= TRUE, format="basket",sep=",",cols=1);
rules <- apriori(txn,parameter = list(sup = 0.05, conf = 0.6,target="rules"));

inspect(rules)

L’algorithme nous donne 107 règles d’association, je ne vais afficher que les 20 premières :

Règles d'associaition.png

Comment lire ces résultats? Prenons l’exemple de la 8ème règle d’association (parce que les 2 films sont un peu plus connus) :

Règle d'association 8.png

Les utilisateurs qui ont regardé (et apprécié) Blood Diamond ont également regardé Rocky IV. Pour évaluer la qualité de la règle d’association nous utilisons les 3 critères suivants :

  • Le support représente la fiabilité de la règle et correspond à la proportion d’utilisateurs ayant regardé les 2 films. Ce critère permet de fixer un seuil en dessous duquel les règles ne sont pas considérées comme fiables. Si par exemple tous les utilisateurs ayant regardé Die Hard 2 ont aussi regardé Down of the Dead mais qu’ils ne sont que 10 à avoir vu ces 2 films, il y a un risque que ce ne soit pas fiable. On cherche donc des règles ayant atteint un support minimum.
  • La confiance (confidence dans la sortie R) représente la précision de la règle et peut être vue comme la probabilité P(Rocky IV | Blood Diamond). Plus la confiance est élevée, meilleure est la règle d’association.
  • Enfin le lift, caractérise l’intérêt de la règle, sa force. Le lift correspond à P(Rocky IV | Blood Diamond) / P(Rocky IV). Un lift supérieur à 1 indique qu’il existe bien un lien entre les 2 éléments.  Dans notre cas, on peut en déduire que les utilisateurs ayant regardé Blood Diamond ont 4 fois plus de chance de regarder Rocky IV que n’importe quel autre utilisateur.

Analyser chaque règle d’association à la main pourrait être long, pour avoir une vue d’ensemble du résultat, nous pouvons utiliser la librairie arulesViz qui intègre des visualisations dédiées aux règles d’association.

8) On visualise les règles d’association

plot(basket_rules[1:20], method="graph", control=list(type="items"), cex=0.7)

Règles d'associaition graphique 1.png

On voit à gauche l’ensemble des 20 premières règles d’association et à droite on a un zoom sur la 8ème règle. Les cercles représentent les règles d’association entre 2 films, leur taille représente le support et l’intensité de leur couleur représente le lift.

Cette visualisation permet d’avoir l’ensemble des règles de manière globale. Par exemple, on voit que les utilisateurs ayant regardé Blood Diamond ont plus de chance de regarder également Rope. Et que 3 films ont tendance à amener les utilisateurs à regarder Rocky IV : Rocky V, Blood Diamond et surtout Sweet Sixteen.

plot(basket_rules[1:20],measure=c("support","lift"),shading="confidence",interactive=T)

Le 2ème graphique est interactif et représente le lift en fonction du support. Vous allez pouvoir sélectionner directement le ou les points qui vous intéressent et afficher les détails sur ces règles d’association.

Règles d'association graphique interactif.png

Voilà, c’est à vous de jouer, le mieux c’est bien sûr de tester.

Un commentaire sur « Règles d’association avec R »

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion /  Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s