Elias TOURNEUX et Yann VILLELLAS TD I, étudiant à l'ESILV en A3, promo 2025
Mini-rapport :¶
Avancement et difficultés :¶
Nous avons eu beaucoup de problèmes lors du tri des données. Certaines valeurs étaient faussées, comme par exemple la surface inférieur à 1 m² par exemple, ou encore des noms de ville avec un tiret, parfois sans espace, parfois avec un espace, etc... Nous avons donc du faire beaucoup de tests pour pouvoir trier les données correctement. Nous avons aussi eu des problèmes avec certains graphiques, car nous avions des difficultés pour comprendre à comment manipuler nos données pour faire apparaître les informations que nous souhaitions montrer. Nous avons donc du faire beaucoup de recherches en amont. Nous avons souhaités faire des cartes dynamiques à l'aide de Folium, et cela nous a aussi pris beaucoup de temps pour comprendre le concept de geojson.
Pour Django, nous avons beaucoup eu de problèmes avec l'URL Rewriting, et comment faire pour permettre de changer dynamiquement un graphique (par exemple, pour trier la surface moyenne par régions).
Au final nous sommes très fier de ce que nous avons créé, et nous avons appris beaucoup de choses sur le traitement de données, et sur Django.
Ratio de contribution:¶
- Elias TOURNEUX : 50 %
- Yann VILLELLAS : 50 %
Introduction¶
Import des différents modules utiles au projet¶
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import folium
from IPython.display import IFrame
import requests
import matplotlib.cm as cm
import plotly.express as px
import plotly.io as pio
import plotly.graph_objects as go
from scipy.stats import norm
pio.renderers.default = "notebook_connected"
pd.options.mode.chained_assignment = None
Import des données de 2019 et 2022 depuis l'Open Data du gouvernement¶
dvf2022 = pd.read_csv("valeursfoncieres-2022.txt", sep="|", low_memory=False)
dvf2019 = pd.read_csv("valeursfoncieres-2019.txt", sep="|", low_memory=False)
On peut observer la nature de nos données¶
On observe que les données sont de type DataFrame, et qu'elles sont composées de 3803885 lignes et de 43 colonnes pour les valeurs de 2022. Le jeu de données de 2019 est quasiment identique, et possède les mêmes en-têtes.
On va supprimer les colonnes qui ne nous intéressent pas pour notre analyse.
dvf2022
Identifiant de document | Reference document | 1 Articles CGI | 2 Articles CGI | 3 Articles CGI | 4 Articles CGI | 5 Articles CGI | No disposition | Date mutation | Nature mutation | ... | Surface Carrez du 5eme lot | Nombre de lots | Code type local | Type local | Identifiant local | Surface reelle bati | Nombre pieces principales | Nature culture | Nature culture speciale | Surface terrain | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 1 | 03/01/2022 | Vente | ... | NaN | 1 | 2.0 | Appartement | NaN | 24.0 | 1.0 | NaN | NaN | NaN |
1 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 1 | 03/01/2022 | Vente | ... | NaN | 0 | NaN | NaN | NaN | NaN | NaN | S | NaN | 84.0 |
2 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 1 | 03/01/2022 | Vente | ... | NaN | 0 | NaN | NaN | NaN | NaN | NaN | S | NaN | 88.0 |
3 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 1 | 03/01/2022 | Vente | ... | NaN | 1 | 2.0 | Appartement | NaN | 140.0 | 3.0 | NaN | NaN | NaN |
4 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 1 | 04/01/2022 | Vente | ... | NaN | 0 | NaN | NaN | NaN | NaN | NaN | T | NaN | 510.0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
3803880 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 1 | 30/12/2022 | Vente | ... | NaN | 1 | 4.0 | Local industriel. commercial ou assimilé | NaN | 327.0 | 0.0 | NaN | NaN | NaN |
3803881 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 1 | 19/12/2022 | Vente | ... | NaN | 2 | 3.0 | Dépendance | NaN | 0.0 | 0.0 | NaN | NaN | NaN |
3803882 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 1 | 19/12/2022 | Vente | ... | NaN | 2 | 2.0 | Appartement | NaN | 40.0 | 3.0 | NaN | NaN | NaN |
3803883 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 1 | 30/12/2022 | Vente | ... | NaN | 1 | 3.0 | Dépendance | NaN | 0.0 | 0.0 | NaN | NaN | NaN |
3803884 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 1 | 21/11/2022 | Vente | ... | NaN | 1 | 3.0 | Dépendance | NaN | 0.0 | 0.0 | NaN | NaN | NaN |
3803885 rows × 43 columns
Nettoyage des données¶
En effet, nous avons remarqué que certaines données étaient manquantes ou encore inutiles dans notre analyse (comme les références des articles, documents, etc...) nous avons donc décidé de les supprimer.
Regardons la part de nos données qui sont nuls¶
dvf2022.isnull().sum()/len(dvf2022)*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
On peut observer que certaines colonnes sont composées de beaucoup ou presque que des valeurs nulles comme : 3ème lot, 4ème lot, 5ème lot et leurs surfaces Carrez associé. Cela signifie qu'on a une grande proportionnalité de valeurs foncières avec un ou deux lots. On remarque qu'un tiers des valeurs foncières correspondent à des terrains.
Observons les différents types de nature de mutation¶
type_nature = dvf2022['Nature mutation'].unique()
# Pourcentage de chaque type de mutation
for i in type_nature:
print(i, ":", len(dvf2022[dvf2022['Nature mutation'] == i])/len(dvf2022)*100)
# On ne garde que les mutations de type "vente" et "vente en l'état futur d'achèvement"
dvf2022 = dvf2022[dvf2022['Nature mutation'].isin(["Vente", "Vente en l'état futur d'achèvement"])]
Vente : 92.60445570778296 Vente en l'état futur d'achèvement : 6.041507563977355 Echange : 0.888354931865711 Vente terrain à bâtir : 0.30968338948206897 Adjudication : 0.13799050181590664 Expropriation : 0.018007905075994673
On observe que le type "Vente" et "Vente en l'état futur d'achèvement" sont les plus représentés dans notre jeu de données. On peut donc en déduire que les ventes sont les plus fréquentes. Nous allons donc nous concentrer sur ces deux types de mutations, étant donné qu'elles représentent plus de 99% de nos données.
#Suppression des colonnes inutiles pour les demandes des valeurs foncières de 2022
dvf2022 = dvf2022.drop(['Identifiant de document', 'Reference document', '1 Articles CGI', '2 Articles CGI', '3 Articles CGI', '4 Articles CGI','5 Articles CGI', 'No disposition', 'No voie'], axis=1)
dvf2022 = dvf2022.drop(['B/T/Q', 'Type de voie', 'Code voie', 'Code commune', 'Prefixe de section', 'Section', 'No plan', 'No Volume'], axis=1)
dvf2022 = dvf2022.drop(['Voie','Nature culture speciale', 'Identifiant local', 'Nombre de lots', '3eme lot', 'Surface Carrez du 3eme lot', '5eme lot', 'Surface Carrez du 5eme lot', '4eme lot', 'Surface Carrez du 4eme lot'], axis=1)
#Même chose pour les demandes des valeurs foncières de 2019
dvf2019 = dvf2019.drop(['Identifiant de document', 'Reference document', '1 Articles CGI', '2 Articles CGI', '3 Articles CGI', '4 Articles CGI','5 Articles CGI', 'No disposition', 'No voie'], axis=1)
dvf2019 = dvf2019.drop(['B/T/Q', 'Type de voie', 'Code voie', 'Code commune', 'Prefixe de section', 'Section', 'No plan', 'No Volume'], axis=1)
dvf2019 = dvf2019.drop(['Voie','Nature culture speciale', 'Identifiant local', 'Nombre de lots', '3eme lot', 'Surface Carrez du 3eme lot', '5eme lot', 'Surface Carrez du 5eme lot', '4eme lot', 'Surface Carrez du 4eme lot'], axis=1)
#ValueError: could not convert string to float: '55000,00' --> On convertit les valeurs foncières en float
dvf2022['Valeur fonciere'] = dvf2022['Valeur fonciere'].str.replace(',', '.').astype(float)
dvf2019['Valeur fonciere'] = dvf2019['Valeur fonciere'].str.replace(',', '.').astype(float)
#On avait une erreur vu qu'on pouvait pas calculer sur des strings
dvf2022['Surface reelle bati'] = dvf2022['Surface reelle bati'].astype(float)
dvf2019['Surface reelle bati'] = dvf2019['Surface reelle bati'].astype(float)
#On créé une nouvelle colonne qui contient le prix au mètre carré qui est la sormme des Surface Carrez
dvf2022['Surface Carrez du 1er lot'] = dvf2022['Surface Carrez du 1er lot'].str.replace(',', '.').astype(float)
dvf2022['Surface Carrez du 2eme lot'] = dvf2022['Surface Carrez du 2eme lot'].str.replace(',', '.').astype(float)
dvf2019['Surface Carrez du 1er lot'] = dvf2019['Surface Carrez du 1er lot'].str.replace(',', '.').astype(float)
dvf2019['Surface Carrez du 2eme lot'] = dvf2019['Surface Carrez du 2eme lot'].str.replace(',', '.').astype(float)
#On remplace toutes les valeurs nulles par 0
dvf2022 = dvf2022.fillna(0)
dvf2019 = dvf2019.fillna(0)
dvf2022['Metre carre'] = dvf2022['Surface Carrez du 1er lot'].astype(float) + dvf2022['Surface Carrez du 2eme lot'].astype(float)
dvf2019['Metre carre'] = dvf2019['Surface Carrez du 1er lot'].astype(float) + dvf2019['Surface Carrez du 2eme lot'].astype(float)
#Enleve les valeurs en double
dvf2022 = dvf2022.drop_duplicates(subset=['Date mutation', 'Valeur fonciere', 'Surface reelle bati', 'Metre carre'], keep='first')
dvf2019 = dvf2019.drop_duplicates(subset=['Date mutation', 'Valeur fonciere', 'Surface reelle bati', 'Metre carre'], keep='first')
# On fait un nouveau tableau contenant que des "Metre carre" non nuls
dvf2022_metre_carre = dvf2022[dvf2022['Metre carre'] >= 1]
dvf2019_metre_carre = dvf2019[dvf2019['Metre carre'] >= 1]
#On remplace le nom des communes avec un - par un espace (car plusieurs communes ont le même nom mais s'écrivent différemment)
dvf2022_metre_carre['Commune'] = dvf2022_metre_carre['Commune'].str.replace('-', ' ')
dvf2019_metre_carre['Commune'] = dvf2019_metre_carre['Commune'].str.replace('-', ' ')
#On affiche le tableau
dvf2022
Date mutation | Nature mutation | Valeur fonciere | Code postal | Commune | Code departement | 1er lot | Surface Carrez du 1er lot | 2eme lot | Surface Carrez du 2eme lot | Code type local | Type local | Surface reelle bati | Nombre pieces principales | Nature culture | Surface terrain | Metre carre | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 03/01/2022 | Vente | 55000.0 | 1000.0 | BOURG-EN-BRESSE | 01 | 7 | 24.10 | 0 | 0.0 | 2.0 | Appartement | 24.0 | 1.0 | 0 | 0.0 | 24.10 |
1 | 03/01/2022 | Vente | 143000.0 | 1480.0 | SAVIGNEUX | 01 | 0 | 0.00 | 0 | 0.0 | 0.0 | 0 | 0.0 | 0.0 | S | 84.0 | 0.00 |
3 | 03/01/2022 | Vente | 143000.0 | 1480.0 | SAVIGNEUX | 01 | 1 | 123.23 | 0 | 0.0 | 2.0 | Appartement | 140.0 | 3.0 | 0 | 0.0 | 123.23 |
4 | 04/01/2022 | Vente | 300.0 | 1480.0 | MESSIMY SUR SAONE | 01 | 0 | 0.00 | 0 | 0.0 | 0.0 | 0 | 0.0 | 0.0 | T | 510.0 | 0.00 |
5 | 06/01/2022 | Vente | 255000.0 | 1560.0 | MANTENAY-MONTLIN | 01 | 0 | 0.00 | 0 | 0.0 | 1.0 | Maison | 108.0 | 5.0 | S | 649.0 | 0.00 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
3803870 | 29/12/2022 | Vente | 1650000.0 | 75016.0 | PARIS 16 | 75 | 105 | 154.75 | 150 | 0.0 | 2.0 | Appartement | 150.0 | 6.0 | 0 | 0.0 | 154.75 |
3803880 | 30/12/2022 | Vente | 3500000.0 | 75014.0 | PARIS 14 | 75 | 3 | 0.00 | 0 | 0.0 | 4.0 | Local industriel. commercial ou assimilé | 327.0 | 0.0 | 0 | 0.0 | 0.00 |
3803881 | 19/12/2022 | Vente | 525000.0 | 75015.0 | PARIS 15 | 75 | 49 | 46.65 | 50 | 0.0 | 3.0 | Dépendance | 0.0 | 0.0 | 0 | 0.0 | 46.65 |
3803882 | 19/12/2022 | Vente | 525000.0 | 75015.0 | PARIS 15 | 75 | 49 | 46.65 | 50 | 0.0 | 2.0 | Appartement | 40.0 | 3.0 | 0 | 0.0 | 46.65 |
3803883 | 30/12/2022 | Vente | 15500.0 | 75013.0 | PARIS 13 | 75 | 244 | 0.00 | 0 | 0.0 | 3.0 | Dépendance | 0.0 | 0.0 | 0 | 0.0 | 0.00 |
1671525 rows × 17 columns
On remarque qu'après le traitement, nous avons perdus 2 132 360 lignes. Cela représente 43.94% de nos données.
Les valeurs infinies¶
Lors de notre analyse, nous avons remarqué que certaines valeurs étaient infinies. Pour palier à ça, nous avons remarqué que cela occurait lorsque les valeurs foncières valaient 0. On remarque donc qu'il y a 1830 valeurs foncières nulles. Nous avons donc décidé de supprimer ces valeurs.
dvf2022[dvf2022['Valeur fonciere'] <= 0]
#On supprime les valeurs négatives
dvf2022 = dvf2022[dvf2022['Valeur fonciere'] > 0]
dvf2019 = dvf2019[dvf2019['Valeur fonciere'] > 0]
#On convertit les dates en datetime
dvf2022['Date mutation'] = pd.to_datetime(dvf2022['Date mutation'], format='%d/%m/%Y')
Début de l'analyse de notre jeu de données¶
1. Quel département a le prix moyen au mètre carré le plus élevé ?¶
prix_m2_departement_2022 = dvf2022_metre_carre.groupby('Code departement')['Valeur fonciere'].mean() / dvf2022_metre_carre.groupby('Code departement')['Metre carre'].mean()
#On affiche
prix_m2_departement_2022.idxmax()
'75'
2. Quel département a le prix moyen du terrain au mètre carré le plus élevé ?¶
prix_m2_terrain_departement_2022 = dvf2022.groupby('Code departement')['Valeur fonciere'].mean() / dvf2022.groupby('Code departement')['Surface terrain'].mean()
#On affiche
prix_m2_terrain_departement_2022.idxmax()
'75'
3. Représentation graphique du prix moyen au mètre carré par département¶
# Graphique du prix moyen au mètre carré par département en fonction de la surface du terrain
fig, ax = plt.subplots()
prix_m2_terrain_departement_2022.plot(kind='bar', x='Code departement', y='Prix moyen au mètre carré')
ax.set_xlabel('Département')
ax.set_ylabel('Prix moyen au mètre carré')
ax.set_title('Prix moyen au mètre carré par département en fonction de la surface du terrain')
for i, v in enumerate(prix_m2_terrain_departement_2022):
ax.text(i-0.3, v+10, str(prix_m2_terrain_departement_2022.index[i]), rotation=90)
# Graphique du prix moyen au mètre carré par département en fonction de la surface bâtie
fig, ax = plt.subplots()
prix_m2_departement_2022.plot(kind='bar', x='Code departement', y='Prix moyen au mètre carré')
ax.set_xlabel('Département')
ax.set_ylabel('Prix moyen au mètre carré')
ax.set_title('Prix moyen au mètre carré par département en fonction de la surface bâtie')
for i, v in enumerate(prix_m2_departement_2022):
ax.text(i-0.3, v+10, str(prix_m2_departement_2022.index[i]), rotation=90)
plt.show()
4. Quelle est la ville ayant le prix moyen au mètre carré le plus élevé ?¶
#On garde que les prix au mètre carré supérieur à 1 (car division entre un entier entre 0 et 1 donne l'infini)
dvf2022_metre_carre = dvf2022_metre_carre[dvf2022_metre_carre['Metre carre'] > 1]
ville_prix_moyen_eleve_2022 = dvf2022_metre_carre.groupby('Commune')['Valeur fonciere'].mean() / dvf2022_metre_carre.groupby('Commune')['Metre carre'].mean()
#On affiche
ville_prix_moyen_eleve_2022.idxmax()
'LA BOURDINIERE SAINT LOUP'
5. Quel est le type de bien ayant le prix moyen au mètre carré le plus élevé ?¶
type_de_bien_2022 = dvf2022_metre_carre.groupby('Type local')['Valeur fonciere'].mean()
#On affiche
type_de_bien_2022.idxmax()
'Local industriel. commercial ou assimilé'
6. Analyse du prix moyen au mètre carré dans les arrondissements de Paris¶
#Analyse du prix moyen au mètre carré dans les arrondissements de Paris
#On créé un nouveau tableau qui contient que les arrondissements de Paris
dvf2022_paris = dvf2022_metre_carre[dvf2022_metre_carre['Code departement'] == '75']
#On créé une colonne pour le numéro de l'arrondissement
dvf2022_paris['Arrondissement'] = dvf2022_paris['Commune'].str.split(' ').str[1].astype(int)
#On récupère la moyenne du prix au mètre carré par arrondissement
prix_m2_arrondissement_2022 = dvf2022_paris.groupby('Arrondissement')['Valeur fonciere'].mean() / dvf2022_paris.groupby('Arrondissement')['Metre carre'].mean()
#Plot en histogramme
prix_m2_arrondissement_2022.plot(kind='bar', x='Arrondissement', y='Prix moyen au mètre carré')
# Créer une carte centrée sur Paris
paris_map = folium.Map(location=[48.8566, 2.3522], zoom_start=12)
# Trouver le prix moyen le plus élevé
max_prix_m2 = prix_m2_arrondissement_2022.max()
geojson_url = f"https://france-geojson.gregoiredavid.fr/repo/departements/75-paris/communes-75-paris.geojson"
geojson_json = requests.get(geojson_url).json()
colors = ['#ff0000', '#ff3300', '#ff6600', '#ff9900', '#ffcc00', '#ffff00', '#e6ff00', '#ccff00', '#b3ff00', '#99ff00', '#80ff00', '#66ff00', '#4dff00', '#33ff00', '#1aff00', '#00ff00', '#00e600', '#00cc00', '#00b300', '#009900']
# Boucler sur chaqu et ajouter un polygone à la carte
for arrondissement in prix_m2_arrondissement_2022.index:
prix_m2 = prix_m2_arrondissement_2022[arrondissement]
# Tri de prix_m2_arrondissement_2022 par ordre croissant
prix_m2_arrondissement_2022 = prix_m2_arrondissement_2022.sort_values()
# Définir la valeur maximale de prix au mètre carré
max_price = prix_m2_arrondissement_2022.max()
min_price = prix_m2_arrondissement_2022.min()
for coord in geojson_json['features']:
arrondissement_insee = arrondissement < 10 and "0" + str(arrondissement) or str(arrondissement)
if coord['properties']['code'] == "751"+str(arrondissement_insee):
color = colors[arrondissement-1]
# Ajoute color à coord['geometry']['color']
coord['geometry']['color'] = color
#Calculer le centre de l'arrondissement
center = [sum([coord['geometry']['coordinates'][0][i][1] for i in range(len(coord['geometry']['coordinates'][0]))]) / len(coord['geometry']['coordinates'][0]), sum([coord['geometry']['coordinates'][0][i][0] for i in range(len(coord['geometry']['coordinates'][0]))]) / len(coord['geometry']['coordinates'][0])]
folium.GeoJson(data=coord['geometry'], style_function=lambda x: {"fillColor": x['geometry']['color'], "color": x['geometry']['color']}).add_to(paris_map)
# Ajouter le prix moyen au mètre carré
folium.Marker(center, popup="Arrondissement "+str(arrondissement)+" : "+str(round(prix_m2,2))+" €/m²").add_to(paris_map)
break
# Ajouter un contrôle de couches
folium.LayerControl().add_to(paris_map)
# Afficher la carte
paris_map.save("carte_paris.html")
#Convertit prix_m2_arrondissement_2022 en dataframe
prix_m2_arrondissement_2022 = prix_m2_arrondissement_2022.to_frame()
#On créé une colonne pour le numéro de l'arrondissement
condition = prix_m2_arrondissement_2022.index < 10
prix_m2_arrondissement_2022['code_postal_insee'] = np.where(condition, "7510" + prix_m2_arrondissement_2022.index.astype(str), "751" + prix_m2_arrondissement_2022.index.astype(str))
prix_m2_arrondissement_2022 = prix_m2_arrondissement_2022.reset_index()
prix_m2_arrondissement_2022 = prix_m2_arrondissement_2022.rename(columns={'Arrondissement': 'Arrondissement', 0:'Prix moyen au mètre carré', 'code_postal_insee':'Code postal insee'})
fig = px.choropleth(prix_m2_arrondissement_2022,
geojson=geojson_json,
locations='Code postal insee',
color='Prix moyen au mètre carré',
color_continuous_scale='sunsetdark',
featureidkey='properties.code',
projection="mercator",
title='Analyse du prix moyen au mètre carré dans les arrondissements de Paris')
fig.update_geos(fitbounds="locations", visible=False)
fig.update_layout(height=600, width=800)
fig.show()
7. Analyse du prix moyen au mètre carré dans les arrondissements de Marseille¶
#Analyse du prix moyen au mètre carré dans les arrondissements de Marseille
#On créé un nouveau tableau qui contient que les arrondissements de Marseille
dvf2022_marseille = dvf2022[dvf2022['Code departement'] == '13']
#On group by sur la commune pour voir les différentes communes de Marseille
prix_m2_arrondissement_2022_marseille = dvf2022_marseille.groupby('Commune')['Valeur fonciere'].mean() / dvf2022_marseille.groupby('Commune')['Metre carre'].mean()
#On garde que les arrondissements de Marseille
prix_m2_arrondissement_2022_marseille = prix_m2_arrondissement_2022_marseille[prix_m2_arrondissement_2022_marseille.index.str.contains('MARSEILLE')]
#Plot en histogramme
prix_m2_arrondissement_2022_marseille.plot(kind='bar', x='Arrondissement', y='Prix moyen au mètre carré')
geojson_url_marseille = f"https://france-geojson.gregoiredavid.fr/repo/departements/13-bouches-du-rhone/communes-13-bouches-du-rhone.geojson"
geojson_json_marseille = requests.get(geojson_url_marseille).json()
df_marseille = pd.DataFrame(prix_m2_arrondissement_2022_marseille, columns=['Prix moyen au mètre carré'])
#On ajoute la colonne code postal insee
df_marseille['code_postal_insee'] = np.where(df_marseille.index.str.contains('MARSEILLE 1ER'), "13201", np.where(df_marseille.index.str.contains('MARSEILLE 2EME'), "13202", np.where(df_marseille.index.str.contains('MARSEILLE 3EME'), "13203", np.where(df_marseille.index.str.contains('MARSEILLE 4EME'), "13204", np.where(df_marseille.index.str.contains('MARSEILLE 5EME'), "13205", np.where(df_marseille.index.str.contains('MARSEILLE 6EME'), "13206", np.where(df_marseille.index.str.contains('MARSEILLE 7EME'), "13207", np.where(df_marseille.index.str.contains('MARSEILLE 8EME'), "13208", np.where(df_marseille.index.str.contains('MARSEILLE 9EME'), "13209", np.where(df_marseille.index.str.contains('MARSEILLE 10'), "13210", np.where(df_marseille.index.str.contains('MARSEILLE 11'), "13211", np.where(df_marseille.index.str.contains('MARSEILLE 12'), "13212", np.where(df_marseille.index.str.contains('MARSEILLE 13'), "13213", np.where(df_marseille.index.str.contains('MARSEILLE 14'), "13214", np.where(df_marseille.index.str.contains('MARSEILLE 15'), "13215", np.where(df_marseille.index.str.contains('MARSEILLE 16'), "13216", "0"))))))))))))))))
fig = px.choropleth(df_marseille,
geojson=geojson_json_marseille,
locations='code_postal_insee',
color='Prix moyen au mètre carré',
color_continuous_scale='sunsetdark',
featureidkey='properties.code',
projection="mercator",
title='Analyse du prix moyen au mètre carré dans les arrondissements de Marseille')
fig.update_geos(fitbounds="locations", visible=False)
fig.update_layout(height=600, width=800)
fig.show()
8. Analyse du prix moyen au mètre carré en fonction de la nature du bien¶
#Analyse du prix moyen au mètre carré en fonction de la nature du bien
prix_en_fonction_nature = dvf2022.groupby('Nature mutation')['Valeur fonciere'].mean() / dvf2022_marseille.groupby('Nature mutation')['Metre carre'].mean()
#on plot
prix_en_fonction_nature.plot(kind='bar', x='Commune', y='Prix moyen au mètre carré')
<AxesSubplot: xlabel='Nature mutation'>
9. Top 10 des villes avec un prix au mètre carré le plus élevé¶
#Top 10 des villes avec un prix au mètre carré le plus élevé
top_10 = dvf2022_metre_carre.groupby('Commune')['Valeur fonciere'].mean() / dvf2022_metre_carre.groupby('Commune')['Metre carre'].mean()
#On trie par ordre décroissant
top_10 = top_10.sort_values(ascending=False)
#On garde que les 10 premiers
top_10 = top_10.head(10)
#On plot
top_10.plot(kind='bar', x='Commune', y='Prix moyen au mètre carré')
<AxesSubplot: xlabel='Commune'>
10. Top 10 des communes avec un prix au mètre carré le plus élevé dans la petite couronne parisienne¶
#Top 10 des communes avec un prix au mètre carré le plus élevé dans la petite couronne parisienne
#On créé un nouveau tableau qui contient que les arrondissements de la petite couronne parisienne
dvf2022_petite_couronne = dvf2022_metre_carre[dvf2022_metre_carre['Code departement'].isin(['92', '93', '94'])]
#On group by sur la commune pour voir les différentes communes de la petite couronne parisienne
prix_m2_petite_couronne = dvf2022_petite_couronne.groupby('Commune')['Valeur fonciere'].mean() / dvf2022_petite_couronne.groupby('Commune')['Metre carre'].mean()
#On trie par ordre décroissant
prix_m2_petite_couronne = prix_m2_petite_couronne.sort_values(ascending=False)
#On garde que les 10 premiers
prix_m2_petite_couronne = prix_m2_petite_couronne.head(10)
#On plot
prix_m2_petite_couronne.plot(kind='bar', x='Commune', y='Prix moyen au mètre carré')
<AxesSubplot: xlabel='Commune'>
11. Les 10 villes avec le plus de ventes¶
top_10_ventes = dvf2022.groupby('Commune')['Valeur fonciere'].count()
#On trie par ordre décroissant
top_10_ventes = top_10_ventes.sort_values(ascending=False)
#On garde que les 10 premiers
top_10_ventes = top_10_ventes.head(10)
#On plot
top_10_ventes.plot(kind='bar', x='Commune', y='Nombre de ventes')
<AxesSubplot: xlabel='Commune'>
12. Comparaison du prix moyen du mètre carré entre les différentes régions de France¶
#Comparaison du prix moyen du mètre carré entre les différentes régions de France
group_by_department = dvf2022.groupby('Code departement')['Valeur fonciere'].mean() / dvf2022.groupby('Code departement')['Metre carre'].mean()
#On enlève les départements d'outre mer
group_by_department = group_by_department.drop(['971', '972', '973', '974'])
#On regroupe par région
region = {
"Grand Est": ['08', '10', '51', '52', '54', '55', '88'], #'57', '67', '68', manquant car le dvf ne contient pas l'alsace-moselle
"Nouvelle-Aquitaine": ['16', '17', '19', '23', '24', '33', '40', '47', '64', '79', '86', '87'],
"Auvergne-Rhône-Alpes": ['01', '03', '07', '15', '26', '38', '42', '43', '63', '69', '73', '74'],
"Bourgogne-Franche-Comté": ['21', '25', '39', '58', '70', '71', '89', '90'],
"Bretagne": ['22', '29', '35', '56'],
"Centre-Val de Loire": ['18', '28', '36', '37', '41', '45'],
"Corse": ['2A', '2B'],
"Île-de-France": ['75', '77', '78', '91', '92', '93', '94', '95'],
"Occitanie": ['09', '11', '12', '30', '31', '32', '34', '46', '48', '65', '66', '81', '82'],
"Hauts-de-France": ['02', '59', '60', '62', '80'],
"Normandie": ['14', '27', '50', '61', '76'],
"Pays de la Loire": ['44', '49', '53', '72', '85'],
"Provence-Alpes-Côte d'Azur": ['04', '05', '06', '13', '83', '84']
}
#On créé un tableau qui regroupe les régions
group_by_region = []
for key, value in region.items():
group_by_region.append([key,group_by_department[value].mean()])
#On fait un pie chart
group_by_region = pd.DataFrame(group_by_region, columns=['Region', 'Prix moyen au mètre carré'])
group_by_region.plot(kind='pie', y='Prix moyen au mètre carré', labels=group_by_region['Region'], autopct='%1.1f%%', legend=False)
<AxesSubplot: ylabel='Prix moyen au mètre carré'>
13. Comparaison du prix moyen du mètre carré entre les différents départements de France¶
moyenne_prix_metre_carre_departement = dvf2022_metre_carre.groupby('Code departement')['Valeur fonciere'].mean() / dvf2022_metre_carre.groupby('Code departement')['Metre carre'].mean()
#On renomme les colonnes
moyenne_prix_metre_carre_departement = moyenne_prix_metre_carre_departement.reset_index()
moyenne_prix_metre_carre_departement = moyenne_prix_metre_carre_departement.rename(columns={'Code departement': 'Département', 0: 'Prix moyen au mètre carré'})
#On fait un geojson avec les départements
departement_geojson_url = "https://france-geojson.gregoiredavid.fr/repo/departements.geojson"
departement_geojson = requests.get(departement_geojson_url).json()
fig = px.choropleth(moyenne_prix_metre_carre_departement,
geojson=departement_geojson,
locations='Département',
color='Prix moyen au mètre carré',
color_continuous_scale='pinkyl',
featureidkey='properties.code',
projection="mercator",
title='Prix moyen par mètre carré par département en France')
fig.update_geos(fitbounds="locations", visible=False)
fig.update_layout(height=600, width=800)
fig.show()
14. Nombre de ventes par département¶
nombre_de_vente_par_departement = dvf2022.groupby('Code departement')['Valeur fonciere'].count()
#On renomme les colonnes
nombre_de_vente_par_departement = nombre_de_vente_par_departement.reset_index()
nombre_de_vente_par_departement = nombre_de_vente_par_departement.rename(columns={'Code departement': 'Département', 'Valeur fonciere': 'Nombre de ventes'})
fig = px.choropleth(nombre_de_vente_par_departement,
geojson=departement_geojson,
locations='Département',
color='Nombre de ventes',
color_continuous_scale='earth',
featureidkey='properties.code',
projection="mercator",
title='Nombre de ventes par département en France')
fig.update_geos(fitbounds="locations", visible=False)
fig.update_layout(height=600, width=800)
fig.show()
15. Analyse de la corrélation entre la taille d'un bien immobilier et son prix¶
# Extraction des variables d'intérêt
taille_bien = dvf2022_metre_carre['Metre carre']
prix_bien = dvf2022_metre_carre['Valeur fonciere']
#On met les données dans un tableau
data = pd.DataFrame({'taille_bien': taille_bien, 'prix_bien': prix_bien})
# Création du nuage de points avec une régression linéaire
plt.scatter(data['taille_bien'],data['prix_bien'], alpha=0.5)
plt.title("Corrélation entre la taille d'un bien immobilier et son prix")
plt.xlabel("Taille du bien")
plt.ylabel("Prix du bien")
# Ajout d'une régression linéaire
coefficients = np.polyfit(taille_bien, prix_bien, 1)
pente = coefficients[0]
intercept = coefficients[1]
plt.plot(taille_bien, pente * taille_bien + intercept, color='red')
#Taille des x jusqu'à 5000
plt.xlim(0, 5000)
#Taille des y jusqu'à 100000000
plt.ylim(0, 100000000)
# Affichage du graphique
plt.show()
16. Progression des ventes en France en fonction du mois de vente¶
#On créé un tableau qui regroupe le nombre de ventes par jour
ventes_par_jours = dvf2022
ventes_par_jours = ventes_par_jours.groupby(pd.Grouper(key='Date mutation', freq='M')).size().reset_index(name='Nombre de ventes')
ventes_par_jours.sort_values('Date mutation', inplace=True)
fig = px.line(ventes_par_jours, x='Date mutation', y='Nombre de ventes', title='Évolution de mutation immobilière en France en 2022')
fig.show()
17. Nombre de ventes en France en 2022 par région par mois¶
#On créé un tableau qui regroupe le nombre de ventes par jour
ventes_par_jours_par_region = dvf2022
#On ajoute une colonne avec le nom de la région en utilisant la variable region qui est un map du nom de la région et des codes départements
for value,keys in region.items():
for key in keys:
ventes_par_jours_par_region.loc[ventes_par_jours_par_region['Code departement'] == key, 'Region'] = value
ventes_par_jours_par_region = ventes_par_jours_par_region.groupby([pd.Grouper(key='Date mutation', freq='d'), 'Region']).size().reset_index(name='Nombre de ventes')
ventes_par_jours_par_region.sort_values('Date mutation', inplace=True)
# On calcule le cumul du nombre de ventes par jour et par région
ventes_par_jours_par_region['Nombre de ventes cumulé'] = ventes_par_jours_par_region.groupby('Region')['Nombre de ventes'].cumsum()
fig = px.line(ventes_par_jours_par_region, x='Date mutation', y='Nombre de ventes cumulé', color='Region', title='Évolution de mutation immobilière par région en 2022')
fig.show()
18. Analyse du prix en fonction du nombre de pièces principales¶
#Analyse du prix en fonction du nombre de pièces principales
#On supprime les valeurs nulles et les valeurs égal à 0
prix_par_piece = dvf2022_metre_carre.query("`Nombre pieces principales`.notna() and `Nombre pieces principales` != 0")
prix_par_piece = dvf2022_metre_carre.groupby('Nombre pieces principales')['Valeur fonciere'].mean()
#On enlève les valeurs supérieurs à 20 pièces
prix_par_piece = prix_par_piece[prix_par_piece.index <= 20]
#On fait un graphique avec plotly
fig = px.bar(prix_par_piece, x=prix_par_piece.index, y='Valeur fonciere', title='Prix moyen par nombre de pièces principales')
fig.show()
19. Taille moyenne des terrains par département en France en 2022¶
moyenne_taille_terrain = dvf2022[dvf2022['Surface terrain'] > 0]
moyenne_taille_terrain = moyenne_taille_terrain.groupby('Code departement')['Surface terrain'].mean()
#On supprime les départements d'outre mer
moyenne_taille_terrain = moyenne_taille_terrain.drop(['971', '972', '973', '974'])
#On renomme les colonnes
moyenne_taille_terrain = moyenne_taille_terrain.reset_index()
moyenne_taille_terrain = moyenne_taille_terrain.rename(columns={'Code departement': 'Département', 0: 'Surface moyenne du terrain'})
fig = px.choropleth(moyenne_taille_terrain,
geojson=departement_geojson,
locations='Département',
color='Surface terrain',
color_continuous_scale='blugrn',
featureidkey='properties.code',
projection="mercator",
title='Surface moyenne des terrains par département en France')
fig.update_geos(fitbounds="locations", visible=False)
fig.update_layout(height=600, width=800)
fig.show()
20. Prix au m² pour 1000 habitants par département en France en 2022¶
Source : Insee - Estimations de population (résultats provisoires arrêtés fin 2022)
#On importe le nombre d'habitants par departement
population = pd.read_csv('habitants_par_departement.csv', sep=';')
nombre_de_vente_par_departement = dvf2022_metre_carre.groupby('Code departement')['Metre carre'].mean()
#On supprime les départements d'outre mer
nombre_de_vente_par_departement = nombre_de_vente_par_departement.drop(['971', '972', '973', '974'])
#On ajoute le nombre d'habitants par département
nombre_de_vente_par_departement = pd.merge(nombre_de_vente_par_departement, population, on='Code departement')
#Convertion de la colonne en int
nombre_de_vente_par_departement['Population'] = nombre_de_vente_par_departement['Population'].astype(int)
#On ajoute une colonne nombre de ventes par 1000 habitants
nombre_de_vente_par_departement['Prix au m² pour 1000 habitants'] = nombre_de_vente_par_departement['Metre carre'] / (nombre_de_vente_par_departement['Population'] / 1000)
fig = px.choropleth(nombre_de_vente_par_departement,
geojson=departement_geojson,
locations='Code departement',
color='Prix au m² pour 1000 habitants',
color_continuous_scale='brwnyl',
featureidkey='properties.code',
projection="mercator",
title='Prix au m² pour 1000 habitants par département en France en 2022')
fig.update_geos(fitbounds="locations", visible=False)
fig.update_layout(height=600, width=800)
fig.show()
Comparaison des données de 2019 et 2022¶
Après avoir fait une quinzaine d'analyses sur les données de 2022, nous avons décidé de comparer les données de 2019 et 2022 pour voir si il y avait une différence entre les deux années. La crise sanitaire a-t-elle eu un impact sur le prix de l'immobilier ? Est-ce que les prix ont augmenté ou diminué ? Nous allons essayer de répondre à ces questions via nos différentes analyses.
21. Carte de la France aves les départements où le prix moyen au mètre carré a augmenté entre 2019 et 2022¶
dvf2019_metre_carre = dvf2019_metre_carre[dvf2019_metre_carre['Metre carre'] > 0]
moyenne_prix_metre_carre_departement_2019 = dvf2019_metre_carre.groupby('Code departement')['Valeur fonciere'].mean() / dvf2019_metre_carre.groupby('Code departement')['Metre carre'].mean()
#On renomme les colonnes
moyenne_prix_metre_carre_departement_2019 = moyenne_prix_metre_carre_departement_2019.reset_index()
moyenne_prix_metre_carre_departement_2019 = moyenne_prix_metre_carre_departement_2019.rename(columns={'Code departement': 'Département', 0: 'Prix moyen au mètre carré'})
#On fait un tableau avec le prix de l'augmentation entre 2019 et 2022
moyenne_prix_metre_carre_departement_2019['Augmentation prix m2'] = moyenne_prix_metre_carre_departement['Prix moyen au mètre carré'] - moyenne_prix_metre_carre_departement_2019['Prix moyen au mètre carré']
fig = px.choropleth(moyenne_prix_metre_carre_departement_2019,
geojson=departement_geojson,
locations='Département',
color='Augmentation prix m2',
color_continuous_scale='armyrose',
featureidkey='properties.code',
projection="mercator",
title='Augmentation du prix moyen par mètre carré par département en France entre 2019 et 2022')
fig.update_geos(fitbounds="locations", visible=False)
fig.update_layout(height=600, width=800)
fig.show()
#Affiche les 3 plus grandes augmentations et les 3 plus grandes baisses
print(moyenne_prix_metre_carre_departement_2019.sort_values(by=['Augmentation prix m2'], ascending=False).head(3))
print(moyenne_prix_metre_carre_departement_2019.sort_values(by=['Augmentation prix m2'], ascending=True).head(3))
Département Prix moyen au mètre carré Augmentation prix m2 47 47 1325.263809 4568.892309 34 34 2938.643277 4366.536357 91 94 4849.257575 2839.921323 Département Prix moyen au mètre carré Augmentation prix m2 76 79 3929.526244 -2321.867562 80 83 5578.462227 -1523.861363 74 77 5029.214319 -1431.855100
On remarque que certains départements ont vu leur prix grandement augmentés, telles que : le 47, 34 et le 94, tandis que d'autres ont vu leur prix diminués, comme le 76, 80 et le 74.
22. Analyse de la demande de biens immobiliers en France entre 2019 et 2022¶
nombre_de_vente_par_local_2022 = dvf2022.groupby('Type local')['Valeur fonciere'].count()
nombre_de_vente_par_local_2019 = dvf2019.groupby('Type local')['Valeur fonciere'].count()
#On mets sur un seul et même histogramme les données de 2019 et 2022
fig = go.Figure()
fig.add_trace(go.Bar(
x=nombre_de_vente_par_local_2022.index,
y=nombre_de_vente_par_local_2022,
name='2022',
marker_color='indianred'
))
fig.add_trace(go.Bar(
x=nombre_de_vente_par_local_2019.index,
y=nombre_de_vente_par_local_2019,
name='2019',
marker_color='lightsalmon'
))
# Here we modify the tickangle of the xaxis, resulting in rotated labels.
fig.update_layout(barmode='group', xaxis_tickangle=-45, title='Nombre de ventes par type de local en 2019 et 2022')
fig.show()
23. Analyse des 10 villes en France qui ont enregistré plus de ventes en 2022 qu'en 2019¶
#On regroupe tous les arrondissements de Paris dans ensemble
dvf2022_q_18 = dvf2022
dvf2022_q_18['Commune'] = dvf2022_q_18['Commune'].replace(['PARIS 1ER ARRONDISSEMENT', 'PARIS 2', 'PARIS 3', 'PARIS 4', 'PARIS 5', 'PARIS 6', 'PARIS 7', 'PARIS 8', 'PARIS 9', 'PARIS 10', 'PARIS 11', 'PARIS 12', 'PARIS 13', 'PARIS 14', 'PARIS 15', 'PARIS 16', 'PARIS 17', 'PARIS 18', 'PARIS 19', 'PARIS 20'], 'PARIS')
dvf2019_q_18 = dvf2019
dvf2019_q_18['Commune'] = dvf2019_q_18['Commune'].replace(['PARIS 1ER ARRONDISSEMENT', 'PARIS 2', 'PARIS 3', 'PARIS 4', 'PARIS 5', 'PARIS 6', 'PARIS 7', 'PARIS 8', 'PARIS 9', 'PARIS 10', 'PARIS 11', 'PARIS 12', 'PARIS 13', 'PARIS 14', 'PARIS 15', 'PARIS 16', 'PARIS 17', 'PARIS 18', 'PARIS 19', 'PARIS 20'], 'PARIS')
#On group le nombre de ventes par commune
nombre_de_vente_par_commune_2022 = dvf2022_q_18.groupby('Commune')['Valeur fonciere'].count()
nombre_de_vente_par_commune_2019 = dvf2019_q_18.groupby('Commune')['Valeur fonciere'].count()
#On compte le nombre de ventes en 2019 et 2022 par commune sur un seul tableau
nombre_de_vente_par_commune = pd.DataFrame({'Nombre de ventes 2022': nombre_de_vente_par_commune_2022, 'Nombre de ventes 2019': nombre_de_vente_par_commune_2019})
#On ajoute une colonne qui donne le nombre de ventes en plus en 2022 par rapport à 2019
nombre_de_vente_par_commune['Augmentation nombre de ventes'] = nombre_de_vente_par_commune['Nombre de ventes 2022'] - nombre_de_vente_par_commune['Nombre de ventes 2019']
#On affiche le top 10
nombre_de_vente_par_commune = nombre_de_vente_par_commune.sort_values(by=['Augmentation nombre de ventes'], ascending=False).head(10)
#On fait un histogramme
fig = go.Figure()
fig.add_trace(go.Bar(
x=nombre_de_vente_par_commune.index,
y=nombre_de_vente_par_commune['Augmentation nombre de ventes'],
name='Augmentation nombre de ventes',
marker_color='indianred'
))
# Here we modify the tickangle of the xaxis, resulting in rotated labels.
fig.update_layout(barmode='group', xaxis_tickangle=-45, title='Augmentation du nombre de ventes par commune entre 2019 et 2022')
fig.show()
24. Analyse de l'évolution du prix moyen au mètre carré entre 2019 et 2022 dans les arrondissements de Paris¶
#On créé un nouveau tableau qui contient que les arrondissements de Paris
dvf2019_paris = dvf2019_metre_carre[dvf2019_metre_carre['Code departement'] == '75']
#On créé une colonne pour le numéro de l'arrondissement
dvf2019_paris['Arrondissement'] = dvf2019_paris['Commune'].str.split(' ').str[1].astype(int)
#On récupère la moyenne du prix au mètre carré par arrondissement
prix_m2_arrondissement_2019 = dvf2019_paris.groupby('Arrondissement')['Valeur fonciere'].mean() / dvf2019_paris.groupby('Arrondissement')['Metre carre'].mean()
prix_m2_arrondissement_2022 = dvf2022_paris.groupby('Arrondissement')['Valeur fonciere'].mean() / dvf2022_paris.groupby('Arrondissement')['Metre carre'].mean()
#Tout dans un seul tableau
prix_m2_arrondissement = pd.DataFrame({'Prix moyen au mètre carré 2019': prix_m2_arrondissement_2019, 'Prix moyen au mètre carré 2022': prix_m2_arrondissement_2022})
#On ajoute une colonne qui donne le nombre de ventes en plus en 2022 par rapport à 2019
prix_m2_arrondissement['Augmentation prix au mètre carré'] = prix_m2_arrondissement['Prix moyen au mètre carré 2022'] - prix_m2_arrondissement['Prix moyen au mètre carré 2019']
prix_m2_arrondissement['code'] = ['7510' + str(index) if index < 10 else '751' + str(index) for index in prix_m2_arrondissement.index]
#On fait un geojson avec les départements
arrondissement_geojson_url = "https://france-geojson.gregoiredavid.fr/repo/departements/75-paris/communes-75-paris.geojson"
arrondissement_geojson = requests.get(arrondissement_geojson_url).json()
fig = px.choropleth(prix_m2_arrondissement,
geojson=arrondissement_geojson,
locations='code',
color='Augmentation prix au mètre carré',
color_continuous_scale='fall',
featureidkey='properties.code',
projection="mercator",
title='Augmentation du prix au mètre carré par arrondissement entre 2019 et 2022')
fig.update_geos(fitbounds="locations", visible=False)
fig.update_layout(height=600, width=800)
fig.show()
25. Analyse des écarts de prix entre les différentes régions en 2019 et en 2022¶
geojson_region_url = 'https://france-geojson.gregoiredavid.fr/repo/regions.geojson'
geojson_region = requests.get(geojson_region_url).json()
#Comparaison du prix moyen du mètre carré entre les différentes régions de France
#On enlève les départements d'outre mer
for i in range(971, 975):
moyenne_prix_metre_carre_departement_2019 = moyenne_prix_metre_carre_departement_2019[moyenne_prix_metre_carre_departement_2019['Département'] != str(i)]
#On créé un tableau qui regroupe les régions
group_by_region_comparaison = []
for key, value in region.items():
_temp_moyenne = 0
for i in value:
_temp = moyenne_prix_metre_carre_departement_2019[moyenne_prix_metre_carre_departement_2019['Département'] == i]
_temp_moyenne = _temp_moyenne + _temp['Augmentation prix m2'].mean()
_temp_moyenne = _temp_moyenne/len(value)
group_by_region_comparaison.append([key,_temp_moyenne])
#On fait un pie chart
group_by_region_comparaison = pd.DataFrame(group_by_region_comparaison, columns=['Region', 'Augmentation du prix moyen au mètre carré'])
group_by_region_comparaison
#On fait un geojson
fig = px.choropleth(group_by_region_comparaison,
geojson=geojson_region,
locations='Region',
color='Augmentation du prix moyen au mètre carré',
color_continuous_scale='tropic',
featureidkey='properties.nom',
projection="mercator",
title='Augmentation du prix moyen par mètre carré par région en France entre 2019 et 2022')
fig.update_geos(fitbounds="locations", visible=False)
fig.update_layout(height=600, width=800)
fig.show()
Site Django¶
Nous avons décidé de créer un site web avec Django pour pouvoir visualiser nos données de manière plus interactive.
1. Page d'accueil avec le choix du graphique à afficher¶
Nous avons cliqué sur le formumaire et nous avons choisi le graphique "Nombre de ventes par département en France". Nous avons ensuite cliqué sur le bouton "Submit".
2. Graphique par défaut (France) du nombre de ventes¶
Nous arrivons alors sur la page par défaut du graphique "Nombre de ventes par département en France". Nous pouvons voir que le graphique est dynamique et que nous pouvons zoomer sur la carte. Nous pouvons aussi passer la souris sur les différents départements pour avoir plus d'informations sur le nombre de ventes. Par défaut, le graphique affiche le nombre de ventes en France.
3. Formulaire pour choisir la région à afficher¶
Un nouveau formulaire est apparu en haut de la page. Nous pouvons choisir la région que nous souhaitons afficher. Nous avons choisi la région "Occitanie" et nous avons cliqué sur le bouton "Submit".
4. Graphique du nombre de ventes en Occitanie¶
Nous arrivons alors sur la page du graphique "Nombre de ventes en Occitanie". On peut remarquer que l'url a changé et que le graphique a été mis à jour. L'url est dynamique et change en fonction du formulaire.
5. Autre exemple¶
Nous avons fait de même pour les 5 différents graphiques que nous avons créé. Ici nous pouvons observer l'évolution de mutation en fonction du mois de vente. Nous avons choisi la région "Île-de-France".
Ou encore le prix moyen en fonction du nombre de pièces principales. Ici nous avons choisi la région "Bretagne".