Ce carnet de recherche est complémentaire à l’analyse spatiale, elle débute par une analyse détaillée des variables d’intérêt et s’achève par une modélisation de la formation des prix, notamment par la comparaison de différents modèles de régression.
Les questions générales sont :
Notes et commentaires favorisent l’offre de prix élevés ?
La qualité intrinsèques des logements ?
Dans quelles mesures les quartiers determinent les prix?
5 offres sur 7 n’ont reçu aucun commentaire. Soit ces appartements n’on pas été loués encore (c’est donc une indication du nombre de nouveaux appartements), soit ceux qui les ont loués n’on pas estimer utile de les commenter . Connaitre le taux de commentaires serait appréciable pour mieux apprécier cette proportion. Si comme dans les réseaux sociaux le taux de contribution est de l’ordre de 1%, on aurait là une concentration d’appartement loué peu souvent, mais il est sans doute bien plus élevé par le jeux des incitations. 50%, 80% ? La question reste ouverte.
P$reviews2<-P$reviews
P$reviews2[P$reviews==0]<-NA
P$reviews3<-"aucun commentaire"
P$reviews3[P$reviews!=0]<-"au moins 1 commentaire"
ggplot(P,aes(x=reviews3))+geom_bar()
En se concentrant sur les avis publiés on constate une distribution exponentielle (ou puissance), elle traduit une très forte inégalité.
g<-ggplot(P,aes(x=reviews2))+geom_histogram(bins=100)+xlim(1,200)+annotate("text", x = 400, y = 250, label = "Some text")
g
ggplot(P, aes(x=reviews2)) + stat_ecdf(geom = "step")+xlim(1,200)
Pour mieux apprécier cette inégalité, l’outil parfait est la courbe de lorenz : on reprend le code glané ici qui emploie des ressource de la librairie ineq pour inégalité.
# Compute the Lorenz curve Lc{ineq}
library(ineq)
Distr1 <- P$reviews2
Distr1 <- Lc(Distr1, n = rep(1,length(Distr1)), plot =F)
# create data.frame from LC
p <- Distr1[1]
L <- Distr1[2]
Distr1_df <- data.frame(p,L)
# plot
ggplot(data=Distr1_df) +
geom_point(aes(x=p, y=L)) +
geom_line(aes(x=p, y=L), color="#990000") +
scale_x_continuous(name="Cumulative share of X", limits=c(0,1)) +
scale_y_continuous(name="Cumulative share of Y", limits=c(0,1)) +
geom_abline()
Le résultat est clair : la moitié des petits contributeurs génère environ 10% des reviews. A vrai dire ils ne produisent pas les commentaires mais en sont l’objet. En revanche, 10% des logements qui reçoivent le plus de commentaires en concentrent la moitié.
30 000 hotels n’ont pas de note. 50 000 n’ont pas de commentaire. On trouve un élément de réponse à la question de la proportion de nouvelles offres. Une note signifie un usage. Si le commentaire demande un effort, l’évaluation ne demande que d’appuyer sur un bouton. Le stock serait ainsi constitué de l’ordre de 42% de logements nouveaux et donc de 58% logement qui ont fait l’objet d’au moins une location.
P$satisfaction2<-P$overall_satisfaction
P$satisfaction2[P$overall_satisfaction==0]<-NA
P$satisfaction3<-"aucune note"
P$satisfaction3[is.na(P$overall_satisfaction)]<-"aucune note"
P$satisfaction3[P$overall_satisfaction!=0]<-"Noté"
ggplot(P,aes(x=satisfaction3))+geom_bar()
En examinant la distribution des notes, on observe l’asymétrie désormais bien connue : il n’y a quasiment aucune note inférieure à 3 ( ce sont certainement des expressions d’une très mauvaise expérience ou d’un coup de colère), et l’essentiel se partage entre les échellon 4.5 et 5 (environ 90%). Le 4 et le 3.5 sont peu fréquents, ils ont probablement un rôle de sanction ou de signalement.
g<-ggplot(P,aes(x=satisfaction2))+geom_histogram()+annotate("text", x = 1, y = 12500, label = "Some text")
g
# 2-Way Frequency Table
mytable <- table(P$reviews3,P$satisfaction3) # A will be rows, B will be columns
mytable
##
## aucune note Noté
## au moins 1 commentaire 11596 39459
## aucun commentaire 19103 0
prop.table(mytable, 1) # row percentages
##
## aucune note Noté
## au moins 1 commentaire 0.2271276 0.7728724
## aucun commentaire 1.0000000 0.0000000
prop.table(mytable, 2) # column percentages g
##
## aucune note Noté
## au moins 1 commentaire 0.3777322 1.0000000
## aucun commentaire 0.6222678 0.0000000
Toutes les annonces ont un prix. En voici la distribution, en prenant soin de choisir des intervalles de 5 euros pour avoir de la finesse. La distribution n’est pas régulière et se constitue sans doute comme la superposition de plusieurs distributions de prix correspondant à des types de logements différents.
P$price2<-P$price
P$price2[P$price==0]<-NA
P$price3<-"aucune prix"
P$price3[P$price!=0]<-"prix"
g<-ggplot(P,aes(x=price2))+geom_histogram(binwidth = 5)+xlim(0,500)+annotate("text", x = 3000, y = 425, label = "Some text")+geom_density()
g
La représentation de la fonction de densité de probabilité donne une autres perspective, elle lisse la distribution empirique mais laisse les pics apparaitres : à 60, 70, 90, 120, 140, 180, 240 et 300 euros. Il y aurait une sorte de stratification des marchés.
g<-ggplot(P,aes(x=price2))+geom_density()+xlim(0,400)
g
On travaille sur le prix median pour minorer l’effet de prix elevé (on trouve une offre à 11323 euros! avec max(P$price)), les mauvaises notes ( très rares) correspondent aux plus faibles niveaux de notations : les mauvaises expériences seraient l’apanage des solutions cheap ? un matelat à même le sol, des souris et des cancrelats? Plus signicatif est la tendance indiquée sur la droite du graphique et en particulier la note de 5 dont la mediane est de l’ordre de 90 euros, plus de 10 euros de plus que pour ceux notés 4.5. Le 3 sanction est à 62 euros.
La satisfaction fait-elle le prix (car l’offreur la module en fonction des notes et commentaires reçus) ou le prix fait-il la satisfaction (on note plus genereusement des appartements chers mais confortables) ?
Px<- aggregate(price2 ~ satisfaction2, data=P, FUN=median)
g<-ggplot(Px,aes(x=satisfaction2, y=price2))+geom_bar(stat="identity")+geom_smooth(method="lm")
g
##prix et type de logement
Si la diversité et l’originalité des logements sont mis en avant par la plateforme la réalité est plus prosaique à 95% il s’agit d’appartements. On retrouve cependant des bateaux, quelques centaines de lofts.
ggplot(P,aes(x=property_type))+geom_bar()+coord_flip()
Ceci se précise avec le type de pièces : chambre partagée, chambre privée ou appartement loué dans son entier. Le rapport est de 1 pour 8, un appartment réelement partagé sur 8! le collaboratif n’est pas exclu mais marginal.
ggplot(P,aes(x=room_type))+geom_bar()+coord_flip()
un dernier angle est celui de nombre de pièces ( on ajoute 1 à la variables nombre de chambres)
ggplot(P,aes(x=bedrooms))+geom_histogram(binwidth = 1)+coord_flip()
###Le prix d’une chambre
On apprécie l’impact du nombre de pièce selon le type de logement : est-il partagé ou loué entier. Lorsqu’il est partagé le prix s’accroît nettement de l’ordre de 40 à 160 euros, mais dans une proportion bien plus faible que dans le cas où l’appartement est loué dans son entier, on rapport dans un rapport de 1 à 20!
P$bedrooms[P$bedrooms>8]<-NA
P$bedrooms2<-as.factor(P$bedrooms)
P$room_type2<-P$room_type
P$room_type2[P$room_type=="Shared room"]<-NA
Px<- aggregate(price ~ bedrooms2+room_type2, data=P, FUN=mean)
g<-ggplot(Px,aes(x=bedrooms2, price))+geom_bar(stat="identity")+geom_smooth(method="lm")+facet_grid(.~room_type2)
g
Une petite analyse de régression peut nous permettre de mieux comprendre les effets. On teste trois modèles :
Autrement dit le modèle est multiplicatif et les paramètres peuvent être interprêté différemment : on les interprête directement comme des elasticités : la valeur de 0.385, signifie qu’à chaque fois que l’on double le nombre de chambre, le prix s’accroit de 38,5% . L’effet que l’appartement soit loué entier se traduit au contraire par une augmentation de 31.1%.
reg1<-lm(price~bedrooms+room_type2,data=P)
P$lprice<-log(P$price+1)
reg2<-lm(price~bedrooms+room_type2+bedrooms*room_type2,data=P)
reg3<-lm(lprice~bedrooms+room_type2,data=P)
stargazer(reg1,reg2,reg3,title="Title: Regression Results",
align=TRUE,digits=2,
type = "text",no.space=TRUE,
notes="this is a test note")
##
## Title: Regression Results
## ====================================================================================================================
## Dependent variable:
## ------------------------------------------------------------------------------------
## price lprice
## (1) (2) (3)
## --------------------------------------------------------------------------------------------------------------------
## bedrooms 63.71*** 64.23*** 0.38***
## (0.54) (0.55) (0.002)
## room_type2Private room -48.48*** -8.48* -0.48***
## (1.41) (5.01) (0.01)
## bedrooms:room_type2Private room -39.69***
## (4.77)
## Constant 49.24*** 48.68*** 4.17***
## (0.75) (0.75) (0.003)
## --------------------------------------------------------------------------------------------------------------------
## Observations 69,638 69,638 69,638
## R2 0.18 0.18 0.38
## Adjusted R2 0.18 0.18 0.38
## Residual Std. Error 117.48 (df = 69635) 117.42 (df = 69634) 0.45 (df = 69635)
## F Statistic 7,594.31*** (df = 2; 69635) 5,090.93*** (df = 3; 69634) 21,774.14*** (df = 2; 69635)
## ====================================================================================================================
## Note: *p<0.1; **p<0.05; ***p<0.01
## this is a test note
un loliplot serait bien venu!! ( avec mean,min, max…)
voir les cartes
P$neighborhood<-as.factor(P$neighborhood)
Px<- aggregate(price2 ~ neighborhood, data=P, FUN=median)
g<-ggplot(Px,aes(x=reorder(neighborhood,price2), y=price2))+geom_bar(stat="identity")+coord_flip()
g<-g+ theme(axis.text.x = element_text(size = 8), axis.text.y = element_text(size = 5))
g
De fortes disparités caractérisent les quartiers. Charonne, la goutte d’or la chapelle sont les plus modique avec une médiane d’à peine 60 euros. Les champs Elysées sont à près du triple talonnée par la place vendôme et la cathédrale. Est-ce l’effet du prestige ou la nature des logements proposés. Il faudra tester cette hypothèse.
P$neighborhood<-as.factor(P$neighborhood)
Px<- aggregate(cbind(price, satisfaction2) ~ neighborhood, data=P, FUN=mean)
g<-ggplot(Px,aes(x=price, y=satisfaction2))+geom_point(stat="identity")+geom_text(aes(label=neighborhood),hjust=0.5, vjust=0.5, size=3)
g<-g+ theme(axis.text.x = element_text(size = 8), axis.text.y = element_text(size = 8))+geom_smooth(method=lm,se=TRUE)
g
même chose mais en regardant le nombre de commentaires. Le résultat est différent, la corrélation est plus prononcée. Sous les 120 euros le nombres de reviews est inférieur en moyenne à 20 commentaires. Au-delà une plus grande variance est observée (un signe d’hétéroscedasticité).
Px<- aggregate(cbind(price, reviews2) ~ neighborhood, data=P, FUN=mean)
g<-ggplot(Px,aes(x=price, y=reviews2))+geom_point(stat="identity")+geom_text(aes(label=neighborhood),hjust=0.5, vjust=0.5, size=3)
g<-g+ theme(axis.text.x = element_text(size = 8), axis.text.y = element_text(size = 8))+geom_smooth(method=lm,se=TRUE)
g
##Régression hédonique
De quoi dépend le prix?
Un modèle simple mais log(prix) comme variable indépendante, comme on a pu le voir précedemment.pour l’interprétation il est comme de prendre l’exopentiel des paramètres qui donne en fait le taux d’accroissement du prix pour une unité d’accroissement de la variable considérée, donc raisonner en terme d’élasticité.
Si on prend le nombre de reviews le paramètre est très faible. Cependant si le passage de 1 à 5 commentaires accroît de 0,3% le prix, mais s’il y en a 50 alors une prime de 4% est obtenue.Pour la satisfaction c’est un prix de 18% plus elevé qui est obtenu ( exp(0.16819556))
le très faible poids du nombre de reviews et son effondrement quand la localisation est prise en compte laisse à penser que la production de commentaire est moins motivée par le séjour et l’expérience du logement que par le prestige et l’agrément du quartier où le logement se trouve. Voilà qui contribue à la thèse que les riches atirrent les riches. En effet l’effet corrolaire est une plus grande documentation des logements bien situés et donc l’accroissement de leur attractivité.
Mais le déterminant c’est le nombre de pièces qui fait passer de 47% le prix à chaque pièce suplémentaire.
Le quartier est employé comme variable de contrôle dans un second modèl et contribue à un accroissement subtantiel de l’ajustement, il y a un effet géographique.
LinearModel1 <- lm(log(price2) ~ bedrooms + room_type2 + reviews2 + satisfaction2, data=P)
LinearModel2 <- lm(log(price2) ~ bedrooms + room_type2 + reviews2 + satisfaction2 +neighborhood, data=P)
stargazer(LinearModel1,LinearModel2, type="text", digits=2,no.space=TRUE)
##
## =========================================================================================
## Dependent variable:
## ------------------------------------------------------
## log(price2)
## (1) (2)
## -----------------------------------------------------------------------------------------
## bedrooms 0.39*** 0.39***
## (0.003) (0.002)
## room_type2Private room -0.54*** -0.46***
## (0.01) (0.01)
## reviews2 0.001*** -0.0000
## (0.0001) (0.0001)
## satisfaction2 0.17*** 0.16***
## (0.01) (0.01)
## neighborhoodArchives 0.61***
## (0.02)
## neighborhoodArsenal 0.55***
## (0.02)
## neighborhoodArts-et-Metiers 0.45***
## (0.02)
## neighborhoodAuteuil 0.31***
## (0.02)
## neighborhoodBatignolles 0.18***
## (0.02)
## neighborhoodBel-Air 0.12***
## (0.03)
## neighborhoodBelleville 0.03
## (0.02)
## neighborhoodBercy 0.22***
## (0.04)
## neighborhoodBonne-Nouvelle 0.45***
## (0.02)
## neighborhoodChaillot 0.57***
## (0.02)
## neighborhoodChamps-Elysées 0.82***
## (0.03)
## neighborhoodCharonne 0.01
## (0.02)
## neighborhoodChaussée-dAntin 0.48***
## (0.03)
## neighborhoodClignancourt 0.16***
## (0.02)
## neighborhoodCombat 0.05**
## (0.02)
## neighborhoodCroulebarbe 0.21***
## (0.03)
## neighborhoodEcole-Militaire 0.43***
## (0.03)
## neighborhoodEnfants-Rouges 0.52***
## (0.02)
## neighborhoodEpinettes 0.07***
## (0.02)
## neighborhoodEurope 0.34***
## (0.03)
## neighborhoodFaubourg-du-Roule 0.69***
## (0.03)
## neighborhoodFaubourg-Montmartre 0.39***
## (0.03)
## neighborhoodFolie-Méricourt 0.20***
## (0.02)
## neighborhoodGaillon 0.67***
## (0.04)
## neighborhoodGare 0.14***
## (0.02)
## neighborhoodGoutte-dOr -0.02
## (0.02)
## neighborhoodGrandes-Carrières 0.18***
## (0.02)
## neighborhoodGrenelle 0.42***
## (0.02)
## neighborhoodGros-Caillou 0.60***
## (0.02)
## neighborhoodHalles 0.62***
## (0.02)
## neighborhoodHôpital-Saint-Louis 0.15***
## (0.02)
## neighborhoodInvalides 0.62***
## (0.04)
## neighborhoodJardin-des-Plantes 0.34***
## (0.02)
## neighborhoodJavel 15Art 0.26***
## (0.02)
## neighborhoodLa Chapelle -0.01
## (0.03)
## neighborhoodMadeleine 0.65***
## (0.03)
## neighborhoodMail 0.51***
## (0.02)
## neighborhoodMaison-Blanche 0.14***
## (0.02)
## neighborhoodMonnaie 0.70***
## (0.02)
## neighborhoodMontparnasse 0.38***
## (0.03)
## neighborhoodMuette 0.48***
## (0.02)
## neighborhoodNecker 0.32***
## (0.02)
## neighborhoodNotre-Dame 0.78***
## (0.03)
## neighborhoodNotre-Dame-des-Champs 0.57***
## (0.02)
## neighborhoodOdeon 0.64***
## (0.03)
## neighborhoodPalais-Royal 0.69***
## (0.03)
## neighborhoodParc-de-Montsouris 0.16***
## (0.03)
## neighborhoodPère-Lachaise 0.03
## (0.02)
## neighborhoodPetit-Montrouge 0.18***
## (0.02)
## neighborhoodPicpus 0.12***
## (0.02)
## neighborhoodPlace-Vendôme 0.84***
## (0.03)
## neighborhoodPlaine-Monceau 0.32***
## (0.03)
## neighborhoodPlaisance 0.16***
## (0.02)
## neighborhoodPont-de-Flandre -0.05
## (0.03)
## neighborhoodPorte-Dauphine 0.43***
## (0.03)
## neighborhoodPorte-Saint-Denis 0.29***
## (0.02)
## neighborhoodPorte-Saint-Martin 0.26***
## (0.02)
## neighborhoodQuinze-Vingts 0.29***
## (0.02)
## neighborhoodRochechouart 0.24***
## (0.02)
## neighborhoodRoquette 0.23***
## (0.02)
## neighborhoodSaint-Ambroise 0.21***
## (0.02)
## neighborhoodSaint-Avoye 0.55***
## (0.02)
## neighborhoodSaint-Fargeau -0.02
## (0.03)
## neighborhoodSaint-Georges 0.35***
## (0.02)
## neighborhoodSaint-Germain-des-Prés 0.72***
## (0.03)
## neighborhoodSaint-Gervais 0.62***
## (0.02)
## neighborhoodSaint-Lambert 0.26***
## (0.02)
## neighborhoodSaint-Merri 0.59***
## (0.02)
## neighborhoodSaint-Thomas-dAquin 0.68***
## (0.03)
## neighborhoodSaint-Victor 0.47***
## (0.03)
## neighborhoodSaint-Vincent-de-Paul 0.18***
## (0.02)
## neighborhoodSainte-Marguerite 0.17***
## (0.02)
## neighborhoodSalpêtrière 0.16***
## (0.03)
## neighborhoodSorbonne 0.57***
## (0.02)
## neighborhoodSt-Germain-lAuxerrois 0.73***
## (0.04)
## neighborhoodTernes 0.41***
## (0.02)
## neighborhoodVal-de-Grace 0.41***
## (0.02)
## neighborhoodVillette 0.01
## (0.02)
## neighborhoodVivienne 0.58***
## (0.03)
## Constant 3.35*** 3.08***
## (0.03) (0.03)
## -----------------------------------------------------------------------------------------
## Observations 39,149 39,149
## R2 0.44 0.58
## Adjusted R2 0.44 0.58
## Residual Std. Error 0.41 (df = 39144) 0.36 (df = 39065)
## F Statistic 7,744.21*** (df = 4; 39144) 646.35*** (df = 83; 39065)
## =========================================================================================
## Note: *p<0.1; **p<0.05; ***p<0.01
http://rspatial.org/analysis/rst/7-spregression.html
library(spdep)
d’armand le test d’arman (y a-t-il autocorrelation ?)
ensuite la construction de la matrice de voisinage
enfin le calcul du modèle
et son interprétation
#ag<- aggregate(price ~ row, data=grid3, FUN=median)
#on merge
#merged = merge(grid2, grid4, by = "row")
#GLM.2 <- glm(price ~ bs( satisfaction2 , df=2) +neighborhood, family=gaussian(identity), data=P)
#summary(GLM.2)