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()
correlation_matrix = df.corr()
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm')
plt.show()
sns.countplot(x='Gender', data=df)
plt.show()
#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'>
#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'>
# 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()
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')
g=sns.PairGrid(df,hue='ObesityCategory')
g.map_diag(sns.violinplot)
g.map_offdiag(sns.scatterplot)
<seaborn.axisgrid.PairGrid at 0x153bca7fdf0>
#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)
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
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()
y_test_pred=lr.predict(X_test_df)
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