-
Notifications
You must be signed in to change notification settings - Fork 0
/
exploration_donnees.Rmd
243 lines (181 loc) · 11.3 KB
/
exploration_donnees.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
---
title: "Statistiques descriptives des données relations col&mon"
author: "Olivier"
date: "17 octobre 2019"
output:
bookdown::html_document2:
theme: readable
toc: true
toc_float: true
number_sections: true
fig_caption: yes
code_folding: hide
---
```{r setup, include = FALSE}
library(tidyr)
library(dplyr) # manip données
library(ggplot2) # graphiques
library(plotly) # graphiques un peu interactif
```
# Chargement des données et prise en main
## Chargement
```{r chargement}
#implantation.dat <- readRDS("data/T0impl.Rds")
# fait.dat <- readRDS("data/T0New.Rds")
fait.dat <- read.csv("data/fait.txt", stringsAsFactors = FALSE) # besoin d'ajouter cela sinon il me garde tous les niveaux des facteurs
implantation.dat <- read.csv("data/implantation.txt")
# une exraction des relations
relation.dat <- fait.dat[fait.dat$caracNew == "Relations" ,]
# on extrait les Déplacements
relation.dat <- relation.dat[!relation.dat$modaNiv1 == "Déplacement",]
```
Les données sont regroupées en deux tableaux :
* "T0impl.Rds" contenant les implantations,
* "T0New.Rds" contenant les faits.
C'est du second que l'on tire les relations.
## Prise en main
Il faut spécifier les encoding de 3 colonnes qui sont en "Latin1" alors que le reste semble être en UTF8. Au final knitr semble avoir un problème avec du "multi encoding", j'ai donc fait un export/import le tout en UTF8.
Le tableau \@ref(tab:presenceNa) reprend les nombre de données manquantes par variables. L'absence la plus importante est sur les dates et durée (358) manquantes), puis sur la localisation (109 NA) avec lat/long et granularité et sur les diocèse (11 NA).
```{r, presenceNa, results="asis" }
# un apply, passer en df qui compte le nombre de NA par colonne
relation_na.dat <- as.data.frame(apply(relation.dat, 2, function(x)length(x[is.na(x)])))
names(relation_na.dat) <- "Nbr_NA" # on renome puis on fait une deuxième var qui prend les rowname
relation_na.dat$variables <- rownames(relation_na.dat)
rownames(relation_na.dat) <- NULL
# une bidouille pour avoir un titre de tableau avec ref
cat("<tableau>",paste0("<caption>", "(#tab:presenceNa)", ' Nombre de données manquantes par variabes', "</caption>"),"</tableau>", sep ="\n")
DT::datatable(relation_na.dat)
#knitr::kable(apply(relation.dat, 2, function(x)length(x[is.na(x)]))) # la version à l'arrache knitr
```
# Description des relations
## Modalité des relations
On obtient `r nrow(relation.dat)` factoides avec une `relation`. Le tableau \@ref(tab:modalite) répartit `modalite` en fonction des `modaNiv1`. Les relations peuvent être hiérarchiques ou horizontales, dans les cas hiérarchique, elles peuvent être ascendantes et descendantes. Elles peuvent ensuite être ascendantes/descendantes vers une école ou vers un autre type d'implantations. Les relations avec les écoles sont toujours d'appartenance/possession sauf dans un cas ou on est dans une filiation (ascendante/descendante) est ce une erreur de codage avec Filiation ascendante directe / hiérarchique descendante ?
(ref:modalite-caption) Ventilation de modaNiv1 en fonction de modalité
```{r, modalite}
knitr::kable(t(table(relation.dat$modaNiv1 , relation.dat$modalite)),
caption = "(ref:modalite-caption)")
```
## Modalités et relations dans le temps
### Exploration des données manquantes dans les dates
Il y a 283 valeurs manquantes au niveau des dates (cf. tableau \@ref(tab:presenceNa)). Ces valeurs manquantes ne sont pas consistantes dans les 6 champs de de description des dates. Ce n'est pas important pour moi (olivier) car j'utilise `date_startC` et `date_stopC`. Cependant on a 283 `date_startC` et 273 `date_stopC` mais on malgré tout 283 `DuréeFact` est-ce logique ? Puis-je utiliser `DuréeFact` quand je n'ai pas de `date_startC` ?
Voici les cas où l'on a une `date_stopC` et pas de `date_startC` :
```{r}
NA_date <- relation.dat[is.na(relation.dat$date_startC),]
knitr::kable(NA_date[!is.na(NA_date$date_stop_max),c(2:4,7,13)]) # attention ici une indexation sur num de colonnes
```
En regardant la répartition des valeurs manquantes temporelles en fonction de `modalite` (\@ref(tab:Namodalite)) on peut remarquer qu'un couple A/D n'est pas complet (60/61). (est ce toujours des couples dans la nouvelle classif ?)
(ref:Namodalite-caption) Répartition des NA temporelles dans les modalité
```{r, Namodalite}
knitr::kable(table(NA_date$modalite), caption = "(ref:Namodalite-caption)")
```
On peut produire une carte rapide des valeurs manquantes pour les dates. On en a un gros cluster autour de la région lyonnaise et un autre autour de Charleville-Mézières. Est ce que cela suit une logique par rapport au données ? Avec la version 20191126 on a toujours ces clusters avec en plus des valeurs manquantes mieux réparties sur le territoires.
```{r, include= F}
source("fonctions_carto.R") # on charge des fonctions de carto
library(sf)
# on passe implantation en sf
implantation.shp <- st_as_sf(implantation.dat[!is.na(implantation.dat$lat),], coords = c("lng", "lat"), crs = 4326)
# de wgs 84 au lambert 93
implantation.shp <- st_transform(implantation.shp, 2154)
NA_date.shp <- st_sf(left_join(NA_date, implantation.shp, by = "idimplantation"))
diocese.shp <- diocese() # on charge les dioceses
```
```{r, carte_Na_date, message = FALSE, fig.align='center'}
plot(st_geometry(diocese.shp))
plot(st_geometry(implantation.shp), add = T, col = "lightgrey", pch = 16, cex = .5)
plot(st_geometry(NA_date.shp), add = T, col = "red", pch = 16, cex = .5)
legend("topleft", legend=c("Avec dates", "Sans date"), pch = 16,
col=c("lightgrey", "red"))
```
Et voici une interactive sous `mapview` : (il y a deux relations qui ne trouve pas d'implantations est ce possible ?)
```{r, message = FALSE, fig.align='center'}
initmapview()
mapview::mapview(diocese.shp, color = "gray75", lwd = 1, # couleur et type du contour
col.regions = "grey", alpha = 0.5, # couleur du fond et type
layer.name = "Diocèses" ) +
mapview::mapview(implantation.shp, cex = 0.1, layer.name = "Implantations") +
mapview::mapview(NA_date.shp, zcol = "modaNiv1", layer.name = "Relations sans dates")
```
### Dates et durées pour les relations
Je n'ai pas gardé les relations `hiérarchique asc. Ecole` et `hiérarchique ascendante` pour les analyses suivantes car elles sont identiques aux descendantes.
Les durées sont produites à partir des fourchettes de dates de début et de fin (`date_start_min/max` et `date_stop_min/max`). Il n'y a que trois cas d’écarts importants entre `date_start_min` et `date_start_max` représenté par la figure \@ref(fig:verif-datemin-et-max). Les données manquantes ne sont pas prises en compte. `date_stop_min` et `date_stop_max` sont identiques pour les relations.
(ref:verif-datemin-et-max) Écarts entre date_start_min et date_start_max
```{r, verif-datemin-et-max, message = FALSE, fig.cap="(ref:verif-datemin-et-max)", fig.align='center'}
# c'est du js
f <- list(
family = "Courier New, monospace",
size = 18,
color = "#7f7f7f"
)
x <- list(
title = "date_start_min",
titlefont = f
)
y <- list(
title = "date_start_max",
titlefont = f
)
# j'enleve les doublons A/D et NA
relation_sans_A.dat <- subset(relation.dat, !(relation.dat$modaNiv1 == "hiérarchique asc. Ecole" | relation.dat$modaNiv1 == "hiérarchique ascendante") )
relation_sans_A.dat <- relation_sans_A.dat[!is.na(relation_sans_A.dat$date_startC),]
# il ignore les NA
plot_ly(relation_sans_A.dat, x = relation_sans_A.dat$date_start_min, y = relation_sans_A.dat$date_start_max, type="scatter", # on def X et y
# on fait un text
text = paste(relation_sans_A.dat$usual_name, relation_sans_A.dat$modalite, relation_sans_A.dat$linked_implantation, sep = "\n")) %>%
layout(xaxis = x, yaxis = y)
```
La figure \@ref(fig:date-modalite) regroupe les répartitions des dates (par tranches de 50 ans) de début et fin des modes d'agrégations. Avec ce grain, assez grossier, on peut noter un premier pic dans les dates de relation autour 1100 pour les relations A/D (penser à détailler cette agrégation), suivit d'un second pic de début de relation autour de 1300 qui n'est rattrapé en fin de relation qu'en 1750-1800. Il y a deux pics de dates de début/fin pour les associations de prières (`H`) le premier autour de 1250-1300 et le second autour de 1400 pour le début puis 1450 pour la fin.
(ref:date-modalite) Répartition des dates (début/fin) par tranches de 50 ans en fonction des modes d'agrégation
```{r, date-modalite, fig.cap="(ref:date-modalite)", fig.align='center'}
# on va utiliser ggplot2 donc il faut que cela soit en tidy, au moins un peu
relation_sans_NA_tidy.dat <- gather(relation_sans_A.dat, "date_startC", "date_stopC", key = "debut_fin", value = "date")
# date de début et de fin des relation par modAgreg
date_modalite <- ggplot(relation_sans_NA_tidy.dat, aes(date, color = debut_fin)) +
geom_freqpoly(binwidth = 50) +
facet_wrap(~modaNiv1) +
labs(x = "", y = "") +
theme_bw()
# c'est du js
f <- list(
family = "Courier New, monospace",
size = 18,
color = "#7f7f7f"
)
x <- list(
title = "date (50 ans)",
titlefont = f
)
y <- list(
title = "décompte",
titlefont = f
)
ggplotly(date_modalite) %>%
layout(xaxis = x, yaxis = y)
```
En plus des 273-283 valeurs manquantes il y `r nrow(relation_sans_A.dat[relation_sans_A.dat$DureeFact == 0,])` durées nulles (`DureeFact == 0`). Est-il possible que ces durées soit inférieures à notre grain temporelle (une année) ?
Il y a `r nrow(relation_sans_A.dat[relation_sans_A.dat$DureeFact != 0,])` durées de plus d'un an.
le tableau \@ref(tab:modalite-duree) représente la répartition des durées nulles par modalités. Le droit de patronage, l'association de prière et la possession restent dans des proportions similaires entre les deux catégories (0/1) par Filiation descendante semble proportionnellement moins souvent représentés par des durées (notre olivier : je n'ai pas fait de chi2 ni de comparaison multiple est-ce utile/nécessaire ?).
(ref:modalite-duree) Répartition des durées nulles (0) ou supérieures à 1 (1) par modalités
```{r, modalite-duree}
relation_sans_A.dat$modalite <- factor(relation_sans_A.dat$modalite) # on recode pour dropper les niveau du facteur absent
# une variable pour séparer ceux qui ont une durée des autres
relation_sans_A.dat$durée01 <- 0
relation_sans_A.dat$durée01[relation_sans_A.dat$DureeFact != 0] <- 1
knitr::kable(table(relation_sans_A.dat$modalite, relation_sans_A.dat$durée01), caption = "(ref:modalite-duree)") # puis un tableau
```
La figure \@ref(fig:durre-modalite) correspond aux distribution des durées en fonction des modalités de relation. On a des durées négatives.
(ref:durre-modalite) Boites à moustaches des durées en fonction des modalités de relation
```{r, durre-modalite, fig.align='center', fig.cap="(ref:durre-modalite)"}
f <- list(
family = "Courier New, monospace",
size = 18,
color = "#7f7f7f"
)
y <- list(
title = "Durée (années)",
titlefont = f
)
relation_duree.dat <- relation_sans_A.dat[relation_sans_A.dat$DureeFact != 0,]
plot_ly(relation_duree.dat, y = ~DureeFact, color = ~modalite, type = "box",
text = paste(relation_duree.dat$usual_name, relation_duree.dat$modalite, relation_duree.dat$linked_implantation, sep = "\n")) %>%
layout(yaxis = y)
```