Modélisation de l’Obésité avec Python : Prédiction des Types d’Obésité à 97% de Précision!

Chers collègues et amis, Je suis ravi de partager avec vous le résultat de mon dernier projet de recherche, axé sur la modélisation de l’obésité en utilisant des données disponibles sur Kaggle. Nous avons développé un modèle de régression logistique avec Python, atteignant une précision remarquable de 97% dans la prédiction des cas d’obésité et dans la distinction précise entre les quatre types : poids normal, surpoids, obèse et insuffisance pondérale. Contexte : L’obésité est un enjeu majeur de santé publique, et notre étude vise à contribuer à une meilleure compréhension de ce problème. Les avancées dans la modélisation, réalisées avec Python, peuvent jouer un rôle crucial dans la prévention et la gestion de cette condition. Données Utilisées : L’ensemble de données fournit des informations complètes sur les caractéristiques démographiques, les attributs physiques et les habitudes de vie des individus, dans le but de faciliter l’analyse et la prédiction de la prévalence de l’obésité. Il comprend des variables clés telles que l’âge, le sexe, la taille, le poids, l’indice de masse corporelle (IMC), le niveau d’activité physique et la catégorie d’obésité, offrant des informations précieuses sur les facteurs influençant les résultats de l’obésité. Résultats Exceptionnels : Notre modèle de régression logistique, développé grâce à Python, a dépassé nos attentes, atteignant une précision de 97% dans la prédiction des cas d’obésité et dans la distinction précise des quatre types d’obésité. Ces résultats ouvrent des perspectives passionnantes pour de futurs développements et applications dans le domaine de la santé. Implications et Prochaines Étapes : Les implications de cette modélisation sont vastes, allant de la personnalisation des interventions à la compréhension des facteurs de risque liés à chaque type d’obésité. Nous sommes impatients d’explorer de nouvelles avenues de recherche et d’appliquer ces résultats pour faire avancer nos connaissances dans le domaine. Collaboration et Discussion : J’aimerais inviter la communauté à partager des idées, des commentaires et à discuter de ces résultats. La collaboration est la clé pour relever les défis complexes de la santé, et vos perspectives sont précieuses. Graphiques et Visualisations : Ci-joint, vous trouverez des graphiques illustrant le succès de notre modèle développé avec Python, tant dans la prédiction des cas d’obésité que dans la distinction précise des types. Pour plus de détails et pour accéder à l’article complet, n’hésitez pas à me contacter. Merci à tous ceux qui ont contribué et soutenu ce projet. Ensemble, continuons à repousser les frontières de la recherche et à œuvrer pour un avenir plus sain.

#Obésité #RechercheScientifique #DataScience #SantéPublique #Python

import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import matplotlib.pyplot as plt
import seaborn as sns
import plotly.express as px
import plotly.figure_factory as ff
import pandas as pd

# Charger un fichier CSV
df = pd.read_csv('C:/Users/gorgu/OneDrive/Documents/OBESE DATA/obesity_data.csv')
df.sample(6)
Age Gender Height Weight BMI PhysicalActivityLevel ObesityCategory
287 71 Male 158.548226 65.867346 26.202781 1 Overweight
124 77 Female 177.704252 59.822060 18.943740 3 Normal weight
130 62 Male 163.045784 73.258215 27.557333 2 Overweight
185 26 Male 178.460135 68.928315 21.642889 2 Normal weight
87 21 Female 170.388776 69.787030 24.037691 3 Normal weight
906 49 Female 178.678469 71.396198 22.363030 2 Normal weight
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 7 columns):
 #   Column                 Non-Null Count  Dtype  
---  ------                 --------------  -----  
 0   Age                    1000 non-null   int64  
 1   Gender                 1000 non-null   object 
 2   Height                 1000 non-null   float64
 3   Weight                 1000 non-null   float64
 4   BMI                    1000 non-null   float64
 5   PhysicalActivityLevel  1000 non-null   int64  
 6   ObesityCategory        1000 non-null   object 
dtypes: float64(3), int64(2), object(2)
memory usage: 54.8+ KB
df.describe()
Age Height Weight BMI PhysicalActivityLevel
count 1000.000000 1000.000000 1000.000000 1000.000000 1000.000000
mean 49.857000 170.052417 71.205769 24.888317 2.534000
std 18.114267 10.309971 15.509849 6.193912 1.116284
min 18.000000 136.115719 26.065730 8.470572 1.000000
25% 35.000000 163.514205 61.129629 20.918068 2.000000
50% 50.000000 169.801665 71.929072 24.698647 3.000000
75% 66.000000 177.353596 81.133746 28.732132 4.000000
max 79.000000 201.419670 118.907366 50.791898 4.000000
print(df.isnull().sum())
Age                      0
Gender                   0
Height                   0
Weight                   0
BMI                      0
PhysicalActivityLevel    0
ObesityCategory          0
dtype: int64
sns.histplot(df, bins=30, kde=True)
plt.show()
png
png
correlation_matrix = df.corr()
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm')
plt.show()
png
png
sns.countplot(x='Gender', data=df)
plt.show()
png
png

visualisation

