TP: Analyse exploratoire de données
1. Chargement de données
2. Exploration de données
3. Statistique univariée
4. Statistique bivariée
Rapport de moisson
Lundi 27 janvier 2025
Lieux : Doha
Personne moissonnée :2
Nouvelle naissance :1
Nom : Ruth Hermisca
Nationalité : Gabonaise
Etat initial : Rétrograde
Commentaire : On s’est rencontré vers Doha elle rentrait chez elle après avoir ses
courses je l’ai abordé. Elle est étudiante en master sauf que financièrement c’est très
compliqué donc sa fait deux ans qu’elle a arrêté d’abord en attendant d’avoir des
ressources je lui ai proposé des concours pour certaines écoles afin d’obtenir des
bourses de réduction, puis je suis revenue sur le sujet central Jésus, j’ai appris qu’elle
est née de nouveau au Gabon mais a de suite rétrogradé, elle n’a pas eu de suivis
donc elle s’est refroidie, arrivée ici elle a encore essayé mais rien sa ne donnait elle
était dans une église mais elle se sentait jugé donc au bout d’un moment elle a
préféré laisser tomber je lui ai demandé si cette situation lui plaisait ne plus être
proche de Dieu elle a avoué qu’elle ne sait plus comment faire pour revenir elle a mal
puis j’ai demandé qu’est ce qu’il la retiens et c’est le péché j’ai parlé sur l’amour de
Dieu que Dieu l’aime et qu’elle n’est pas trop salle pour revenir a lui puis elle s’est
confessé sur tous ce qu’elle faisait et je lui ai parlé de son entourage et c’était aussi
un problème, puis j’ai demandé si elle voulait revenir au Seigneur et laissé ses
anciennes voies elle a accepté de revenir a lui, le lundi même elle a assisté
entièrement au Big Talk, je l’appelle et lui écris mais elle eut un soucis dans la
semaine et son téléphone c’est compliqué pour la joindre.
Numéro : +212 624-210078
Etat final : Née de nouveau
Nom: Anne
Nationalité: Gabonaise
Etat initial : Païenne
Commentaire: On s’est aussi rencontré vers Doha après ma discussion avec Ruth et il
sait avéré qu’elles étaient amis, Anne part a l’église de temps en temps mais sans
plus, elle m’a avoué que franchement elle ne pense au fait que se soit important et
que sa ne lui dit rien tous sa elle part juste comme sa et qu’a part elle personne ne
compte même pas ses parents et durant qu’elle parlait le Saint Esprit me mettait a
cœur qu’elle était remplis de blessures émotionnelles et qu’il prendra plaisir a la brisé
et la nettoyé si elle lui donne sa vie nous avons longuement échangée et au final elle
m’a juste dis qu’elle a compris et que sur une échelle de 1 a 1O sa lui dis maintenant
quelque chose a 5 pour le reste voilà on verra je garde contacte avec elle et je pris
aussi pour elle le problème est que son école ils ont cours le samedi et le dimanche
donc sa reste un peu compliqué
Etat final : Païenne
1°D
2°A
3°B
4°A
5°A
6°A
7°D
8°A
9°D
10°4
11°B
12°A
13°
14°C
15°A
16°C
17°B
18°
19°A
20°A
21°A
22°B
23°B
24°
25°
26°C
27°
28°A
29°
30°D
31°
32°
33°
34°
35°
36°
37°
38°
39°
40°
import pandas as pd
# Charger le fichier CSV
df= pd.read_csv('lung_cancer_data.csv')
# Afficher les premières lignes
print([Link]())
# Résumé des colonnes et des types
print([Link]())
# Afficher les noms des colonnes
print([Link])
# Statistiques descriptives
print([Link]())
# Vérifier les valeurs manquantes
print([Link]().sum())
# Identifier les doublons
print([Link]().sum())
# Sélectionner uniquement les colonnes numériques
numeric_columns = df.select_dtypes(include=['number']).columns
# Remplir les valeurs manquantes des colonnes numériques avec la moyenne
df[numeric_columns] = df[numeric_columns].fillna(df[numeric_columns].mean())
# Vérifiez les données après remplissage
print([Link]())
# Sélectionner les colonnes non numériques (potentiellement catégoriques)
non_numeric_columns = df.select_dtypes(include=['object']).columns
print("Colonnes catégoriques :", non_numeric_columns)
# Forcer la conversion des colonnes à un type numérique
for column in [Link]:
try:
df[column] = pd.to_numeric(df[column], errors='coerce')
except Exception as e:
print(f"Erreur dans la conversion de la colonne {column} : {e}")
# Remplir les colonnes numériques avec leur moyenne
df = [Link]([Link]())
# Afficher quelques valeurs des colonnes non numériques
for column in non_numeric_columns:
print(f"Valeurs de la colonne {column} :")
print(df[column].unique())
# Supprimer les lignes avec des valeurs manquantes
df = [Link]()
# Exemple : Remplir les valeurs manquantes avec la moyenne
[Link]([Link](), inplace=True)
# Supprimer les lignes avec des valeurs manquantes
[Link](inplace=True)
df.to_csv('cleaned_lung_cancer_data.csv', index=False)
pip install spark
import numpy as np
import [Link] as plt
import seaborn as sns
import [Link] as px
from [Link] import LabelEncoder
import warnings
df = pd.read_csv('lung_cancer_data.csv')
[Link]()
print([Link]) # Dimensions du tableau
print([Link]()) # Détails sur les colonnes
[Link]().T
[Link](include = 'object').T
print("Missing Value (%)")
missing_values = [Link]().mean() * 100
print(missing_values)
print("\nDuplicate Rows (%):")
duplicate_count = [Link]().mean()
print(duplicate_count)
df['Comorbidities'].unique()
df['Comorbidities'] = df['Comorbidities'].fillna('nan')
df['Comorbidities'].unique()
def outlier_check(row, colname):
Q1 = row[colname].quantile(0.25)
Q3 = row[colname].quantile(0.75)
IQR = Q3 - Q1
lower_b = Q1 - 1.5 * IQR
upper_b = Q3 + 1.5 * IQR
outlier = [Link][(row[colname] < lower_b) | (row[colname] > upper_b)]
return outlier
outliers = [Link]()
for col in df.select_dtypes(include=['number']).columns:
outliers_in_col = outlier_check(df, col)
outliers = [Link]([outliers, outliers_in_col])
outliers.reset_index(drop=True, inplace=True)
if [Link]:
print("No outliers")
else:
outliers
# Définition des configurations de base
[Link](style="whitegrid")
[Link](figsize=(10, 6))
# 1. Histogramme de la repartition par âge
[Link](figsize=(8, 6))
[Link](df['Age'], kde=True, color='blue')
[Link]('Age Distribution')
[Link]('Age')
[Link]('Frequency')
[Link]()
# 2. Barplot pour la répartition des sexes
[Link](figsize=(8, 6))
[Link](x='Gender', data=df, hue='Gender', palette='Set2')
[Link]('Gender Distribution')
[Link]('Gender')
[Link]('Count')
[Link]()
# 3. Boxplot pour la répartition par âge selon l'historique du tabagisme
[Link](figsize=(8, 6))
[Link](x='Smoking_History', y='Age', hue='Smoking_History', data=df,
palette='Set3')
[Link]('Age Distribution by Smoking History')
[Link]('Smoking History')
[Link]('Age')
[Link]()
# 4. Diagramme de dispersion de l'IMC par rapport au résultat du test de fonction
[Link](figsize=(8, 6))
[Link](x='BMI', y='Lung_Function_Test_Result', data=df, hue='Gender',
palette='coolwarm')
[Link]('BMI vs Lung Function Test Result')
[Link]('BMI')
[Link]('Lung Function Test Result')
[Link](loc="upper right")
[Link]()
# 5. Les symptômes de la douleur thoracique sont classés par groupe d'âge
[Link](figsize=(10, 6))
df['Age_Group'] = [Link](df['Age'], bins=[20, 40, 60, 80, 100], labels=['20-40', '40-60',
'60-80', '80+'])
[Link](x='Age_Group', hue='Chest_Pain_Symptoms', data=df, palette='Set1')
[Link]('Chest Pain Symptoms by Age Group')
[Link]('Age Group')
[Link]('Count')
[Link](title='Symptômes de la douleur thoracique', labels=['No', 'Yes'])
[Link]()
# 6. Histogramme de la distribution des résultats du test de la fonction pulmonaire
[Link](figsize=(8, 6))
[Link](df['Lung_Function_Test_Result'], kde=True, color='green')
[Link]('Distribution des résultats du test de la fonction pulmonaire')
[Link]('Lung Function Test Result')
[Link]('Frequency')
[Link]()
# 7. Nuage de points pour la taille de la tumeur par rapport aux années de survie
[Link](figsize=(8, 6))
[Link](x='Tumor_Size_cm', y='Survival_Years', data=df,
hue='Metastasis_Status', palette='viridis')
[Link]('Tumor Size vs Survival Years')
[Link]('Tumor Size (cm)')
[Link]('Survival Years')
[Link](title='Metastasis Status', labels=['No', 'Yes'], loc="upper right")
[Link]()
# 8. Diagramme en boîte pour les années de survie par stade de cancer
[Link](figsize=(8, 6))
[Link](x='Stage_of_Cancer', y='Survival_Years', hue='Stage_of_Cancer', data=df,
palette='muted')
[Link]('Survival Years by Stage of Cancer')
[Link]('Stage of Cancer')
[Link]('Survival Years')
[Link]()
# 9. Graphique de comptage de la réponse aux médicaments par type de traitement
[Link](figsize=(12, 6))
[Link](x='Treatment_Type', hue='Medication_Response', data=df,
palette='pastel')
[Link]('Medication Response by Treatment Type')
[Link]('Treatment Type')
[Link]('Count')
[Link](title='Medication Response', labels=['Poor', 'Good'])
[Link](rotation=45)
[Link]()
# 10. Diagramme à barres pour les antécédents familiaux de cancer
[Link](figsize=(8, 6))
[Link](x='Family_History_Cancer', data=df, hue='Family_History_Cancer',
palette='coolwarm')
[Link]('Family History of Cancer')
[Link]('Family History of Cancer')
[Link]('Count')
[Link]()
# 11. Graphique linéaire de la tendance annuelle du diagnostic du cancer
[Link](figsize=(12, 6))
df['Year_of_Diagnosis'] = pd.to_datetime(df['Year_of_Diagnosis'], format='%Y')
[Link](df['Year_of_Diagnosis'].[Link]).size().plot(kind='line', color='purple')
[Link]('Number of Cancer Diagnoses by Year')
[Link]('Year')
[Link]('Number of Diagnoses')
[Link]()
# 12. Box plot pour l'IMC par profession
[Link](figsize=(12, 6))
[Link](x='Occupation', y='BMI', data=df, hue='Occupation', palette='Set2')
[Link]('BMI by Occupation')
[Link]('Occupation')
[Link]('BMI')
[Link](rotation=45)
[Link]()
# 13. Graphique de comptage de l'essoufflement dû à l'exposition aux toxines
[Link](figsize=(8, 6))
[Link](x='Exposure_to_Toxins', hue='Shortness_of_Breath', data=df,
palette='magma')
[Link]('Shortness of Breath by Toxin Exposure')
[Link]('Exposure to Toxins')
[Link]('Count')
[Link](title='Shortness of Breath', labels=['No', 'Yes'])
[Link]()
df = [Link](columns=['Patient_ID', 'Year_of_Diagnosis', 'Age_Group'])
encoder = LabelEncoder()
for col in df.select_dtypes(include='object').columns:
df[col] = encoder.fit_transform(df[col])
print("DataFrame converti: ")
[Link]()
correlation_matrix = [Link]()
[Link](figsize=(12, 6))
[Link](correlation_matrix, cmap='coolwarm')
[Link]("Correlation Heatmap")
[Link]()
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from [Link] import StandardScaler
from [Link] import mean_squared_error
from xgboost import XGBRegressor
from [Link] import make_pipeline
from [Link] import PolynomialFeatures
# Charger les données
df = pd.read_csv('C:/Users/USER/lung_cancer_data.csv')
# Vérifiez que les données sont correctement chargées
print([Link]())
print([Link])
# Préparation des données
# Assurez-vous que 'Survival_Years' est bien une colonne de votre DataFrame
X = [Link]('Survival_Years', axis=1) # Caractéristiques
y = df['Survival_Years'] # Cible
# Division des données en ensembles d'entraînement et de test
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
#scaler = StandardScaler()
#X_train_scaled = scaler.fit_transform(X_train)
#X_test_scaled = [Link](X_test)
models = {
"Linear Regression": LinearRegression(),
# "ElasticNet": ElasticNet(alpha=0.1, l1_ratio=0.5, max_iter=10000, tol=1e-4),
# "SVR": SVR(kernel='rbf', C=1.0, epsilon=0.1),
# "KNN": KNeighborsRegressor(n_neighbors=3),
# "Decision Tree": DecisionTreeRegressor(random_state=42),
# "Random Forest": RandomForestRegressor(n_estimators=100, random_state=42),
"XGBoost": XGBRegressor(n_estimators=100, random_state=42),
# "Bayesian Ridge": BayesianRidge(),
"Polynomial Regression": make_pipeline(PolynomialFeatures(degree=2),
LinearRegression()),
# "MLP Regressor": MLPRegressor(hidden_layer_sizes=(100, 50), max_iter=500,
random_state=42),
}
def evaluate_model(model, X_train, X_test, y_train, y_test):
[Link](X_train, y_train)
y_pred = [Link](X_test)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
return mse, r2
!pip install scikit-learn
!pip install xgboost
from [Link] import LabelEncoder
# Initialiser l'encodeur
label_encoder = LabelEncoder()
# Appliquer LabelEncoder à toutes les colonnes de type 'object' (catégorielles)
for column in X_train.select_dtypes(include=['object']).columns:
X_train[column] = label_encoder.fit_transform(X_train[column])
X_test[column] = label_encoder.transform(X_test[column])
# Vérifier les changements
print(X_train.head())
print(X_test.head())
from sklearn.linear_model import LinearRegression
model = LinearRegression()
[Link](X_train, y_train)
from [Link] import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from [Link] import mean_squared_error, r2_score
import pandas as pd
# Exemple de préparation des données
# Encoder les variables catégorielles (par exemple 'Gender')
encoder = LabelEncoder()
df['Gender'] = encoder.fit_transform(df['Gender']) # Conversion en entiers (0 ou 1)
# Vérifier les valeurs manquantes et les traiter
if [Link]().sum().any():
df = [Link]() # Supprimer les lignes avec des valeurs manquantes
# Diviser les données
X = [Link]('Survival_Years', axis=1)
y = df['Survival_Years']
# Vérifier les dimensions de X et y
print([Link])
print([Link])
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Vérifier les types de données
print(X_train.dtypes)
print(y_train.dtypes)
# Entraîner et évaluer les modèles
models = {
"Linear Regression": LinearRegression(),
}
def evaluate_model(model, X_train, X_test, y_train, y_test):
[Link](X_train, y_train) # Entraîner le modèle
y_pred = [Link](X_test) # Prédictions sur l'ensemble de test
mse = mean_squared_error(y_test, y_pred) # Calcul de l'erreur quadratique
moyenne
r2 = r2_score(y_test, y_pred) # Calcul du coefficient de détermination R²
return mse, r2
# Évaluation du modèle
results = {}
for name, model in [Link]():
mse, r2 = evaluate_model(model, X_train, X_test, y_train, y_test)
results[name] = {"MSE": mse, "R²": r2}
# Afficher les résultats
results_df = [Link](results).T
print(results_df)
from sklearn.linear_model import LogisticRegression
from [Link] import KNeighborsClassifier
from [Link] import DecisionTreeClassifier
from [Link] import RandomForestClassifier
from xgboost import XGBClassifier
models = {
"Logistic Regression": LogisticRegression(max_iter=10000, random_state=42),
# "KNN": KNeighborsClassifier(n_neighbors=3),
# "Decision Tree": DecisionTreeClassifier(random_state=42),
# "Random Forest": RandomForestClassifier(n_estimators=100, random_state=42),
"XGBoost": XGBClassifier(n_estimators=100, random_state=42)
}
def evaluate_model(model, X_train, X_test, y_train, y_test):
[Link](X_train, y_train)
y_pred = [Link](X_test)
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred, average='weighted', zero_division=0)
recall = recall_score(y_test, y_pred, average='weighted', zero_division=0)
f1 = f1_score(y_test, y_pred, average='weighted', zero_division=0)
return accuracy, precision, recall, f1
!pip install xgboost
from [Link] import LabelEncoder
# Définir les colonnes catégorielles
categorical_columns = ['Gender', 'Smoking_History', 'Occupation',
'Family_History_Cancer',
'Exposure_to_Toxins', 'Residential_Area', 'Comorbidities',
'Previous_Cancer_Diagnosis', 'Treatment_Type', 'Medication_Response',
'Symptom_Progression']
# Appliquer LabelEncoder à chaque colonne catégorielle
label_encoder = LabelEncoder()
for col in categorical_columns:
X_train[col] = label_encoder.fit_transform(X_train[col])
X_test[col] = label_encoder.transform(X_test[col])
# Si y_train est une colonne catégorielle
y_train = label_encoder.fit_transform(y_train)
y_test = label_encoder.transform(y_test)
from [Link] import LabelEncoder
# Appliquer le label encoding sur les colonnes catégoriques
label_encoder = LabelEncoder()
for column in X_test.columns:
if X_test[column].dtype == 'object':
X_test[column] = label_encoder.fit_transform(X_test[column])
# Faites de même pour X_train, pour que les deux jeux soient cohérents
for column in X_train.columns:
if X_train[column].dtype == 'object':
X_train[column] = label_encoder.fit_transform(X_train[column])
from [Link] import Sequential
from [Link] import Dense, Dropout, Input
from [Link] import Adam
# Modèle de réseau neuronal unique
nn_model = Sequential([
Input(shape=(X_train.shape[1],)),
Dense(128, activation='relu'),
Dropout(0.2),
Dense(64, activation='relu'),
Dropout(0.2),
Dense(32, activation='relu'),
Dense(1)
])
nn_model.compile(optimizer=Adam(learning_rate=0.001), loss='mse',
metrics=['mae'])
nn_history = nn_model.fit(X_train, y_train, validation_split=0.2, epochs=50,
batch_size=32, verbose=1)
nn_pred = nn_model.predict(X_test).flatten()
nn_mse = mean_squared_error(y_test, nn_pred)
nn_r2 = r2_score(y_test, nn_pred)
print(f"Single Neural Network (NN) - MSE: {nn_mse:.4f}, R2: {nn_r2:.4f}")
#Récupérer l'historique de formation
history = nn_history.history
# Plot Training and Validation Loss
[Link](figsize=(12, 6))
# Loss Plot
[Link](1, 2, 1)
[Link](history['loss'], label='Training Loss', color='blue')
[Link](history['val_loss'], label='Validation Loss', color='orange')
[Link]('Training and Validation Loss')
[Link]('Epochs')
[Link]('Mean Squared Error (MSE)')
[Link]()
# Mean Absolute Error (MAE) Plot
[Link](1, 2, 2)
[Link](history['mae'], label='Training MAE', color='blue')
[Link](history['val_mae'], label='Validation MAE', color='orange')
[Link]('Training and Validation MAE')
[Link]('Epochs')
[Link]('Mean Absolute Error (MAE)')
[Link]()
# Display the plots
plt.tight_layout()
[Link]()