Votre deuxième représentation est plus traditionnelle pour les variables catégorielles comme le jour de la semaine.
Ceci est également connu sous le nom de création de variables fictives et est une méthode largement utilisée pour coder des variables catégorielles. Si vous avez utilisé l'encodage 1-7, vous dites au modèle que les jours 4 et 5 sont très similaires, tandis que les jours 1 et 7 sont très différents. En fait, les jours 1 et 7 sont tout aussi similaires que les jours 4 et 5. La même logique est valable pour l'encodage 0-30 pour les jours du mois.
Le jour du mois est un peu plus délicat, car si chaque semaine a les mêmes 7 jours, chaque mois n'a pas les mêmes 30 jours: certains mois ont 31 jours et certains mois ont 28 jours. Comme les semaines et les mois sont cycliques, vous pouvez utiliser des transformations de Fourier pour les convertir en variables linéaires lisses.
Par exemple (en utilisant R, mon langage de programmation de choix ):
day_of_month = c(1:31, 1:28, 1:30)
day_of_year <- 1:length(day_of_month)
s = sin((2*pi)/30*day_of_month)
c = cos((2*pi)/30*day_of_month)
plot(day_of_month ~ day_of_year)
lines(15*s+15 ~ day_of_year, col='blue')
lines(15*c+15 ~ day_of_year, col='red')
legend(10, 30, c('raw', 'sin', 'cos'), c('black', 'blue', 'red'))
(J'ai mis à l'échelle les variables sinus / cosinus pour qu'elles soient de 0/30, plutôt que de -1/1 pour que le graphique soit meilleur)
Comme vous pouvez le voir, alors que la variable "jour du mois" revient à zéro à la fin de chaque mois, les transformations sinus et cosinus font une transition en douceur qui permet au modèle de savoir que les jours à la fin d'un mois sont similaires à jours au début du mois suivant.
Vous pouvez ajouter le reste des termes Fourier comme suit:
for(i in 1:3){
s = sin((2*pi)/30*day_of_month + 30 * i/4)
c = cos((2*pi)/30*day_of_month + 30 * i/4)
lines(15*s+15 ~ day_of_year, col='blue')
lines(15*c+15 ~ day_of_year, col='red')
}
legend(10, 30, c('raw', 'sin', 'cos'), c('black', 'blue', 'red'))
Chaque paire d'ondes sinus / cosinus forme un cercle:
m <- lapply(1:4, function(i){
as.matrix(
data.frame(
s = sin((2*pi)/30*day_of_month + 30 * i/4),
c = cos((2*pi)/30*day_of_month + 30 * i/4)
)
)
})
m <- do.call(cbind, m)
pairs(m)
Cette page a une explication très pratique sur la façon de manipuler les ondes sinus et cosinus.