rues de Paris

rues de Paris

Cette étude se concentre sur l’analyse des intitulés des offres de logements sur Airbnb, rédigés par leurs propriétaires. Il sont la quintessence de ce qu’il peuvent offrir, balancent entre la description objective des attributs de l’offre (un 2 pièce à Montmartre) et la synthèse de ses qualité objective (charmant). Nous voulons voir ce qu’exprime ces condensés.

On aurait bien sur avoir des textes plus longs. Ici il se limitent à une centaines de caractères et pas plus de dix mots. C’est la contrainte du jeu de données dont nous avons présenté l’analyse spatiale et approfondi la question de la formation des prix.

Dans cette perspective, c’est l’occasion d’examiner plus qualitativement la nature des offres en étudiant les mots qui les définissent, On poursuivra suivra la logique géographique en exploitant les 80 quartiers définis par AirBnB, mais aussi celle des prix, l’organisation spatiale : de centre à périphérie, qui n’exclue pas une multipolarité : le Marais, Montmartre, les Champs Elysées en étant les principaux.

C’est surtout l’occasion d’étudier le package quanteda mais aussi tidytext , deux avancées récente dans le domaine du traitement textuel avec r, qui prennent la succession de tm notamment. Des langages plus condensés, qui abandonnenty l’idée du mot pour celle plus générale et abstraites du Token.

En terme d’analyse, nous resterons dans le cadre du “bagofword�?, et n’exploiterons peu les ressources de l’analyse positionnelle. La première s’appuie sur les similarités issue de fréquences et de probabilité, n’assignant aucun ordre entre les tokens d’un même ensemble de mots faisant partie du corpus. Les tokens peuvent être des des mots, des ngrams, des syllabes, des phrases. Les sacs de mots peuvent êtres des phrases, des k-groupes de mots, des mots, des paragraphes, des documents. Le corpus est l’ensemble des documents, l’ensembles des token. A chaque échelle on s’intéresse aux fréquences relatives et aux co-occurences.

L’analyse positionnelle donne une importance à l’ordre des mots qui traduit souvent une grammaire implicite. L’ordre des phrases : sujet Verbe Complément en français, SCV en allemand. quand les tokens dans l’ordre sont caractérisés par des attributs grammaticaux, on peut décrire de manière hiérarchiques les éléments d’une phrase qui comme la musique est ordonnée par la séquence. Ce peut être pûrement ordinale, la musique y ajoute une idée cardinale : l’unité de temps est donnée par le réglages d’un métronome.

L’outillage

Voici l’ensemble des packages employés et quelques recodages. En particulier les gamme de prix qui découlent de l’étuide sur la formation des prix

