github linkedin
İnteraktif Sankey Diyagramlarını Oluşturma

Veri Hazırlık Aşaması

Sankey genellikle ağ içerisinde yer alan belli birimler arasındaki geçişkenliği göstermek amacıyla kullanılmaktadır. Bu yazımda örnek olarak Türkiye’de coğrafi bölgeler arasıda göç akımlarını inceleyeceğim. TÜİK’in websitesindeki veritabanları bölümünde iller arasıdaki göç matrisi, yıl bazında oluşturulup indirilebilmektedir.

library(readxl)

#Verilerin olduğu excel dosyasının içe aktarılması
nuts3_goc <- read_excel("nuts3_goc.xlsx", sheet = "data")

nuts3_goc$YIL <- as.integer(nuts3_goc$YIL)

#İBBS tipolojisi ile eşleştirme yapmak için
trkod <- read_excel("trkod.xlsx")

´nuts3_goc´ dataframe objesinde yer alan göç matrisinin görünümü aşağıdaki şekildedir.

head(nuts3_goc)
## # A tibble: 6 x 83
##     YIL FROM_IL Adana Adıyaman Afyonkarahisar  Ağrı Aksaray Amasya Ankara
##   <int> <chr>   <dbl>    <dbl>          <dbl> <dbl>   <dbl>  <dbl>  <dbl>
## 1  2013 Adana       0      811            333   243     455     91   3420
## 2  2013 Adıyam~   975        0            104   104      57     67    817
## 3  2013 Afyonk~   269       46              0    97      89     53   1837
## 4  2013 Ağrı      243      125            149     0      59     94   2376
## 5  2013 Aksaray   421       72            118    41       0     40   1806
## 6  2013 Amasya     77       32             62    63      27      0   1785
## # ... with 74 more variables: Antalya <dbl>, Ardahan <dbl>, Artvin <dbl>,
## #   Aydın <dbl>, Balıkesir <dbl>, Bartın <dbl>, Batman <dbl>,
## #   Bayburt <dbl>, Bilecik <dbl>, Bingöl <dbl>, Bitlis <dbl>, Bolu <dbl>,
## #   Burdur <dbl>, Bursa <dbl>, Çanakkale <dbl>, Çankırı <dbl>,
## #   Çorum <dbl>, Denizli <dbl>, Diyarbakır <dbl>, Düzce <dbl>,
## #   Edirne <dbl>, Elazığ <dbl>, Erzincan <dbl>, Erzurum <dbl>,
## #   Eskişehir <dbl>, Gaziantep <dbl>, Giresun <dbl>, Gümüşhane <dbl>,
## #   Hakkari <dbl>, Hatay <dbl>, Iğdır <dbl>, Isparta <dbl>,
## #   İstanbul <dbl>, İzmir <dbl>, Kahramanmaraş <dbl>, Karabük <dbl>,
## #   Karaman <dbl>, Kars <dbl>, Kastamonu <dbl>, Kayseri <dbl>,
## #   Kilis <dbl>, Kırıkkale <dbl>, Kırklareli <dbl>, Kırşehir <dbl>,
## #   Kocaeli <dbl>, Konya <dbl>, Kütahya <dbl>, Malatya <dbl>,
## #   Manisa <dbl>, Mardin <dbl>, Mersin <dbl>, Muğla <dbl>, Muş <dbl>,
## #   Nevşehir <dbl>, Niğde <dbl>, Ordu <dbl>, Osmaniye <dbl>, Rize <dbl>,
## #   Sakarya <dbl>, Samsun <dbl>, Şanlıurfa <dbl>, Siirt <dbl>,
## #   Sinop <dbl>, Şırnak <dbl>, Sivas <dbl>, Tekirdağ <dbl>, Tokat <dbl>,
## #   Trabzon <dbl>, Tunceli <dbl>, Uşak <dbl>, Van <dbl>, Yalova <dbl>,
## #   Yozgat <dbl>, Zonguldak <dbl>

´nuts3_goc´ dataframe objesinde belirli bir yılda her bir ilden diğer ile olan göç sayısı gösterilmektedir. Söz konusu matristeki (R’daki matris mantığında değil) göç veren iller satır olarak, göç alan iller ise kolon olarak gösterilmektedir. Fakat R ile ilgili paketlerin fonksiyonları genellikle tidy yani unpivot durumunda olan verileri girdi olarak kabul etmektedir. Bu yüzden ´nuts3_goc´ objesininde tidyr paketi ile gerekli dönüşüm işlemlerinin yapılması gerekmektedir.

