-
Notifications
You must be signed in to change notification settings - Fork 0
/
03-MethodesRepartitionPonctuelle.qmd
2223 lines (1814 loc) · 107 KB
/
03-MethodesRepartitionPonctuelle.qmd
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
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
# Méthodes de répartition ponctuelle {#sec-chap03}
Dans ce chapitre, nous abordons les méthodes de répartition ponctuelle qui permettent de décrire un semis de points dans un espace géographique donné. En géomatique appliquée, ces méthodes sont fréquemment employées dans le cadre d'études rattachées à des champs disciplinaires variés comme :
- En études urbaines, pour décrire la répartition de services et d'équipements collectifs à travers une ville afin de vérifier s'ils sont équitablement répartis ou à l'inverse, concentrés dans certaines parties de la ville.
- En biologie, pour décrire la répartition d'espèces fauniques ou végétales dans un territoire.
- En criminologie, pour analyser la répartition spatiale d'un ou de plusieurs types de crimes.
- En épidémiologie, pour comprendre l'évolution de la répartition spatiale des cas d'une maladie infectieuse.
- En transport, pour analyser la répartition d'accidents.
- Et même en sciences de l'activité physique, pour analyser la distribution spatiale de personnes pratiquant un sport sur un terrain de soccer, de rugby, de tennis, de baseball, etc.
::: bloc_package
::: bloc_package-header
::: bloc_package-icon
:::
**Liste des *packages* utilisés dans ce chapitre**
:::
::: bloc_package-body
- Pour importer et manipuler des fichiers géographiques :
- `sf` pour importer et manipuler des données vectorielles.
- Pour construire des cartes et des graphiques :
- `tmap` pour construire des cartes thématiques.
- `ggplot2` est un *package* pour construire des graphiques.
- Pour les analyses de méthodes de répartition ponctuelle :
- `spatstat` est sans aucun doute le meilleur *package*.
- `sparr` pour calculer la STKDE, soit l'estimation de la densité par noyau spatio-temporel (*Space-Time Kernel density Estimatation*).
:::
:::
::: bloc_objectif
::: bloc_objectif-header
::: bloc_objectif-icon
:::
**Pour décrire la distribution d'un semis de points, nous voyons les méthodes suivantes :**
:::
::: bloc_objectif-body
- La fréquence et la densité des points dans l'espace d'étude.
- L'analyse centrographique :
- Paramètres de tendance centrale (centre moyen et point central).
- Dispersion du semis de points (distance standard) et ses différentes représentations graphiques (cercle et ellipse de distance standard).
- L'arrangement spatial du semis de points :
- Méthode du plus proche voisin.
- Méthode des quadrats.
- La cartographie de la densité :
- Dans une maille irrégulière (des polygones de forme et de taille différentes).
- Dans une maille régulière (estimation de la densité par noyau -- *kernel density estimation, KDE*).
:::
:::
## Fréquence et densité des points dans l'espace d'étude {#sec-031}
La **fréquence** est tout simplement le nombre de points présents dans une région donnée (par exemple, le nombre d'hôpitaux, de stations de métro, d'arbres, etc.). La **densité** est le ratio entre la fréquence et la *superficie totale* de la région donnée ou la *population*.
Par exemple, le @tbl-TableauMetros renvoie le nombre et la densité des stations de métro (pour 10 000 habitants) pour trois villes. Interprétez ces chiffres avec prudence, car ils varient en fonction de la taille du territoire retenu pour les trois villes.
```{r}
#| label: tbl-TableauMetros
#| tbl-cap: Fréquence et densité des stations de métro dans trois villes
#| echo: false
#| message: false
#| warning: false
DfMetro <- data.frame(Ville=c("New York", "Paris", "Île de Montréal"),
Pop=c(8804000, 2165000, 2004000),
Metro=c(424, 309, 68))
DfMetro$Densite <- round(DfMetro$Metro / (DfMetro$Pop /10000), 1)
knitr::kable(DfMetro,
format.args = list(decimal.mark = ',', big.mark = " "),
col.names = c("Ville", "Population",
"Stations de métro",
"Densité (stations / 10 000 hab.)"),
align=c("l", "l", "r", "c"),
format = "markdown")
```
## Analyse centrographique {#sec-032}
L'analyse centrographique est une approche qui a été largement utilisée durant les décennies 1990 et 2000. Son utilisation est parfois critiquée pour deux raisons principales : 1) elle ne décrit que partiellement le semis de points; 2) aucun test d'inférence n'est calculé. Quoi qu'il en soit, elle permet d'explorer les données avant de se lancer dans des analyses plus avancées.
::: bloc_notes
::: bloc_notes-header
::: bloc_notes-icon
:::
**Utilisation de l'analyse centrographique au Québec et dans le monde francophone**
:::
::: bloc_notes-body
Marius Thériault (géographe et professeur émérite à l'Université Laval) a largement contribué à la popularité de l'analyse centrographique au Québec et ailleurs. Il est le créateur de *MapStat*, un module développé avec le langage MapBasic intégré dans le logiciel SIG MapInfo permettant de réaliser une analyse centrographique avant même qu'elle soit implémentée dans ArcGIS. En guise d'exemple, les études suivantes utilisent l'analyse centrographique calculée avec *MapStat* [@lopez2015evolution; @barbonne2007dynamique]. Consultez-les au besoin.
:::
:::
### Paramètres de tendance centrale d'un semis de points {#sec-0311}
Les deux principaux paramètres de tendance centrale d'un semis de points sont le centre moyen et le point central qui peuvent être ou non pondérés.
#### Centre moyen {#sec-03111}
Le centre moyen ($cm$) est le centre de gravité du semis de points et correspond aux valeurs des moyennes arithmétiques des coordonnées géographiques (@eq-CentreMoyen).
$$
(\bar{x}_{cm}, \bar{y}_{cm}) = \Biggl( \frac{\Sigma_{i=1}^n x_i}{n}, \frac{\Sigma_{i=1}^n y_i}{n}\Biggl)\text{ avec :}
$$ {#eq-CentreMoyen}
- $(\bar{x}_{cm}, \bar{y}_{cm})$, les coordonnées géographiques du point moyen.
- $n$, le nombre de points dans la couche géographique.
- $x_i$ et $y_j$, les coordonnées géographiques du point $i$.
Il est possible de calculer le centre moyen en pondérant chacun des points du semis avec la valeur d'une variable donnée (@eq-CentreMoyenPonderee). Ainsi, l'importance accordée à chacun des points n'est pas la même. Par exemple, nous pourrions calculer le centre moyen pondéré ($cmp$) des cliniques médicales d'une ville en pondérant chaque clinique par le nombre de médecins, ou encore le point moyen des hôpitaux pondéré par le nombre de lits. Autre exemple, avec un jeu de données sur les arbres dans une érablière, nous pourrions utiliser une pondération basée sur le diamètre à la hauteur de la poitrine (DHP) afin d'accorder un poids plus important aux arbres de plus « grand volume ».
::: bloc_notes
::: bloc_notes-header
::: bloc_notes-icon
:::
**Moyenne pondérée**
:::
::: bloc_notes-body
**Pour un rappel sur le calcul d'une moyenne pondérée**, consultez la section intitulée [*Statistiques descriptives pondérées*](https://serieboldr.github.io/MethodesQuantitatives/02-univarie.html#sec-027) [@RBoldAir].
:::
:::
$$
(\bar{x}_{cmp}, \bar{y}_{cmp}) = \Biggl( \frac{\Sigma_{i=1}^n w_ix_i}{\Sigma_{i=1}^nw_i}, \frac{\Sigma_{i=1}^n w_iy_i}{\Sigma_{i=1}^nw_i}\Biggl) \text{ avec :}
$$ {#eq-CentreMoyenPonderee}
- $n$, $x_i$ et $y_j$ étant définis plus haut.
- $(\bar{x}_w, \bar{y}_w)$, les coordonnées géographiques du point moyen pondéré.
- $w_i$, la valeur de pondération associée au point $i$.
Le centre moyen et le centre moyen pondéré sont des mesures très utiles pour comparer la distribution de plusieurs semis de points (de différents services et équipements collectifs par exemple) ou encore pour décrire l'évolution dans le temps de la répartition d'un semis de points. L'analyse du déplacement du centre moyen (pondéré) à différentes dates nous informe ainsi de l'évolution du phénomène à l'étude et plus spécifiquement, de son orientation et de sa direction.
::: bloc_astuce
::: bloc_astuce-header
::: bloc_astuce-icon
:::
**Exemple d'utilisation temporelle du centre moyen pondéré**
:::
::: bloc_astuce-body
Un exemple classique d'utilisation du centre moyen pondéré sur plusieurs années est l'évolution du centre moyen pondéré de la population des États-Unis de 1790 à 2020. Il est calculé à partir des centroïdes des comtés américains et de la population comme variable de pondération extraite des recensements de l'*US Census Bureau*. Bien entendu, le centre moyen pondéré se déplace vers l'ouest.
Vous pouvez consulter [cette carte](https://www.census.gov/library/visualizations/2020/geo/center-of-population-1790-2020.html) ou visionner cette [courte vidéo YouTube ludique](https://www.youtube.com/watch?v=D9XelnGyggI).
:::
:::
Notez que les centres moyen et moyen pondéré peuvent aussi être calculés sur des données géographiques comprenant des valeurs d'élévation ($x,y,z$) :
$$
(\bar{x}_{cm}, \bar{y}_{cm}, \bar{z}_{cm}) = \Biggl( \frac{\Sigma_{i=1}^n x_i}{n}, \frac{\Sigma_{i=1}^n y_i}{n}, \frac{\Sigma_{i=1}^n z_i}{n}\Biggl)
$$ {#eq-PointMoyenZ1}
$$
(\bar{x}_{cmp}, \bar{y}_{cmp}, \bar{z}_{cmp}) = \Biggl( \frac{w_i\Sigma_{i=1}^n x_i}{\Sigma_{i=1}^nw_i}, \frac{w_i\Sigma_{i=1}^n y_i}{\Sigma_{i=1}^nw_i}, \frac{w_i\Sigma_{i=1}^n z_i}{\Sigma_{i=1}^nw_i}\Biggl)
$$ {#eq-PointMoyenZ2}
#### Point central {#sec-03112}
Le point central d'un semis de points est celui qui minimise la somme des distances le séparant de tous les autres points (@eq-PointCentral). Tout comme le point moyen, il est aussi possible de calculer le point central pondéré (@eq-PointCentralW).
$$
pc=\text{Min}\Biggl(\Sigma_{i=1}^n \sqrt{(x_i-x_j)^2+(y_i-y_j)^2}\Biggl)\text{; avec }i \ne j
$$ {#eq-PointCentral}
$$
pcp=\text{Min}\Biggl(\Sigma_{i=1}^n w_i \sqrt{(x_i-x_j)^2+(y_i-y_j)^2}\Biggl)\text{; avec }i \ne j
$$ {#eq-PointCentralW}
::: bloc_attention
::: bloc_attention-header
::: bloc_attention-icon
:::
**Différence entre point central et centre moyen**
:::
::: bloc_attention-body
Contrairement au centre moyen, le point central fait partie du semis de points initial.
**Utilité du point central pondéré**
Imaginez que des personnes étudiantes en géographie et en géomatique de toutes les universités du Québec souhaitent organiser une rencontre en présence. Calculer le point central, pondéré par le nombre de personnes étudiantes par établissement participant à la rencontre, permet d'identifier l'université la plus centrale. Idéalement, il faudrait obtenir ce point central pondéré avec les distances temps calculées avec un réseau routier.
:::
:::
### Paramètres de dispersion d'un semis de points {#sec-0312}
Les deux principaux paramètres de dispersion d'un semis de points sont la distance standard et la distance standard pondérée. La dispersion d'un semis de points peut être représentée graphiquement avec une enveloppe convexe, un cercle de rayon de standard ou une ellipse (avec ou sans pondération).
#### Distance standard et distance standard pondérée {#sec-03121}
En statistique univariée, l'écart-type (@eq-ecartype) est une mesure de dispersion bien connue : plus la valeur de l'écart-type est élevée, plus la dispersion des valeurs de la variable autour de la moyenne ($\mu$) est importante.
$$
\sigma=\sqrt{\frac{\sum_{i=1}^n (x_{i}-\mu)^2}{n}}
$$ {#eq-ecartype}
::: bloc_notes
::: bloc_notes-header
::: bloc_notes-icon
:::
**Écart-type**
:::
::: bloc_notes-body
**Pour un rappel sur l'écart-type**, consultez la section intitulée [*Paramètres de dispersion*](https://serieboldr.github.io/MethodesQuantitatives/02-univarie.html#sec-0253) [@RBoldAir].
:::
:::
**Distance standard (pondérée ou non) des *X* et des *Y***
De manière analogue à l'écart-type, nous pouvons calculer la distance standard pour les coordonnées *X* et pour les coordonnées *Y* des points, soit l'écart moyen respectif au centre moyen (@eq-distancestandardxy) ou au centre moyen pondéré (@eq-distancestandardxyw).
$$
\sigma_x=\sqrt{\frac{\sum_{i=1}^n (x_{i}-\bar{x}_{cm})^2}{n}} \text{ et }
\sigma_y=\sqrt{\frac{\sum_{i=1}^n (y_{i}-\bar{y}_{cm})^2}{n}}
$$ {#eq-distancestandardxy}
$$
\sigma_{xw}=\sqrt{\frac{\sum_{i=1}^n w_i(x_{i}-\bar{x}_{cmp})^2}{\sum_{i=1}^n{w_i}}} \text{ et } \sigma_{yw}=\sqrt{\frac{\sum_{i=1}^n w_i(y_{i}-\bar{y}_{cmp})^2}{\sum_{i=1}^n{w_i}}}
$$ {#eq-distancestandardxyw}
**Distance standard (pondérée ou non)**
Nous pouvons aussi calculer la distance standard ($ds$) sans pondération (@eq-distancestandard) et avec pondération (@eq-distancestandardw). Plus elle est forte, plus les points sont dispersés autour du centre moyen ou du centre moyen pondéré. Inversement, une faible distance standard indique une concentration de points autour du centre moyen.
$$
ds=\sqrt{\frac{\sum_{i=1}^n (x_{i}-\bar{x}_{cm})^2}{n} + \frac{\sum_{i=1}^n (y_{i}-\bar{y}_{cm})^2}{n}}
$$ {#eq-distancestandard}
$$
ds_w=\sqrt{\frac{\sum_{i=1}^n w_i(x_{i}-\bar{x}_{cmp})^2}{\sum_{i=1}^n w_i} + \frac{\sum_{i=1}^n w_i(y_{i}-\bar{y}_{cmp})^2}{\sum_{i=1}^n w_i}}
$$ {#eq-distancestandardw}
De nouveau, ces mesures peuvent être adaptées pour des points avec une élévation ($x,y,z$) :
$$
ds=\sqrt{\frac{\sum_{i=1}^n (x_{i}-\bar{x}_{cm})^2}{n} + \frac{\sum_{i=1}^n (y_{i}-\bar{y}_{cm})^2}{n} + \frac{\sum_{i=1}^n (z_{i}-\bar{z}_{cm})^2}{n}}
$$ {#eq-distancestandardz}
$$
ds_w=\sqrt{\frac{\sum_{i=1}^n w_i(x_{i}-\bar{x}_{cmp})^2}{\sum_{i=1}^n w_i} + \frac{\sum_{i=1}^n w_i(y_{i}-\bar{y}_{cmp})^2}{\sum_{i=1}^n w_i} + \frac{\sum_{i=1}^n w_i(z_{i}-\bar{z}_{cmp})^2}{\sum_{i=1}^n w_i}}
$$ {#eq-distancestandardwz}
#### Représenter la dispersion : cercle de distance standard et ellipse {#sec-03122}
La dispersion d'un semis de points peut être représentée de quatre manières différentes :
1. Une enveloppe convexe des points décrite à la [section @sec-01225]).
2. Un rectangle centré sur le centre moyen avec les déviations des coordonnées *X* et *Y* pondérées ou non (@eq-distancestandardxy et @eq-distancestandardxyw décrites précédemment). Dans le cas de données comprenant l'élévation, la forme géométrique est un parallélépipède rectangle.
3. Un cercle de rayon de distance standard pondérée ou non (@eq-distancestandard et @eq-distancestandardw) décrites précédemment). Dans le cas de données comprenant l'élévation, la forme géométrique est une sphère de rayon de distance standard.
4. Une ellipse de distance standard pondérée ou non. Dans le cas de données comprenant l'élévation, la forme géométrique est un ellipsoïde.
**Prenons un jeu de données fictives** pour décrire ces quatre représentations graphiques. Imaginons que nous avons observé le parc de la Laurentie à Sherbrooke pour comprendre son utilisation. Pour collecter des données sur la localisation des personnes utilisatrices, nous aurions pu utiliser un questionnaire dans QField ou ArcGIS Survey 123. La @fig-PointsB illustre la localisation de dix personnes (points rouges).
![Données fictives sur des personnes utilisatrices du parc de la Laurentie à Sherbrooke](images/Chap03/CartePointsB.png){#fig-PointsB width="100%" fig-align="center"}
À partir de ces dix points, nous obtenons :
- Les coordonnées du **centre moyen** qui sont égales à -8 007 869 et 5 685 921, soit simplement les moyennes des coordonnées *X* et *Y* des dix observations.
- L'**enveloppe convexe des points** qui contient tous les points.
- **Le rectangle construit avec les déviations standards des *X* et des *Y*** qui est centré sur le centre moyen. À partir de ce point, nous ajoutons à l'est et à l'ouest la valeur de la distance standard des *X* et au nord et au sud celle des *Y*. Les valeurs de ces distances standards sont égales à 32,60 et 52,20 mètres (voir les calculs au @tbl-DonneesFictivesCasB).
- La **distance standard** est égale à 61,59 mètres (voir les calculs au @tbl-DonneesFictivesCasB). À partir de cette distance, nous traçons le cercle ayant comme rayon la distance standard.
- L'**ellipse de déviation de distance standard** (@fig-ExplicationEllipse).
```{r}
#| label: tbl-DonneesFictivesCasB
#| tbl-cap: Calcul des distances standards des X et des Y et de la distance standard
#| echo: false
#| message: false
#| warning: false
library(sf)
PointsB <- st_read(dsn = "data/chap03/ParcLarentie.gdb", layer = "PointsB", quiet=TRUE)
DS.B <- st_read(dsn = "data/chap03/ParcLarentie.gdb", layer = "DS_B", quiet=TRUE)
PointsB$id <- 1:nrow(PointsB)
PointsB$X <- st_coordinates(PointsB)[,1]
PointsB$Y <- st_coordinates(PointsB)[,2]
# Moyenne et écart-type
moy.x <- mean(PointsB$X)
moy.y <- mean(PointsB$Y)
et.x <- sqrt(mean((PointsB$X - moy.x)^2))
et.y <- sqrt(mean((PointsB$Y - moy.y)^2))
ds <- sqrt(mean((PointsB$X - moy.x)^2) + mean((PointsB$Y - moy.y)^2))
dfB <- data.frame(id = as.character(PointsB$id),
xi = PointsB$X,
yi = PointsB$Y)
dfB$xi_X2 <- round((dfB$xi - moy.x)^2,1)
dfB$yi_Y2 <- round((dfB$yi - moy.y)^2,1)
dfB$xi_X2_yi_Y2 <- round((dfB$xi - moy.x)^2 + (dfB$yi - moy.y)^2,1)
Sumxi_X2 = round(sum((dfB$xi - moy.x)^2),1)
Sumyi_Y2 = round(sum((dfB$yi - moy.y)^2),1)
Sumxi_X2_yi_Y2 = round(sum((dfB$xi - moy.x)^2 + (dfB$yi - moy.y)^2),1)
Sumxi = sum(dfB$xi)
Sumyi = sum(dfB$yi)
Meanxi = mean(dfB$xi)
Meanyi = mean(dfB$yi)
dfB[11,1] <- "n"
dfB[11,2] <- 10
dfB[12,1] <- "Somme"
dfB[12,2] <- Sumxi
dfB[12,3] <- Sumyi
dfB[12,4] <- Sumxi_X2
dfB[12,5] <- Sumyi_Y2
dfB[12,6] <- Sumxi_X2_yi_Y2
dfB[13,1] <- "Moyenne"
dfB[13,2] <- round(Meanxi,0)
dfB[13,3] <- round(Meanyi,0)
dfB[13,4] <- Sumxi_X2 / 10
dfB[13,5] <- Sumyi_Y2 / 10
dfB[13,6] <- Sumxi_X2_yi_Y2 / 10
dfB[14,1] <- "Racine carrée"
dfB[14,4] <- round(et.x,1)
dfB[14,5] <- round(et.y,1)
dfB[14,6] <- round(sqrt(Sumxi_X2_yi_Y2 / 10),2)
options(knitr.kable.NA = "")
knitr::kable(dfB,
format.args = list(decimal.mark = ',', big.mark = ""),
col.names = c("Point",
"$x_i$",
"$y_i$",
"$(x_{i}-\\bar{x}_{cm})^2$",
"$(y_{i}-\\bar{y}_{cm})^2$",
"$(x_{i}-\\bar{x}_{cm})^2+$\\n $(y_{i}-\\bar{y}_{cm})^2$"),
align=c("r", "r", "r", "r", "r", "r")
)
```
![Trois éléments composant une ellipse](images/Chap03/ExplicationEllipse.png){#fig-ExplicationEllipse width="35%" fig-align="center"}
::: bloc_attention
::: bloc_attention-header
::: bloc_attention-icon
:::
**Calcul des ellipses : des résultats qui varient d'un logiciel à l'autre...**
:::
::: bloc_attention-body
Il existe plusieurs solutions pour tracer une ellipse. Pour une discussion détaillée de ces différentes solutions, lisez le [court texte très intéressant de Martin Leroux](https://portailsig.org/content/qgis-des-ellipses-de-deviation-standard-sde-un-plugin-standard-deviational-ellipse-des-scrip.html).
- Ellipse de Yuill [@tveitesde].
- Ellipse basée sur la covariance implémentée dans [ArcGIS Pro](https://pro.arcgis.com/en/pro-app/3.0/tool-reference/spatial-statistics/h-how-directional-distribution-standard-deviationa.htm).
- Ellipse de distance standard implémentée dans le logiciel [CrimeStat](https://www.icpsr.umich.edu/CrimeStat/).
- Ellipse avec la correction proposée par Wang et ses collègues [-@wang2015confidence].
Notez qu'un plugin QGIS nommé *The QGIS Standard Deviational Ellipse Plugin* [@tveitesde] intègre plusieurs de ces méthodes. Les résultats varient ainsi d'un logiciel à l'autre selon la méthode implémentée. Autrement dit, pour un même jeu de données ponctuelles, les ellipses obtenues avec ArcGIS Pro, ArcMap 9.3, ArcMap 10.x et QGIS seront différentes.
**Quoi faire alors?**
Quelle que soit la méthode utilisée, l'ellipse est toujours centrée sur le point moyen et a toujours le même angle de rotation. Par contre, la taille de l'ellipse (superficie) varie. Par conséquent, si vous souhaitez comparer des ellipses différentes, assurez-vous toujours qu'elles sont toutes obtenues dans le même logiciel et avec la même solution.
:::
:::
::: bloc_aller_loin
::: bloc_aller_loin-header
::: bloc_aller_loin-icon
:::
**Calcul de l'ellipse selon la méthode implémentée dans CrimeStat**
:::
::: bloc_aller_loin-body
Ned Levine [-@levine2006crime; -@levine2021crimestat], créateur du logiciel [CrimeStat](https://www.icpsr.umich.edu/CrimeStat/), propose les formulations suivantes pour le calcul d'une ellipse :
$$
\theta = \frac{\text{arctan} \Biggl\{ \Bigl(\sum_{i=1}^nx_d^2-\sum_{i=1}^ny_d^2 \Bigl)+ \Bigr[\Bigl(\sum_{i=1}^nx_d^2-\sum_{i=1}^ny_d^2 \Bigl)^2 + 4 \Bigl(\sum_{i=1}^nx_dy_d \Bigl)^2\Bigr]^{1/2} \Biggl\}} {2 \sum_{i=1}^nx_dy_d}
$$ {#eq-CrimeStatRotation}
avec $\theta$ est la rotation de l'ellipse, $x_d = x_i-\bar{x}$ et $y_d = y_i-\bar{y}$.
$$
\sigma_x =\sqrt{2\times \frac{\sum_{i=1}^n\Bigl((x_i-\bar{x}) \text{cos}\theta-(y_i-\bar{y})\text{sin}\theta\Bigl)^2}{n-2}}
$$ {#eq-CrimeStatSigmaX}
$$
\sigma_y =\sqrt{2\times \frac{\sum_{i=1}^n\Bigl((x_i-\bar{x}) \text{sin}\theta-(y_i-\bar{y})\text{cos}\theta\Bigl)^2}{n-2}}
$$ {#eq-CrimeStatSigmaY}
$$
l_x=2\sigma_x \text{ et }l_y=2\sigma_y \text{ et }S_e=\pi\sigma_x\sigma_y
$$ {#eq-CrimeStatSuperficieLyLx}
avec $l_x$, $l_y$ et $S_e$ étant les longueurs de axes *X* et *Y* et la superficie de l'ellipse.
:::
:::
Prenons quatre situations fictives de répartition de dix personnes utilisatrices du parc de la Laurentie à Sherbrooke :
- **Situation A**. Les observations sont concentrées autour de l'aire de jeu.
- **Situation B**. Les observations sont dispersées dans la partie est du parc.
- **Situation C**. Les observations sont concentrées dans la partie nord du parc.
- **Situation D**. Les observations sont concentrées dans la partie nord du parc, excepté deux observations au sud.
![Données fictives sur des personnes utilisatrices du parc de la Laurentie à Sherbrooke (quatre situations)](images/Chap03/CartePointsABCD.png){#fig-PointsABCD width="100%" fig-align="center"}
Les cercles et les ellipses de distance standard ($ds$) centrés au centre moyen ($cm$) sont représentés à la (@fig-EllipsesCercleABCD).
![Ellipse et cercle de distance standard pour les quatre situations](images/Chap03/CartePointsABCD_DS.png){#fig-EllipsesCercleABCD width="100%" fig-align="center"}
#### Comparaison de la dispersion de deux semis de points dans deux régions différentes {#sec-03123}
Pour comparer la dispersion de deux semis de points situés dans des régions de taille différente, il convient de supprimer les effets de taille des deux régions. Pour ce faire, nous divisons la **distance standard** ou la **distance standard pondérée** par la superficie de la région. Cette approche est donc très similaire au [coefficient de variation](https://serieboldr.github.io/MethodesQuantitatives/02-univarie.html#sec-0253) en statistique univariée, soit le rapport entre l'écart-type et la moyenne.
Par exemple, si nous comparons les dispersions des personnes utilisatrices du parc de la Laurentie (0,078 ha) et parc du Mont-Bellevue (409 ha). Inévitablement, la valeur de la distance standard est plus forte pour le parc du Mont-Bellevue que celle du parc de la Laurentie. Il faut donc diviser chaque distance standard par la superficie associée.
#### Comparaison de la dispersion de deux semis de points dans la même région {#sec-03124}
Pour comparer la distribution spatiale de deux semis de points situés dans la même région, nous comparons leur cercle ou leur ellipse respective (par exemple, des points représentant des accidents l'été versus l'hiver ou encore deux espèces végétales sur le même territoire).
Une démarche similaire peut être appliquée à deux groupes de population rattachés à des entités polygonales : ils ont la même distribution spatiale si les deux ellipses de distance pondérée se juxtaposent significativement. David W.S. Wong [-@wong1999geostatistics] propose d'ailleurs un indice dénommé *S* basé sur la comparaison des deux ellipses (@eq-WongIndice2Groupes). Le numérateur représente la surface d'intersection entre les deux ellipses tandis que le dénominateur représente leur surface d'union. L'indice varie de 0 à 1, soit respectivement d'une similitude parfaite à une dissemblance la plus grande entre les deux distributions spatiales :
- Si deux groupes de population ont des distributions spatiales identiques, les ellipses sont les mêmes et donc $E_i \cap E_j = E_i \cup E_j = 1$ et $S_{ij} = 1 - 1 = 0$.
- Si les deux groupes de population ont des distributions spatiales totalement différentes, les ellipses ne se touchent pas, alors $E_i \cap E_j = 0$ et la valeur de $S = 1 - 0 = 1$.
Bien évidemment, cet indice peut être étendu pour comparer les distributions de plus de deux groupes de population simultanément (@eq-WongIndiceNGroupes).
$$
S_{ij}=1-\frac{E_i \cap E_j}{E_i \cup E_j}
$$ {#eq-WongIndice2Groupes}
$$
S=1-\frac{E_1 \cap E_2 \cap E_3 \cap \text{…} \cap E_n}{E_1 \cup E_2 \cup E_3 \cup \text{…} \cup E_n}
$$ {#eq-WongIndiceNGroupes}
**Voyons un exemple concret** : calculons l'indice de Wong [-@wong1999geostatistics] (@eq-WongIndice2Groupes) pour les ellipses de distances standards pondérées par les effectifs de propriétaires et de locataires par secteur de recensement pour la ville de Sherbrooke en 2021 (@fig-CarteProprioLoctaires). D'emblée, nous constatons que les propriétaires ont une distribution plus dispersée que celle des locataires plus présents dans le centre de la ville.
```{r}
#| echo: false
#| message: false
#| warning: false
#| label: fig-CarteProprioLoctaires
#| fig-align: center
#| fig-cap: Propriétaires et locataires dans la ville de Sherbrooke (avec ellipse de distance standard), 2021
#| out-width: 85%
library(sf)
library(tmap)
tmap_mode("plot")
SR <- st_read(dsn = "data/chap03/Recen2021Sherbrooke.gpkg",
layer = "DR_SherbSRDonnees2021", quiet=TRUE)
E1 <- st_read(dsn = "data/chap03/EllipseProprio.shp", quiet=TRUE)
E2 <- st_read(dsn = "data/chap03/EllipseLocataire.shp", quiet=TRUE)
## Carte 1 : propriétaires
Carte1 = tm_shape(SR)+
tm_polygons(col="whitesmoke", border.col = "grey30", lwd = 1)+
tm_bubbles(size = "Proprietaire", border.col = "black",
col = "aquamarine3", title.size = "Nombre", scale = 1.5)+
tm_shape(E1)+ tm_borders(col="tomato3", lwd = 3)+
tm_layout(main.title = "A. Propriétaires", main.title.size = .9, frame = FALSE)
## Carte 2 : locataires
Carte2 = tm_shape(SR)+
tm_polygons(col="whitesmoke", border.col = "grey30", lwd = 1)+
tm_bubbles(size = "Locataire", border.col = "black",
col = "cadetblue3", title.size = "Nombre", scale = 1.5)+
tm_shape(E2)+ tm_borders(col="tomato3", lwd = 3)+
tm_layout(main.title = "B. Locataires", main.title.size = .9, frame = FALSE)+
tm_credits("Source : recensement de 2021, Statistique Canada\nAuteur : Jéremy Lacartemplace.",
position = c("right", "bottom"), size = 0.7, align = "right")
## Combinaison des deux cartes
tmap_arrange(Carte1, Carte2, ncol = 2, nrow = 1)
```
Le code suivant permet d'obtenir l'indice de Wong [-@wong1999geostatistics].
```{r}
#| echo: true
#| message: false
#| warning: false
## Importation des deux ellipses
E1 <- st_read(dsn = "data/chap03/EllipseProprio.shp", quiet=TRUE)
E2 <- st_read(dsn = "data/chap03/EllipseLocataire.shp", quiet=TRUE)
## Intersection
Inter <- st_intersection(E1, E2)
## Union
Union <- st_union(E1, E2)
## Calcul de l'indice de Wong
Wong <- 1 - ( as.numeric(st_area(Inter)) / as.numeric(st_area(Union)))
print(paste0("Valeur de l'indice de Wong : ",round(Wong,3)))
```
### Mise en œuvre de l'analyse centrographique dans R {#sec-0313}
#### Calcul de mesures non pondérées {#sec-03131}
Pour illustrer la mise en œuvre des différentes mesures de l'analyse centrographique dans R, nous utilisons un jeu de données ouvertes sur les [incidents de sécurité publique de la ville de Sherbrooke](https://donneesouvertes-sherbrooke.opendata.arcgis.com/datasets/64d19d62f0804f5896e4b24c32aea49d_0/explore?location=45.403468%2C-71.960143%2C12.00). Dans le code ci-dessous, nous importons les données et constituons une couche `sf` par année (2019 à 2022) et extrayons les coordonnées géographiques.
```{r}
#| echo: true
#| message: false
#| warning: false
library(sf)
library(tmap)
## Importation des données
Arrondissements <- st_read(dsn = "data/chap03/Arrondissements.shp", quiet=TRUE)
Incidents <- st_read(dsn = "data/chap03/IncidentsSecuritePublique.shp", quiet=TRUE)
## Changement de projection
Arrondissements <- st_transform(Arrondissements, crs = 3798)
Incidents <- st_transform(Incidents, crs = 3798)
## Extaction des méfaits
Mefaits <- subset(Incidents, DESCRIPTIO == "Méfait")
# Méfaits par année
M2019 <- subset(Mefaits, ANNEE==2019)
M2020 <- subset(Mefaits, ANNEE==2020)
M2021 <- subset(Mefaits, ANNEE==2021)
M2022 <- subset(Mefaits, ANNEE==2022)
# Coordonnées géographiques
xy.2019 <- st_coordinates(M2019)
xy.2020 <- st_coordinates(M2020)
xy.2021 <- st_coordinates(M2021)
xy.2022 <- st_coordinates(M2022)
```
Les méfaits par année sont présentés à la @fig-CarteMefaits.
```{r}
#| echo: false
#| message: false
#| warning: false
#| label: fig-CarteMefaits
#| fig-align: center
#| fig-cap: Localisation des méfaits par année, ville de Sherbrooke, 2021
#| out-width: 85%
Carte2019 <- tm_shape(Arrondissements)+tm_borders(lwd = 1, col="black")+tm_fill(col="wheat")+
tm_shape(M2019)+ tm_dots(shape = 21, size=.2, col= "#1b9e77", title ="2019")+
tm_layout(frame=FALSE, title = "2019")
Carte2020 <- tm_shape(Arrondissements)+tm_borders(lwd = 1, col="black")+tm_fill(col="wheat")+
tm_shape(M2020)+ tm_dots(shape = 21, size=.2, col= "#d95f02", title ="2020")+
tm_layout(frame=FALSE, title = "2020")
Carte2021 <- tm_shape(Arrondissements)+tm_borders(lwd = 1, col="black")+tm_fill(col="wheat")+
tm_shape(M2021)+ tm_dots(shape = 21, size=.2, col= "#7570b3", title ="2021")+
tm_layout(frame=FALSE, title = "2021")
Carte2022 <- tm_shape(Arrondissements)+tm_borders(lwd = 1, col="black")+tm_fill(col="wheat")+
tm_shape(M2022)+ tm_dots(shape = 21, size=.2, col= "#e7298a", title ="2022")+
tm_layout(frame=FALSE, title = "2022")
tmap_arrange(Carte2019, Carte2020, Carte2021, Carte2022, ncol =2, nrow=2)
```
**Centre moyen**
Avec la fonction `mean`, nous pouvons calculer les valeurs moyennes sur les coordonnées *X* et *Y*, puis créer un objet `sf` avec les centres moyens.
```{r}
#| echo: true
#| message: false
#| warning: false
## Récupération de la projection cartographique dans une variable
ProjCarto <- st_crs(Mefaits)
## Calcul du centre moyen pour une année (2019)
print(c(mean(xy.2019[,1]), mean(xy.2019[,2])))
## Calcul pour toutes les années
# vecteur pour les moyennes des X
X.moy <- c(mean(xy.2019[,1]), mean(xy.2020[,1]), mean(xy.2021[,1]), mean(xy.2022[,1]))
# Vecteur pour les moyennes des Y
Y.moy <- c(mean(xy.2019[,2]), mean(xy.2020[,2]), mean(xy.2021[,2]), mean(xy.2022[,2]))
# Enregistrement dans un objet sf
CentreMoyen <- data.frame(Annee = c("2019", "2020", "2021", "2022"),
X = X.moy,
Y = Y.moy,
CMx = X.moy,
CMy = Y.moy)
CentreMoyen <- st_as_sf(CentreMoyen, coords = c("X", "Y"), crs = ProjCarto)
# Affichage des résultats
print(CentreMoyen)
```
**Point central**
Le code ci-dessous illustre comment identifier le point central, qui fait partie du jeu de données, pour l'année 2019.
```{r}
#| echo: true
#| message: false
#| warning: false
## Calcul de la matrice de distances entre les points de l'année 2019
DistMatrice2019 <- as.matrix(dist(xy.2019, method = "euclidean", diag = TRUE, upper = TRUE))
## Somme de chaque ligne de la matrice, soit la somme des distances à tous les autres points
M2019$DistATous <- rowSums(DistMatrice2019)
## Sélection du point avec plus petite distance à tous les autres
PointCentral2019 <- subset(M2019, M2019$DistATous==min(M2019$DistATous))
```
**Distance standard sur les coordonnées *X* et *Y* et distance standard combinée**
Le code ci-dessous permet de calculer les trois distances standards.
```{r}
#| echo: true
#| message: false
#| warning: false
## Calcul de la distance standard pour une année (2019)
# Distance standard sur les coordonnées X et Y
c(sqrt(mean((xy.2019[,1] - mean(xy.2019[,1]))^2)),
sqrt(mean((xy.2019[,2] - mean(xy.2019[,2]))^2)))
# Distance standard
sqrt(mean((xy.2019[,1] - mean(xy.2019[,1]))**2 +
(xy.2019[,2] - mean(xy.2019[,2]))**2))
## Calcul pour toutes les années et enregistrement des centres moyens dans de nouveaux champs
CentreMoyen$DS.X <- c(sqrt(mean((xy.2019[,1] - mean(xy.2019[,1]))^2)),
sqrt(mean((xy.2020[,1] - mean(xy.2020[,1]))^2)),
sqrt(mean((xy.2021[,1] - mean(xy.2021[,1]))^2)),
sqrt(mean((xy.2022[,1] - mean(xy.2022[,1]))^2)))
CentreMoyen$DS.Y <- c(sqrt(mean((xy.2019[,2] - mean(xy.2019[,2]))^2)),
sqrt(mean((xy.2020[,2] - mean(xy.2020[,2]))^2)),
sqrt(mean((xy.2021[,2] - mean(xy.2021[,2]))^2)),
sqrt(mean((xy.2022[,2] - mean(xy.2022[,2]))^2)))
CentreMoyen$DS <- c(sqrt(mean((xy.2019[,1] - mean(xy.2019[,1]))**2 +
(xy.2019[,2] - mean(xy.2019[,2]))**2)),
sqrt(mean((xy.2020[,1] - mean(xy.2020[,1]))**2 +
(xy.2020[,2] - mean(xy.2020[,2]))**2)),+
sqrt(mean((xy.2021[,1] - mean(xy.2021[,1]))**2 +
(xy.2021[,2] - mean(xy.2021[,2]))**2)),+
sqrt(mean((xy.2022[,1] - mean(xy.2022[,1]))**2 +
(xy.2022[,2] - mean(xy.2022[,2]))**2)))
## Visualisation des résultats
head(CentreMoyen)
```
**Représentations graphiques de la dispersion**
Une fois que la couche `sf` des centres moyens avec les trois champs pour la distance standard est créée, il suffit de tracer un rectangle et un cercle de distance standard.
```{r}
#| echo: true
#| message: false
#| warning: false
## Enveloppe convexe
sf.Enveloppes <- st_sf(data.frame(Id=c("2019", "2020", "2021", "2022")),
geometry = c(st_convex_hull(st_union(M2019)),
st_convex_hull(st_union(M2020)),
st_convex_hull(st_union(M2021)),
st_convex_hull(st_union(M2022))))
## Rectangle avec les distances standards sur les coordonnées X et Y
#' Fonction pour tracer le rectangle
#' @param MoyX coordonnées X du centre moyen.
#' @param MoyY coordonnées Y du centre moyen.
#' @param SDx distance standard sur les coordonnées X.
#' @param SDy distance standard sur les coordonnées Y.
#' @param crs projection cartographique.
CreationRec <- function(MoyX, MoyY, SDx, SDy, ProjCarto){
pt1 = c(MoyX - SDx, MoyY - SDy)
pt2 = c(MoyX - SDx, MoyY + SDy)
pt3 = c(MoyX + SDx, MoyY + SDy)
pt4 = c(MoyX + SDx, MoyY - SDy)
Rectangle = st_polygon(list(rbind(pt1, pt2, pt3, pt4, pt1)))
Rectangle = st_sfc(Rectangle)
st_crs(Rectangle) = ProjCarto
return(Rectangle)
}
MoyX <- CentreMoyen$CMx
MoyY <- CentreMoyen$CMy
SDx <- CentreMoyen$DS.X
SDy <- CentreMoyen$DS.Y
sf.Rectangles <- st_sf(data.frame(Id=c("2019", "2020", "2021", "2022")),
geometry = c(CreationRec(MoyX[1], MoyY[1], SDx[1], SDy[1], ProjCarto),
CreationRec(MoyX[2], MoyY[2], SDx[2], SDy[2], ProjCarto),
CreationRec(MoyX[3], MoyY[3], SDx[3], SDy[3], ProjCarto),
CreationRec(MoyX[4], MoyY[4], SDx[4], SDy[4], ProjCarto)))
## Cercle de distance standard avec la fonction st_buffer
sf.CercleDS <- st_buffer(CentreMoyen, dist = CentreMoyen$DS)
```
Le calcul de l'ellipse est un peu plus complexe. Par conséquent, nous avons écrit deux fonctions :
- `CreateEllipse` qui construit une ellipse à partir d'une couche `sf` de points.
- `CreateEllipse_gp` qui construit des ellipses à partir d'une couche `sf` de points en fonction d'une colonne indiquant différents groupes de points (ici, les différentes années).
```{r}
#| echo: true
#| message: false
#| warning: false
## Appel des deux fonctions dans le fichier ellipses.R
source("code_complementaire/ellipses.R")
## Création d'une ellipse pour une année
sf.Ellipse2019 <- CreateEllipse(M2019)
## Création de plusieurs ellipses regroupées selon les différentes années
sf.Ellipse <- CreateEllipse_gp(points = Mefaits, group = "ANNEE")
head(sf.Ellipse)
```
Les quatre représentations de la dispersion sont présentées à la @fig-RepresentationDispersion : 1) enveloppe convexe (gris), 2) cercle de distance standard (bleu), 3) rectangle de distance standard sur les X et Y (noir) et 4) ellipse de distance standard (rouge).
```{r}
#| echo: false
#| message: false
#| warning: false
#| label: fig-RepresentationDispersion
#| fig-align: center
#| fig-cap: Représentations de la dispersion des méfaits pour les quatre années
#| out-width: 85%
tmap_mode("plot")
Carte2019 <- tm_shape(Arrondissements)+tm_borders(lwd = 1, col="black")+tm_fill(col="wheat")+
tm_shape(M2019)+ tm_dots(shape = 21, size=.2, col= "#1b9e77", title ="2019")+
tm_shape(sf.Enveloppes[1,]) +tm_borders(lwd = 3, col="gray")+
tm_shape(sf.Rectangles[1,]) +tm_borders(lwd = 3, col="black")+
tm_shape(sf.Ellipse[1,]) +tm_borders(lwd = 3, col="red")+
tm_shape(sf.CercleDS[1,]) +tm_borders(lwd = 3, col="blue")+
tm_layout(frame=FALSE, title = "2019")
Carte2020 <- tm_shape(Arrondissements)+tm_borders(lwd = 1, col="black")+tm_fill(col="wheat")+
tm_shape(M2020)+ tm_dots(shape = 21, size=.2, col= "#d95f02", title ="2020")+
tm_shape(sf.Enveloppes[2,]) +tm_borders(lwd = 3, col="gray")+
tm_shape(sf.Rectangles[2,]) +tm_borders(lwd = 3, col="black")+
tm_shape(sf.Ellipse[2,]) +tm_borders(lwd = 3, col="red")+
tm_shape(sf.CercleDS[2,]) +tm_borders(lwd = 3, col="blue")+
tm_layout(frame=FALSE, title = "2020")
Carte2021 <- tm_shape(Arrondissements)+tm_borders(lwd = 1, col="black")+tm_fill(col="wheat")+
tm_shape(M2021)+ tm_dots(shape = 21, size=.2, col= "#7570b3", title ="2021")+
tm_shape(sf.Enveloppes[3,]) +tm_borders(lwd = 3, col="gray")+
tm_shape(sf.Rectangles[3,]) +tm_borders(lwd = 3, col="black")+
tm_shape(sf.Ellipse[3,]) +tm_borders(lwd = 3, col="red")+
tm_shape(sf.CercleDS[3,]) +tm_borders(lwd = 3, col="blue")+
tm_layout(frame=FALSE, title = "2021")
Carte2022 <- tm_shape(Arrondissements)+tm_borders(lwd = 1, col="black")+tm_fill(col="wheat")+
tm_shape(M2022)+ tm_dots(shape = 21, size=.2, col= "#e7298a", title ="2022")+
tm_shape(sf.Enveloppes[4,]) +tm_borders(lwd = 3, col="gray")+
tm_shape(sf.Rectangles[4,]) +tm_borders(lwd = 3, col="black")+
tm_shape(sf.Ellipse[4,]) +tm_borders(lwd = 3, col="red")+
tm_shape(sf.CercleDS[4,]) +tm_borders(lwd = 3, col="blue")+
tm_layout(frame=FALSE, title = "2022")
tmap_arrange(Carte2019, Carte2020, Carte2021, Carte2022, ncol =2, nrow=2)
```
#### Calcul de mesures pondérées {#sec-03132}
Pour illustrer le calcul des mesures pondérées, nous utilisons des données sur les effectifs des premier et dernier déciles de revenu après impôt des familles économiques pour les secteurs de recensement de la ville de Sherbrooke en 2021 (@fig-CartesDecilesPremierDernier).
```{r}
#| echo: false
#| message: false
#| warning: false
#| label: fig-CartesDecilesPremierDernier
#| fig-align: center
#| fig-cap: Déciles extrêmes de revenu après impôt des familles économiques
#| out-width: 85%
library(sf)
library(tmap)
tmap_mode("plot")
dfdecile <- read.csv("data/chap03/DataDecilesSR.csv", header = TRUE, sep = ",")
SR <- st_read(dsn = "data/chap03/Recen2021Sherbrooke.gpkg",
layer = "DR_SherbSRDonnees2021", quiet=TRUE)
dfdecile$SRIDU <- substr(dfdecile$SRIDU, 1, 10)
SR <- merge(SR, dfdecile, by = "SRIDU")
## Carte 1 : premier décile
Carte1 = tm_shape(SR)+
tm_polygons(col="whitesmoke", border.col = "grey30", lwd = 1)+
tm_bubbles(size = "D1", border.col = "black",
col = "aquamarine3", title.size = "Nombre", scale = 1.5)+
tm_layout(main.title = "A. Premier décile (le plus pauvre)",
main.title.size = .9, frame = FALSE)
## Carte 2 : dernier décile
Carte2 = tm_shape(SR)+
tm_polygons(col="whitesmoke", border.col = "grey30", lwd = 1)+
tm_bubbles(size = "D10", border.col = "black",
col = "cadetblue3", title.size = "Nombre", scale = 1.5)+
tm_layout(main.title = "B. Dernier décile (le plus riche)",
main.title.size = .9, frame = FALSE)+
tm_credits("Source : recensement de 2021, Statistique Canada\nAuteur : Jéremy Lacartemplace.",
position = c("right", "bottom"), size = 0.7, align = "right")
## Combinaison des deux cartes
tmap_arrange(Carte1, Carte2, ncol = 2, nrow = 1)
```
Le code suivant permet d'importer et de structurer les données, puis de calculer les différentes mesures (centre moyen pondéré et distance standard pondérée).
```{r}
#| echo: true
#| message: false
#| warning: false
#| label: fig-MesuresPonderees
#| fig-align: center
#| fig-cap: Cercles de distance standard et ellipses pondérés
#| out-width: 85%
## Importation et structuration des données
dfdecile <- read.csv("data/chap03/DataDecilesSR.csv", header = TRUE, sep = ",")
dfdecile$SRIDU <- substr(dfdecile$SRIDU, 1, 10)
SR <- st_read(dsn = "data/chap03/Recen2021Sherbrooke.gpkg",
layer = "DR_SherbSRDonnees2021", quiet=TRUE)
SR <- merge(SR[,c("SRIDU")], dfdecile, by = "SRIDU")
ProjCarto <- st_crs(SR)
## Coordonnées géographiques des secteurs de recensement
xy <- st_coordinates(st_point_on_surface(SR))
## Pondérations pour les deux déciles
wd1 <- SR$D1
wd10 <- SR$D10
## Sommes des pondérations
swd1 <- sum(wd1)
swd10 <- sum(wd10)
## Calcul du centre pondéré
XmoyD1 <- sum(xy[,1]*wd1) / swd1
XmoyD10 <- sum(xy[,1]*wd10) / swd10
YmoyD1 <- sum(xy[,2]*wd1) / swd1
YmoyD10 <- sum(xy[,2]*wd10) / swd10
CentreMoyenPond <- data.frame(Decile = c("Premier", "Dernier"),
X = c(XmoyD1, XmoyD10),
Y = c(YmoyD1, YmoyD10),
CMwx = c(XmoyD1, XmoyD10),
CMwy = c(YmoyD1, YmoyD10))
CentreMoyenPond <- st_as_sf(CentreMoyenPond, coords = c("X", "Y"), crs = ProjCarto)
## Calcul de la distance standard pondérée
sdD1 <- sqrt((sum(wd1*(xy[,1]- XmoyD1)^2) / swd1) + (sum(wd1*(xy[,2]- YmoyD1)^2) / swd1))
sdD10 <- sqrt((sum(wd10*(xy[,1]- XmoyD10)^2) / swd1) + (sum(wd10*(xy[,2]- YmoyD10)^2) / swd10))
## Zones tampons avec la distance standard pondérée
CentreMoyenPond$SDw <- c(sdD1, sdD10)
sf.CercleDSW <- st_buffer(CentreMoyenPond, dist = CentreMoyenPond$SDw)
## Calcul de l'ellipse pondérée pour le premier décile
SR.points <- st_point_on_surface(SR)
ellipse.D1 <- CreateEllipse(SR.points, w = SR.points$D1)
ellipse.D10 <- CreateEllipse(SR.points, w = SR.points$D10)
# Carte 1 : premier décile
Carte1 = tm_shape(SR)+
tm_polygons(col="whitesmoke", border.col = "grey30", lwd = 1)+
tm_shape(CentreMoyenPond[1,])+
tm_dots(size = .5, col="black")+
tm_shape(sf.CercleDSW[1,])+
tm_borders(col="blue", lwd = 2)+
tm_shape(ellipse.D1)+
tm_borders(col="red", lwd = 2)+
tm_layout(main.title = "A. Premier décile (le plus pauvre)",
main.title.size = .9, frame = FALSE)
# Carte 2 : dernier décile
Carte2 = tm_shape(SR)+
tm_polygons(col="whitesmoke", border.col = "grey30", lwd = 1)+
tm_shape(CentreMoyenPond[2,])+
tm_dots(size = .5, col="black")+
tm_shape(sf.CercleDSW[2,])+
tm_borders(col="red", lwd = 2)+
tm_shape(ellipse.D10)+
tm_borders(col="blue", lwd = 2)+
tm_layout(main.title = "B. Dernier décile (le plus riche)",
main.title.size = .9, frame = FALSE)+
tm_credits("Source : recensement de 2021, Statistique Canada\nAuteur : Jéremy Lécartemplace.",
position = c("right", "bottom"), size = 0.7, align = "right")
# Combinaison des deux cartes
tmap_arrange(Carte1, Carte2, ncol = 2, nrow = 1)
```
## Forme d'un semis de points {#sec-033}
Étudier la forme d'un semis de points, c'est vouloir décrire l'arrangement spatial et l'espacement des points dans une région donnée. Autrement dit, l'objectif est de répondre à la question suivante : comment se répartissent les points dans une région donnée? Nous distinguons habituellement trois types de distribution spatiale d'un semis de points (@fig-FormeSemisDePoints3Types) :
1. **Distribution dispersée** quand les points du semis sont régulièrement espacés.
2. **Distribution aléatoire** quand la distribution des points n'est nullement guidée par des considérations géographiques. Autrement dit, chaque point du semis a la même probabilité d'être situé dans n'importe quelle partie de la zone d'étude.
3. **Distribution concentrée** quand il existe des regroupements de points dans une ou plusieurs parties de la région d'étude. Par exemple, les musées et les théâtres sont habituellement concentrés dans les parties centrales des métropoles.
![Trois types de distribution spatiale d'un semis de points](images/Chap03/FigureTroisTypesDistributions.png){#fig-FormeSemisDePoints3Types width="65%" fig-align="center"}
::: bloc_attention
::: bloc_attention-header
::: bloc_attention-icon
:::
**Deux grandes familles pour décrire la forme d'un semis de points**
:::
::: bloc_attention-body
1. Celles basées sur la distance (l'indice du plus proche voisin, fonctions *K* et *L* de Ripley) ([section @sec-0331]).
2. Celles basées sur la densité (méthode des quadrats avec différents tests statistiques) ([section @sec-0332]).
:::
:::
### Méthode du plus proche voisin {#sec-0331}
Le principe de base de cette méthode est fort simple et se décompose en quatre étapes :
1. Mesurer, pour chaque point du semis, la distance le séparant du point le plus proche, puis calculer la distance moyenne du point le plus proche (@eq-PlusProcheVoisinRobs).
2. Calculer la moyenne attendue du point le plus proche pour une dispersion aléatoire (@eq-PlusProcheVoisinR).
3. Calculer l'indice du plus proche voisin, soit le ratio entre la distance observée et la distance aléatoire (@eq-PlusProcheVoisinRExp). L'indice *R* s'interprète alors comme suit :
- Si *R* est égal à 1, la dispersion du semis de points est aléatoire.
- Si *R* est inférieur à 1, la distribution du semis de points tend vers la concentration (avec une concentration absolue quand *R* = 0; tous les points ont les mêmes coordonnées géographiques).
- Si *R* est supérieur à 1, la distribution du semis de points tend vers la dispersion.
4. Calculer les valeurs de *Z* et de *p* pour déterminer si la valeur de *R* obtenue est significative (@eq-PlusProcheVoisinZ).
$$
R_{o}= \frac{\sum_{i=1}^n d_i}{n}
$$ {#eq-PlusProcheVoisinRobs}
$$
R_{a}= \frac{1}{2 \sqrt{(n/S)}}
$$ {#eq-PlusProcheVoisinRExp}
$$
R = \frac{R_{o}}{R_{a}}
$$ {#eq-PlusProcheVoisinR}
$$
Z = \frac{R_o-R_a}{SE} \text{, } SE = \frac{0.26136}{\sqrt{(n^2/S)}} \text{ avec :}
$$ {#eq-PlusProcheVoisinZ}
- $n$, nombre de points.
- $d_i$, distance séparant le point *i* de son voisin le plus proche.
- $S$, superficie de l'espace d'étude.
Le code ci-dessous permet de mettre en œuvre la méthode du plus proche voisin pour les méfaits pour les quatre années.
```{r}
#| echo: true
#| message: false
#| warning: false
library(spatstat)
library(ggplot2)
## Indice du plus proche voisin : R observé (équation 3.20)
# le paramètre k indique le nombre de plus proches voisins
Robs2019 <- mean(nndist(st_coordinates(M2019), k=1))
Robs2020 <- mean(nndist(st_coordinates(M2020), k=1))
Robs2021 <- mean(nndist(st_coordinates(M2021), k=1))
Robs2022 <- mean(nndist(st_coordinates(M2022), k=1))
## Indice du plus proche voisin : R attendu (distribution aléatoire) (équation 3.21)
# Attention, il faut spéficier S, la superficie de l'espace d'étude
Arrondissements <- st_read(dsn = "data/chap03/Arrondissements.shp", quiet=TRUE)
Arrondissements <- st_transform(Arrondissements, crs = 3798)
S <- as.numeric(st_area(st_union(Arrondissements)))
# Nombre de points par année
N2019 <- nrow(M2019)
N2020 <- nrow(M2020)
N2021 <- nrow(M2021)
N2022 <- nrow(M2022)
# Calcul de Ra
Ra2019 <- 1 / (2 * sqrt(N2019 / S))
Ra2020 <- 1 / (2 * sqrt(N2020 / S))
Ra2021 <- 1 / (2 * sqrt(N2021 / S))
Ra2022 <- 1 / (2 * sqrt(N2022 / S))
## Calculons le R
# Création d'un DataFrame
IndicePPV <- data.frame(id = c("2019", "2020", "2021", "2022"),
points = c(N2019, N2020, N2021, N2022),
Superficie = c(S, S, S, S),
Robs = c(Robs2019, Robs2020, Robs2021, Robs2022),
Rattendu = c(Ra2019, Ra2020, Ra2021, Ra2022))
# Calcul du R (équation 3.22)
IndicePPV$R <- IndicePPV$Robs / IndicePPV$Rattendu
# Calcul du Z (équation 3.23)
IndicePPV$SE <- 0.26136 / sqrt(IndicePPV$points^2 / IndicePPV$Superficie)
IndicePPV$Z <- (IndicePPV$Robs - IndicePPV$Rattendu) / IndicePPV$SE
IndicePPV$P <- round(2*pnorm(q=abs(IndicePPV$Z), lower.tail=FALSE),3)
print(IndicePPV)
```
**Interprétation des résultats**
Analysons les différentes colonnes du @tbl-TableauMPPV :
- **points (n) :** il y a respectivement 251, 383, 344 et 220 méfaits pour les années 2019 à 2022.
- ***R*** **observé :** en moyenne, un méfait est distant de 252, 184, 227 et 251 mètres du méfait le plus proche pour les quatre années.