Blogue

Blogue

L’intelligence artificielle à son apogée : Prédire le jour de Noël avec R

L’intelligence artificielle à son apogée : Prédire le jour de Noël avec R

Partager sur facebook
Partager sur twitter
Partager sur linkedin
Partager sur google

L’intelligence artificielle à son apogée : Prédire le jour de Noël avec R

Nous vivons dans un monde où l’incertitude prend de plus en plus de place dans notre quotidien. Les fausses nouvelles (fake news) font désormais partie de l’espace public. Bien malin ou maline celui ou celle qui peut affirmer hors de tout doute ne pas s’être fait déjouer par un article truffé de faussetés. Même les meilleurs voyants peuvent se tromper en tentant de prédire le futur de leurs clients!

Conséquemment, même une chose aussi anodine que la date à laquelle Noël doit se célébrer peut semer le doute. Nous pourrions croire que le 25 décembre est de facto le jour attitré à cette fête. Mais est-ce vraiment le cas?

Pour répondre à cette épineuse question, nous avons mis au point un modèle de régression logistique de pointe en R que nous allons parcourir dans les lignes suivantes.

Nous allons tout d’abord mettre en mémoire les données du fichier Calendar.csv qui contient 5 colonnes soit:

  • Date : la date
  • Year : l’année de la date
  • Month : le mois de la date
  • Day : le jour de la date
  • Is_Christmas : s’agit-il de la journée de Noël (variable binaire)

Notons que notre fichier comporte onze années complètes de données, soit de 2010 à 2020 inclusivement.

options(scipen=999)
df <- read.csv('C:/Users/nbtst/Desktop/Numea/Calendar.csv')
names(df) <- c('Date',names(df)[2:5])
head(df)

Sachant que la combinaison du mois et du jour nous permettra de bien identifier la fête annuelle, nous allons créer une colonne supplémentaire: MonthDay. Cette dernière concatènera Month et Day ensemble. Au passage, nous changerons les valeurs de Is_Christmas en 0 et en 1.

df$MonthDay <- paste0(df$Month, "-",df$Day)
df$Is_Christmas <- ifelse(df$Is_Christmas == 'Yes',1,0)
str(df)

Comme nous souhaitons faire une analyse rigoureuse, il importe de segmenter notre jeu de données en deux, soit un segment pour l’apprentissage (training) et un pour le test (testing). Cette segmentation se fera dans une proportion de 80/20. De plus, afin de rester dans l’esprit des fêtes, nous allons mettre le paramètre aléatoire (set.seed) à 25.

set.seed(25)
training.set.proportion <- 0.8
indices <- sample(1 : round(nrow(df),0), round(nrow(df),0) * training.set.proportion)
train <- df[indices, ]
print('Training set Christmas distribution:')
print(table(train$Is_Christmas))
test <- df[-indices, ]
print('Test set Christmas distribution:')
print(table(test$Is_Christmas))

Constatez que nous avons 10 journées de Noël dans le jeu d’entrainement, contre une journée pour notre test. Nous pouvons donc procéder à notre création de modèle de régression logistique. Pour ce faire, la commande glm() sera notre alliée et nous n’utiliserons que la colonne MonthDay à titre de prédicteur (la réponse étant bien entendue Is_Christmas). N’oubliez pas de mettre le paramètre family à binomial afin que R utilise le modèle approprié.

model <- glm(Is_Christmas ~ MonthDay, data = train, family = 'binomial')

Maintenant que notre modèle est entraîné, nous allons faire notre prédiction sur notre jeu de données test. De cette manière nous saurons si notre modèle aura été en mesure de déceler les subtiles variations nous permettant de déterminer avec exactitude quand Noël surviendra.

predictions <- round(predict(model,test, type= 'response'),0)
test$Predictions <- predictions
accuracy <- sum(test$Is_Christmas == test$Predictions) / nrow(test)
paste0(accuracy*100,'%')

Nous remarquons ici un taux de prédictions des plus excellents avec 100%!! Wow! Notre modèle ne se trompe jamais sur les données test! Explorons ces résultats plus en détail.

test <- test[order(-test$Is_Christmas),]
test <- test[,c(1,2,3,4,6,5,7)]
head(test)

Nous remarquons donc que le modèle a identifié le 25 décembre 2018 comme étant une journée Is_Christmas, alors que les autres journées sont considérées comme étant “ordinaire.”

Il ne nous reste plus qu’à mettre le modèle en production. Nous allons donc supposer qu’un utilisateur utiliserait une interface web pour nous faire parvenir diverses dates sous forme de vecteur (new.dates). Nous commençons par extraire les valeurs du mois et du jour pour que celles-ci puissent être comprises par notre régression logistique.

new.dates <- c('2021-05-02','2021-08-30', '2021-12-25', '2022-03-14','2022-12-25','2022-09-02', '2022-11-10', '2023-03-24','2023-12-25')
new.dates.clean <- gsub("-0", "-", new.dates)
new.dates.clean <- sapply(substr(new.dates.clean,6,15),'[', 1)
new.dates.df <- data.frame(Date = new.dates,MonthDay = new.dates.clean)
new.dates.df

Il ne nous reste plus qu’à utiliser notre modèle sur nos nouvelles données de la manière qui suit.

predictions.production <- round(predict(model,data.frame(MonthDay=new.dates.clean), type= 'response'),0)
new.dates.df$IsChristmas <- predictions.production
new.dates.df$IsChristmas  <- ifelse(new.dates.df$IsChristmas == 1, 'Yes', 'No')
new.dates.df <- new.dates.df[,c(1,3)]
new.dates.df

Nous remarquons donc ici que les dates ayant le mois 12 et le jour 25 sont identifiées comme étant Noël. Ceci peut donc valider l’intuition que Noël se déroule bel et bien le 25 décembre!!

Vous aurez compris que nous ne sommes pas sérieux dans cet article… Noël restera le 25 décembre avec ou sans IA! N’empêche que pour vous éviter de perdre votre temps pour vrai, nous avons pris soin de détailler la méthode en R puisqu’elle reste quand même applicable à d’autre prédictions plus… pertinentes!

Joyeux Poisson d’avril!

L’intelligence artificielle à son apogée : Prédire le jour de Noël avec R

Partager sur facebook
Facebook
Partager sur twitter
Twitter
Partager sur linkedin
LinkedIn
Partager sur google
Google+