From 74f433717f7e5d108ea93b56dd1de76bd46b0431 Mon Sep 17 00:00:00 2001 From: gaspar <gaspar.henniaux.etu@univ-lille.fr> Date: Fri, 11 Apr 2025 15:30:17 +0200 Subject: [PATCH] rendu final --- folkTables.ipynb | 72 +++++++++++++++++++++--------------------------- 1 file changed, 32 insertions(+), 40 deletions(-) diff --git a/folkTables.ipynb b/folkTables.ipynb index 25f11f4..1332330 100644 --- a/folkTables.ipynb +++ b/folkTables.ipynb @@ -11,6 +11,25 @@ "- HENNIAUX Gaspar" ] }, + { + "cell_type": "markdown", + "id": "63a79aeb", + "metadata": {}, + "source": [ + "Pour exécuter ce notebook, il faut : \n", + "\n", + "- se rendre sur cette page :https://www2.census.gov/programs-surveys/acs/data/pums/2018/1-Year/\n", + "- télécharger les fichiers : \n", + " - csv_pca.zip\n", + " - csv_pny.zip\n", + " - csv_ptx.zip\n", + "- il faut les déziper et placer les fichiers \"psam_p06.csv\", \"psam_p36.csv\", \"psam_p48.csv\" dans un dossier \"/data/2018/1-year\" qui se trouve au niveau du notebook\n", + "- exécuter la commande :\n", + "```bash\n", + "pip install folktables\n", + "```\n" + ] + }, { "cell_type": "markdown", "id": "d70abd61-f4bd-41b3-97cf-e06311de84fa", @@ -31,7 +50,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "id": "c5d2b55c", "metadata": {}, "outputs": [], @@ -45,12 +64,12 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "id": "7cb34917", "metadata": {}, "outputs": [], "source": [ - "states = ['CA', 'TX', 'NY'] # Exemple d'États" + "states = ['CA', 'TX', 'NY']" ] }, { @@ -99,26 +118,22 @@ "state_dfs = {}\n", "\n", "data_source = ACSDataSource(survey_year='2018', horizon='1-Year', survey='person')\n", - "states = ['CA', 'TX', 'NY'] # Exemple d'États\n", + "states = ['CA', 'TX', 'NY']\n", "\n", "# Pour chaque état, récupérer les données et ajouter une colonne \"state\"\n", "for state in states:\n", " state_data = data_source.get_data(states=[state], download=False)\n", " features, labels, _ = ACSIncome.df_to_pandas(state_data)\n", "\n", - " # Ajouter une colonne \"state\"\n", " features['state'] = state\n", "\n", - " # Ajouter les labels au DataFrame\n", " features['income'] = labels\n", "\n", - " # Ajouter les données de cet état au dictionnaire\n", " state_dfs[state] = features\n", "\n", "# Fusionner tous les États dans un seul DataFrame\n", "df_all_states = pd.concat(state_dfs.values(), ignore_index=True)\n", "\n", - "# Afficher les DataFrames\n", "for state, df_state in state_dfs.items():\n", " print(f\"DataFrame for state {state}:\")\n", " print(df_state.head())\n", @@ -402,10 +417,8 @@ "lle = LocallyLinearEmbedding(n_components=2, n_neighbors=10, method='standard')\n", "lle_result = lle.fit_transform(df_scaled_all_states)\n", "\n", - "# Use the 'income' column from the original DataFrame\n", "income_values = loaded_state_dfs['NY']['income'].iloc[:10000]\n", "\n", - "# Affichage du scatter plot\n", "plt.figure(figsize=(8, 6))\n", "plt.scatter(lle_result[:, 0], lle_result[:, 1], alpha=0.2, c=income_values, cmap='viridis')\n", "plt.title(\"Projection LLE des données (premiers 1000 points)\")\n", @@ -445,23 +458,17 @@ "metadata": {}, "outputs": [], "source": [ - "# Fixer une seed pour la reproductibilité\n", "np.random.seed(42)\n", "\n", - "# Nombre d'échantillons à prendre (ajuste selon tes besoins)\n", "sample_size = 1000\n", "\n", - "# Sélectionner les colonnes numériques pour la réduction de dimension\n", "numerical_features = [\"AGEP\", \"COW\", \"SCHL\", \"MAR\", \"OCCP\", \"POBP\", \"RELP\", \"WKHP\", \"SEX\", \"RAC1P\", \"income\", \"state\"]\n", "\n", - "# Extraire les données échantillonnées\n", "df_sample = df_loaded[numerical_features].sample(n=sample_size, random_state=42)\n", "\n", - "# On garde les features numériques et la variable cible\n", - "X_sample = df_sample.drop(columns=[\"income\", \"state\"]) # Supprime income pour l'analyse\n", - "income_sample = df_sample[\"income\"].values # Label pour la coloratio\n", + "X_sample = df_sample.drop(columns=[\"income\", \"state\"])\n", + "income_sample = df_sample[\"income\"].values\n", "\n", - "# Normalisation des données pour de meilleures performances\n", "scaler = StandardScaler()\n", "X_scaled = scaler.fit_transform(X_sample)\n" ] @@ -550,7 +557,6 @@ "\n", " plt.show()\n", "\n", - "# Plot des PCA colorés\n", "plot_pca(X_pca_1D, income_sample, 1)\n", "plot_pca(X_pca_2D, income_sample, 2)\n", "plot_pca(X_pca_3D, income_sample, 3)\n", @@ -649,7 +655,6 @@ "\n", " plt.show()\n", "\n", - "# Plot des LLE colorés\n", "plot_lle(X_lle_1D, income_sample, 1)\n", "plot_lle(X_lle_2D, income_sample, 2)\n", "plot_lle(X_lle_3D, income_sample, 3)\n", @@ -711,7 +716,6 @@ } ], "source": [ - "# Assuming X_sample and income_sample are already defined\n", "X_tsne_1D = TSNE(n_components=1, random_state=42).fit_transform(X_sample)\n", "X_tsne_2D = TSNE(n_components=2, random_state=42).fit_transform(X_sample)\n", "X_tsne_3D = TSNE(n_components=3, random_state=42).fit_transform(X_sample)\n", @@ -743,7 +747,6 @@ "\n", " plt.show()\n", "\n", - "# Affichage des graphes\n", "plot_tsne(X_tsne_1D, income_sample, 1)\n", "plot_tsne(X_tsne_2D, income_sample, 2)\n", "plot_tsne(X_tsne_3D, income_sample, 3)\n" @@ -824,8 +827,6 @@ "id": "8bb5d18f", "metadata": {}, "source": [ - "🔹 Pourquoi ?\n", - "\n", "L’histogramme montre la répartition globale et l’éventuelle asymétrie.\n", "\n", "Le KDE (Kernel Density Estimation) permet de visualiser la densité des valeurs.\n", @@ -936,8 +937,6 @@ "id": "3495af8c", "metadata": {}, "source": [ - "🔹 Pourquoi ?\n", - "\n", "Permet de voir s’il y a des catégories dominantes et si certaines sont sous-représentées.\n", "\n", "Vérifie la diversité des données pour éviter des biais dans les modèles.\n", @@ -1248,9 +1247,8 @@ } ], "source": [ - "# Iterate through all numerical features and plot KDE for each\n", "for feature in numerical_features:\n", - " if feature not in [\"income\", \"state\"]: # Exclude non-numerical or categorical features\n", + " if feature not in [\"income\", \"state\"]:\n", " plt.figure(figsize=(10, 5))\n", " sns.kdeplot(df_sample[df_sample[\"income\"] == True][feature], label=\"Income True\", shade=True, color=\"green\")\n", " sns.kdeplot(df_sample[df_sample[\"income\"] == False][feature], label=\"Income False\", shade=True, color=\"red\")\n", @@ -1265,13 +1263,11 @@ "id": "cbcc3da2", "metadata": {}, "source": [ - "🔹 Pourquoi ?\n", - "\n", "Par exemple pour l'age : \n", "\n", - " On peut voir si les jeunes ou les vieux ont plus de chance d’avoir un bon revenu.\n", + " - On peut voir si les jeunes ou les vieux ont plus de chance d’avoir un bon revenu.\n", "\n", - " Vérifie l’influence de l’âge sur income." + " - Vérifie l’influence de l’âge sur income." ] }, { @@ -1279,7 +1275,8 @@ "id": "92100388", "metadata": {}, "source": [ - "Conclusion\n", + "#### Conclusion\n", + "\n", "Avec ces visualisations, on peut :\n", "\n", "Détecter des outliers et des déséquilibres dans les données.\n", @@ -1400,8 +1397,6 @@ "id": "988ddd54", "metadata": {}, "source": [ - "🔹 Pourquoi ?\n", - "\n", "Le boxplot met en évidence les écarts entre les États.\n", "\n", "L’histogramme permet de voir si le revenu est distribué différemment en fonction de l’État.\n" @@ -1501,8 +1496,6 @@ "id": "20dd2cda", "metadata": {}, "source": [ - "🔹 Pourquoi ?\n", - "\n", "Si le modèle fonctionne bien sur CA mais échoue sur TX ou NY, cela montre qu’il y a une hétérogénéité forte entre les États." ] }, @@ -1588,8 +1581,6 @@ "id": "4b01c9ea", "metadata": {}, "source": [ - "🔹 Pourquoi ?\n", - "\n", "KL Divergence mesure l’asymétrie entre distributions (si CA est très différent de TX).\n", "\n", "Wasserstein Distance donne une mesure plus robuste sur comment les distributions sont éloignées en moyenne." @@ -1600,7 +1591,8 @@ "id": "ee1d8b8e", "metadata": {}, "source": [ - "Conclusion\n", + "Conclusion : \n", + "\n", "Si les distributions sont différentes, il faut adapter les modèles à chaque État.\n", "\n", "Si un modèle entraîné sur CA fonctionne mal sur TX, cela montre une forte hétérogénéité.\n", -- GitLab