diff --git a/folkTables.ipynb b/folkTables.ipynb
index 25f11f4b373d0f29e834816d79ac953a8abee6bb..1332330f3f5eb59eecc8b7acbb6901676eebeaf0 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",