Airbnb
en Île-de-France
  • Offre et réservations
  • Types de locations
  • Prix et revenus
  • Contexte résidentiel
  • Indicateurs-clés
  • Focus Communes
  • Infos
  • Indicateurs-clés
    • Comparaison par territoires
      • Départements
    • Classement par indicateur
      • Départements
      • Établissement Public Territorial (EPT)
      • Communes

13 indicateurs-clés

Les indicateurs-clés reposent sur plusieurs thématiques d’intérêt pour le suivi du phénomène Airbnb :

  • Masses en présence : nombre d’annonces actives, nombre de loueurs, nombre de nuitées disponibles, nombre de nuitées réservées.
  • Caractéristiques des logements proposés : part d’annonces en logement entier, part d’hébergements détenus par des multiloueurs, prix d’une nuitée par personne.
  • Fréquentation : taux d’occupation, part des annonces louées plus de 120 nuitées.
  • Pression exercée sur le parc du logement : nombre d’annonces actives pour 100 logements en résidence principale, nombre d’annonces louées plus de 120 nuitées pour 1000 logements en résidence principale.

Pour l’ensemble de ces indicateurs, il est possible d’apprécier leur évolution à partir de tableaux et de graphiques interactifs. Ces analyses et comparaisons peuvent être réalisées au niveau des départements (période 2015-2022), des 276 communes d’Île-de-France qui comptabilisent au moins une annonce Airbnb active chaque année, ou encore en classant les 50 communes les plus fréquentées par indicateur.

Indicateurs-clés

Comparaison par territoires

Départements

viewof dep = Inputs.select(DEP, {label: "Département :", value: "Paris (75)"})
tablodep = transpose(tabdep)
newtab_dep = tablodep.filter(d => d.DEP === dep)

Inputs.table(newtab_dep, {
columns: [
"Indicateurs", "2015", "2016", "2017", "2018", "2019", "2020", "2021", "2022"
],
rows: 22
})


viewof ind_dep = Inputs.select(indics, {value: "Nombre d'annonces actives" ,label: "Indicateur :"})
viewof deps = Inputs.checkbox(DEP, {label: "Département(s) :", multiple: true, value: ["Paris (75)",
"Hauts-de-Seine (92)"]})
t_tmp = transpose(tmp)
newtab_depp = t_tmp.filter(d => deps.includes(d.DEP)  & d.Indicateur === ind_dep)
tmp2 = tablodep.filter(d => deps.includes(d.DEP)  & d.Indicateurs === ind_dep)

Inputs.table(tmp2, {
columns: [
"DEP", "2015", "2016", "2017", "2018", "2019", "2020", "2021", "2022"
],
rows: 22
})


colors = ["#66c2a5", "#fc8d62", "#8da0cb", "#e78ac3", "#a6d854", "#ffd92f", "#e5c494", "#b3b3b3"]
colorbydep = new Map(DEP.map((d, i) => [d, colors[i]]))

Plot.plot({
y: {
grid: true,
label : ind_dep
},
marginRight: 100,
marginLeft: 100,
marks: [
Plot.axisX({ticks: ["2015", "2016", "2017", "2018", "2019", "2020", "2021", "2022"], tickFormat: ""}),
Plot.line(newtab_depp, {x: "Année", y: "tot", z: "DEP", stroke: d => colorbydep.get(d.DEP)}),
Plot.text(newtab_depp, Plot.selectLast({x: "Année", y: "tot", z: "DEP", text: "DEP",
textAnchor: "start", dx : 3}))
]
})

Établissement Public Territorial (EPT)

viewof ept = Inputs.select(EPT, {label: "EPT", value: "Vallée Sud Grand Paris - T2"})
tabloept = transpose(tabept)
newtab_ept = tabloept.filter(d => d.EPT === ept)

Inputs.table(newtab_ept, {
columns: [
"Indicateurs", "2016", "2017", "2018", "2019", "2020", "2021", "2022"
],
rows: 22
})


viewof ind_ept = Inputs.select(indics, {value: "Nombre d'annonces actives" ,label: "Indicateur :"})
viewof epts = Inputs.checkbox(EPT, {label: "Département(s) :", multiple: true, value: ["Vallée Sud Grand Paris - T2",
"Grand Paris Seine Ouest - T3"]})
t_tmp_ept = transpose(tmp_ept)
newtab_eptt = t_tmp_ept.filter(d => epts.includes(d.EPT)  & d.Indicateur === ind_ept)
tmp2_ept = tabloept.filter(d => epts.includes(d.EPT)  & d.Indicateurs === ind_ept)