#distribution du genre homme et femme
df['Gender'].value_counts("femme","homme").plot(kind='pie',autopct='%.2f%%',title='Diagramme circulaire du genre',ylabel='genre')
<AxesSubplot:title={'center':'Diagramme circulaire du genre'}, ylabel='genre'>
png
png
#distribution des categories d'obeses
df['ObesityCategory'].value_counts().plot(kind='pie',autopct='%.2f%%',title='Diagramme circulaire des types obeses', ylabel='type d obese')
<AxesSubplot:title={'center':'Diagramme circulaire des types obeses'}, ylabel='type d obese'>
png
png

visualiser la distribution des valeurs de l’indice de masse corporelle (BMI) en fonction de différentes catégories d’obésité.

# Convertir la colonne 'ObesityCategory' en type catégoriel
df['ObesityCategory'] = pd.Categorical(df['ObesityCategory'])

# Tracer un KDE plot (tracé de densité) pour la colonne 'BMI' en fonction de la catégorie d'obésité
trace=sns.kdeplot(data=df, x='BMI', hue='ObesityCategory', fill=True)
trace.set(xlabel='BMI', ylabel='Densité')

# Afficher le tracé
import matplotlib.pyplot as plt
plt.show()
png
png
tracehf=sns.catplot(data=df,x='ObesityCategory',hue='Gender',kind='count')
tracehf.set(ylabel="nombre par categorie",xlabel="categorie obese")
tracehf._legend.set_title('Genre')
png
png

CORRELATION ENTRE VARIABLES

g=sns.PairGrid(df,hue='ObesityCategory')
g.map_diag(sns.violinplot)
g.map_offdiag(sns.scatterplot)
<seaborn.axisgrid.PairGrid at 0x153bca7fdf0>
png
png

#interpretation la distribution de la taille,le poids et de l’indice de masse corporelle semble etre normale #de plus on a une forte correlation positive entre le poids et l’indice de masse corporelle #la correlation entre l’indice de masse corporelle et la taille est negative # Division des données en ensembles d’entraînement et de test :

from sklearn.model_selection import train_test_split

X = df.drop(columns='ObesityCategory')
y = df['ObesityCategory']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

Encodage de la variable cible avec LabelEncoder :

from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()
y_train_df = le.fit_transform(y_train)
y_test_df = le.transform(y_test)

LabelEncoder est utilisé pour encoder les étiquettes de classe (catégories) de la variable cible ‘ObesityCategory’ en nombres entiers. fit_transform ajuste le LabelEncoder sur les étiquettes d’entraînement et les transforme en entiers. transform est utilisé pour encoder les étiquettes du jeu de test après l’ajustement. # Encodage des variables catégorielles avec OneHotEncoder :

from sklearn.preprocessing import OneHotEncoder
import pandas as pd

X_train_df = pd.get_dummies(X_train, drop_first=True, dtype=int)
X_test_df = pd.get_dummies(X_test, drop_first=True, dtype=int)

OneHotEncoder n’est pas utilisé directement ici. Au lieu de cela, pd.get_dummies de pandas est utilisé pour créer des variables indicatrices (dummy variables) à partir des variables catégorielles dans les ensembles d’entraînement et de test. drop_first=True est utilisé pour éviter le piège de la variable fictive. Cela signifie que pour une variable catégorielle avec k catégories, on utilise seulement k-1 variables indicatrices. Lorsque vous utilisez pd.get_dummies pour encoder une variable catégorielle, cela crée de nouvelles colonnes binaires (dummy variables) pour chaque catégorie distincte de la variable d’origine. Cela est fait pour représenter chaque catégorie de manière binaire (présence ou absence) sans attribuer un ordre numérique spécifique. Cette méthode est couramment utilisée pour traiter des variables catégorielles nominales dans le cadre de l’apprentissage automatique. # MODELE DE REGRESSION LOGISTIQUE

  1. APPRENTISSAGE DU MODELE
from sklearn.linear_model import LogisticRegression
lr=LogisticRegression()
lr.fit(X_train_df,y_train_df)
C:\Users\gorgu\anaconda3\lib\site-packages\sklearn\linear_model\_logistic.py:814: ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.

Increase the number of iterations (max_iter) or scale the data as shown in:
    https://scikit-learn.org/stable/modules/preprocessing.html
Please also refer to the documentation for alternative solver options:
    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression
  n_iter_i = _check_optimize_result(





LogisticRegression()
  1. PREDICTION DU MODELE SUR LES DONNEES TEST
y_test_pred=lr.predict(X_test_df)
  1. MESURE PERFORMANCE DU MODELE
from sklearn.metrics import confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt

# Prédire les classes sur l'ensemble de test
y_test_pred = lr.predict(X_test_df)
print("l'accuracy est :",accuracy_score(y_test_df,y_test_pred))
# Calculer la matrice de confusion
conf_matrix = confusion_matrix(y_test_df, y_test_pred)


# Afficher la matrice de confusion avec Seaborn
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', cbar=False,
            xticklabels=le.classes_, yticklabels=le.classes_)
plt.xlabel('Prédiction')
plt.ylabel('Vraie Valeur')
plt.title('Matrice de Confusion')
plt.show()
l'accuracy est : 0.97
png
png