#option pour le tricotage
knitr::opts_chunk$set(echo = TRUE, include=TRUE,message=FALSE,warning=FALSE,cache=TRUE)
#chargement des packages
library(Rcmdr)              # la bouée de sauvetage
## Loading required package: splines
## Loading required package: RcmdrMisc
## Loading required package: car
## Loading required package: carData
## Loading required package: sandwich
## Loading required package: effects
## lattice theme set by effectsTheme()
## See ?effectsTheme for details.
## L'interface graphique de R Commander n'est utilisable que dans des sessions interactives
## 
## Attaching package: 'Rcmdr'
## The following object is masked from 'package:car':
## 
##     Confint
library(corrplot)           # un accesoire visuel pour l'analyse des correlations
## corrplot 0.84 loaded
library(tidyverse)          # la mode pour r c'est le tidy et il y a ggplot2 pour la viz
## -- Attaching packages ---------------------------------- tidyverse 1.2.1 --
## v ggplot2 3.1.0     v purrr   0.2.5
## v tibble  1.4.2     v dplyr   0.7.8
## v tidyr   0.8.2     v stringr 1.3.1
## v readr   1.3.1     v forcats 0.3.0
## -- Conflicts ------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
## x dplyr::recode() masks car::recode()
## x purrr::some()   masks car::some()
library(ggplot2)
library(gridExtra)          # c'est pour mettre plusieurs graphiques en un seul
## 
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
## 
##     combine
library(dendextend)         # pour de plus beaux arbres
## 
## ---------------------
## Welcome to dendextend version 1.9.0
## Type citation('dendextend') for how to cite the package.
## 
## Type browseVignettes(package = 'dendextend') for the package vignette.
## The github page is: https://github.com/talgalili/dendextend/
## 
## Suggestions and bug-reports can be submitted at: https://github.com/talgalili/dendextend/issues
## Or contact: <[email protected]>
## 
##  To suppress this message use:  suppressPackageStartupMessages(library(dendextend))
## ---------------------
## 
## Attaching package: 'dendextend'
## The following object is masked from 'package:stats':
## 
##     cutree
library(Rcpp)               # j'ai du avoir besoin de ça
library(topicmodels)        # pour trouver des sujets de conversations
library(corpustools)        # on a toujours besoin de l'outil du voisin
## Loading required package: Matrix
## 
## Attaching package: 'Matrix'
## The following object is masked from 'package:tidyr':
## 
##     expand
## Loading required package: data.table
## 
## Attaching package: 'data.table'
## The following object is masked from 'package:dendextend':
## 
##     set
## The following objects are masked from 'package:dplyr':
## 
##     between, first, last
## The following object is masked from 'package:purrr':
## 
##     transpose
library(Rtsne)              # c'est du mds à la sauce relativité - un modèle de champs?
library(ldatuning)          # des sujets oui mais combiens?
library(tidytext)           # dans le tidy il y a le rameau du texte
## 
## Attaching package: 'tidytext'
## The following object is masked from 'package:corpustools':
## 
##     get_stopwords
library(quanteda)           # le plus top des accessoires et les modèles les plus originaux
## Package version: 1.3.14
## Parallel computing: 2 of 4 threads used.
## See https://quanteda.io for tutorials and examples.
## 
## Attaching package: 'quanteda'
## The following object is masked from 'package:utils':
## 
##     View
library(textcat)            # identification des langues
#library(quanteda.dictionaries) #attention aux langues!
library(knitr)
#chargement du fichier 
library(readr) #pour lire le fichier csv
B_17_07 <- read_csv("C:/Users/UserPC/Documents/airbnb/data/tomslee_airbnb_paris_1478_2017-07-25.csv")
## Parsed with column specification:
## cols(
##   .default = col_double(),
##   room_type = col_character(),
##   country = col_logical(),
##   city = col_character(),
##   borough = col_logical(),
##   neighborhood = col_character(),
##   bathrooms = col_logical(),
##   minstay = col_logical(),
##   name = col_character(),
##   property_type = col_character(),
##   last_modified = col_datetime(format = ""),
##   location = col_character()
## )
## See spec(...) for full column specifications.
#on recode le prix en 5 plages ( voir étuides formation des prix)
P <-B_17_07 #pour simplifier le code une lettre suffit
P$priceb[P$price<61]<-" 20-60 et moins"
## Warning: Unknown or uninitialised column: 'priceb'.
P$priceb[P$price>60 & P$price<100]<-" 60-100"
P$priceb[P$price>99 & P$price<150]<-"100-150"
P$priceb[P$price>149 & P$price<250]<-"150-250"
P$priceb[P$price>249]<-"250 et plus"
Table <- with(P, table(priceb))
cat("\ncounts:\n")
## 
## counts:
print(Table)
## priceb
##  20-60 et moins          60-100         100-150         150-250 
##           19130           24773           14670            7750 
##     250 et plus 
##            3835
Corpus<-corpus(P,text_field="name") #corpus de base qui sera filtré

Volumétrie

L’analyse textuelle demande d’être attentif à la volumétrie. Analyser l’oeuvre de Jame Joyces, composée de nouvelle (les gens de Dublin) et d’odyssée (bien sur Ulysse) est une tâche bien différente que d’analyser 70 158 télégrammes.

  • le nombre de mots (et plus généralement de tokens)
  • le nombre de documents
  • le nombre de groupes de documents ou de séquences de documents

La caractéristique est que ce sont de sparses matrix. Des tableaux creux qui prennent un volume important (ici de plusieurs dizaines de Mo pour un fichier d’origine de quelques centaines de ko) et souligne le fait que traiter des données textuelles, c’est d’abord suivre un chemin d’expansion avant de penser à réduire.

L’analyse de la volumétrie doit nous permettre d’apprécier les bons ordres de grandeur.

Le nombre de caractères

Examinons d’abord la longueur des intitulés. Le maximum est de 50 caractères. Deux populations se manifestent : l’une tend à employer tous les caractères possibles, l’autre trouve son mode vers 33 caractères. Deux groupes d’annonces? des courtes? des longues?

P$nbcar<-as.numeric(nchar(P$name))
ggplot(data = P, aes(x=nbcar))+geom_histogram(fill="grey")+ labs(title = "Distribution des intitulés par nombre de caractères", x="nombre de caractères", y="nombre d'annonces")+theme_bw()+xlim(0,50)

###par niveaux de prix

On se contente d’ajouter la couche facet_grid. Et rien de particulier n’émerge.

ggplot(data = P, aes(x=nbcar))+geom_histogram(fill="grey")+ labs(title = "Distribution des intitulés par nombre de caractères", x="nombre de caractères", y="nombre d'annonces")+theme_bw()+xlim(0,50)+facet_grid(priceb~.)

par localisation

df<-aggregate(nbcar~neighborhood,data=P,FUN=mean)
ggplot(data = df, aes(x=reorder(neighborhood,nbcar),y=nbcar))+geom_point()+ labs(title = "Nombre de caractères", x="nombre de caractères", y="")+theme_bw()+coord_flip()+theme(axis.text=element_text(size=6))