W poprzednim ćwiczeniu dane z bloków spisowych zostały wykorzystane do obliczenia jednej wartości wskaźnika dla całego hrabstwa. W niniejszym ćwiczeniu dane z bloków spisowych zostaną użyte do wyliczenia wskaźnika H oraz E dla każdego obszaru spisowego.
Obliczenia dla analizowanego hrabstwa należy wykonać wykorzystując dane przygotowane w ćwiczeniu 2 i zapisane w pliku dane_attr/[nazwa_hrabstwa]_[rok]_blocks_attr.csv
library(kableExtra)
<- c("WHITE", "BLACK", "ASIAN", "HISPANIC", "AM", "OTHER") list_race
#proportions - wektor zawierający odsetek poszczególnych ras w ogólnej liczbie ludności (wartości od 0 do 1)
#base - podstawa logarytmu, domyslnie exp(1) oznacza obliczenie logarytmu naturalnego
= function(proportions, base = exp(1)) {
entropy_fnc = -sum(ifelse(proportions > 0, proportions * log(proportions, base = base), 0))
entr return(entr)
}
Analiza i wizualizacja segregacji rasowej oraz zróżnicowania rasowego na poziomie obszarów spisowych.
Wykorzystując dane dla wybranego hrabstwa dla analizowanego roku, oblicz miary segregacji rasowej (\(H\)) oraz zróżnicowania rasowego (\(E\), \(E_{std}\)) na poziomie obszarów spisowych. Na podstawie wartości \(H\) oraz \(E_{std}\) wykonaj klasyfikację typów struktury rasowo-etnicznej. Opracowanie wyników powinno zawierać:
Wizualizację wyników można wykonać w R lub w QGIS.
Tabela przedstawia dane dotyczące struktury rasowo-etnicznej dla 16 bloków spisowych dla 6 kategorii rasowo-etnicznych (WHITE, BLACK, ASIAN, HISPANIC, NATIVE AMERICAN, OTHER RACE). Dane te można zagregować do dwóch obszarów spisowych (pole TRACTA -> 12301 oraz 12302).
<- read.csv("data/cw2/ex.csv") dat
GISJOIN | GISJOIN_T | COUNTY_CODE | STATEA | COUNTYA | TRACTA | BLOCKA | WHITE | BLACK | ASIAN | AM | OTHER | HISPANIC | POP |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
G06007500123011000 | G0600750012301 | 6075 | 6 | 75 | 12301 | 1000 | 28 | 11 | 25 | 2 | 2 | 5 | 73 |
G06007500123011001 | G0600750012301 | 6075 | 6 | 75 | 12301 | 1001 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
G06007500123011002 | G0600750012301 | 6075 | 6 | 75 | 12301 | 1002 | 22 | 8 | 90 | 1 | 5 | 2 | 128 |
G06007500123011003 | G0600750012301 | 6075 | 6 | 75 | 12301 | 1003 | 5 | 2 | 4 | 0 | 0 | 4 | 15 |
G06007500123011004 | G0600750012301 | 6075 | 6 | 75 | 12301 | 1004 | 1 | 2 | 0 | 0 | 0 | 1 | 4 |
G06007500123011005 | G0600750012301 | 6075 | 6 | 75 | 12301 | 1005 | 395 | 211 | 234 | 7 | 37 | 258 | 1142 |
G06007500123011006 | G0600750012301 | 6075 | 6 | 75 | 12301 | 1006 | 43 | 10 | 93 | 0 | 4 | 9 | 159 |
G06007500123012000 | G0600750012301 | 6075 | 6 | 75 | 12301 | 2000 | 372 | 72 | 401 | 6 | 41 | 321 | 1213 |
G06007500123021000 | G0600750012302 | 6075 | 6 | 75 | 12302 | 1000 | 453 | 55 | 259 | 11 | 46 | 118 | 942 |
G06007500123021001 | G0600750012302 | 6075 | 6 | 75 | 12302 | 1001 | 368 | 72 | 220 | 3 | 42 | 116 | 821 |
G06007500123022000 | G0600750012302 | 6075 | 6 | 75 | 12302 | 2000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
G06007500123022001 | G0600750012302 | 6075 | 6 | 75 | 12302 | 2001 | 60 | 18 | 31 | 0 | 4 | 26 | 139 |
G06007500123022002 | G0600750012302 | 6075 | 6 | 75 | 12302 | 2002 | 123 | 13 | 269 | 1 | 8 | 34 | 448 |
G06007500123022003 | G0600750012302 | 6075 | 6 | 75 | 12302 | 2003 | 111 | 9 | 36 | 1 | 7 | 27 | 191 |
G06007500123022004 | G0600750012302 | 6075 | 6 | 75 | 12302 | 2004 | 134 | 71 | 136 | 5 | 10 | 35 | 391 |
G06007500123022005 | G0600750012302 | 6075 | 6 | 75 | 12302 | 2005 | 58 | 4 | 60 | 1 | 2 | 16 | 141 |
<- aggregate(.~GISJOIN_T, dat[, c("GISJOIN_T", list_race, "POP")], FUN=sum) dat_ct
GISJOIN_T | WHITE | BLACK | ASIAN | HISPANIC | AM | OTHER | POP |
---|---|---|---|---|---|---|---|
G0600750012301 | 866 | 316 | 847 | 600 | 16 | 89 | 2734 |
G0600750012302 | 1307 | 242 | 1011 | 372 | 22 | 119 | 3073 |
Obliczenie miar segregacji wymaga podzielenia obszaru analizy na mniejsze jednostki. W poprzednich przykładach 1) obszar analizy podzielony został na bloki spisowe i na tej podstawie obliczony był jeden wskaźnik teorii informacji dla całego obszaru. 2) obszar analizy podzielony został na obszary spisowe (census tract) i na tej podstawie obliczony był jeden wskaźnik teorii informacji dla całego obszaru.
W poniższym przykładzie miary segregacji (wskaźnik teorii informacji H) zostaną obliczone dla każdego obszaru spisowego oddzielnie. Aby to było możliwe każdy obszar musi zostać podzielony na bloki spisowe, a następnie używając danych z bloków spisowych zostanie policzony wskaźnik H dla każdego obszaru spisowego. Obliczenie wskaźników segregacji dla obszarów spisowych pozwala na przeanalizowanie segregacji rasowej na poziomie lokalnym, wewnątrz miasta.
Wskaźnik teorii informacji \(H\) obliczany jest według wzoru:
\[H = \sum_{i=1}^{N}\left [ \frac{t_{i}(E - E_{i})}{ET} \right ]\]
Na potrzeby obliczeń wykonywanych w R wzór ten można zapisać następująco:
\[H = \sum_{i=1}^{N}\left [ \frac{pop_{i}(ent - ent_{i})}{ent\times pop} \right ]\] W przypadku obliczania wskaźnika \(H\) dla poszczególnych obszarów spisowych podzielonych na bloki spisowe:
#utworzenie ramki danych zawierajacej identyfikator obszaru spisowego (GISJOINT) oraz ogólną liczbę ludności dla każdego obszaru spisowego.
<- data.frame(GISJOIN_T = dat_ct$GISJOIN_T, pop = dat_ct$POP)
out_ct
#obliczenie odsetka ras dla poszczegolnych obszarow spisowych (dane wejsciowe do obliczenia entropii)
<- dat_ct[,list_race]/dat_ct$POP
perc_ct
#obliczenie entopii dla każdego obszaru spisowego oraz dodanie jej do obiektu out_ct
$ent <- apply(perc_ct, 1, entropy_fnc) out_ct
#obiekt out_ct zawiera identyfikator obszaru spisowego, liczbę ludności w obszarze spisowym (pop) oraz entropię obszaru spisowego (ent)
out_ct
## GISJOIN_T pop ent
## 1 G0600750012301 2734 1.450987
## 2 G0600750012302 3073 1.346376
Obiekt out_block zawiera dane dla poszczególnych bloków spisowych: GISJOIN - identyfikator bloku spisowego, GISJOIN_T - identyfikator obszaru spisowego, pop_i - ogólna liczba ludności w bloku spisowym.
<- data.frame(GISJOIN = dat$GISJOIN, GISJOIN_T = dat$GISJOIN_T, pop_i = dat$POP)
out_block head(out_block)
## GISJOIN GISJOIN_T pop_i
## 1 G06007500123011000 G0600750012301 73
## 2 G06007500123011001 G0600750012301 0
## 3 G06007500123011002 G0600750012301 128
## 4 G06007500123011003 G0600750012301 15
## 5 G06007500123011004 G0600750012301 4
## 6 G06007500123011005 G0600750012301 1142
#obliczenie odsetka wg ras dla każdego bloku (dane wejsciowe do obliczenia entropii dla bloku)
<- dat[,list_race]/dat$POP
perc_block is.na(perc_block)] <- 0 perc_block[
# obliczenie entropii dla każdego bloku
$ent_i <- apply(perc_block, 1, entropy_fnc)
out_blockhead(out_block)
## GISJOIN GISJOIN_T pop_i ent_i
## 1 G06007500123011000 G0600750012301 73 1.4004560
## 2 G06007500123011001 G0600750012301 0 0.0000000
## 3 G06007500123011002 G0600750012301 128 0.9531645
## 4 G06007500123011003 G0600750012301 15 1.3397943
## 5 G06007500123011004 G0600750012301 4 1.0397208
## 6 G06007500123011005 G0600750012301 1142 1.4824488
Do obliczenia wskaźnika H potrzebne są dane zawarte w obiekcie out_ct oraz out_block.
<- merge(out_ct, out_block, by="GISJOIN_T")
calc_df <- calc_df[, c("GISJOIN_T", "GISJOIN", "pop", "pop_i", "ent", "ent_i")]
calc_df head(calc_df)
## GISJOIN_T GISJOIN pop pop_i ent ent_i
## 1 G0600750012301 G06007500123011000 2734 73 1.450987 1.4004560
## 2 G0600750012301 G06007500123011001 2734 0 1.450987 0.0000000
## 3 G0600750012301 G06007500123011002 2734 128 1.450987 0.9531645
## 4 G0600750012301 G06007500123011003 2734 15 1.450987 1.3397943
## 5 G0600750012301 G06007500123011004 2734 4 1.450987 1.0397208
## 6 G0600750012301 G06007500123011005 2734 1142 1.450987 1.4824488
Obiekt calc_df zawiera dane dla każdego bloku spisowego: - pop - liczba ludności w obszarze spisowym, do którego przypisany jest blok i - pop_i - liczba ludności w bloku spisowym i - ent - entropia obszaru spisowego, do którego przypisany jest blok i - ent_i - entropia bloku spisowego i.
$H <- calc_df$pop_i*(calc_df$ent-calc_df$ent_i)/(calc_df$ent*calc_df$pop) calc_df
Obliczenie wskaźnika teorii informacji H dla każdego obszaru spisowego.
<- aggregate(H~GISJOIN_T, calc_df, sum) h_index
<- merge(out_ct, h_index, by = "GISJOIN_T")
out_ct colnames(out_ct) <- c("GISJOIN_T", "POP", "E", "H")
#obliczenie entropii standaryzowanej
$Estd <- out_ct$E/log(length(list_race)) out_ct
<- merge(dat_ct, out_ct[,-2], by="GISJOIN_T") out
GISJOIN_T | WHITE | BLACK | ASIAN | HISPANIC | AM | OTHER | POP | E | H | Estd |
---|---|---|---|---|---|---|---|---|---|---|
G0600750012301 | 866 | 316 | 847 | 600 | 16 | 89 | 2734 | 1.450987 | 0.0420558 | 0.8098114 |
G0600750012302 | 1307 | 242 | 1011 | 372 | 22 | 119 | 3073 | 1.346376 | 0.0357665 | 0.7514266 |
Zróżnicowanie rasowe oraz segregacja rasowa to dwie osobne koncepcje. Obszar może być równocześnie zróżnicowany rasowo, ale poszczególne grupy mogą mieszkać w odzielnych częściach miasta (duża segregcja rasowa). Wykorzystując wartości entropii standaryzowanej oraz wskaźnika teorii informacji H zostanie wyznaczonych 9 typów struktury rasowo-etnicznej określonych przez poziom zróżnicowania oraz segregacji rasowej.
Entropia standaryzowana oraz wskaźnik teorii informacji H przyjmuje wartości od 0 do 1. Wartości te podzielimy na 3 równe grupy (0, 0.33), (0.33, 0.66), (0.66,1) określające odpowiednio małe, średnie, duże zróżnicowanie lub segregację.
Kompletna klasyfikacja składa się z 9 następujących typów:
<- expand.grid(ent = c("L", "M", "H"), h=c("L", "M", "H"))
biv $biv_cls <- paste(biv$ent,biv$h, sep="")
biv biv
## ent h biv_cls
## 1 L L LL
## 2 M L ML
## 3 H L HL
## 4 L M LM
## 5 M M MM
## 6 H M HM
## 7 L H LH
## 8 M H MH
## 9 H H HH
library(dplyr)
$biv_classes <- recode(biv$biv_cls,
biv"LL" = "low diversity and low segregation", "ML" = " medium diversity diversity and low segregation",
"HL" = "high diversity and low segregation",
"LM" = "low diversity and medium segregation", "MM" = "medium diversity and medium segregation",
"HM" = "high diversity and medium segregation",
"LH" = "low diversity and high segregation", "MH" = "medium diversity and high segregation",
"HH" = "high diversity and high segregation")
ent | h | biv_cls | biv_classes |
---|---|---|---|
L | L | LL | low diversity and low segregation |
M | L | ML | medium diversity diversity and low segregation |
H | L | HL | high diversity and low segregation |
L | M | LM | low diversity and medium segregation |
M | M | MM | medium diversity and medium segregation |
H | M | HM | high diversity and medium segregation |
L | H | LH | low diversity and high segregation |
M | H | MH | medium diversity and high segregation |
H | H | HH | high diversity and high segregation |
$Estd_cls <- cut(out$Estd, breaks = c(0, 0.33, 0.66, 1), labels = c("L", "M", "H"), include.lowest = TRUE, right = TRUE)
out$H_cls <- cut(out$H, breaks = c(0, 0.33, 0.66, 1), labels = c("L", "M", "H"), include.lowest = TRUE, right = TRUE)
out$biv_cls <- paste(out$Estd_cls, out$H_cls, sep="") out
GISJOIN_T | E | Estd | Estd_cls | H_cls | biv_cls |
---|---|---|---|---|---|
G0600750012301 | 1.450987 | 0.8098114 | H | L | HL |
G0600750012302 | 1.346376 | 0.7514266 | H | L | HL |
library(sf)
## Linking to GEOS 3.6.2, GDAL 2.2.3, PROJ 4.9.3; sf_use_s2() is TRUE
Granice obszarów spisowych
<- st_read("data/cw2/ct_gis.shp") bnd
## Reading layer `ct_gis' from data source
## `/home/anna/DYDAKTYKA/Analiza_geoinformacyjna/cwiczenia2022_23/na_www/data/cw2/ct_gis.shp'
## using driver `ESRI Shapefile'
## Simple feature collection with 2 features and 15 fields
## Geometry type: POLYGON
## Dimension: XY
## Bounding box: xmin: -2274715 ymin: 1956801 xmax: -2274097 ymax: 1957183
## proj4string: +proj=aea +lat_1=29.5 +lat_2=45.5 +lat_0=23 +lon_0=-96 +x_0=0 +y_0=0 +datum=NAD83 +units=m +no_defs
plot(bnd[1:3])
<- merge(bnd, out, by.x = "GISJOIN", by.y = "GISJOIN_T") bnd_attr
plot(bnd_attr["H"])
library(pals)
library(pals)
= function(pal){
bivcol = substitute(pal)
tit = pal()
pal = length(pal)
ncol image(matrix(seq_along(pal), nrow = sqrt(ncol)),
axes = FALSE,
col = pal,
asp = 1)
mtext(tit)
}
par(mfrow = c(3, 4), mar = c(1, 1, 2, 1))
bivcol(arc.bluepink)
bivcol(brewer.divdiv)
bivcol(brewer.divseq)
bivcol(brewer.qualseq)
bivcol(brewer.seqseq1)
bivcol(brewer.seqseq2)
bivcol(census.blueyellow)
bivcol(stevens.bluered)
bivcol(stevens.greenblue)
bivcol(stevens.pinkblue)
bivcol(stevens.pinkgreen)
bivcol(stevens.purplegold)
Do wizualizacji typów segregacji i zróżnicowania rasowego wykorzystamy paletę stevens.bluered
bivcol(stevens.bluered)
stevens.bluered()
## [1] "#e8e8e8" "#e4acac" "#c85a5a" "#b0d5df" "#ad9ea5" "#985356" "#64acbe"
## [8] "#627f8c" "#574249"
#legenda
= stevens.bluered()
biv_colors names(biv_colors) = c("LL", "ML", "HL", "LM", "MM", "HM", "LH", "MH", "HH")
Do wizualizacji typów segregacji i zróżnicowania rasowego wykorzystamy paletę stevens.bluered
library(ggplot2)
ggplot(bnd_attr) +
geom_sf(aes(fill = biv_cls)) +
scale_fill_manual(values = biv_colors) +
theme_bw()
st_write(bnd_attr, "results/bnd_attr.shp", delete_dsn=TRUE, quiet=TRUE)