# define millesime
millesime = "2025-06-15"
# set up paths
# origin = tempdir()
path_dep = file.path("~", "data", "data-local", "floodam-data", "adapted", "bd-topo", millesime, "dwelling", "synthesis")
path_output = file.path("table", "logement-bd-topo")Génération et analyse de la base de données « Typologie des bâtiments résidentiels à l’échelle de la France métropolitaine »
Visualisation à échelle nationale de la répartition des bâtiments et des logements en zone inondable selon la typologie du GT-AMC
Objectif
Ce méthode génère une base de données de nombre d’effectifs par type sur la typologie des bâtiments résidentiels à l’échelle nationale à partir du pré-traitement de la dernière version de la BD-Topo® disponible pour le territoire de France métropolitaine.
Logiciels et bibliothèques requis
Le code est destiné à être exécuté avec R. Il est donc nécessaire que R soit installé sur votre système.
Ce tutoriel utilise les bibliothèques R suivantes :
- floodam.data qui permet de réaliser des opérations adaptées aux données de l’observatoire.
- so.ii qui permet notamment de réaliser des cartes centrées sur le territoire de l’observatoire.
Il est également supposé que vous disposez d’un dossier « data » dans « l’accueil » de votre ordinateur.
Déroulement de la méthode
Il est nécessaire d’avoir appliqué la méthode de Traitement des bâtiments résidentiels de la BD-Topo au niveau départemental avant de continuer.
Cette méthode n’est pas complètement reproductible en l’état pour des personnes extérieures à l’équipe so-ii, en raison des contraintes d’accès aux données de tiers.
Définition du millésime et des chemins
Premièrement il faut définir la version de la BD-Topo® pour laquelle on souhaite effectuer l’agrégation des données et définir les chemins d’accès à vos fichiers et dossiers.
Création de la table de classification
Nous devons définir une table de classification de la typologie qui nous permettra d’effectuer des analyses à différents niveaux de détails.
# creation of classification table
classification = data.frame(
type = c("AB", "MFH", "SFH", "TH", ""),
type_0 = c("dwelling", "dwelling", "dwelling", "dwelling", "indefinite"),
type_1 = c("collective", "collective", "individual", "individual", "indefinite"),
type_2 = c("AB", "MFH", "SFH", "TH", "indefinite"),
stringsAsFactors = FALSE
)Définition des fonctions utilisateur
Nous devons également définir la fonction read_department() qui nous permet de lire et assembler l’ensemble de nos fichiers par département en un seul fichier à échelle nationale. La fonction add_prop() permet de calculer le pourcentage de bâtiments/logements en .
## read_department ()
# - select files with a pattern
# - read everything with data.table (but return data.frame)
# - rbind everything
read_department = function(x, pattern) {
x = grep(pattern, department, value = TRUE)
result = sapply(x, data.table::fread, simplify = FALSE, data.table = FALSE)
Reduce(rbind, result)
}
## add_prop ()
# - add proportion for each field
add_prop = function(df, field) {
df[sprintf("perc_%s", field)] = df[[field]] * 100 / sum(df[[field]])
return(df)
}Création de la base de données
Regroupement des différents traitement de la BD-Topo® par département et distinction des bâtiments/logements situés ou non en .
# define list of files
department = list.files(path_dep, "^[bdtopo]", full.names = TRUE)
dep_all = read_department(department, "_all.csv.gz")
dep_eaip = read_department(department, "_eaip.csv.gz")
# make a common DB (grouping "all" and "eaip")
common = names(dep_all)[!names(dep_all) %in% c("building", "dwelling")]
national = merge(
dep_all,
dep_eaip,
by = common,
suffixes = c("_all", "_eaip"),
all = TRUE
)
value = grep("building|dwelling", names(national), value = TRUE)
# data aggregation
national = aggregate(national[value], national[common], sum)Ajout des proportions de bâtiment/logements en sur le territoire métropolitain.
# add percentages
national = add_prop(national, field = "building_eaip")
national = add_prop(national, field = "dwelling_eaip")
# add classification
national = merge(national, classification)
# make explicite indefinite
selection = c("level", "period", "wall", "roof")
national[selection] = lapply(
national[selection],
function(x){x[x == ""] = "indefinite"; x}
)
national = national[
c(
"department", "type_0", "type_1", "type_2",
"level", "period", "wall", "roof",
"building_all", "building_eaip", "perc_building_eaip",
"dwelling_all", "dwelling_eaip", "perc_dwelling_eaip"
)
]
national[["department"]] = floodam.data::format_scope(
national[["department"]],
type = "insee"
)
# order columns
national = national[order(national[["type_2"]], national[["level"]]), ]Écriture de la base de données « typologie des bâtiments résidentiels pour le territoire de France métropolitaine » pour le millésime de la BD-Topo® sélectionné.
# create CSV
data.table::fwrite(national, file.path(path_output, sprintf("national-%s.csv.gz", millesime)), row.names = FALSE)Analyse de la base de données à plusieurs niveaux de détail
Pour analyser plus globalement ou plus finement la base de données sur la typologie à l’échelle de la France métropolitaine, ces différents niveaux d’analyses sont proposés :
- l0 : bâtiment ou logement considérés du type habitation ;
- l1 : bâtiment ou logement considérés du type collectif ou individuel ;
- l2 : bâtiment ou logement considérés du type , , ou ;
- l3 : l2 avec la répartition dans les différentes volumétries : 1, 2-3, 4+ ;
- l4 : l3 avec la répartition dans les différentes périodes de constructions ;
- l5 : l4 avec la répartition selon les matériaux de construction des murs ;
- l6 : l5 avec la répartition selon les matériaux de construction des plafonds.
# needed to have good order
for (var in names(classification)[-1]) {
national[[var]] = factor(national[[var]], unique(classification[[var]]))
}
# define levels
a_list = list(
l0 = "type_0",
l1 = "type_1",
l2 = "type_2",
l3 = c("type_2", "level"),
l4 = c("type_2", "level", "period"),
l5 = c("type_2", "level", "period", "wall"),
l6 = c("type_2", "level", "period", "wall", "roof")
)
# extraction information by level
var_data = c("building_all", "dwelling_all", "building_eaip", "dwelling_eaip", "perc_building_eaip", "perc_dwelling_eaip")
pattern = file.path(path_output, "national-%s-%s.csv.gz")Écriture des différents niveaux d’analyses.
for (i in seq_along(a_list)) {
dataset = aggregate(national[var_data], national[rev(a_list[[i]])], sum)
data.table::fwrite(
dataset[c(a_list[[i]], var_data)],
sprintf(pattern, millesime, names(a_list)[i]),
row.names = FALSE
)
}