Génération et analyse de la base de données « Typologie des bâtiments résidentiels à l’échelle de la France métropolitaine »

R
géomatique
logement

Visualisation à échelle nationale de la répartition des bâtiments et des logements en zone inondable selon la typologie du GT-AMC

Auteur·rice
Date de publication

28 novembre 2025

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

Installation des 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

Avertissement

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.

# 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")

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
    ) 
}
Retour au sommet