Inputs.table(tmp2_ept, {
columns: [
"EPT", "2016", "2017", "2018", "2019", "2020", "2021", "2022"
],
rows: 22
})


colors2 = ['#a6cee3','#1f78b4','#b2df8a','#33a02c','#fb9a99','#e31a1c','#fdbf6f','#ff7f00','#cab2d6','#6a3d9a','#ffff99','#b15928']
colorbyept = new Map(EPT.map((d, i) => [d, colors2[i]]))

Plot.plot({
y: {
grid: true,
label : ind_ept
},
marginRight: 100,
marginLeft: 100,
marks: [
Plot.axisX({ticks: ["2016", "2017", "2018", "2019", "2020", "2021", "2022"], tickFormat: ""}),
Plot.line(newtab_eptt, {x: "Année", y: "tot", z: "EPT", stroke: d => colorbyept.get(d.EPT)}),
Plot.text(newtab_eptt, Plot.selectLast({x: "Année", y: "tot", z: "EPT", text: "EPT",
textAnchor: "start", dx : 3}))
]
})

Classement par indicateur

Départements

Classement des valeurs des indicateurs pour les 8 départements. Il est possible de trier ces valeurs en ordre croissant ou décroissant en cliquant sur une année. Par défaut, elles sont classées par la valeur moyenne des 7 années.

viewof ind2 = Inputs.select(indics, {label: "Indicateur :", value: "Nombre d'annonces actives"})
t_tabdep2 = transpose(tabdep2)
ind_tabdep2 = t_tabdep2.filter(d => d.Indicateur === ind2)
ind_final2 = ind_tabdep2.sort((a,b) => b.Moyenne - a.Moyenne)

Inputs.table(ind_final2, {
columns: [
"DEP", "2016", "2017", "2018", "2019", "2020", "2021", "2022", "Moyenne"
],
rows: 10
})

Établissement Public Territorial (EPT)

viewof ind3 = Inputs.select(indics, {label: "Indicateur :", value: "Nombre d'annonces actives"})
t_tabept2 = transpose(tabept2)
ind_tabept2 = t_tabept2.filter(d => d.Indicateur === ind3)
ind_final3 = ind_tabept2.sort((a,b) => b.Moyenne - a.Moyenne)

Inputs.table(ind_final3, {
columns: [
"EPT", "2016", "2017", "2018", "2019", "2020", "2021", "2022", "Moyenne"
],
rows: 10
})

Communes

viewof com = Inputs.select(coms, {label: "Commune :", value: "Palaiseau"})
tablocom = transpose(tabcom)
newtab_com = tablocom.filter(d => d.COM === com)

Inputs.table(newtab_com, {
columns: [
"Indicateurs", "2016", "2017", "2018", "2019", "2020", "2021", "2022"
],
rows: 22
})


viewof ind = Inputs.select(indics, {label: "Indicateur :", value: "Prix médian d'une nuitée par personne ($)"})
viewof com1 = Inputs.select(coms, {label: "Commune 1 :", value: "Pantin"})
viewof com2 = Inputs.select(coms, {label: "Commune 2 :", value: "Issy-les-Moulineaux"})
viewof comp = Inputs.checkbox(labels, {label: "Comparaison", multiple: true})
tablocomp = transpose(tabcom)
newtab_comp = tablocomp.filter(d => d.COM === com1 & d.Indicateurs === ind | d.COM === com2  & d.Indicateurs === ind)

Inputs.table(newtab_comp, {
columns: [
"COM", "2016", "2017", "2018", "2019", "2020", "2021", "2022"
],
rows: 22
})
t_tab = transpose(tab)
t_tab_idf = transpose(tab_idf)
newtab = t_tab.filter(d => d.COM === com1 & d.Indicateur === ind | d.COM === com2  & d.Indicateur === ind)
newtab_idf = t_tab_idf.filter(d => comp.includes(d.COM)  & d.Indicateur === ind)

Plot.plot({
y: {
grid: true,
label : ind
},
marginRight: 130,
marks: [
Plot.line(newtab, {x: "Année", y: "tot", z: "COM", stroke: "COM"}),
Plot.line(newtab_idf, {x: "Année", y: "tot", z: "COM", stroke: "COM"}),
Plot.text(newtab_idf, Plot.selectLast({x: "Année", y: "tot", z: "COM", text: "COM"})),
Plot.text(newtab, Plot.selectLast({x: "Année", y: "tot", z: "COM", text: "COM",
textAnchor: "start", dx : 3}))
]
})
Plot = require("@observablehq/plot@0.6.14")