Mes statistiques de vie J’ai suivi mes habitudes pendant un an, et voici ce que j’ai appris.
Mes statistiques de vie J'ai suivi mes habitudes pendant un an et voici ce que j'ai découvert.
J’ai mesuré le temps que j’ai passé à mes activités quotidiennes (étudier, faire du sport, socialiser, dormir…) pendant 332 jours d’affilée
Pourquoi ? Pourquoi est-ce que je ferais ça ?
C’est probablement l’expérience la plus longue et la plus chronophage que j’ai réalisée dans ma vie. De plus, elle a peu de signification scientifique – l’échantillon de population n’est qu’une seule personne – et est très subjective (elle repose entièrement sur ma mémoire et ma perception du temps).
Alors pourquoi faire cela ? Les routines, tout comme tout autre moyen de responsabilité personnelle, m’aident de différentes manières. J’ai commencé cela à un moment difficile de ma vie, en essayant de m’étudier moi-même et de comprendre comment différentes habitudes pouvaient influencer mon humeur et ma santé mentale. L’objectif était de pouvoir “pirater” mon propre cerveau : si je savais – statistiquement – ce qui me rendait heureux et en bonne santé à long terme (et ce qui faisait le contraire !), je pourrais améliorer ma vie et éventuellement donner des conseils ou aider des personnes similaires à traverser des moments difficiles.
Et pourquoi cela vous importe-t-il ?
Je pense que cet exercice introspectif est un excellent exemple de l’application de la science des données à n’importe quoi. Bien sûr, cela ne doit pas forcément être ce type de suivi et de journalisation. Vous pouvez étudier tout ce que vous considérez comme précieux dans votre vie : observer le comportement de votre animal de compagnie, la météo de votre ville, le taux de retard dans le système de transport en commun local… Il y a de nombreuses analyses personnelles à réaliser : s’il y a un jeu de données, vous pouvez l’étudier ! Heureusement, les données sont partout – il suffit de regarder au bon endroit et de les suivre.
La méthode – qu’ai-je fait et comment l’ai-je fait ?
Je consacrais quelques minutes chaque jour à prendre des notes personnelles sur ce que je faisais et je suivais le temps passé (en heures) sur différentes activités et catégories.
- Optimiser les actions Github
- Créer un modèle GPT en utilisant l’API de puissance de la NASA
- Comprendre la maintenance prédictive – Données de vague Ingénierie des caractéristiques (Partie 1)
Les variables que j’ai mesurées ont légèrement changé au cours de l’année : certaines sont apparues, d’autres ont disparu et certaines se sont regroupées. Les variables finales, et celles pour lesquelles j’ai des données pour tous les enregistrements, sont les suivantes : Sommeil, Écriture, Étude, Sport, Musique, Hygiène, Langues, Lecture, Socialisation et Humeur – soit un total de dix variables, couvrant ce que je considère comme les aspects les plus importants de ma vie.
Exploration initiale des données
J’ai d’abord examiné les séries chronologiques individuelles de quatre variables : Sommeil, Étude, Socialisation et Humeur. J’ai utilisé Microsoft Excel pour tracer rapidement quelques graphiques. Ils représentent le nombre d’heures passées quotidiennement (en bleu) et la moyenne mobile¹ sur cinq jours MA(5) (en rouge), que j’ai considérée comme une mesure intéressante pour ma situation. La variable d’humeur était notée de 10 (excellent !) à 0 (terrible !).
En ce qui concerne les données contenues en bas de chaque graphique : le total est la somme des valeurs de la série, la moyenne est la moyenne arithmétique de la série, l’ET est l’écart type et l’écart relatif est l’écart type divisé par la moyenne.
Tout bien considéré, j’ai assez bien géré mon sommeil. J’ai eu des jours difficiles, comme tout le monde, mais je pense que la tendance est assez stable. En fait, c’est l’une des variables qui varie le moins dans mon étude.
Voici les heures que j’ai consacrées à ma carrière académique. Cela varie beaucoup – trouver un équilibre entre le travail et les études signifie souvent devoir se précipiter sur des projets le week-end – mais malgré tout, je me considère satisfait.
En ce qui concerne ce tableau, tout ce que je peux dire, c’est que je suis surpris. Le total est plus élevé que ce à quoi je m’attendais, étant donné que je suis introverti. Bien sûr, les heures passées avec mes collègues à l’université comptent également. En termes de variabilité, l’écart type est vraiment élevé, ce qui est logique compte tenu de la difficulté d’avoir une routine établie en ce qui concerne les relations sociales.
Cette série est la moins variable – la déviation relative est la plus basse parmi mes variables étudiées. A priori, je suis satisfait de la tendance observée. Je pense qu’il est positif de maintenir une émotion assez stable – et encore mieux si c’est une bonne émotion.
Étude de corrélation
Après avoir examiné les tendances des principales variables, j’ai décidé d’approfondir et d’étudier les corrélations potentielles² entre elles. Puisque mon objectif était d’être capable de modéliser mathématiquement et de prédire (ou du moins d’expliquer) “L’humeur”, les corrélations étaient une mesure importante à prendre en compte. À partir d’elles, je pourrais extraire des relations telles que : “les jours où j’étudie le plus sont ceux où je dors le moins”, “j’étudie habituellement les langues et la musique ensemble”, etc.
Avant de faire quoi que ce soit d’autre, ouvrons un fichier python et importons certaines bibliothèques clés de l’analyse de séries. J’utilise généralement des alias pour celles-ci, car c’est une pratique courante et cela rend les choses moins verbeuses dans le code réel.
import pandas as pd #1.4.4import numpy as np #1.22.4import seaborn as sns #0.12.0import matplotlib.pyplot as plt #3.5.2from pmdarima import arima #2.0.4
Nous réaliserons deux études différentes concernant la corrélation. Nous examinerons le coefficient de corrélation de Pearson³ (pour les relations linéaires entre variables) et le coefficient de corrélation de Spearman⁴ (qui étudie les relations monotones entre variables). Nous utiliserons leur implémentation⁵ dans pandas.
Matrice de corrélation de Pearson
Le coefficient de corrélation de Pearson entre deux variables X et Y est calculé comme suit :
Nous pouvons rapidement calculer une matrice de corrélation, où chaque corrélation possible est calculée.
#read, select and normalize the dataraw = pd.read_csv("final_stats.csv", sep=";")numerics = raw.select_dtypes('number')#compute the correlation matrixcorr = numerics.corr(method='pearson')#generate the heatmapsns.heatmap(corr, annot=True)#draw the plotplt.show()
Voici la matrice de corrélation de Pearson brute obtenue à partir de mes données.
Et voici les valeurs significatives⁶ – celles qui sont, avec une confiance de 95%, différentes de zéro. Nous effectuons un test t⁷ avec la formule suivante. Pour chaque valeur de corrélation rho, nous la rejetons si:
où n est la taille de l’échantillon. Nous pouvons réutiliser le code précédent et ajouter ce filtre.
#constantsN = 332 #nombre d'échantillonsSTEST = 2 / np.sqrt(N)def significance_pearson(val): if np.abs(val) < STEST: return True return False#lire les donnéesraw = pd.read_csv("final_stats.csv", sep=";")numerics = raw.select_dtypes('number')#calculer la corrélationcorr = numerics.corr(method='pearson')#préparer les masquesmask = corr.copy().applymap(significance_pearson)mask2 = np.triu(np.ones_like(corr, dtype=bool)) #supprimer la triangulation supérieuremask_comb = np.logical_or(mask, mask2)c = sns.heatmap(corr, annot=True, mask=mask_comb)c.set_xticklabels(c.get_xticklabels(), rotation=-45)plt.show()
Ceux qui ont été rejetés pourraient être du bruit, et représenter à tort des tendances ou des relations. Dans tous les cas, il vaut mieux supposer qu’une véritable relation est sans signification que considérer comme significative une relation qui ne l’est pas (ce que nous appelons l’erreur de type II préférée à l’erreur de type I). Ceci est particulièrement vrai dans une étude avec des mesures plutôt subjectives.
Coefficient de corrélation de rang de Spearman
Le coefficient de corrélation de Spearman peut être calculé comme suit:
Comme nous l’avons fait précédemment, nous pouvons rapidement calculer la matrice de corrélation:
#lire, sélectionner et normaliser les donnéesraw = pd.read_csv("final_stats.csv", sep=";")numerics = raw.select_dtypes('number')#calculer la matrice de corrélationcorr = numerics.corr(method='spearman') #soyez attentif à ce changement!#générer les heatmapsns.heatmap(corr, annot=True)#dessiner le graphiqueplt.show()
Voici la matrice de corrélation de rang de Spearman brute obtenue à partir de mes données:
Voyons quelles valeurs sont réellement significatives. La formule pour vérifier la significativité est la suivante:
Ici, nous filtrerons toutes les valeurs de t supérieures (en valeur absolue) à 1,96. Encore une fois, la raison de leur élimination est que nous ne sommes pas sûrs qu’il s’agisse de bruit – dû au hasard – ou d’une tendance réelle. Codons cela:
#constantsN=332 #nombre d'échantillonsTTEST = 1.96def significance_spearman(val): if val==1: return True t = val * np.sqrt((N-2)/(1-val*val)) if np.abs(t)<1.96: return True return False#lire les donnéesbrutes = pd.read_csv("final_stats.csv", sep=";")numériques = brutes.select_dtypes('number')#calculer la corrélationcorr = numériques.corr(method='spearman')#préparer les masquesmasque = corr.copy().applymap(significance_spearman)masque2 = np.triu(np.ones_like(corr, dtype=bool)) #supprimer le triangle supérieurmasque_comb = np.logical_or(masque, masque2)#afficher les résultatss = sns.heatmap(corr, annot=True, mask=masque_comb)s.set_xticklabels(s.get_xticklabels(), rotation=-45)plt.show()
Voici les valeurs significatives.
Je pense que ce graphique explique mieux les relations apparentes entre les variables, car son critère est plus “naturel” (il considère les fonctions et les relations monotones⁹, et non seulement linéaires). Il n’est pas autant affecté par les valeurs aberrantes que l’autre (quelques jours très mauvais liés à une certaine variable n’affecteront pas de manière significative le coefficient de corrélation global).
Cependant, je laisserai les deux graphiques pour que le lecteur puisse les juger et en tirer ses propres conclusions.
Études sur les séries temporelles – Modèles ARIMA
Nous pouvons traiter ces données comme une série temporelle. Le temps pourrait être un facteur important pour expliquer les variables : certaines d’entre elles pourraient fluctuer périodiquement, ou même être autocorrélées¹⁰. Par exemple, une mauvaise nuit pourrait me rendre somnolent et me faire dormir trop longtemps le lendemain – cela serait une corrélation temporelle. Dans cette section, je me concentrerai uniquement sur les variables de l’exploration initiale.
Explorons le modèle ARIMA et trouvons un bon ajustement pour nos données. Un modèle ARIMA¹¹ est une combinaison d’un modèle autorégressif (AR¹²) et d’une moyenne mobile – d’où ses initiales (Auto Regressive Integrated Moving Average). Dans ce cas, nous utiliserons la méthode auto_arima de pmdarima, une fonction inspirée de la fonction “forecast::autoarima” de R, pour déterminer les coefficients de notre modèle.
for v in ['Sommeil','Études','Socialisation','Humeur']: arima.auto_arima(numériques[v], trace=True) #trace=True pour voir les résultats
Les résultats ont été résumés dans le tableau suivant :
Étonnamment, le sommeil n’est pas autorégressif, mais l’humeur semble l’être ! Comme nous pouvons le voir, un simple ARIMA(1,0,0) – un AR(1) – représente assez bien l’humeur. Cela implique que l’humeur du jour D est expliquée par l’humeur du jour D-1, ou le jour précédent, et de l’erreur suivant une distribution normale.
Malgré son apparence modeste, cette conséquence est suffisamment intéressante. Les études sont également autorégressives, mais suivent un ARIMA(1,0,2) – ce qui signifie qu’elles ne suivent pas directement une tendance, mais que leur moyenne mobile le fait. Cependant, l’AIC¹³ pour celui-ci est considérablement plus élevé, il est donc possible que le modèle complique trop l’explication du comportement observé.
FFT – Transformée de Fourier rapide
Nous pouvons utiliser une transformation de Fourier discrète¹⁴ pour analyser nos données. Avec elle, nous devrions être en mesure de remarquer tous les schémas liés à la saisonnalité. La transformée de Fourier est une opération de transformation de données capable de décomposer une série en ses composantes de base. Cela peut être mieux compris à travers l’image ci-dessous :
Voici un autre exemple : nous avons un signal composé de deux fonctions sinusoïdales avec des fréquences respectives de 1 et 10. Après l’application de la transformée de Fourier, nous obtenons ceci :
Le résultat est un graphique avec deux pics, un à x=1 et un à x=10. La transformée de Fourier a trouvé les composantes de base de notre signal !
Passons cela en code :
for v in ['Sommeil', 'Étude', 'Socialisation', 'Humeur'] :
t = np.arange(0,N,1)
x = numerics[v]
X = np.fft.fft(x)
n = np.arange(0,len(X),1)
T = N
freq = n/T
plt.figure(figsize = (8, 4))
plt.subplot(121)
plt.plot(t, x, 'r')
plt.xlabel('Temps (jours)')
plt.ylabel(v)
plt.subplot(122)
plt.stem(n, np.abs(X), 'b', markerfmt=" ", basefmt="-b")
plt.xlabel('Fréquence (1/jours)')
plt.ylabel('FFT |X(freq)|')
plt.xlim(0, 30)
plt.ylim(0, 500)
plt.tight_layout()
plt.show()
Revenons à notre étude de cas, voici les résultats générés par notre code :
Nous pouvons observer que le sommeil a une valeur significative à la fréquence 1 – ce qui signifie que les données suivent un cycle de 1 jour, ce qui n’est pas très utile. L’étude présente également des valeurs intéressantes : les cinq premières sont nettement supérieures aux autres. Malheureusement, le bruit prend le dessus pour elles et pour chaque autre graphique – aucune conclusion ne peut être obtenue avec certitude.
Pour y remédier, nous filtrons le bruit avec une moyenne mobile. Essayons d’appliquer à nouveau la MA(5) et d’étudier la FFT. Le code sera presque le même à l’exception de la moyenne mobile.
def moving_average(x, w): return np.convolve(x, np.ones(w), 'valid') / wk = 5for v in ['Sommeil', 'Étude', 'Socialisation', 'Humeur'] :
t = np.arange(0,N-k+1,1)
x = moving_average(numerics[v], k)
X = np.fft.fft(x)
n = np.arange(0,len(X),1)
T = N-k+1
freq = n/T
plt.figure(figsize = (8, 4))
plt.subplot(121)
plt.plot(t, x, 'r')
plt.xlabel('Temps (jours)')
plt.ylabel(v)
plt.subplot(122)
plt.stem(n, np.abs(X), 'b', markerfmt=" ", basefmt="-b")
plt.xlabel('Fréquence (1/jours)')
plt.ylabel('FFT |X(freq)|')
plt.xlim(0, 30)
plt.ylim(0, 500)
plt.tight_layout()
plt.show()
Voici les graphiques générés par notre code :
Après l’application de la MA, le bruit a été légèrement réduit. Cependant, il semble qu’aucune conclusion ne puisse être tirée de cela – nous ne trouvons aucune valeur de fréquence significative et claire.
Conclusions
Après avoir effectué différentes études statistiques, nous pouvons conclure ce qui était attendu : le comportement humain est très complexe, bien plus que ce qu’une simple feuille Excel et quelques modèles mathématiques peuvent expliquer. Cependant, il y a de la valeur à trouver dans la collecte méthodique de données et les possibilités d’analyse qui en découlent. Jetons un rapide coup d’œil à ce que nous avons fait :
- Aperçu des données brutes et de la tendance.
- Analyse de corrélation de Pearson et de Spearman ainsi que tests de significativité.
- Ajustement du modèle ARIMA.
- Décomposition par transformée de Fourier rapide/discrete.
Après avoir effectué ces analyses, nous avons pu tirer quelques enseignements de nos données et comprendre comment les différentes variables sont corrélées les unes aux autres. Voici le résumé de nos conclusions :
- En termes de déviation relative (variabilité), l’humeur et le sommeil étaient les plus faibles (respectivement 11,3 % et 15,5 %), tandis que l’étude et la socialisation étaient tous deux supérieurs à 100 %.
- La socialisation était négativement corrélée avec presque tous mes passe-temps, mais positivement avec mon humeur (à la fois selon Pearson et Spearman). Cela est probablement dû au fait que lorsque je rencontre des amis ou de la famille, je dois mettre de côté mes passe-temps pour la journée, mais je suis généralement plus heureux que si je me retrouvais seul.
- L’humeur et l’écriture étaient négativement corrélées (Spearman), ce qui s’explique par le fait que je me plains parfois de mes problèmes via des histoires courtes ou en écrivant dans mon journal.
- L’humeur et l’étude se sont révélées être autoregressives selon l’étude d’ajustement ARIMA, ce qui implique que la valeur d’un certain jour peut être expliquée par celle du jour précédent.
- Aucune décomposition claire n’a pu être trouvée avec la transformation de Fourier discrète, bien que certains groupes de fréquences aient été plus élevés que d’autres.
Il est également intéressant de noter que nous avons obtenu des statistiques “globales” intéressantes, qui, bien qu’elles ne soient pas scientifiquement significatives, sont intéressantes à connaître.
Sur un plan personnel, je pense que cette expérience m’a été utile. Même si les résultats finaux ne sont pas concluants, je crois qu’elle m’a aidé à surmonter les moments difficiles et à suivre les bons. De plus, je pense qu’il est toujours positif de faire une certaine introspection et de mieux se connaître.
Enfin, voici le graphique cumulatif – réalisé à nouveau dans MS Excel – de toutes les variables qui ont pu être accumulées (à l’exception de l’humeur et de l’hygiène, qui ne sont pas comptées en heures mais selon un certain classement ; et le sommeil). J’ai décidé de le représenter sous forme de graphique logarithmique car même si les variables accumulées étaient linéaires, leurs pentes variables rendaient difficile pour le spectateur de voir les données. Voilà ! Amusez-vous bien !
Comme toujours, je vous encourage à partager vos réflexions ou vos doutes dans les commentaires.
Le code et les données se trouvent sur mon github.
GitHub – Nerocraft4/habittracker
Contribuer au développement de Nerocraft4/habittracker en créant un compte sur GitHub.
github.com
Références
[1] Wikipédia. Moyenne mobile. https://fr.wikipedia.org/wiki/Moyenne_mobile
[2] Wikipédia. Corrélation. https://fr.wikipedia.org/wiki/Corrélation_(statistiques)
[3] Wikipédia. Coefficient de corrélation de Pearson. https://fr.wikipedia.org/wiki/Coefficient_de_corrélation_de_Pearson
[4] Wikipedia. Coefficient de corrélation de rang de Spearman. https://fr.wikipedia.org/wiki/Coefficient_de_corr%C3%A9lation_de_rang_de_Spearman
[5] Documentation Pandas. pandas.DataFrame.corr. https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.corr.html
[6] Wikipedia. Signification statistique. https://fr.wikipedia.org/wiki/Signification_statistique
[7] Wikipedia. Test de Student. https://fr.wikipedia.org/wiki/Test_de_Student
[8] Wikipedia. Corrélation de rang. https://fr.wikipedia.org/wiki/Corr%C3%A9lation_de_rang
[9] Wolfram MathWorld. Fonction monotone. https://mathworld.wolfram.com/MonotonicFunction.html
[10] Wikipedia. Autocorrélation. https://fr.wikipedia.org/wiki/Autocorr%C3%A9lation
[11] Wikipedia. Modèle Autorégressif Intégré à Moyenne Mobile. https://fr.wikipedia.org/wiki/Mod%C3%A8le_Autor%C3%A9gressif_Int%C3%A9gr%C3%A9_%C3%A0_Moyenne_Mobile
[12] Wikipedia. Modèle autorégressif. https://fr.wikipedia.org/wiki/Mod%C3%A8le_autor%C3%A9gressif
[13] Science Direct. Critère d’information d’Akaike. https://www.sciencedirect.com/topics/social-sciences/akaike-information-criterion
[14] Wikipedia. Transformée de Fourier discrète. https://fr.wikipedia.org/wiki/Transform%C3%A9e_de_Fourier_discr%C3%A8te
We will continue to update IPGirl; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- Requêtes de langage naturel alimentées par l’IA pour la découverte des connaissances
- Démystifier le remplissage des données
- Est-il difficile d’adopter le Serverless?
- Les 5 piliers des tests LLM fiables
- Comment les détecteurs de contenu AI fonctionnent-ils ?
- Caractéristiques catégorielles Qu’est-ce qui ne va pas avec le codage par étiquettes ?
- Utilisez Amazon SageMaker Studio pour créer une solution de réponse à questions RAG avec Llama 2, LangChain, et Pinecone pour une expérimentation rapide.