Gabriel Chaix 50% | Elsa Chevrot 50%
¶
TD 8/9 : Analyse des données¶
Analyse des valeurs foncières¶
Dataset OpenData :¶
Il s'agit des transactions immobilières intervenues au cours des cinq dernières années sur le territoire métropolitain et les DOM-TOM, à l’exception de l’Alsace, de la Moselle et de Mayotte. Les données contenues sont issues des actes notariés et des informations cadastrales.
Rapport¶
Avancement¶
Pour commencer cette analyse de données, nous avons tout d’abord importé les librairies nécessaires pour notre projet comme, par exemple, numpy, pandas, plotly et d’autres.¶
Par la suite, nous avons chargé les données de valeurs foncières de 2022.¶
Ensuite, nous avons procédé au nettoyage des données du ficher afin d’éliminer celles qui n’étaient pas pertinentes ou gênantes pour notre étude. Ainsi, nous avons vérifié les parts des données manquantes dans la base brutes afin de supprimer celles vides, soit celles à 100% après calcul (suppression de 14 colonnes). Nous avons également supprimé les doubles s’il y en avait et les lignes null. Après cela, nous avons corrigé les types de nos données afin de pouvoir les utiliser plus facilement par la suite et nous avons supprimé les valeurs foncières null. Nous sommes parvenus à un dataset de 29 colonnes. Ce nettoyage nous a donc permis de réduire le nombre de données à traiter.¶
Après tout ce travail de nettoyage, nous avons pu réaliser les graphes suivants sur les données de 2022 :¶
- Part de maison, d'appartement, ect.. dans le dataset¶
- Prix au mètre carré en fonction du type de local¶
- Comparaison de plusieurs types de local¶
- Surface du terrain par département¶
- Valeur foncière moyenne par département en 2022 (bar plot)¶
- Valeur foncière moyenne par département en 2022 (geojson et choropleth)¶
- Valeur foncière moyenne par pays, par département et par commune (treemap) NE FONCTIONNE PAS¶
- Surface réelle bâtie moyenne par département¶
- Départements les plus chers pour l'immobilier en 2022¶
- Valeur foncière moyenne par jour en 2022¶
- Valeur foncière moyenne à Paris en 2022¶
- Prix moyen du mètre carré pour les appartements à Paris en 2022¶
- Nombre de bien vendu dans les 20 villes¶
- Valeur foncière moyenne par arrondissement de Lyon en 2022¶
- Nombre de biens vendus par arrondissement de Lyon en 2022¶
- Nature des cultures en France en 2022¶
- Relation entre valeur foncière et nature de mutation¶
- Relation entre nombre de pièce principale et nature de mutation¶
- Prix au m² selon le type de local¶
- Prix au m² selon le nombre de pièce principale¶
Puis nous avons réitéré l’opération sur les valeurs foncières de 2021 pour les comparer avec celles de 2022 afin de réaliser les graphes suivants :¶
- Comparaison du prix moyen du mètre carré entre 2021 et 2022¶
- Comparaison de la nature des mutations entre 2021 et 2022¶
- Surface du terrain en fonction du département entre 2021 et 2022¶
- Relation entre la commune et la valeur foncière en fonction de la commune entre 2021 et 2022¶
- Nombre de biens vendus par commune en 2021 et 2022¶
Difficultés¶
Nous avons rencentré quelques difficultés au cours de ce projet. Premièrement, dans la base de données, il n’y a pas d’explication précise sur quelle colonne correspond à quoi et pas de pré indication sur certaines données (exemple : certains prix astronomiques au m² à Paris, alors que cela dépend simplement de l’arrondissement mais n’est pas précisé).¶
Sur l’utilisation du framework django, nous avons A DETAILLER QUAND ON L’AURA FAIT + Importation du dataset de 2021¶
Contribution des membres¶
La répartition des tâches fut assez équilibrée. Nous avons commencé par importer et nettoyer le fichier ensemble en TD, puis nous nous sommes réparti les différents graphes à faire en 2 parties, une partie chacun. Nous avons travaillé en ligne sur Google Colab afin de pouvoir suivre les avancées de l’autre sur le notebook. Sur l’utilisation du framework django, la principale difficulté était de comprendre la liaison python/html faite par django et réussir à garder les paramètres de visualisation sélectionnés par l'utilisateur lors du passage d'une page à une autre.¶
Pour l’export html et la partie django, nous nous sommes retrouvés pour comprendre son fonctionnement et le réaliser ensemble. Gabriel a réalisé la partie comparaison des données avec 2021 et Elsa a réalisé le rapport.¶
Conclusion¶
Nous avons trouvé ce projet intéressant, du fait que l’on traite de donnés réelles, et qui nous parlent. Il nous a permis d’exploiter nos connaissances en Python avec les notebook, mais également à traiter un jeu de données en choisissant les plus pertinente.¶
Librairies¶
Install
%load_ext pretty_jupyter
%load_ext jinja2
The jinja2 module is not an IPython extension.
# install calmap pour colab
#! pip install calmap
#mettre à jour plotly pour colab
#!pip install plotly==4.5.2
#!pip install plotly
#!pip install geopandas
#!pip install jinja2
Imports
# librairies essentielles
import json
import requests
import random
from urllib.request import urlopen
from collections import Counter
# analyse et stockage
import numpy as np
import pandas as pd
# visualisation
import warnings
warnings.filterwarnings('ignore')
import matplotlib.pyplot as plt
import seaborn as sns
import plotly.express as px
import geopandas as gpd
colors1 = ['#DAF7A6', '#FFC300', '#FF5733', '#C70039', '#900C3F', '#581845']
colors2 = ["#e60049", "#0bb4ff", "#50e991", "#e6d800", "#9b19f5", "#ffa300", "#dc0ab4", "#b3d4ff", "#00bfa0"]
colors3 = ["#1984c5", "#22a7f0", "#63bff0", "#a7d5ed", "#e2e2e2", "#e1a692", "#de6e56", "#e14b31", "#c23728"]
I ] Chargement¶
df = pd.read_csv('https://static.data.gouv.fr/resources/demandes-de-valeurs-foncieres/20230405-160733/valeursfoncieres-2022.txt', sep = '|')
df.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 3803885 entries, 0 to 3803884 Data columns (total 43 columns): # Column Dtype --- ------ ----- 0 Identifiant de document float64 1 Reference document float64 2 1 Articles CGI float64 3 2 Articles CGI float64 4 3 Articles CGI float64 5 4 Articles CGI float64 6 5 Articles CGI float64 7 No disposition int64 8 Date mutation object 9 Nature mutation object 10 Valeur fonciere object 11 No voie float64 12 B/T/Q object 13 Type de voie object 14 Code voie object 15 Voie object 16 Code postal float64 17 Commune object 18 Code departement object 19 Code commune int64 20 Prefixe de section float64 21 Section object 22 No plan int64 23 No Volume object 24 1er lot object 25 Surface Carrez du 1er lot object 26 2eme lot object 27 Surface Carrez du 2eme lot object 28 3eme lot object 29 Surface Carrez du 3eme lot object 30 4eme lot float64 31 Surface Carrez du 4eme lot object 32 5eme lot float64 33 Surface Carrez du 5eme lot object 34 Nombre de lots int64 35 Code type local float64 36 Type local object 37 Identifiant local float64 38 Surface reelle bati float64 39 Nombre pieces principales float64 40 Nature culture object 41 Nature culture speciale object 42 Surface terrain float64 dtypes: float64(17), int64(4), object(22) memory usage: 1.2+ GB
# formatage des noms des colonnes
df = df.rename(columns=lambda x: x.replace(' ', '_').lower())
II ] Nettoyage¶
#Vérifier les parts des données manquantes dans la base brutes
df.isnull().sum()/len(df)*100
identifiant_de_document 100.000000 reference_document 100.000000 1_articles_cgi 100.000000 2_articles_cgi 100.000000 3_articles_cgi 100.000000 4_articles_cgi 100.000000 5_articles_cgi 100.000000 no_disposition 0.000000 date_mutation 0.000000 nature_mutation 0.000000 valeur_fonciere 0.649888 no_voie 34.733621 b/t/q 95.374019 type_de_voie 36.984294 code_voie 1.026398 voie 1.029290 code_postal 1.029816 commune 0.000000 code_departement 0.000000 code_commune 0.000000 prefixe_de_section 95.824295 section 0.004075 no_plan 0.000000 no_volume 99.765792 1er_lot 66.631142 surface_carrez_du_1er_lot 90.332568 2eme_lot 89.535278 surface_carrez_du_2eme_lot 96.741752 3eme_lot 98.134670 surface_carrez_du_3eme_lot 99.635662 4eme_lot 99.402611 surface_carrez_du_4eme_lot 99.911880 5eme_lot 99.744130 surface_carrez_du_5eme_lot 99.967481 nombre_de_lots 0.000000 code_type_local 39.918478 type_local 39.918478 identifiant_local 100.000000 surface_reelle_bati 39.973396 nombre_pieces_principales 39.973396 nature_culture 33.830912 nature_culture_speciale 95.934262 surface_terrain 33.830912 dtype: float64
# suppression des attributs non nécessaire
df = df.drop(['identifiant_de_document',
'reference_document',
'1_articles_cgi',
'2_articles_cgi',
'3_articles_cgi',
'4_articles_cgi',
'5_articles_cgi',
'prefixe_de_section',
'no_volume',
'3eme_lot',
'4eme_lot',
'5eme_lot',
'identifiant_local',
'nature_culture_speciale',
],axis= 1)
# suppression des doubles
df = df.drop_duplicates()
# suppression des ligne null
df = df.dropna(how="all")
# correction des types de données
df['date_mutation'] = pd.to_datetime(df['date_mutation'])
df['nature_mutation'] = df['nature_mutation'].astype('category')
df['valeur_fonciere'] = df['valeur_fonciere'].str.replace(',', '.').astype('float')
df['no_voie'] = df['no_voie'].astype('Int32')
df['b/t/q'] = df['b/t/q'].astype('category')
df['code_postal'] = df['code_postal'].astype('float')
df['code_commune'] = df['code_commune'].astype('int32')
df['no_plan'] = df['no_plan'].astype('int32')
df['1er_lot'] = df['1er_lot'].astype('category')
df['2eme_lot'] = df['2eme_lot'].astype('category')
df['surface_carrez_du_1er_lot'] = df['surface_carrez_du_1er_lot'].str.replace(',', '.').astype('float')
df['surface_carrez_du_2eme_lot'] = df['surface_carrez_du_2eme_lot'].str.replace(',', '.').astype('float')
df['surface_carrez_du_3eme_lot'] = df['surface_carrez_du_3eme_lot'].str.replace(',', '.').astype('float')
df['surface_carrez_du_4eme_lot'] = df['surface_carrez_du_4eme_lot'].str.replace(',', '.').astype('float')
df['surface_carrez_du_5eme_lot'] = df['surface_carrez_du_5eme_lot'].str.replace(',', '.').astype('float')
df['nombre_de_lots'] = df['nombre_de_lots'].astype('int32')
df['code_type_local'] = df['code_type_local'].astype('Int32')
df['type_local'] = df['type_local'].astype('category')
df['surface_reelle_bati'] = df['surface_reelle_bati'].astype('float')
df['nombre_pieces_principales'] = df['nombre_pieces_principales'].astype('Int32')
df['nature_culture'] = df['nature_culture'].astype('category')
df['surface_terrain'] = df['surface_terrain'].astype('float')
#remplissage des valeur null
df['surface_carrez_du_1er_lot'].fillna(0, inplace=True)
df['surface_carrez_du_2eme_lot'].fillna(0, inplace=True)
df['surface_carrez_du_3eme_lot'].fillna(0, inplace=True)
df['surface_carrez_du_4eme_lot'].fillna(0, inplace=True)
df['surface_carrez_du_5eme_lot'].fillna(0, inplace=True)
df['surface_reelle_bati'].fillna(0, inplace=True)
df['surface_terrain'].fillna(0, inplace=True)
df['valeur_fonciere'].fillna(0, inplace=True)
df['nombre_pieces_principales'].fillna(0, inplace=True)
df = df[df['valeur_fonciere'] > 0]
df = df[df['surface_reelle_bati'] > 0]
df = df.loc[(df['code_departement'] != 22) | (~df.duplicated(subset=['valeur_fonciere'], keep=False))]
df.info()
<class 'pandas.core.frame.DataFrame'> Int64Index: 1215482 entries, 0 to 3803882 Data columns (total 29 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 no_disposition 1215482 non-null int64 1 date_mutation 1215482 non-null datetime64[ns] 2 nature_mutation 1215482 non-null category 3 valeur_fonciere 1215482 non-null float64 4 no_voie 1208562 non-null Int32 5 b/t/q 83276 non-null category 6 type_de_voie 1091558 non-null object 7 code_voie 1215482 non-null object 8 voie 1215453 non-null object 9 code_postal 1215452 non-null float64 10 commune 1215482 non-null object 11 code_departement 1215482 non-null object 12 code_commune 1215482 non-null int32 13 section 1215424 non-null object 14 no_plan 1215482 non-null int32 15 1er_lot 482819 non-null category 16 surface_carrez_du_1er_lot 1215482 non-null float64 17 2eme_lot 196721 non-null category 18 surface_carrez_du_2eme_lot 1215482 non-null float64 19 surface_carrez_du_3eme_lot 1215482 non-null float64 20 surface_carrez_du_4eme_lot 1215482 non-null float64 21 surface_carrez_du_5eme_lot 1215482 non-null float64 22 nombre_de_lots 1215482 non-null int32 23 code_type_local 1215482 non-null Int32 24 type_local 1215482 non-null category 25 surface_reelle_bati 1215482 non-null float64 26 nombre_pieces_principales 1215482 non-null Int32 27 nature_culture 727284 non-null category 28 surface_terrain 1215482 non-null float64 dtypes: Int32(3), category(6), datetime64[ns](1), float64(9), int32(3), int64(1), object(6) memory usage: 208.0+ MB
df.head()
no_disposition | date_mutation | nature_mutation | valeur_fonciere | no_voie | b/t/q | type_de_voie | code_voie | voie | code_postal | ... | surface_carrez_du_3eme_lot | surface_carrez_du_4eme_lot | surface_carrez_du_5eme_lot | nombre_de_lots | code_type_local | type_local | surface_reelle_bati | nombre_pieces_principales | nature_culture | surface_terrain | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2022-03-01 | Vente | 55000.0 | 13 | NaN | RUE | 2280 | DE LA LIBERTE | 1000.0 | ... | 0.0 | 0.0 | 0.0 | 1 | 2 | Appartement | 24.0 | 1 | NaN | 0.0 |
3 | 1 | 2022-03-01 | Vente | 143000.0 | 98 | NaN | RTE | 0055 | DE LA DOMBES | 1480.0 | ... | 0.0 | 0.0 | 0.0 | 1 | 2 | Appartement | 140.0 | 3 | NaN | 0.0 |
5 | 1 | 2022-06-01 | Vente | 255000.0 | 282 | NaN | RTE | 0130 | DE POISATON | 1560.0 | ... | 0.0 | 0.0 | 0.0 | 0 | 1 | Maison | 108.0 | 5 | S | 649.0 |
8 | 1 | 2022-03-01 | Vente | 525000.0 | 217 | NaN | PL | 0300 | DE LA CROIX BLANCHE | 1390.0 | ... | 0.0 | 0.0 | 0.0 | 0 | 4 | Local industriel. commercial ou assimilé | 424.0 | 0 | S | 628.0 |
9 | 1 | 2022-03-01 | Vente | 525000.0 | 217 | NaN | PL | 0300 | DE LA CROIX BLANCHE | 1390.0 | ... | 0.0 | 0.0 | 0.0 | 0 | 2 | Appartement | 126.0 | 4 | S | 628.0 |
5 rows × 29 columns
III ] Interprétations¶
Générales¶
1. Quelle est la part de maison, d'appartement, ect.. dans le dataset?¶
# Quelle est la part de maison, d'appartement, ect.. dans le dataset?
types = df['type_local'].value_counts(dropna = False, normalize = True).head()
plt.figure(figsize=(8,8))
plt.pie(types.values, labels=types.index, colors = colors2, startangle=65)
plt.title(label= 'Parts des types de biens')
plt.legend(loc = 4)
<matplotlib.legend.Legend at 0x7f7b02b378e0>
Nous remarquons que sur ce graphique circulaire, un peu moins de la moitié des biens n'ont pas de type. Un peu moins d'1/4 sont des dépendances, 1/6 des appartements et 1/6 des maisons
2. Prix au mètre carré en fonction du type de local¶
# Prix au mètre carré en fonction du type de local
pm2 = df[(df['nombre_de_lots']<6) & ((df['surface_carrez_du_1er_lot'] + df['surface_carrez_du_2eme_lot'] + df['surface_carrez_du_3eme_lot'] + df['surface_carrez_du_4eme_lot'] + df['surface_carrez_du_5eme_lot']) > 0)]
pm2['surface_totale'] = pm2['surface_carrez_du_1er_lot'] + pm2['surface_carrez_du_2eme_lot'] + pm2['surface_carrez_du_3eme_lot'] + pm2['surface_carrez_du_4eme_lot'] + pm2['surface_carrez_du_5eme_lot']
pm2['prix_m2'] = pm2['valeur_fonciere'] / pm2['surface_totale']
sns.set(rc={'figure.figsize':(40,30)})
sns.color_palette()
sns.catplot(x="type_local", y="prix_m2", jitter=True, data=pm2, kind="strip", height=8, aspect=1.5, palette="Set2")
#sns.stripplot(pm2['type_local'],pm2['prix_m2'],jitter=True)
#pm2.loc[:,['type_local','prix_m2']].plot(kind='scatter',x='type_local',y='prix_m2')
<seaborn.axisgrid.FacetGrid at 0x7f7b07837dc0>
On vois que la variance du prix au metre carrée et plus faible dans les maisons que dans les appartement ou les locals industiels.
3. Comparaison de plusieurs types de local¶
prixlocal = df.loc[df['type_local'].notna() & df['surface_terrain'].notna() & df['surface_terrain'] >= 1 & df['valeur_fonciere'].notna(),("surface_terrain","valeur_fonciere","type_local")]
prixlocal['prix_m2_sur_le_terrain'] = prixlocal['valeur_fonciere']/prixlocal['surface_terrain']
prixlocal['valeur_fonciere'] = prixlocal['valeur_fonciere']/1000
prixlocal.groupby(['type_local']).mean().plot.bar(title = 'Comparaison de différents types de local',figsize=(20,5))
<AxesSubplot:title={'center':'Comparaison de différents types de local'}, xlabel='type_local'>
On peut voir qu’une maison est beaucoup plus rentable qu’un appartement, qu’une dépendance ou qu’un local commercial. Ceci étant dit, plusieurs facteurs peuvent entrer en jeu, le peu de données sur des maisons vendues mais aussi la situation géographique des ventes. Il y a beaucoup plus de maisons vendues en province, là où les prix sont inférieurs à ceux des villes.
4. Surface du terrain par département¶
fig = plt.figure(4,figsize = (30,5))
axis = fig.add_subplot(1, 1, 1)
axis.set_title('Surface du terrain en fonction du département')
axis.set_xlabel("Département")
axis.set_ylabel("Surface du terrain")
chmp = df.loc[df["code_departement"].notna(),("surface_terrain","code_departement")]
gb = chmp.groupby("code_departement",dropna= False).mean()['surface_terrain'].reset_index()
axis.bar(gb["code_departement"].astype(str), gb["surface_terrain"])
plt.xticks(rotation=90)
fig.show()
Les départements avec le plus de surface de terrain sont le 14 et le 973, on remarque que ce ne sont pas des grandes villes). Ceux avec le moins sont bien sûr situés en région parisienne (beaucoup d'appartements).
5. Quelle est la valeur foncière moyenne par département en 2022 (bar plot) ?¶
#Quelle est la valeur foncière moyenne par departement en utilisant un bar plot ?
grouped_vf_dept = df.groupby('code_departement')['valeur_fonciere'].mean().reset_index()
grouped_vf_dept['code_departement'] = grouped_vf_dept['code_departement'].astype('string')
fig = px.bar(grouped_vf_dept, y='valeur_fonciere',
x='code_departement',
text_auto='.2s')
fig.update_layout(title="Valeur foncière moyenne par département",
yaxis_title='Valeur foncière moyenne (€)',
xaxis_title='Département');
%%jmd
[//]: # (-.-|m { input: true, output_error: false, input_fold: hide })
{{fig.to_html(include_plotlyjs=False, full_html=False)}}
On remarque que les 2 départements qui se démarquent vraiment des autres au niveau de la valeur foncière moyenne sont : 75 et 92, soit une grande partie de la région parisienne. On s'aperçoit que la valeur foncière est fortement correlée avec la position géographique.
6. Quelle est la valeur foncière moyenne par département en 2022 (geojson et choropleth) ?¶
#Quelle est la valeur foncière moyenne par département en 2022 (geojson et choropleth) ?
geojson_url = "https://france-geojson.gregoiredavid.fr/repo/departements.geojson"
geojson_data = requests.get(geojson_url).json()
fig = px.choropleth(grouped_vf_dept,
geojson=geojson_data,
locations='code_departement',
color='valeur_fonciere',
color_continuous_scale='pinkyl',
featureidkey='properties.code',
projection="mercator",
title='Valeur foncière moyenne par départements')
fig.update_geos(fitbounds="locations", visible=False)
fig.update_layout(height=600, width=800);
%%jmd
[//]: # (-.-|m { input: true, output_error: false, input_fold: hide })
{{ fig.to_html(include_plotlyjs=False, full_html=False) }}
Même analyse que la question précédente.
7. Quelle est la valeur foncière moyenne par pays, par département et par commune (treemap) ?¶
# Quelle est la valeur foncière moyenne par pays, par département (treemap) ?
df_avg = df.groupby(['code_departement'])['valeur_fonciere'].mean().reset_index()
fig = px.treemap(df_avg,
path=[px.Constant("France"),'code_departement'],
values='valeur_fonciere',
color='valeur_fonciere')
fig.update_layout(title='Carte proportionelle de la valeur foncière moyenne');
#fig.show()
%%jmd
[//]: # (-.-|m { input: true, output_error: false, input_fold: hide })
{{ fig.to_html(include_plotlyjs=False, full_html=False) }}
Même analyse que la question précédente. Aussi, on s'aperçoit que la valeur foncière est fortement correlée avec la position géographique.
8. Quelle est la surface réelle bâtie moyenne par département?¶
# Quelle est la surface réelle bâtie moyenne par département?
grouped_srb_dept = df[df['surface_reelle_bati'] > 0]
grouped_srb_dept = grouped_srb_dept.groupby('code_departement')['surface_reelle_bati'].mean().reset_index()
grouped_srb_dept['code_departement'] = grouped_srb_dept['code_departement'].astype('string')
fig = px.bar(grouped_srb_dept, y='surface_reelle_bati',
x='code_departement',
text_auto='.2s')
fig.update_layout(title="Surface réelle bâtie moyenne par departement",
yaxis_title='Valeur foncière moyenne (€)',
xaxis_title='Département');
#fig.show()
%%jmd
[//]: # (-.-|m { input: true, output_error: false, input_fold: hide })
{{ fig.to_html(include_plotlyjs=False, full_html=False) }}
On remarque que le département 75 (Paris) présente une surface réelle bâtie plus faible en moyenne par rapport aux autres départements de France, en raison de contraintes géographiques et d'une forte urbanisation.
9. Quels sont les départements les plus chers pour l'immobilier en 2022 ?¶
# Quels sont les départements les plus chers pour l'immobilier en 2022 ?
grouped_vf_dept_top10 = grouped_vf_dept.sort_values('valeur_fonciere', ascending=False).head(10)
fig = px.bar(grouped_vf_dept_top10, x='valeur_fonciere', y='code_departement', orientation='h')
fig.update_layout(title='Les départements les plus chers pour l\'immobilier en 2022',
xaxis_title='Valeur foncière moyenne (€)',
yaxis_title='Département');
#fig.show()
%%jmd
[//]: # (-.-|m { input: true, output_error: false, input_fold: hide })
{{ fig.to_html(include_plotlyjs=False, full_html=False) }}
L'analyse du graphe de la valeur foncière par département en France révèle que les départements 75 (Paris) et 92 (Hauts-de-Seine) affichent des valeurs foncières significativement plus élevées que les autres. Cela suggère une concentration de la valeur immobilière dans ces régions, probablement en raison de facteurs tels que la densité urbaine, l'emplacement stratégique et la demande élevée.
10. Valeur foncière moyenne par jour en 2022¶
# Valeur foncière moyenne par jour en 2022
filtered_df = df[df['valeur_fonciere'] <= 4000000]
daily_means = filtered_df.groupby(filtered_df['date_mutation'].dt.date)['valeur_fonciere'].mean()
plt.scatter(daily_means.index, daily_means.values, c='red', label='Prix moyen')
avg_value = df['valeur_fonciere'].mean()
plt.axhline(y=avg_value, color='green', linestyle='solid', label='Valeur foncière moyenne sur 2022')
tick_dates = pd.date_range(start='2022-01-01', end='2022-12-31', freq='2M')
tick_labels = [date.strftime('%Y-%m') for date in tick_dates]
plt.xticks(ticks=tick_dates, labels = tick_labels, rotation=80)
plt.title('Valeur foncière moyenne par jour en 2022')
plt.xlabel("Date")
plt.ylabel("Valeur foncière moyenne")
plt.legend()
plt.show()
Les valeurs sont un peu moins espacées par rapport à la moyenne pendant le printemps et l'été alors qu'autrement elles sont plus dispersées. La mauvaise période pour investir serait donc en hiver, il y a une très forte demande, donc des prix élevés.
11. Quelle est la valeur foncière moyenne à Paris en 2022 ?¶
#Quelle est la valeur foncière moyenne par commune dans le 75 en utilisant geojson et choropleth ?
geojson_url = "https://france-geojson.gregoiredavid.fr/repo/departements/75-paris/communes-75-paris.geojson"
geojson_data = requests.get(geojson_url).json()
vf_com_paris = df[(df['code_departement']==75) & df['valeur_fonciere'] > 0]
vf_com_paris = vf_com_paris.groupby('code_commune')['valeur_fonciere'].mean().reset_index()
vf_com_paris['code_commune'] = '75'+vf_com_paris['code_commune'].astype(str)
fig = px.choropleth(vf_com_paris,
geojson=geojson_data,
locations='code_commune',
color='valeur_fonciere',
color_continuous_scale='Reds',
featureidkey='properties.code',
projection="mercator",
title="Valeur fonciére moyenne en €")
fig.update_geos(fitbounds="locations", visible=False)
fig.update_layout(height=600,
width=800);
#fig.show()
%%jmd
[//]: # (-.-|m { input: true, output_error: false, input_fold: hide })
{{ fig.to_html(include_plotlyjs=False, full_html=False) }}
Nous remarquons sur cette carte représentant les différents arrondissements de Paris (75), que le 8ème arrondissement est celui avec la valeur foncière la plus élevée en 2022 (très élévée comparé aux autres arrondissements qui sont tous < 7M).
12. Quel est le prix moyen du mètre carré pour les appartements à Paris en 2022 ?¶
#Quelle est le prix moyen d'un mètre carré dans les communes du 75 en utilisant geojson et choropleth ?
geojson_url = "https://france-geojson.gregoiredavid.fr/repo/departements/75-paris/communes-75-paris.geojson"
geojson_data = requests.get(geojson_url).json()
vf_com_paris = df[(df['code_departement'] == 75) & (df['nombre_de_lots']<6) & ((df['surface_carrez_du_1er_lot'] + df['surface_carrez_du_2eme_lot'] + df['surface_carrez_du_3eme_lot'] + df['surface_carrez_du_4eme_lot'] + df['surface_carrez_du_5eme_lot']) > 0)]
vf_com_paris['surface_totale'] = vf_com_paris['surface_carrez_du_1er_lot'] + vf_com_paris['surface_carrez_du_2eme_lot'] + vf_com_paris['surface_carrez_du_3eme_lot'] + vf_com_paris['surface_carrez_du_4eme_lot'] + vf_com_paris['surface_carrez_du_5eme_lot']
vf_com_paris['prix_m2'] = vf_com_paris['valeur_fonciere'] / vf_com_paris['surface_totale']
vf_com_paris = vf_com_paris.groupby('code_commune')['prix_m2'].mean().reset_index()
vf_com_paris['code_commune'] = '75'+vf_com_paris['code_commune'].astype(str)
fig = px.choropleth(vf_com_paris,
geojson=geojson_data,
locations='code_commune',
color='prix_m2',
color_continuous_scale='Reds',
featureidkey='properties.code',
projection="mercator",
title="Prix moyen d'un mètre carré en €")
fig.update_geos(fitbounds="locations", visible=False)
fig.update_layout(height=600,
width=800);
#fig.show()
%%jmd
[//]: # (-.-|m { input: true, output_error: false, input_fold: hide })
{{ fig.to_html(include_plotlyjs=False, full_html=False) }}
Sur cette carte, nous remarquons que le 1er arrondissement de Paris est celui dont le prix au m² est le plus élévé en 2022 (environs 33k/m²), suivi du 7ème et du 4ème avec environ 23-24k/m².
13. Nombre de bien vendu dans les 20 villes¶
#Nombre de bien vendu dans les 20 villes
plt.rcParams['figure.figsize'] = [18, 5]
plt.rcParams['figure.dpi'] = 150
vente_ville = df.groupby(['commune']).size().sort_values(ascending = False).head(20)
x = vente_ville.index
y = vente_ville.tolist()
plt.scatter(x, y, color='#119670', marker='o', label = 'Nombre de biens vendus')
plt.title('Nombre de biens vendus par ville', fontsize = 13)
plt.xticks(rotation=60)
plt.xlabel("Ville", fontsize = 12)
plt.ylabel("Nombre de biens vendus", fontsize = 12)
plt.legend(loc = 'upper right')
plt.grid(True)
plt.show()
On peut voir les 20 villes les plus populaires. La première est Toulouse avec plus de 27500 biens vendus en 2022, suivi de Nice, Nantes, Montpellier et Bordeaux.
Lyon¶
14. Valeur foncière moyenne par arrondissement de Lyon en 2022¶
#Valeur foncière moyenne par arrondissement de Lyon en 2022
lyon = df.loc[(df['commune'].str.contains("LYON")) & (df['commune'].str.contains("EME"))]
arrondissement_lyon = lyon.groupby(['commune']).mean().sort_values(['valeur_fonciere'])
x = arrondissement_lyon.index
y = arrondissement_lyon['valeur_fonciere']
arrondissement_lyon.head()
no_disposition | valeur_fonciere | no_voie | code_postal | code_commune | no_plan | surface_carrez_du_1er_lot | surface_carrez_du_2eme_lot | surface_carrez_du_3eme_lot | surface_carrez_du_4eme_lot | surface_carrez_du_5eme_lot | nombre_de_lots | code_type_local | surface_reelle_bati | nombre_pieces_principales | surface_terrain | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
commune | ||||||||||||||||
LYON 5EME | 1.003717 | 3.993009e+05 | 48.791822 | 69005.0 | 385.0 | 66.944238 | 30.991945 | 19.413160 | 0.621611 | 0.314449 | 0.000000 | 1.584882 | 2.065675 | 75.116481 | 3.003717 | 35.422553 |
LYON 8EME | 1.002094 | 4.994212e+05 | 57.570133 | 69008.0 | 388.0 | 90.849965 | 54.388974 | 13.122826 | 0.515052 | 0.100251 | 0.000000 | 1.325192 | 2.142359 | 68.923238 | 2.542219 | 39.972087 |
LYON 4EME | 1.025707 | 7.098798e+05 | 28.996144 | 69004.0 | 384.0 | 83.394602 | 32.994254 | 13.620206 | 1.237352 | 0.241915 | 0.000000 | 1.525707 | 2.174807 | 68.169666 | 2.517995 | 41.029563 |
LYON 2EME | 1.025260 | 1.004394e+06 | 24.36107 | 69002.0 | 382.0 | 59.179792 | 38.735765 | 11.226345 | 3.079480 | 0.466330 | 1.040669 | 1.496285 | 2.326895 | 80.313522 | 2.142645 | 24.613670 |
LYON 7EME | 1.002449 | 1.100286e+06 | 59.290402 | 69007.0 | 387.0 | 85.114594 | 33.955132 | 8.728790 | 0.690700 | 0.288834 | 0.012684 | 1.299706 | 2.265426 | 87.515181 | 2.101371 | 44.467189 |
#Valeur foncière moyenne par arrondissement de Lyon en 2022
plt.figure(1, figsize=(10, 6))
plt.plot(x, y, color='purple', marker='o', label='Prix moyen')
plt.title('Valeur fonciere moyenne par arrondissement de Lyon en 2021')
plt.xticks(rotation=80)
plt.xlabel("Arrondissements de Lyon")
plt.ylabel("Valeur fonciere moyenne")
plt.legend(loc = 'upper left')
plt.grid(True)
plt.show()
Sur ce graphe, nous remarquons que le 6ème arrondissement de Lyon se démarque beaucoup des autres au niveau de sa valeur foncière, c'est donc l'arrondissement le plus cher de Lyon. En effet, sa valeur foncière est d'environ 3.5M alors que tous les autres arrondissements sont inférieur à 2M.
15. Nombre de biens vendus par arrondissement de Lyon¶
# Nombre de biens vendus par arrondissement de Lyon
arrondissement_lyon = lyon.groupby(['commune']).size()
x = arrondissement_lyon.index.tolist()
y = arrondissement_lyon.tolist()
plt.figure(1, figsize=(10, 6))
plt.pie(y, labels = x, autopct = '%.2f')
plt.title("Pars de biens vendus par arrondissement à Lyon")
# Ajout d'un cercle au centre
my_circle=plt.Circle( (0,0), 0.7, color='white')
p=plt.gcf()
p.gca().add_artist(my_circle)
plt.show()
Sur ce graphe, nous représentons la part des biens vendus par arrondissements à Lyon en 2022. Nous remarquons que l'arrondissement dans lequel le plus de bien ont été vendu en 2022 est le 3ème arrondissement (avec 22.71% de la part des biens vendus) suivi de près par le 7ème (19.40%) . Le 6ème arrondissement précédemment mentionné comme le plus cher n'est pas le plus populaire cette année. En effet, les arrondissements les plus populaires sont le 3ème et le 7ème (beaucoup moins chers en terme de valeur foncière).
Relation diverse¶
16. Nature des cultures en France en 2022¶
# Nature des cultures en France en 2022
plt.figure(figsize=(8,8))
plt.title('Nature des cultures françaises en 2022')
sns.set(rc={'figure.figsize':(3,9)})
sns.countplot(y='nature_culture', data=df)
<AxesSubplot:title={'center':'Nature des cultures françaises en 2022'}, xlabel='count', ylabel='nature_culture'>
On remarque ci-dessus que le type de terrain très largement majoritaire est sol (S). On peut observer aussi que les terrains les plus commercialisées sont les terrains d’agrément (AG), les jardins (J), les terres (T), les prés (P). Ceux qui sont moins populaires sont les terrains à bâtir (AB), les taillis simple (BT) et les vergers (VE).
17. Relation entre valeur foncière et nature de mutation¶
# Relation entre valeur foncière et nature de mutation
df_ve = df[df['nature_mutation']=='Vente'].sort_values(by='valeur_fonciere', ascending=False)
se_vente_commune = df_ve.commune.value_counts()
plt.figure(figsize=(10,5))
df_best_city = df_ve[df_ve['commune'].isin(se_vente_commune.head(10).index)]
df_best_city = df_best_city[df_best_city['valeur_fonciere'] < df_best_city['valeur_fonciere'].quantile(.95)]
df_best_city = df_best_city[df_best_city['valeur_fonciere'] > df_best_city['valeur_fonciere'].quantile(.05)]
order=df_best_city['valeur_fonciere'].groupby(df_best_city.commune).median().sort_values(ascending=False)
plt.figure(figsize=(20,10))
ax = sns.boxplot(x=df_best_city.commune, y=df_best_city['valeur_fonciere'], order=order.index)
ax.set_title('Relation entre la commune et la valeur foncière')
ax.set_xlabel('Commune')
ax.set_ylabel('Valeur foncière')
Text(0, 0.5, 'Valeur foncière')
<Figure size 1500x750 with 0 Axes>
Nous avons réalisé un graphique sous forme de boite à moustache (boxplot). Pour Nice, Lille, Nantes et Rennes, on remarque que la médiane de la valeur foncière est à peu près la même. Celle de Saint-Etienne est en dessous alors que celle de Paris 18 et Bordeaux est largement supérieure. Grâce à ce graphique en boite à moustache, nous pouvons également lire les valeurs foncières minimales et maximales pour chacune des villes. Par exemple, la valeur foncière maximale pour Paris 18 est d'environs 1.1M contre 0.5M pour Saint-Etienne. On remarque également que Paris 18 comptabilise des ventes de biens avec la valeur foncière la plus élevée. C'est elle qui a le plus gros écart inter-quartile: des valeurs allant de 0.2 à 0.6 millions d'euros.
18. Relation entre nombre de pièce principale et nature de mutation¶
# Relation entre nombre de pièce principale et nature de mutation
df_ve = df[df['nature_mutation']=='Vente'].sort_values(by='valeur_fonciere', ascending=False)
se_vente_nombre_pieces_principales = df_ve.nombre_pieces_principales.value_counts()
plt.figure(figsize=(10,5))
df_best_city = df_ve[df_ve['nombre_pieces_principales'].isin(se_vente_nombre_pieces_principales.head(10).index)]
df_best_city = df_best_city[df_best_city['valeur_fonciere'] < df_best_city['valeur_fonciere'].quantile(.95)]
df_best_city = df_best_city[df_best_city['valeur_fonciere'] > df_best_city['valeur_fonciere'].quantile(.05)]
order=df_best_city['valeur_fonciere'].groupby(df_best_city.nombre_pieces_principales).median().sort_values(ascending=False)
plt.figure(figsize=(20,10))
ax = sns.boxplot(x=df_best_city.nombre_pieces_principales, y=df_best_city['valeur_fonciere'], order=order.index)
ax.set_title('Relation entre le nombre pièce principale et la valeur foncière')
ax.set_xlabel('nombre_pieces_principales')
ax.set_ylabel('Valeur foncière')
Text(0, 0.5, 'Valeur foncière')
<Figure size 1500x750 with 0 Axes>
On remarque que plus le nombre de pièce est élevé, plus la valeur foncière est importante.
19. Prix au m² selon le type de local ?¶
# Prix au mètre carré en fonction du type de local
pm2 = df[(df['nombre_de_lots']<6) & ((df['surface_carrez_du_1er_lot'] + df['surface_carrez_du_2eme_lot'] + df['surface_carrez_du_3eme_lot'] + df['surface_carrez_du_4eme_lot'] + df['surface_carrez_du_5eme_lot']) > 0)]
pm2['surface_totale'] = pm2['surface_carrez_du_1er_lot'] + pm2['surface_carrez_du_2eme_lot'] + pm2['surface_carrez_du_3eme_lot'] + pm2['surface_carrez_du_4eme_lot'] + pm2['surface_carrez_du_5eme_lot']
pm2['prix_m2'] = pm2['valeur_fonciere'] / pm2['surface_totale']
sns.set(rc={'figure.figsize':(40,30)})
sns.color_palette()
sns.catplot(x="type_local", y="prix_m2", jitter=True, data=pm2, kind="strip", height=8, aspect=1.5, palette="Set2")
<seaborn.axisgrid.FacetGrid at 0x7f7b88b58e80>
Sur ce graphe, nous remarquons que le prix au m² reste assez similaire pour les maisons. Cepedant, pour les appartements et les local industriels, nous remarquons quelques valeurs qui s'écartent du reste, cela peut être dû à la localisation du bien.
20. Prix au m² selon le nombre de pièce principale¶
# Prix au mètre carré en fonction du nombre de pièce principale
pm2 = df[(df['nombre_de_lots']<6) & ((df['surface_carrez_du_1er_lot'] + df['surface_carrez_du_2eme_lot'] + df['surface_carrez_du_3eme_lot'] + df['surface_carrez_du_4eme_lot'] + df['surface_carrez_du_5eme_lot']) > 0)]
pm2['surface_totale'] = pm2['surface_carrez_du_1er_lot'] + pm2['surface_carrez_du_2eme_lot'] + pm2['surface_carrez_du_3eme_lot'] + pm2['surface_carrez_du_4eme_lot'] + pm2['surface_carrez_du_5eme_lot']
pm2['prix_m2'] = pm2['valeur_fonciere'] / pm2['surface_totale']
pm2['nombre_pieces_principales'] = pm2['nombre_pieces_principales'].astype('category')
sns.set(rc={'figure.figsize':(40,30)})
sns.color_palette()
sns.catplot(x="nombre_pieces_principales", y="prix_m2", jitter=True, data=pm2, kind="strip", height=8, aspect=1.5, palette="Set2")
<seaborn.axisgrid.FacetGrid at 0x7f7ba8ff2eb0>
Nous remarquons que pour les biens ayant peu de pièces principales, le prix au m² peut beaucoup varier (pouvant aller jusqu'à 2k pour 1 pièce principale alors que la plupart des biens à 1 pièce ont un prix au m² <1k). Alors que, pour un bien avec plus de pièces, exemple à partir de 7, nous n'avons pas de valeurs extrèmes.
IV ] Comparaison avec 2021¶
Importation et nettoyage des données de 2021
df2021 = pd.read_csv('https://static.data.gouv.fr/resources/demandes-de-valeurs-foncieres/20230405-155828/valeursfoncieres-2021.txt', sep = '|')
df2021 = df2021.rename(columns=lambda x: x.replace(' ', '_').lower())
df2021 = df2021.drop(['identifiant_de_document',
'reference_document',
'1_articles_cgi',
'2_articles_cgi',
'3_articles_cgi',
'4_articles_cgi',
'5_articles_cgi',
'prefixe_de_section',
'no_volume',
'3eme_lot',
'4eme_lot',
'5eme_lot',
'identifiant_local',
'nature_culture_speciale',
],axis= 1)
# suppression des doubles
df2021 = df2021.drop_duplicates()
# suppression des ligne null
df2021 = df2021.dropna(how="all")
df2021 = df2021.drop_duplicates()
df2021['valeur_fonciere'] = df2021['valeur_fonciere'].str.replace(',', '.').astype('float')
df2021['surface_carrez_du_1er_lot'] = df2021['surface_carrez_du_1er_lot'].str.replace(',', '.').astype('float')
df2021['surface_carrez_du_2eme_lot'] = df2021['surface_carrez_du_2eme_lot'].str.replace(',', '.').astype('float')
df2021['surface_carrez_du_3eme_lot'] = df2021['surface_carrez_du_3eme_lot'].str.replace(',', '.').astype('float')
df2021['surface_carrez_du_4eme_lot'] = df2021['surface_carrez_du_4eme_lot'].str.replace(',', '.').astype('float')
df2021['surface_carrez_du_5eme_lot'] = df2021['surface_carrez_du_5eme_lot'].str.replace(',', '.').astype('float')
df2021.info()
df2021.head()
<class 'pandas.core.frame.DataFrame'> Int64Index: 4303715 entries, 0 to 4649208 Data columns (total 29 columns): # Column Dtype --- ------ ----- 0 no_disposition int64 1 date_mutation object 2 nature_mutation object 3 valeur_fonciere float64 4 no_voie float64 5 b/t/q object 6 type_de_voie object 7 code_voie object 8 voie object 9 code_postal float64 10 commune object 11 code_departement object 12 code_commune int64 13 section object 14 no_plan int64 15 1er_lot object 16 surface_carrez_du_1er_lot float64 17 2eme_lot object 18 surface_carrez_du_2eme_lot float64 19 surface_carrez_du_3eme_lot float64 20 surface_carrez_du_4eme_lot float64 21 surface_carrez_du_5eme_lot float64 22 nombre_de_lots int64 23 code_type_local float64 24 type_local object 25 surface_reelle_bati float64 26 nombre_pieces_principales float64 27 nature_culture object 28 surface_terrain float64 dtypes: float64(12), int64(4), object(13) memory usage: 985.0+ MB
no_disposition | date_mutation | nature_mutation | valeur_fonciere | no_voie | b/t/q | type_de_voie | code_voie | voie | code_postal | ... | surface_carrez_du_3eme_lot | surface_carrez_du_4eme_lot | surface_carrez_du_5eme_lot | nombre_de_lots | code_type_local | type_local | surface_reelle_bati | nombre_pieces_principales | nature_culture | surface_terrain | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 05/01/2021 | Vente | 185000.0 | 5080.0 | NaN | CHE | 0471 | DE VOGELAS | 1370.0 | ... | NaN | NaN | NaN | 0 | 1.0 | Maison | 97.0 | 5.0 | S | 2410.0 |
1 | 1 | 05/01/2021 | Vente | 185000.0 | 5080.0 | NaN | CHE | 0471 | DE VOGELAS | 1370.0 | ... | NaN | NaN | NaN | 0 | 3.0 | Dépendance | 0.0 | 0.0 | S | 2410.0 |
2 | 1 | 06/01/2021 | Vente | 10.0 | NaN | NaN | NaN | B043 | ROUGEMONT | 1290.0 | ... | NaN | NaN | NaN | 0 | NaN | NaN | NaN | NaN | BT | 530.0 |
3 | 1 | 04/01/2021 | Vente | 204332.0 | 7.0 | NaN | ALL | 0276 | DES ECUREUILS | 1310.0 | ... | NaN | NaN | NaN | 0 | 1.0 | Maison | 88.0 | 4.0 | S | 866.0 |
4 | 1 | 06/01/2021 | Vente | 320000.0 | 87.0 | NaN | RTE | 0140 | DE CERTINES | 1250.0 | ... | NaN | NaN | NaN | 0 | 1.0 | Maison | 168.0 | 5.0 | S | 1426.0 |
5 rows × 29 columns
21. Comparaison du prix moyen du mètre carré entre 2021 et 2022¶
pm2_22 = df[(df['nombre_de_lots']<6) & ((df['surface_carrez_du_1er_lot'] + df['surface_carrez_du_2eme_lot'] + df['surface_carrez_du_3eme_lot'] + df['surface_carrez_du_4eme_lot'] + df['surface_carrez_du_5eme_lot']) > 0)]
pm2_22['surface_totale'] = pm2_22['surface_carrez_du_1er_lot'] + pm2_22['surface_carrez_du_2eme_lot'] + pm2_22['surface_carrez_du_3eme_lot'] + pm2_22['surface_carrez_du_4eme_lot'] + pm2_22['surface_carrez_du_5eme_lot']
pm2_22['prix_m2'] = pm2_22['valeur_fonciere'] / pm2_22['surface_totale']
pm2_21 = df2021[(df2021['nombre_de_lots']<6) & ((df2021['surface_carrez_du_1er_lot'] + df2021['surface_carrez_du_2eme_lot'] + df2021['surface_carrez_du_3eme_lot'] + df2021['surface_carrez_du_4eme_lot'] + df2021['surface_carrez_du_5eme_lot']) > 0)]
pm2_21['surface_totale'] = pm2_21['surface_carrez_du_1er_lot'] + pm2_21['surface_carrez_du_2eme_lot'] + pm2_21['surface_carrez_du_3eme_lot'] + pm2_21['surface_carrez_du_4eme_lot'] + pm2_21['surface_carrez_du_5eme_lot']
pm2_21['prix_m2'] = pm2_21['valeur_fonciere'] / pm2_21['surface_totale']
fig = plt.figure(11,figsize = (10,5))
axis = fig.add_subplot(1, 1, 1)
axis.set_title('Comparaison du prix du mètre carré entre 2021 et 2022')
axis.set_xlabel("Année")
axis.set_ylabel("Prix")
gb1 = pm2_21['prix_m2'].mean()
gb2 = pm2_22['prix_m2'].mean()
com = ['2021','2022']
prix = [gb1,gb2]
axis.bar(com[:],prix[:])
plt.xticks(ticks=com,labels=prix,rotation=0)
fig.show()
En 2021 les biens vendus tournaient autour de 2400 euros au m² alors qu'en 2022, le prix au m² est d'environ 5500 euros. Cela est peut-être dû au fait que des biens plus chers ont été vendus cette année là.
22. Comparaison de la nature des mutations¶
mutation_type2021 = df2021['nature_mutation']
r2021 = Counter(mutation_type2021)
mutation_type2022 = df['nature_mutation']
r2022 = Counter(mutation_type2022)
mutation_df2021 = pd.DataFrame.from_dict(r2021, orient='index').sort_values(by=0)
mutation_df2021.columns = ['nature_mutation']
mutation_df2022 = pd.DataFrame.from_dict(r2022, orient='index').sort_values(by=0)
mutation_df2022.columns = ['nature_mutation']
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(32, 8))
mutation_df2021.plot.pie(y = 'nature_mutation',
colormap = 'Reds_r',
figsize = (16, 16),
fontsize = 9,
autopct = '%.2f',
legend = False,
title = 'Diagramme de distribution de la nature des mutations en 2021',
ax=ax1)
mutation_df2022.plot.pie(y = 'nature_mutation',
colormap = 'Reds_r',
figsize = (16, 16),
fontsize = 9,
autopct = '%.2f',
legend = False,
title = 'Diagramme de distribution de la nature des mutations 2022',
ax=ax2,
)
# Ajouter un cercle au centre pour faire un donut chart
mutation_df2021=plt.Circle( (0,0), 0.7, color='white')
mutation_df2022=plt.Circle( (0,0), 0.7, color='white')
plt.show()
On remarque qu'il y a une faible différence dans la répartition des natures de mutation entre l'année 2021 et 2022.
On créé un nouveau dataframe rassemblant les donnée de 2021 et 2022
df['year'] = int(2022)
df2021['year'] = int(2021)
all_years = [ df, df2021]
data_years = pd.concat(all_years)
23. Surface du terrain en fonction du département entre 2021 et 2022¶
fig = plt.figure(4,figsize = (35,10))
axis = fig.add_subplot(1, 1, 1)
axis.set_title('Surface du terrain en fonction du département entre 2021 et 2022')
axis.set_xlabel("Département")
axis.set_ylabel("Surface du terrain")
gb = data_years.loc[data_years["code_departement"].notna(),("surface_terrain","code_departement","year")]
ax = sns.barplot(x=gb["code_departement"].astype(str), y=gb["surface_terrain"], hue="year", data = gb)
plt.xticks(rotation=90)
fig.show()
Nous pouvons voir sur le graphique que la surface du terrain enregistrée dans mes transactions immobilières est, pour la plupart des départements, supérieure en 2021 par rapport à 2022.
24. Relation entre la commune et la valeur foncière¶
sns.set_theme(style="ticks", palette="pastel")
df_ve = data_years[data_years['nature_mutation']=='Vente'].sort_values(by='valeur_fonciere', ascending=False)
se_vente_commune = df_ve.commune.value_counts()
plt.figure(figsize=(10,5))
df_best_city = df_ve[df_ve['commune'].isin(se_vente_commune.head(10).index)]
df_best_city = df_best_city[df_best_city['valeur_fonciere'] < df_best_city['valeur_fonciere'].quantile(.95)]
df_best_city = df_best_city[df_best_city['valeur_fonciere'] > df_best_city['valeur_fonciere'].quantile(.05)]
order=df_best_city['valeur_fonciere'].groupby(df_best_city.commune).median().sort_values(ascending=False)
plt.figure(figsize=(20,10))
ax = sns.boxplot(x=df_best_city.commune, y=df_best_city['valeur_fonciere'], hue=df_best_city['year'], order=order.index, palette=["m", "g"],)
plt.legend(loc = 'upper right')
ax.set_title('Relation entre la commune et la valeur foncière')
ax.set_xlabel('Commune')
ax.set_ylabel('Valeur foncière')
Text(0, 0.5, 'Valeur foncière')
<Figure size 1500x750 with 0 Axes>
Sur ce graphe en boite à moustache, nous comparons entre 2021 et 2022 les relations entre la commune et la valeur foncière. Nous remarquons que, dans l'ensemble, les médianes de la valeur foncières restent à peu près les mêmes entre les 2 années pour chaque commune. Cependant, nous remarquons que les quartiles inférieurs et supérieurs ainsi que les minimums et maximums ont, eux, un peu changé entre les 2 années.
25. Nombre de biens vendus par commune en 2022 et 2021¶
sns.set_style('whitegrid')
sns.set(rc={'figure.figsize':(18,5), 'figure.dpi': 150})
vente_ville = data_years.groupby(['commune','year']).size().sort_values(ascending=False).head(20).reset_index(name='nombre')
ax = sns.scatterplot(x='commune', y='nombre', hue='year', data=vente_ville, color='#119670', palette=["b", "r"], marker='o')
ax.set_title('Nombre de biens vendus par commune en 2022 et 2021')
ax.set_xlabel('Commune')
ax.set_ylabel('Nombre de biens')
Text(0, 0.5, 'Nombre de biens')
On remarque que les villes dans lequel le plus de transactions ont été effecuté sont différente entre 2021 et 2022. Et, les valeurs sont plus ou moins fortes/faibles selon l'année (exemple: Toulouse et Nice).
*Licence :* Licence Ouverte / Open Licence version 2.0