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)
list_race <- c("WHITE", "BLACK", "ASIAN", "HISPANIC", "AM", "OTHER")
#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 
entropy_fnc = function(proportions, base = exp(1)) {
  entr = -sum(ifelse(proportions > 0, proportions * log(proportions, base = base), 0))
  return(entr)
}

1 Cel ćwiczenia

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ć:

  • mapę pokazującą rozkład wartości wskaźnika H na poziomie obszarów spisowych
  • mapę pokazujące rozkład wartości entropii standaryzowanej na poziomie obszarów spisowych.
  • mapę z typami struktury rasowo-etnicznej
  • podsumowanie, ile obszarów spisowych występowało w danym typie struktury rasowo-etnicznej.

Wizualizację wyników można wykonać w R lub w QGIS.

2 Analiza zróżnicowania oraz segregacji rasowej dla poszczególnych obszarów spisowych.

Rycina 1. Zróżnicowanie oraz segregacja rasowa w obszarach spisowych

3 Dane dla bloków spisowych.

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).

dat <- read.csv("data/cw2/ex.csv")
Struktura rasowo-etniczna na poziomie bloków spisowych - 2010 rok
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

4 Dane dla obszarów spisowych (census tract)

4.1 Agregacja danych do obszarów spisowych

dat_ct <- aggregate(.~GISJOIN_T, dat[, c("GISJOIN_T", list_race, "POP")], FUN=sum) 
Struktura rasowo-etniczna na poziomie obszarów spisowych
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

5 Obliczenie miar segregacji dla obszarów spisowych

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:

  • \(E_{i}\) (ent_i) - entropia bloku spisoweg i wchodzącego w skład obszaru spisowego,
  • \(E\) (ent)- entropia obliczona dla obszaru spisowego
  • \(t_{i}\) (pop_i) - liczba ludnościbloku spisoweg i wchodzącego w skład obszaru spisowego,
  • \(T\) (pop) - liczba ludności dla obszaru spisowego

5.1 Obliczenie wskaźnika H dla obszarów spisowych

Etap 1. Obliczenie entropii oraz liczby ludności w każdym obszarze spisowym.

#utworzenie ramki danych zawierajacej identyfikator obszaru spisowego (GISJOINT) oraz ogólną liczbę ludności dla każdego obszaru spisowego. 
out_ct <- data.frame(GISJOIN_T = dat_ct$GISJOIN_T, pop = dat_ct$POP)

#obliczenie odsetka ras dla poszczegolnych obszarow spisowych (dane wejsciowe do obliczenia entropii)
perc_ct <- dat_ct[,list_race]/dat_ct$POP

#obliczenie entopii dla każdego obszaru spisowego oraz dodanie jej do obiektu out_ct
out_ct$ent <- apply(perc_ct, 1, entropy_fnc)
#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

Etap 2. Obliczenie entropii oraz liczby ludności dla każdego bloku spisowego.

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.

out_block <- data.frame(GISJOIN = dat$GISJOIN, GISJOIN_T = dat$GISJOIN_T, pop_i = dat$POP)
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)
perc_block <- dat[,list_race]/dat$POP
perc_block[is.na(perc_block)] <- 0
# obliczenie entropii dla każdego bloku 
out_block$ent_i <- apply(perc_block, 1, entropy_fnc)
head(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

Etap 3. Obliczenie wskaźnika H dla każdego obszaru spisowego.

Do obliczenia wskaźnika H potrzebne są dane zawarte w obiekcie out_ct oraz out_block.

calc_df <- merge(out_ct, out_block, by="GISJOIN_T")
calc_df <- calc_df[, c("GISJOIN_T", "GISJOIN", "pop", "pop_i", "ent", "ent_i")]
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.

calc_df$H <- calc_df$pop_i*(calc_df$ent-calc_df$ent_i)/(calc_df$ent*calc_df$pop)

Obliczenie wskaźnika teorii informacji H dla każdego obszaru spisowego.

h_index <- aggregate(H~GISJOIN_T, calc_df, sum)

5.1.1 Podsumowanie wyników dla obszarów spisowych.

out_ct <- merge(out_ct, h_index, by = "GISJOIN_T")
colnames(out_ct) <- c("GISJOIN_T", "POP", "E", "H")
#obliczenie entropii standaryzowanej 
out_ct$Estd <- out_ct$E/log(length(list_race))
out <- merge(dat_ct, out_ct[,-2], by="GISJOIN_T")
Struktura rasowo-etniczna na poziomie obszarów spisowych - 2010 rok
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

6 Typy zróżnicowania rasowego oraz segregacji rasowej.

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ę.

6.1 Klasyfikacja - typy struktury rasowo-etnicznej

Kompletna klasyfikacja składa się z 9 następujących typów:

biv <-  expand.grid(ent = c("L", "M", "H"), h=c("L", "M", "H"))
biv$biv_cls <- paste(biv$ent,biv$h,  sep="")
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$biv_classes <- recode(biv$biv_cls, 
                          "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")
Typy struktury rasowo-etnicznej
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

6.2 Zastosowanie klasyfikacji do danych

out$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="")
Struktura rasowo-etniczna na poziomie obszarów spisowych - 2010 rok
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

7 Wizualizacja danych

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

bnd <- st_read("data/cw2/ct_gis.shp")
## 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])

bnd_attr <- merge(bnd, out, by.x = "GISJOIN", by.y = "GISJOIN_T")
plot(bnd_attr["H"])

7.1 Dwuzmienna paleta (bivariate pallette)

library(pals)
library(pals)
bivcol = function(pal){
        tit = substitute(pal)
        pal = pal()
        ncol = length(pal)
        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 
biv_colors = stevens.bluered()
names(biv_colors) = c("LL", "ML", "HL", "LM", "MM", "HM", "LH", "MH", "HH")

7.2 Wizualizacja typów zróżnicowania oraz segregacji rasowej (biv_cls)

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()

8 Wizualizacja w oprogramowaniu QGIS

8.1 Zapisanie danych do warstwy ESRI Shapefile

st_write(bnd_attr, "results/bnd_attr.shp", delete_dsn=TRUE, quiet=TRUE)

8.2 Wizualizacja