Visualisation et analyse de données¶
Nous travaillerons sur une jeu de données contenu dans un fichier csv (comma separated value). Il s’agit des demandes de valeurs foncières géolocalisées par département: https://cadastre.data.gouv.fr/data/etalab-dvf/latest/csv/2019/departements/
Nous nous intéresserons notamment au département du Doubs. Tout d’abord, il va falloir importer les données.
Visualisation et traitement des données¶
Revenons à nos données géolocalisées et chargeons la base de données directement dans un DataFrame
.
import pandas as pd
df = pd.read_csv("data/25.csv")
print(df.head(2))
id_mutation date_mutation numero_disposition nature_mutation \
0 2019-73036 2019-02-25 1 Vente
1 2019-73036 2019-02-25 1 Vente
valeur_fonciere adresse_numero adresse_suffixe adresse_nom_voie \
0 200000.0 NaN NaN AU VILLAGE
1 200000.0 NaN NaN AU VILLAGE
adresse_code_voie code_postal ... type_local surface_reelle_bati \
0 B037 25640 ... NaN NaN
1 B037 25640 ... NaN NaN
nombre_pieces_principales code_nature_culture nature_culture \
0 NaN S sols
1 NaN P prés
code_nature_culture_speciale nature_culture_speciale surface_terrain \
0 NaN NaN 2260.0
1 NaN NaN 2792.0
longitude latitude
0 6.178685 47.388526
1 6.178685 47.388526
[2 rows x 40 columns]
Affichons désormais les statistiques descriptives pour chaque variable
df.describe()
numero_disposition | valeur_fonciere | adresse_numero | code_postal | code_commune | code_departement | ancien_code_commune | ancien_nom_commune | ancien_id_parcelle | numero_volume | ... | lot4_surface_carrez | lot5_numero | lot5_surface_carrez | nombre_lots | code_type_local | surface_reelle_bati | nombre_pieces_principales | surface_terrain | longitude | latitude | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
count | 1122.000000 | 1122.000000 | 761.000000 | 1122.000000 | 1122.000000 | 1122.0 | 0.0 | 0.0 | 0.0 | 0.0 | ... | 4.000000 | 7.000000 | 2.000000 | 1122.000000 | 714.000000 | 527.000000 | 713.000000 | 722.000000 | 1117.000000 | 1117.000000 |
mean | 1.044563 | 162458.884127 | 169.919842 | 25293.212121 | 25255.843137 | 25.0 | NaN | NaN | NaN | NaN | ... | 35.897500 | 91.857143 | 31.405000 | 0.591800 | 2.128852 | 103.884250 | 2.371669 | 1844.631579 | 6.363802 | 47.238550 |
std | 0.245879 | 158839.680463 | 940.512485 | 250.469920 | 189.888907 | 0.0 | NaN | NaN | NaN | NaN | ... | 19.312033 | 141.404183 | 37.455446 | 1.489495 | 0.912855 | 194.453128 | 2.160845 | 4830.122997 | 0.347765 | 0.191982 |
min | 1.000000 | 198.000000 | 1.000000 | 25000.000000 | 25001.000000 | 25.0 | NaN | NaN | NaN | NaN | ... | 8.000000 | 6.000000 | 4.920000 | 0.000000 | 1.000000 | 2.000000 | 0.000000 | 3.000000 | 5.774606 | 46.668816 |
25% | 1.000000 | 55000.000000 | 5.000000 | 25000.000000 | 25056.000000 | 25.0 | NaN | NaN | NaN | NaN | ... | 31.617500 | 11.500000 | 18.162500 | 0.000000 | 1.000000 | 57.000000 | 0.000000 | 321.250000 | 6.025504 | 47.149638 |
50% | 1.000000 | 125000.000000 | 11.000000 | 25260.000000 | 25258.000000 | 25.0 | NaN | NaN | NaN | NaN | ... | 41.760000 | 44.000000 | 31.405000 | 0.000000 | 2.000000 | 80.000000 | 2.000000 | 681.000000 | 6.305465 | 47.246357 |
75% | 1.000000 | 213000.000000 | 25.000000 | 25480.000000 | 25411.000000 | 25.0 | NaN | NaN | NaN | NaN | ... | 46.040000 | 85.500000 | 44.647500 | 1.000000 | 3.000000 | 110.000000 | 4.000000 | 1289.000000 | 6.713855 | 47.386621 |
max | 3.000000 | 804000.000000 | 9010.000000 | 25960.000000 | 25633.000000 | 25.0 | NaN | NaN | NaN | NaN | ... | 52.070000 | 399.000000 | 57.890000 | 40.000000 | 4.000000 | 4144.000000 | 10.000000 | 85381.000000 | 6.978547 | 47.553060 |
8 rows × 27 columns
Nous avons ici une base de données regroupant toutes les valeurs foncières de l’année 2019 dans le Doubs. Il faut s’intérroger à comment visualiser ces données de façon utile et agréable.
On pourrait par exemple aggréger les données pour chaque ville/village.
Agrégation¶
On souhaite effectuer des calculs sur des sous-groupes de données. Il fait séparer les données en fonction de groupes identifiés et appliquer une opération sur chacun des groupes. Pour effectuer le regroupement, pandas
propose la méthode groupby()
.
df = df.dropna(subset=['lot1_surface_carrez'])
print(df.groupby("code_postal")["valeur_fonciere"].sum()/df.groupby("code_postal")["lot1_surface_carrez"].sum())
code_postal
25000 2072.524454
25110 444.883836
25120 1059.001513
25130 2221.821677
25140 1441.492369
25160 6232.919742
25170 1952.902519
25200 1270.379488
25220 1299.245599
25230 922.560805
25240 2900.305966
25300 2373.105653
25370 2358.651226
25410 1570.623917
25420 986.272158
25430 811.770675
25450 1384.562132
25480 2106.481481
25500 2365.857163
25580 1653.543307
25680 587.994543
25700 338.632828
25930 1175.908222
dtype: float64
Cette opération permet de visualiser le prix au m2 dans les différentes communues.