library(tidyr)
library(dplyr)

# Verilerde temizlik ve hazırlık işlemleri
nuts3_goc_temiz <- nuts3_goc %>% gather(TO_IL, SAYI, 4:ncol(nuts3_goc)) %>%
  left_join(trkod, by = c("FROM_IL" = "Duzey_3_Ad")) 

colnames(nuts3_goc_temiz)[6:ncol(nuts3_goc_temiz)] <- paste("FROM_", colnames(nuts3_goc_temiz)[6:ncol(nuts3_goc_temiz)], sep="")

nuts3_goc_temiz <- nuts3_goc_temiz %>% left_join(trkod, by = c("TO_IL" = "Duzey_3_Ad"))

colnames(nuts3_goc_temiz)[13:ncol(nuts3_goc_temiz)] <- paste("TO_", colnames(nuts3_goc_temiz)[13:ncol(nuts3_goc_temiz)], sep="")

# Coğrafi Bölge Ölçeğinde gruplamanın yapılması ve ağ yapısının oluşturulması
goc_data <- nuts3_goc_temiz %>% group_by(YIL, FROM_Cografi, TO_Cografi) %>%
  summarise(SAYI = sum(SAYI)) %>% 
  filter(FROM_Cografi != TO_Cografi) %>%
  ungroup()
# Verilerin net göç verisine dönüştürülmesi
goc_data$NET_SAYI <- NA

for (i in unique(goc_data$YIL)){
  for (j in unique(goc_data$FROM_Cografi)){
    for (m in unique(goc_data$TO_Cografi)){
      goc_data$NET_SAYI[goc_data$YIL == i & goc_data$FROM_Cografi == j & 
                          goc_data$TO_Cografi == m] <- goc_data$SAYI[goc_data$YIL == i & goc_data$FROM_Cografi == j & 
                                                                           goc_data$TO_Cografi == m] -
        goc_data$SAYI[goc_data$YIL == i & goc_data$FROM_Cografi == m & 
                            goc_data$TO_Cografi == j]
      
    }
  }
}
# Göç verilerinde yalnızca pozitif değerlere sahip olan bölgeleri almak verilen net göçü görmek için yeterlidir
goc_data <- goc_data %>% filter(NET_SAYI > 0) %>% select(-SAYI) %>%
  filter(YIL == 2018)

# Her bir coğrafi bölgeye indeks numarasının verilmesi
index_nums <- data.frame(bolge = unique(nuts3_goc_temiz$FROM_Cografi), FROM_index = c(0:6),
                         TO_index = c(7:13))

# Indeks numaralarının data frame e yerleştirilmesi
goc_data <- goc_data %>% 
  left_join(select(index_nums, -TO_index), by = c("FROM_Cografi" = "bolge")) %>% 
  left_join(select(index_nums, -FROM_index), by = c("TO_Cografi" = "bolge")) %>%
  arrange(FROM_index, TO_index)
library(plotly)
library(paletteer)

# Sankey diyagramının oluşturulması
plot_ly(
  type = "sankey",

  orientation = "h",
  valuesuffix = " Kişi",
  valueformat = ".0f", #,.2r #.0f
  
  node = list(
    label = c(as.character(index_nums$bolge),as.character(index_nums$bolge)),
    color = c(paletteer_d(ggsci, default_igv, 7), paletteer_d(ggsci, default_igv, 7)),
    pad = 15,
    thickness = 20,
    line = list(
      color = "black",
      width = 0.5
    )
  ),
  
  link = list(
    source = as.vector(goc_data$FROM_index),
    target = as.vector(goc_data$TO_index),
    value =  as.vector(goc_data$NET_SAYI),
    value =  as.vector(goc_data$NET_SAYI)
  )
) %>% 
  layout(
    title = "Türkiye'de Coğrafi Bölgeler Arası Göç Akımları",
    font = list(
      size = 10
    )
    
  )

Yukarıdaki grafikte yalnızca 2017 yılındaki coğrafi bölgeler arasındaki net göç akımları görülmektedir. Aşağıda yer alan Shiny uygulmasından diğer yıllara ilişkim gösterimde otomatik olarak hesaplanıp oluşturulmaktadır.

İnteraktif Uygulama