import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
import statsmodels.api as sm
from sklearn.impute import KNNImputer
# Chargement du fichier CSV dans un DataFrame
file_path = 'Salary_Data.csv' # Assurez-vous que le chemin du fichier est correct
Datasalaire = pd.read_csv(file_path)
# Afficher les premières lignes du DataFrame pour vérifier l'importation
print("Premières lignes du DataFrame:")
print(Datasalaire.head())
# Afficher les noms des colonnes pour vérifier les noms corrects
print("Colonnes du DataFrame:")
print(Datasalaire.columns)
# Définir la variable dépendante correctement
dependent_variable = 'Salary'
# Sélection des colonnes numériques
numerical_columns = Datasalaire.select_dtypes(include=['float64', 'int64']).columns
# Statistiques descriptives des variables numériques
print("Statistiques descriptives des variables numériques:")
print(Datasalaire[numerical_columns].describe())
# Distribution des variables numériques
Datasalaire[numerical_columns].hist(figsize=(10, 10))
plt.suptitle('Distribution des Variables Numériques')
plt.show()
# Distribution des variables catégorielles
categorical_columns = Datasalaire.select_dtypes(include=['object']).columns
for col in categorical_columns:
sns.countplot(y=col, data=Datasalaire)
plt.title(f'Distribution de la variable {col}')
plt.show()
# Détection des outliers avec l'IQR
Q1 = Datasalaire[numerical_columns].quantile(0.25)
Q3 = Datasalaire[numerical_columns].quantile(0.75)
IQR = Q3 - Q1
outliers = (Datasalaire[numerical_columns] < (Q1 - 1.5 * IQR)) | (Datasalaire[numerical_columns] > (Q3 + 1.5 * IQR))
print("Outliers détectés avec IQR:")
print(outliers.sum())
# Détection des outliers avec le Z-score
z_scores = stats.zscore(Datasalaire[numerical_columns].dropna())
abs_z_scores = np.abs(z_scores)
outliers_z = (abs_z_scores > 3).all(axis=1)
print("Outliers détectés avec le Z-score:")
print(outliers_z.sum())
# Corrélation entre les variables numériques
correlation_matrix = Datasalaire[numerical_columns].corr()
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm')
plt.title('Matrice de Corrélation')
plt.show()
# Relation entre les variables numériques
sns.pairplot(Datasalaire[numerical_columns])
plt.suptitle('Relations entre Variables Numériques', y=1.02)
plt.show()
# Exemple de relation non linéaire
for col in numerical_columns:
if col != dependent_variable:
sns.lmplot(x=col, y=dependent_variable, data=Datasalaire, lowess=True)
plt.title(f'Relation non-linéaire entre {col} et {dependent_variable}')
plt.show()
# Exemple de relation entre une variable catégorielle et une variable numérique
# Relation entre 'Job Title' (catégorielle) et 'Salary' (numérique)
sns.boxplot(x='Job Title', y='Salary', data=Datasalaire)
plt.xticks(rotation=45)
plt.title('Distribution du Salaire par Titre de Poste')
plt.show()
# Convertir les variables catégorielles en variables binaires (dummy variables)
X = pd.get_dummies(Datasalaire, columns=['Gender', 'Education Level', 'Job Title'], drop_first=True)
# Assurez-vous que 'Salary' est la variable cible et pas incluse dans les variables indépendantes
y = Datasalaire[dependent_variable]
# Supprimer la colonne 'Salary' de X
X = X.drop(columns=[dependent_variable])
# Convertir X en type numérique
X = X.apply(pd.to_numeric, errors='coerce')
# Convertir y en type numérique
y = pd.to_numeric(y, errors='coerce')
# Vérifiez et affichez les types de données et les valeurs manquantes
print("Types de données de X:")
print(X.dtypes)
print("Types de données de y:")
print(y.dtypes)
print("Valeurs manquantes dans X:")
print(X.isnull().sum())
print("Valeurs manquantes dans y:")
print(y.isnull().sum())
# Supprimer les lignes avec des NaN dans X ou y après conversion
X = X.dropna()
y = y[X.index]
# Vérifiez les tailles après suppression des NaN
print(f"Taille de X après suppression des NaN: {X.shape}")
print(f"Taille de y après suppression des NaN: {y.shape}")
# Ajouter une constante pour le modèle de régression
X = sm.add_constant(X)
# Création du modèle de régression
model = sm.OLS(y, X).fit()
# Résumé du modèle
print("Résumé du modèle de régression:")
print(model.summary())
# Identification des valeurs manquantes
missing_values = Datasalaire.isnull().sum()
print("Valeurs manquantes avant traitement:")
print(missing_values)
# Suppression des valeurs manquantes
Datasalaire_cleaned = Datasalaire.dropna()
# Imputation des valeurs manquantes avec la moyenne
Datasalaire_filled = Datasalaire.fillna(Datasalaire.mean())
# Remplacer les valeurs aberrantes par une valeur spécifique (par exemple, la médiane)
for col in numerical_columns:
median = Datasalaire[col].median()
Datasalaire[col] = np.where(outliers[col], median, Datasalaire[col])
# Imputation des valeurs manquantes avec KNN
imputer = KNNImputer(n_neighbors=5)
Datasalaire_imputed = pd.DataFrame(imputer.fit_transform(Datasalaire), columns=Datasalaire.columns)
print("Données après imputation KNN :")
print(Datasalaire_imputed.head())