In this first part, we cleaned the OpenFoodFacts dataset:
- Removed columns and rows with missing or insufficient data
- Removed duplicate product entries
- Removed redundant variables
- Adjusted date, country and category variables
This reduced the number of rows by 33% and columns from 184 to 40.
2. Contexte
L'agence "Santé publique France" a lancé un appel à projets
pour trouver des idées innovantes d’applications en lien
avec l'alimentation.
Pour développer cette application, les données de
l’"OpenFoodFacts" seront décrites, analysées et explorées
afin de trouver la meilleure approche.
Sommaire
• L’idée d’application.
• Le nettoyage des données.
• Analyse exploratoire réalisée.
• Les faits pertinents pour l’application.
• Questions – réponses.
2
4. Les applications de consommateurs
A l’instar de Yuka®, les applications proposant de classer les
produits et de leur attribuer une note en fonction de leur
composition sont très plébiscitées par les consommateurs.
En effet, chacun aime savoir si ce qu’il consomme est bon
pour sa santé, si le produit est ultra transformé ou non,
quel est l’impact sur l’environnement …
La démocratisation des smartphones aide
considérablement à répondre à ces attentes des
consommateurs et cela pour plusieurs raisons :
• Des connexions à Internet ultra-rapides,
• La possibilité de scanner une étiquette ou un code-
barres,
• Des applications simples à installer et dotées d’une part
d’Intelligence Artificielle.
4
5. Le Nutri-score et Nutri-grade
Dans le cadre de la loi de Santé de 2016, le gouvernement
français a recommandé la mise en place d’une information
nutritionnelle claire, visible, et facile à comprendre pour
tous.
L’objectif : améliorer l’information nutritionnelle figurant sur
les produits et ainsi aider les consommateurs à acheter des
aliments de meilleure qualité nutritionnelle.
Ce calcul du Nutri-score est basé sur les valeurs énergétique
des produits, teneurs en graisses, acides gras saturés,
glucides, sucres, protéines et sel pour 100 g de produit.
La base de données de l’Open Food Facts regroupe ces
données mais nous verrons par la suite qu’elles sont
souvent insuffisamment complétées.
En outre, très peu d’étiquettes produits affichent
aujourd’hui cette indication visuelle.
5
6. L’idée Nutri-scan
L’idée principale de l’application serait donc d’afficher le
nutri-score et nutri-grade estimé du produit en fonction des
indications nutritionnelles disponibles sur l’étiquette.
6
7. L’idée Nutri-scan
Première étape :
Scan de l’étiquette du produit, sur
la partie textuelle mentionnant les
valeurs nutritionnelles.
7
Seconde étape :
Conversion de l’image en données
textuelles exploitable par les
algorithmes (OCR).
Troisième étape :
Nettoyage des données obtenues
et recherche des équivalents dans
la base OpenFoodFacts.
Quatrième étape :
Application des algorithmes de
Machine Learning pour
déterminer le nutri-score en
fonction des variables connues.
Cinquième étape :
Sortie visuelle du nutri-score et
nutri-grade estimé ainsi que
diverses informations sur le
produit.
Afin de vérifier la faisabilité du projet, nous allons procéder
à diverses analyses de la base de données OpenFoodFacts
après nettoyage. Le but sera de déterminer si le Nutri-
score est bien estimable.
9. 9
Les données de l’Open Food Fact
Les datas ont été téléchargées au format CSV
sur le site de l’OpenFoodFacts, puis converties
en DataFrame via la librairie Pandas de Python.
Il compte 1 701 965 lignes au départ et
regroupe 184 variables :
• identification du produit,
• identification du fabricant,
• valeurs nutritionnelles …
10. Suppression des variables insuffisamment renseignées
10
Un grand nombre de variables du jeu de
données est très peu renseigné.
Plus de 72% de ces features ont un taux de
remplissage inferieur à 25%
Ces variables ne pourront pas être interpolées
sans danger de biaiser le jeu de données. Elles
ont donc été supprimées du DataFrame.
A cette étape, notre dataset compte à présent
50 variables.
11. Suppression des lignes mal renseignées
11
Pour nos analyses, nous avons besoin d’un minimum d’informations sur les nutriments des produits. Ces données sont
suffixées avec _100g dans notre jeu de données.
Nous avons donc supprimé toutes les lignes dont l’ensemble de ces données nutritionnelles est vide. Cela concerne
323654 lignes.
A ce stade, notre jeu de données compte 1 378 311 lignes et 50 colonnes.
12. Suppression des doublons de produits
12
Le code du produit dans le jeu de données de
l’OpenFoodFacts doit être unique. Un
dédoublonnage a donc été effectué sur la
variable « code ».
Dans un second temps, un deuxième
dédoublonnage a été réalisé sur le couple
« product_name | brands ».
Le dataset compte à présent 1 124 710 lignes.
13. Elimination des variables redondantes
13
Le dataset comporte des variables
redondantes. Par exemple, pour la
catégorie nous voyons :
• Les catégories dans la langue 1,
• Les catégories en Anglais,
• Les tags de catégories.
Pour toutes les variables comportant
les suffixes _en et _tags, seule la
variable en _en a été conservée pour
éliminer les redondances et baser le
jeu de données en Anglais.
14. Et d’autres opérations de Data Cleaning …
14
D’autres opérations ont été effectuées
notamment sur les dates et les pays
de la base de données.
Des nettoyages ont également été
effectués sur les catégories de produits
mais nous y reviendrons dans la partie
traitant des faits pertinents de
l’application.
A ce stade, le dataset compte 40
colonnes et 1 124 710 lignes.
Je vous invite à découvrir l’ensemble des nettoyages de données sur le Notebook Kaggle du projet.
15. Héloïse Cartier
+1 23 45 67 89
heloise@www.proseware.com
Synthèse:
Dans cette première partie du nettoyage
de données, nous avons :
• Supprimé les colonnes et lignes mal
renseignées,
• Supprimé les doublons de produits,
• Supprimé les variables redondantes,
• Ajusté les variables dates, pays et
catégories.
Ces opérations ont permis de réduire le
nombre de lignes de 33% et ramener le
nombre de variables de 184 à 40.
16. Les valeurs manquantes ou aberrantes
16
En réalisant une rapide description des données, les valeurs maximum et minimum semblent déjà contenir des
valeurs aberrantes (valeurs négatives ou beaucoup trop importantes …).
Nous allons donc identifier et supprimer les lignes contenant des valeurs aberrantes de plusieurs manières.
17. Suppression des valeurs aberrantes des nutriments
17
Nous avons donc plusieurs seuils à respecter :
• Les variables nutriments pour 100g ne
peuvent pas dépasser 100,
• Les graisses saturées ne peuvent pas
dépasser le total des graisses et le sodium
ne peut pas dépasser la quantité de sel,
• L’énergie maximum en kJ/g ne peut pas
excéder 37.
Toutes les lignes dont une de ces conditions
n’est pas respectée sont supprimées.
18. Les autres valeurs aberrantes
18
Pour les variables restantes (les additifs et la quantité servie), nous allons réaliser une élimination statistique basée sur la moyenne
et l’écart-type. Ici, ce sont plus des outliers que des valeurs aberrantes mais nous n’avons pas de moyen de vérifier les valeurs
maximales.
Nous éliminons donc les lignes dont les valeurs sur ces variables diffèrent de la médiane de plus de 5 fois l’écart-type.
19. Imputation des valeurs manquantes
19
Afin de choisir la meilleure méthode
d’imputation des valeurs manquantes, il
faut regarder dans un premier temps leur
distribution.
Ici, la courbe de distribution de loi normale a
également été projetée et un test de
Kolmogorov-Smirnov a été réalisé sur
chaque variable.
Les hypothèses de normalité de ces
distributions ont été rejetées, il serait donc
inexacte d’imputer les valeurs manquantes
par la moyenne.
20. Imputation des valeurs manquantes
20
Les boxplots de distribution des variables par
catégorie de produits (ici, pnns_groups_2)
permettent de vérifier que les médianes et
variances sont bien différentes selon la catégorie.
Pour les variables les plus importantes dans le
calcul du Nutri-score (energy_100g,
proteins_100g, sutrated-fat_100g, sugars_100g
et salt_100g), les valeurs manquantes ont été
imputées avec un algorithme du KNN.
Pour les autres variables, une imputation par la
médiane du groupe pnns_groups_2 a été
effectuée.
21. Vérification des distributions après imputation
21
Après imputation de toutes les valeurs
manquantes pour les variables
nutritionnelles, nous vérifions que les
distributions n’ont pas été modifiées
comparativement aux données d’origine.
22. Suppression des dernières variables mal renseignées
22
A ce niveau, les dernières variables mal
renseignées ont été supprimées du dataset.
Le jeu de données compte à présent 24 variables
dont les principales ne comptent plus de valeurs
nulles.
23. Héloïse Cartier
+1 23 45 67 89
heloise@www.proseware.com
Synthèse:
Dans cette seconde partie du nettoyage
de données, nous avons :
• Supprimé les valeurs aberrantes pour
les nutriments,
• Vérifié les distributions des variables.
• Imputé les données manquantes des
nutriments par la médiane ou KNN.
• Supprimer les dernières variables non
renseignées.
Le jeu de données compte à présent 24
features.
24. Tentative de calcul des Nutri-Grades
24
Notre application a pour vocation l’estimation des Nutri-scores en fonction des nutriments relevés sur les étiquettes. Afin
d’entrainer nos modèles de prédiction, nous avons besoin d’une base fiable de ces Nutri-score et Nutri-grade, or, dans notre base
OpenFoodFact, 51% seulement de ces variables sont complétées.
Nous avons donc tenter de recalculer ces Nutriscores et Nutri-grades grâce au tableau ci-dessus et comparer les résultats avec les
scores déjà complétés.
Après calculs, la précision de
cette méthode est inférieur à
50%
Les données manquantes ne
seront donc pas imputées.
26. Les dates de création et modifications de produit
26
On remarque que les ajouts dans la
base OpenFoodFacts se sont
accélérés à partir de 2016 (date de la
loi de santé et d’entrée du Nutri-
score).
Les modifications quant à elles se
sont intensifiées à partir de 2018 avec
un pic en 2020.
La base est de plus en plus complétée
et 92% des produits ont été modifiés
au moins 1 fois.
27. Les contributeurs à la base Open Food Facts
27
Si on regarde les 5 meilleurs
contributeurs, kiliweb rempli à lui seul
56% de la base de données.
Les 5 premiers contributeurs couvrent
86,9% des produits de la base.
28. Nutri-scores et nutri-grades
28
La catégorie D des nutri-grades est
majoritairement représentée avec
30,8% des entrées de la base.
Suivent les grades C et E puis les
grades A avec 15,9% et B.
29. Nutri-scores et nutri-grades
29
On voit ici clairement que la
mise en place de la Loi de
Santé 2017 et du calcul du
Nutri-score par l'équipe du Pr.
Serge Hercberg a fait chuter la
part de produits considérés
Nutri-score A au profit des
produits typés D et E.
30. Nutri-scores et nutri-grades
30
La distribution des nutri-scores suit la tendance des nutri-grades sauf pour la classe B qui est beaucoup plus
resserrée sur une plage plus restreinte de scores.
Ces répartitions ne devraient pas perturber nos futurs modèles de prédiction.
31. Relations des paires de variables et nutri-grades
31
L’analyse des relations de variables 2 à 2, colorées en
fonction du nutri-grade, nous montre plusieurs choses :
• On remarque déjà des relations parfaitement
linéaires (pour les variables salt_100g et
sodium_100g par exemple)
• Pour les variables nutritionnelles, la catégorisation
par nutri-score est clairement marquée, les groupes
sont bien séparés.
Ces indications nous seront utiles pour nos prochaines
modélisations.
32. Répartition des Nutri-scores par catégorie de produits
32
On remarque ici, sous une
autre forme, que la
catégorie du produit semble
avoir un impact sur la
distribution des Nutri-
scores.
Pour vérifier cette
hypothèse, nous allons
réaliser une analyse de
variance.
33. Héloïse Cartier
+1 23 45 67 89
heloise@www.proseware.com
Résumé:
Ces premières analyses univariées nous
ont montré que :
• Les contributions se sont accélérées au
fil du temps,
• 5 principaux contributeurs complètent
près de 87% de la base,
• Les Nutri-grades sont répartis quasi-
équitablement,
• Les distributions des nutri-scores
semblent liées à la catégorie produit.
34. Analyse de la variance : ANOVA
34
Afin de vérifier si la catégorie pnns_groups_1
influence réellement le Nutri-score nous allons
réaliser une analyse de variance (ANOVA).
Les hypothèses posées seront donc :
• 𝐻0 : La distribution des échantillons est
similaire (et donc la catégorie n’a aucune
influence sur le Nutri-score)
• 𝐻1 : Une ou plusieurs distributions sont
inégales.
L’ANOVA repose sur 3 hypothèses de départ :
• Les observations dans chaque échantillon sont indépendantes et
distribuées de manière identique,
• Les observations dans chaque échantillon ont la même variance
• Les observations de chaque échantillon sont normalement
distribuées.
35. Analyse de la variance : ANOVA
35
On peut voir sur ces boxplots que les
catégories semblent assez différentes, même si
l’ordre de grandeur des écarts est relativement
faible.
La question est à présent de savoir si ces écarts
sont significatifs ou non via l’ANOVA.
36. 36
Les résultats du test de Fisher nous indiquent ici une p-
value de 0 pour l’ensemble des catégories, donc
inférieur au niveau de test de 5%.
Nous rejetons donc l’hypothèse 𝐻0 selon laquelle les
distributions sont identiques.
La catégorie de produit pnns_groups_1 a donc bien une
influence sur le Nutri-score.
37. Analyse des corrélations linéaires
37
Comme nous l’avons vu précédemment dans les
pairplots, il existe des relations linéaires fortes entre
certaines variables.
Nous vérifions ces fortes corrélations pour éviter les
problèmes de colinéarité dans nos modèles prédictifs.
Par exemple salt et sodium ont un coefficient de
corrélation linéaire de 1, il faudra donc éliminer une
de ces variables.
Si l’on trie le Heatmap pour afficher les corrélations
avec le Nutri-score, on retrouve bien les variables qui
entrent dans la formule de calcul du Pr. Hercberg (ici
corrélées positivement)
38. Héloïse Cartier
+1 23 45 67 89
heloise@www.proseware.com
Résumé:
La seconde partie de cette exploration
permet de vérifier que :
• La catégorie produit a une influence
vérifiée sur le Nutri-score,
• De fortes corrélations linéaires existent
entre variables nutritionnelles,
• Le nutri-score est bien corrélé
linéairement aux principaux groupes de
variables nutritionnelles.
A présent, nous allons réaliser des
analyses multivariées dont la régression
linéaire multivariée.
39. Régression linéaire multivariée
39
Quand une variable cible est le fruit de la
corrélation de plusieurs variables prédictives,
on parle de régression multivariée pour faire
des prédictions.
Toutes ces variables prédictives seront utilisées
dans notre modèle pour trouver une fonction
prédictive.
• 𝜖 est une constante,
• 𝛼,𝛽,𝛾 représentent les coefficients de la
fonction prédictive 𝐹(𝑋),
• 𝑋 est un vecteur de variables prédictives.
Fonction prédictive de la régression
linéaire multivariée
40. Les métriques analysées :
MAE
Mean Absolute Error,
mesure la déviation
absolue moyenne entre
une estimation prévue et
les données réelles.
MSE
Mean Squared Error, la
distance, entre la
prévision et l’observation,
est ici élevée au carré. La
sensibilité à l’erreur est
meilleure.
RMSE
Root Mean Squared Error,
est la racine carrée du
MSE, c’est une métrique
largement utilisée.
R²
Coefficient de
détermination, c’est le
carré du coefficient de
corrélation linéaire.
40
41. Première régression sur les variables numériques
41
Pour la première régression, seules les
variables numériques ont été utilisées,
à savoir les nutriments.
Les métriques obtenues ont été
comparées à une baseline (stratégie
moyennes) :
Le R² obtenu est de 0,63 et la
dispersion des valeurs prédites est
centrée sur la droite de régression mais
assez dispersée.
42. Seconde régression en ajoutant la catégorie.
42
Pour la seconde régression, en plus des
données des nutriments, la catégorie
pnns_groups_1 a été intégrée.
Les données catégorielles ont été
transformées avec un OneHotEncoder
et les numériques standardisées.
Le R² obtenu est de 0,77 et l’ensemble
des métriques sont meilleures que sur
le premier modèle.
43. Héloïse Cartier
+1 23 45 67 89
heloise@www.proseware.com
Synthèse:
La régression linéaire multivariée incluant
les catégorie de produits donne des
premiers résultats satisfaisants.
Pour améliorer encore les performances,
nous pourrions traiter d'autres types
d'algorithmes comme la régression Ridge
par exemple ou encore la régression lasso.
Nous allons à présent réaliser une
réduction de de dimensions.
44. Réduction dimensionnelle par PCA
44
Analyse en Composantes Principale (PCA),
l'une des méthodes d'analyse de données
multivariées les plus utilisées.
Elle permet d'explorer des jeux de données
multidimensionnels constitués de variables
quantitatives et de créer des variables
synthétiques exploitables.
Nous allons ici réaliser un cercle des
corrélations de nos variables puis projeter les
individus sur les premiers plans factoriels.
Analyse en Composantes
Principales
45. Inertie cumulée sur les différents axes des plans factoriels
45
Afin d'avoir un aperçu du nombre de
composantes nécessaire à l'analyse,
nous projetons l'éboulis des valeurs
propres.
On constate que le premier plan
factoriel (Axes 1 et 2) couvre une
inertie de 49%.
En ajoutant le deuxième plan factoriel
(Axes 2 et 3) l’inertie totale est de 77%.
46. Cercles des corrélations
46
Comme nous avons déjà étudié les corrélations entre variables, ici le coefficient de corrélation linéaire est représenté par le
cosinus de l’angle entre 2 variables. Plus la pointe de la flèche est proche du cercle, plus la variable est représentative de l’axe.
L’axe 𝐹1 va représenter le caractère sucré / salé du produit alors que l’axe 𝐹2 représentera le caractère énergétique. 𝐹3 représente
la richesse du produit.
47. Projection des produits sur ces plans factoriels
47
Une fois les 522 952 produits projetés sur les axes définis, on peut se rendre compte de la propagation des individus sur les
variables synthétiques crées. Cette méthode nous permet d’éventuellement identifier des outliers sur ces différents axes.
48. Qualité de représentation et contribution aux axes
48
Ces 2 métriques nous permettent de confirmer les contributions des variables à chaque axe et leur qualité de représentation.
Nous allons à présent pouvoir réaliser une dernière régression linéaire multivariée sur ces variables synthétiques calculées que nous
étudierons dans la partie « faits pertinents de l’application » .
50. Le problème des catégories de produits …
50
Comme nous l’avons vu pour les
régressions linéaires multivariées, la
catégorie produit a un rôle important
dans la prédiction du Nutri-score.
Or, si l’on se base sur la catégorie
principale du produit de la base
OpenFoodFacts, on en compte 26 651.
Ce qui est difficilement exploitable
pour un algorithme de régression.
De plus, la catégorie de loin la plus
représentée est : « unknown » …
51. Le problème des catégories de produits …
51
La catégorie pnns_groups_1 compte
quant à elle 10 catégories et 40 pour la
pnns_groups_2.
Elles seraient donc plus facilement
exploitables mais le constat est le
même. Les données inconnues sont
majoritairement représentées ce qui
peut fausser les mesures et la
prédiction du Nutri-score.
En l’état, ces problèmes de catégories
mal renseignées sont un frein à la
précision de l’application.
52. Problème de la réduction dimensionnelle
52
La réduction de dimension, quoi que
représentant bien les différentes
données nutritives, ne permet pas
d’améliorer les performances de la
régression linéaire multivariée.
Au contraire, les métriques sont très
dégradées. La réduction dimensionnelle
ne peut donc pas être utilisée dans
notre application.
53. Problème des données manquantes
53
Dans notre base de données Open Food Facts, les données
manquantes sont un réel problème.
155 variables sur 184 ont un taux de remplissage inférieur à
50%.
Chacun peut contribuer à cette base de données, ce qui
permet d’obtenir une base large mais pas forcement
vérifiée, nous l’avons vu dans les divers nettoyages.
Pour obtenir des datas plus cohérentes, et compléter les
valeurs manquantes, il est, je pense, impératif de coupler
d’autres bases de données telles que la FoodData Central,
Food Nutritional Database ou encore les bases de données
de la FAO.
54. Héloïse Cartier
+1 23 45 67 89
heloise@www.proseware.com
Conclusion:
Lors de ces nettoyages et analyses exploratoires, nous avons pu
évaluer la base de donnée de l’OpenFoodFacts afin de vérifier
qu’elle pouvait servir de base à notre application.
Données manquantes et aberrantes, modélisations encore
imprécise, cette base, seule, ne peut pas suffire à évaluer les
Nutri-scores et Nutri-grades avec une précision satisfaisante.
Il faut donc compléter les données l’Open Food Facts avec
d’autres bases de données produits ou encore repenser l’idée
de départ et créer une application capable d’insérer des datas
complète dans la base Open Food Facts.