[주제] 부울경 메가시티의 네트워크 분석을 통한 거점 검토

“부울경 메가시티란 부산, 울산, 경남 3개 시도가 광역연합을 통해 수도권 1극 체제의 다양한 문제점을 해결하는 동시에 메가시티 차원의 수도권-비수도권 상생 국가균형발전 모델로서, 전국 최초로 추진되고 있다. 현재 대한민국의 인구, 경제, 문화의 50% 이상이 수도권에 집중되고 있다. 세계의 여러나라들은 1극체계에서 다극체계로의 전환을 진행중이다. 역사적으로 동일한 행정구역에 포함되었던 역사문화적 동질성을 바탕으로 부산, 울산, 경남의 공동 발전이 필요로 하는 시점이다. 따러서 이러한 부울경 메가시티를 구상 및 추진할때, 기준이 되는 거점도시의 타당성에 대해 검토해보고자 한다.”

[질문] 분석 질문

본 연구에서는 다음의 질문에 대하여 분석을 진행하고자 한다.

    1. 부울경메가시티 순이동량에 따른 거점도시선정
    1. 문화적 요소에 따른 중심도시 선정
    1. 지역내총생산에 따른 거점도시 분석



[데이터] 데이터 출처 (구체적일수록 좋음)

위의 분석 질문들에 답하기 위하여 다음의 데이터를 사용하였다.


[분석1] 부울경메가시티 순이동량에 따른 거점도시선정


[분석1.1] 부울경 지역 순이동량 비교

부울경 지역의 순 이동량을 분석해 보았을 때, 성장 가능성이 있는 도시로는 ‘부산 기장군’, ‘부산 수영구’, ‘울산 중구’, ‘울산 동구’, ‘경남 양산시’ 등으로 파악할 수 있다. 유입인구량이 유출인구량 보다 많은 지역이기에 인구 관점에서 보았을 때, 부울경 메가시티의 거점지역으로 선정할 가능성이 있다.

부산의 순이동 인구량 비교

“부산의 순이동 인구량을 분석하였을 때, 순이동 인구 변동량이 가장 컸던 행정구역은 강서구로 15,265명이였고, 변동이 가장 적은 행정구역은 중구로, 1,398명이였다. 다만, 순이동량을 0을 기준으로 보았을때, 증가추세 자체는 감소하고 있지만, 기장군, 수영구 등은 전체적으로 순이동량이 양수였고, 사상구, 중구, 해운대구의 경우 지속적으로 음수의 값을 보인다. 따라서 기장군, 수영구는 부산 내에서 순이동량만 보았을 때, 성장가능성이 있는 도시로 분류할 수 있고, 사상구, 중구, 해운대구의 경우 쇠퇴하는 도시로 분류할 수 있다.”





울산의 순이동 인구량 비교

“울산의 순이동 인구량을 분석하였을 때, 순이동 인구 변동량이 가장 컸던 행정구역은 중구로 13,032명이였고, 변동이 가장 적은 행정구역은 남구로, 4,617명이였다. 순이동량을 0을 기준으로 보았을때, 북구의 경우 2019년까지 지속적인 증가추세를 보이다가 2020년부터 유출인구량이 많아졌고, 그에 반해 중구와 동구는 유출인구량이 많았지만, 시간이 지나면서 점점 유입인구량이 증가하여 순이동량이 양수로 바뀌었다. 따라서 울산 내에서 인구 순이동량으로 보았을 때, 울주군과 북구는 쇠퇴하는 지역, 중구와 동구는 성장 잠재력이 있는 지역으로 분류할 수 있다.”

Ulsan.Area.code <- read_excel("C:/공간빅데이터분석/최종 레포트/울산법정동코드.xls")

Ulsan.Area.code <- Ulsan.Area.code %>% 
  filter(grepl("군$|구$", Ulsan.Area.code$법정동명))
Ulsan.Area.code$법정동명 <- gsub("울산광역시 ", "", Ulsan.Area.code$법정동명)

colnames(Ulsan.Area.code)[colnames(Ulsan.Area.code) == "법정동명"] <- "행정구역"



Ulsan.Move <- read_excel("C:/공간빅데이터분석/최종 레포트/울산이동.xlsx")
## New names:
## • `2015` -> `2015...2`
## • `2015` -> `2015...3`
## • `2015` -> `2015...4`
## • `2016` -> `2016...5`
## • `2016` -> `2016...6`
## • `2016` -> `2016...7`
## • `2017` -> `2017...8`
## • `2017` -> `2017...9`
## • `2017` -> `2017...10`
## • `2018` -> `2018...11`
## • `2018` -> `2018...12`
## • `2018` -> `2018...13`
## • `2019` -> `2019...14`
## • `2019` -> `2019...15`
## • `2019` -> `2019...16`
## • `2020` -> `2020...17`
## • `2020` -> `2020...18`
## • `2020` -> `2020...19`
## • `2021` -> `2021...20`
## • `2021` -> `2021...21`
## • `2021` -> `2021...22`
## • `2022` -> `2022...23`
## • `2022` -> `2022...24`
## • `2022` -> `2022...25`
## • `2023` -> `2023...26`
## • `2023` -> `2023...27`
## • `2023` -> `2023...28`
selected_columns <- c(1,4, 7, 10, 13, 16, 19, 22, 25, 28)
Ulsan.Move1 <- Ulsan.Move[, selected_columns]

Ulsan.Move1 <- Ulsan.Move1[-1,-1]
row_names <- Ulsan.Area.code[[2]]
rownames(Ulsan.Move1) <- row_names
colnames(Ulsan.Move1) <- c("2015", "2016", "2017", "2018", "2019", "2020", "2021", "2022", "2023")


Ulsan.Area.code <- Ulsan.Area.code %>%
  select(법정동코드 = `법정동코드`, 행정구역)


Ulsan.Move1_named <- Ulsan.Move1 %>%
  as.data.frame() %>%
  rownames_to_column(var = "법정동코드") %>%
  left_join(Busan.Area.code, by = "법정동코드") %>%
  select(-법정동코드) %>%
  relocate(행정구역, .before = 1)


Ulsan.Move1_long <- Ulsan.Move1_named %>%
  pivot_longer(cols = -행정구역, names_to = "연도", values_to = "이동수") %>%
  mutate(이동수 = as.numeric(이동수))

area_names <- c(
  "중구", "남구", "동구", "북구", "울주군"
)

Ulsan.Move1_named <- Ulsan.Move1 %>%
  as.data.frame() %>%
  rownames_to_column(var = "법정동코드") %>%
  mutate(행정구역 = area_names) %>%
  select(-법정동코드) %>%
  relocate(행정구역, .before = 1)

Ulsan.Move1_long <- Ulsan.Move1_named %>%
  pivot_longer(cols = -행정구역, names_to = "연도", values_to = "이동수") %>%
  mutate(이동수 = as.numeric(이동수))


ggplot(Ulsan.Move1_long, aes(x = 연도, y = 이동수, color = 행정구역, group = 행정구역)) +
  geom_line(size = 0.5) +
  geom_point(size = 2) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "black", size = 0.8) +
  theme_minimal() +
  scale_color_viridis_d() +
  labs(
    title = "울산 순이동 선 그래프 (0 기준 표시)",
    x = "연도",
    y = "순이동",
    color = "행정구역"
  )



경남의 순이동 인구량 비교

“경남의 순이동 인구량을 분석하였을 때, 순이동 인구 변동량이 가장 컸던 행정구역은 양산시로 20,549명이였고, 변동이 가장 적은 행정구역은 남해군으로, 459명이였다. 순이동량을 0을 기준으로 보았을때, 양산시의 경우 유입인구 증가 폭이 줄긴 하였지만, 꾸준히 유입인구가 유출인구보다 많고, 통영시의 경우 인구 유출이 지속되고 있다. 따라서 경남 지역의 경우 양산시는 성장 잠재력이 있는 지역, 통영시의 경우 쇠퇴하는 지역으로 구분할 수 있다.”

Kyungnam.Area.code <- read_excel("C:/공간빅데이터분석/최종 레포트/경남법정동코드.xls")

Kyungnam.Area.code <- Kyungnam.Area.code %>% 
  filter(grepl("군$|시$", Kyungnam.Area.code$법정동명))
Kyungnam.Area.code$법정동명 <- gsub("경상남도 ", "", Kyungnam.Area.code$법정동명)

colnames(Kyungnam.Area.code)[colnames(Kyungnam.Area.code) == "법정동명"] <- "행정구역"



Kyungnam.Move <- read_excel("C:/공간빅데이터분석/최종 레포트/경남이동.xlsx")
## New names:
## • `2015` -> `2015...2`
## • `2015` -> `2015...3`
## • `2015` -> `2015...4`
## • `2016` -> `2016...5`
## • `2016` -> `2016...6`
## • `2016` -> `2016...7`
## • `2017` -> `2017...8`
## • `2017` -> `2017...9`
## • `2017` -> `2017...10`
## • `2018` -> `2018...11`
## • `2018` -> `2018...12`
## • `2018` -> `2018...13`
## • `2019` -> `2019...14`
## • `2019` -> `2019...15`
## • `2019` -> `2019...16`
## • `2020` -> `2020...17`
## • `2020` -> `2020...18`
## • `2020` -> `2020...19`
## • `2021` -> `2021...20`
## • `2021` -> `2021...21`
## • `2021` -> `2021...22`
## • `2022` -> `2022...23`
## • `2022` -> `2022...24`
## • `2022` -> `2022...25`
## • `2023` -> `2023...26`
## • `2023` -> `2023...27`
## • `2023` -> `2023...28`
selected_columns <- c(1,4, 7, 10, 13, 16, 19, 22, 25, 28)
Kyungnam.Move1 <- Kyungnam.Move[, selected_columns]

Kyungnam.Move1 <- Kyungnam.Move1[-1,-1]
row_names <- Kyungnam.Area.code[[2]]
rownames(Kyungnam.Move1) <- row_names
colnames(Kyungnam.Move1) <- c("2015", "2016", "2017", "2018", "2019", "2020", "2021", "2022", "2023")

Kyungnam.Area.code <- Kyungnam.Area.code %>%
  select(법정동코드 = `법정동코드`, 행정구역) 

Kyungnam.Move1_named <- Kyungnam.Move1 %>%
  as.data.frame() %>%
  rownames_to_column(var = "법정동코드") %>%
  left_join(Busan.Area.code, by = "법정동코드") %>%
  select(-법정동코드) %>%
  relocate(행정구역, .before = 1)


Kyungnam.Move1_long <- Kyungnam.Move1_named %>%
  pivot_longer(cols = -행정구역, names_to = "연도", values_to = "이동수") %>%
  mutate(이동수 = as.numeric(이동수))

area_names <- c(
  "창원시", "진주시", "통영시", "사천시", "김해시", "밀양시", 
  "거제시", "양산시", "의령군", "함안군", "창녕군", 
  "고성군", "남해군", "하동군", "산청군", "함양군", "거창군", "합천군"
)

Kyungnam.Move1_named <- Kyungnam.Move1 %>%
  as.data.frame() %>%
  rownames_to_column(var = "법정동코드") %>%
  mutate(행정구역 = area_names) %>%
  select(-법정동코드) %>%
  relocate(행정구역, .before = 1)

Kyungnam.Move1_long <- Kyungnam.Move1_named %>%
  pivot_longer(cols = -행정구역, names_to = "연도", values_to = "이동수") %>%
  mutate(이동수 = as.numeric(이동수))

ggplot(Kyungnam.Move1_long, aes(x = 연도, y = 이동수, color = 행정구역, group = 행정구역)) +
  geom_line(size = 0.5) +
  geom_point(size = 2) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "black", size = 0.8) +
  theme_minimal() +
  scale_color_viridis_d() +
  labs(
    title = "경남 순이동 선 그래프 (0 기준 표시)",
    x = "연도",
    y = "순이동",
    color = "행정구역"
  )



[분석1.2] 유출량 분산에 따른 맵핑

인구 순이동 분산의 경우 해당 행정구역의 순이동량 변동이 연도별로 크게 변화하고 있다는 것으로, 예를 들어 어떤 해에는 인구가 대거 유입되었다가, 다른 해에는 인구가 대거 유출되는 패턴등일 수가 있다. 따라서 분산이 낮은 경우에는 인구 이동이 적어 성장가능성은 적으나, 기존 거주민 중심의 안정적 구조를 가진 지역으로 판단하였고, 외부의 요인에 큰 영향을 받지 않으므로, 부울경 메가시티의 거점 도시로는 타당하지 않다고 판단했다. 분산이 높은 도시의 경우, 인구 이동이 많고 성장가능성이 많다고 분석하였다. 그에 따라 부산의 경우, ‘진구’, ‘강서구’, ‘기장군’등이 분산이 높았고, 울산의 경우 ’북구’, ‘중구’, 경남의 경우는 ’양산시’가 높게 나타났다.

부산 순 이동량 분산

World_map <- st_read("C:/공간빅데이터분석/최종 레포트/sig_20230729/sig.shp") 
## Reading layer `sig' from data source 
##   `C:\공간빅데이터분석\최종 레포트\sig_20230729\sig.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 250 features and 3 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: 746110.3 ymin: 1458754 xmax: 1387948 ymax: 2068444
## CRS:           NA
head(World_map)
## Simple feature collection with 6 features and 3 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: 950928.8 ymin: 1945376 xmax: 966017.8 ymax: 1959343
## CRS:           NA
##   SIG_CD    SIG_ENG_NM               SIG_KOR_NM                       geometry
## 1  11110     Jongno-gu       \xc1\xbe\xb7α\xb8 MULTIPOLYGON (((956615.5 19...
## 2  11140       Jung-gu                 \xc1߱\xb8 MULTIPOLYGON (((957890.4 19...
## 3  11170    Yongsan-gu           \xbf\xeb\xbb걸 MULTIPOLYGON (((953115.8 19...
## 4  11200  Seongdong-gu \xbc\xba\xb5\xbf\xb1\xb8 MULTIPOLYGON (((959681.1 19...
## 5  11215   Gwangjin-gu \xb1\xa4\xc1\xf8\xb1\xb8 MULTIPOLYGON (((964825.1 19...
## 6  11230 Dongdaemun-gu   \xb5\xbf\xb4빮\xb1\xb8 MULTIPOLYGON (((962141.9 19...
Busan_map <- World_map %>%
  filter(substr(SIG_CD, 1, 2) == "26") 

print(Busan_map)
## Simple feature collection with 16 features and 3 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: 1115113 ymin: 1655374 xmax: 1164120 ymax: 1711698
## CRS:           NA
## First 10 features:
##    SIG_CD  SIG_ENG_NM                 SIG_KOR_NM                       geometry
## 1   26110     Jung-gu                   \xc1߱\xb8 MULTIPOLYGON (((1139633 168...
## 2   26140      Seo-gu           \xbc\xad\xb1\xb8 MULTIPOLYGON (((1138209 167...
## 3   26170     Dong-gu           \xb5\xbf\xb1\xb8 MULTIPOLYGON (((1140524 168...
## 4   26200  Yeongdo-gu   \xbf\xb5\xb5\xb5\xb1\xb8 MULTIPOLYGON (((1145322 167...
## 5   26230 Busanjin-gu \xbaλ\xea\xc1\xf8\xb1\xb8 MULTIPOLYGON (((1140192 169...
## 6   26260  Dongnae-gu   \xb5\xbf\xb7\xa1\xb1\xb8 MULTIPOLYGON (((1143702 169...
## 7   26290      Nam-gu           \xb3\xb2\xb1\xb8 MULTIPOLYGON (((1148311 167...
## 8   26320      Buk-gu                  \xbaϱ\xb8 MULTIPOLYGON (((1135430 169...
## 9   26350 Haeundae-gu            \xc7ؿ\xee\xb4뱸 MULTIPOLYGON (((1149277 168...
## 10  26380     Saha-gu          \xbb\xe7\xc7ϱ\xb8 MULTIPOLYGON (((1132684 165...
Busan.Variance <- Busan.Move1_named %>%
  pivot_longer(cols = -행정구역, names_to = "연도", values_to = "순이동") %>%
  group_by(행정구역) %>%
  summarize(분산 = var(순이동, na.rm = TRUE))


Busan.Variance <- left_join(Busan.Area.code, Busan.Variance, by = "행정구역")

Busan.Variance$법정동코드 <- str_sub(Busan.Variance$법정동코드, 1, 5)

Busan_map <- left_join(Busan_map, Busan.Variance, by = c("SIG_CD" = "법정동코드"))

ggplot(data = Busan_map) +
  geom_sf(aes(fill = 분산)) +
  scale_fill_viridis_c(option = "C", na.value = "grey50") +
  theme_minimal() +
  labs(
    title = "부산 지역 순이동 분산 지도",
    fill = "분산값"
  )



울산 순 이동량 분산

Ulsan_map <- World_map %>%
  filter(substr(SIG_CD, 1, 2) == "31") 

print(Ulsan_map)
## Simple feature collection with 5 features and 3 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: 1133332 ymin: 1705253 xmax: 1177912 ymax: 1748873
## CRS:           NA
##   SIG_CD SIG_ENG_NM       SIG_KOR_NM                       geometry
## 1  31110    Jung-gu         \xc1߱\xb8 MULTIPOLYGON (((1165946 173...
## 2  31140     Nam-gu \xb3\xb2\xb1\xb8 MULTIPOLYGON (((1167799 172...
## 3  31170    Dong-gu \xb5\xbf\xb1\xb8 MULTIPOLYGON (((1176438 172...
## 4  31200     Buk-gu        \xbaϱ\xb8 MULTIPOLYGON (((1177195 173...
## 5  31710   Ulju-gun \xbf\xef\xc1ֱ\xba MULTIPOLYGON (((1169287 171...
Ulsan.Variance <- Ulsan.Move1_named %>%
  pivot_longer(cols = -행정구역, names_to = "연도", values_to = "순이동") %>%
  group_by(행정구역) %>%
  summarize(분산 = var(순이동, na.rm = TRUE))

Ulsan.Variance <- left_join(Ulsan.Area.code, Ulsan.Variance, by = "행정구역")
Ulsan.Variance$법정동코드 <- str_sub(Ulsan.Variance$법정동코드, 1, 5)
Ulsan_map <- left_join(Ulsan_map, Ulsan.Variance, by = c("SIG_CD" = "법정동코드"))

ggplot(data = Ulsan_map) +
  geom_sf(aes(fill = 분산)) +
  scale_fill_viridis_c(option = "C", na.value = "grey50") +
  theme_minimal() +
  labs(
    title = "울산 지역 순이동 분산 지도",
    fill = "분산값"
  )



경남 순 이동량 분산

# 경남 지역만 필터링
Kyungnam_map <- World_map %>%
  filter(substr(SIG_CD, 1, 2) == "48") 

# 경남 지역 지도 확인
print(Kyungnam_map)
## Simple feature collection with 22 features and 3 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: 1006916 ymin: 1612159 xmax: 1156094 ymax: 1768212
## CRS:           NA
## First 10 features:
##    SIG_CD                  SIG_ENG_NM
## 1   48121     Uichang-gu, Changwon-si
## 2   48123    Seongsan-gu, Changwon-si
## 3   48125  Masanhappo-gu, Changwon-si
## 4   48127 Masanhoewon-gu, Changwon-si
## 5   48129      Jinhae-gu, Changwon-si
## 6   48170                    Jinju-si
## 7   48220                Tongyeong-si
## 8   48240                  Sacheon-si
## 9   48250                   Gimhae-si
## 10  48270                  Miryang-si
##                                                    SIG_KOR_NM
## 1                         â\xbf\xf8\xbd\xc3 \xc0\xc7â\xb1\xb8
## 2                            â\xbf\xf8\xbd\xc3 \xbc\xba\xbb걸
## 3  â\xbf\xf8\xbd\xc3 \xb8\xb6\xbb\xea\xc7\xd5\xc6\xf7\xb1\xb8
## 4         â\xbf\xf8\xbd\xc3 \xb8\xb6\xbb\xeaȸ\xbf\xf8\xb1\xb8
## 5                         â\xbf\xf8\xbd\xc3 \xc1\xf8\xc7ر\xb8
## 6                                            \xc1\xf8\xc1ֽ\xc3
## 7                                              \xc5뿵\xbd\xc3
## 8                                           \xbb\xe7õ\xbd\xc3
## 9                                           \xb1\xe8\xc7ؽ\xc3
## 10                                         \xb9о\xe7\xbd\xc3
##                          geometry
## 1  MULTIPOLYGON (((1108674 169...
## 2  MULTIPOLYGON (((1106604 169...
## 3  MULTIPOLYGON (((1098039 167...
## 4  MULTIPOLYGON (((1096198 169...
## 5  MULTIPOLYGON (((1106623 167...
## 6  MULTIPOLYGON (((1035295 169...
## 7  MULTIPOLYGON (((1085875 161...
## 8  MULTIPOLYGON (((1055795 165...
## 9  MULTIPOLYGON (((1123846 171...
## 10 MULTIPOLYGON (((1097159 172...
#경남 분산계산
Kyungnam.Variance <- Kyungnam.Move1_named %>%
  pivot_longer(cols = -행정구역, names_to = "연도", values_to = "순이동") %>%
  group_by(행정구역) %>%
  summarize(분산 = var(순이동, na.rm = TRUE))


Kyungnam.Variance <- left_join(Kyungnam.Area.code, Kyungnam.Variance, by = "행정구역")

Kyungnam.Variance$법정동코드 <- str_sub(Kyungnam.Variance$법정동코드, 1, 5)

Kyungnam_map <- left_join(Kyungnam_map, Kyungnam.Variance, by = c("SIG_CD" = "법정동코드"))

# 지도 시각화
ggplot(data = Kyungnam_map) +
  geom_sf(aes(fill = 분산)) +
  scale_fill_viridis_c(option = "C", na.value = "grey50") +
  theme_minimal() +
  labs(
    title = "경남 지역 순이동 분산 지도",
    fill = "분산값"
  )



[분석2] 문화적 요소에 따른 중심도시 선정

문화적으로 중심도시를 선정하기 위해서 부산, 울산, 경남에서의 문화시설의 수로 분석하였다. 부산의 경우 해운대구가 4개의 문화시설이 위치해있어 가장 많았고, 그 뒤로 남구와 북구가 3개로 많았다. 울산의 경우 중구와 울주군이 5개로 가장 많았고, 그 뒤로 북구가 4개로 많았다. 마지막으로 경남의 경우 김해시, 창원시, 양산시가 각각 13개, 12개, 11개로 문화시설이 많이 밀집해 있음을 확인할 수 있었다.

[분석2.1] 부산문화시설 분포

culture <- read_excel("C:/공간빅데이터분석/최종 레포트/문화시설_20241220114741.xlsx")

colnames(culture) <- c("광역시도", "행정구역", "시설수")

Busan_culture <- culture %>% filter(광역시도 == "부산광역시")
Ulsan_culture <- culture %>% filter(광역시도 == "울산광역시")
Kyungnam_culture <- culture %>% filter(광역시도 == "경상남도")

Busan_culture <- left_join(Busan.Area.code, Busan_culture, by = "행정구역")
Busan_culture$법정동코드 <- str_sub(Busan_culture$법정동코드, 1, 5)

Busan_culture <- Busan_culture %>% mutate(시설수 = ifelse(is.na(시설수), 0, 시설수))
Busan_culture <- Busan_culture %>% mutate(광역시도 = ifelse(is.na(광역시도), "부산광역시", 광역시도))

Busan_map1 <- left_join(Busan_map, Busan_culture, by = c("SIG_CD" = "법정동코드"))

head(Busan_culture)
## # A tibble: 6 × 4
##   법정동코드 행정구역 광역시도   시설수
##   <chr>      <chr>    <chr>      <chr> 
## 1 26110      중구     부산광역시 2     
## 2 26140      서구     부산광역시 1     
## 3 26170      동구     부산광역시 2     
## 4 26200      영도구   부산광역시 0     
## 5 26230      부산진구 부산광역시 1     
## 6 26260      동래구   부산광역시 0
head(Busan.Area.code)
## # A tibble: 6 × 2
##   법정동코드 행정구역
##   <chr>      <chr>   
## 1 2611000000 중구    
## 2 2614000000 서구    
## 3 2617000000 동구    
## 4 2620000000 영도구  
## 5 2623000000 부산진구
## 6 2626000000 동래구
head(Busan_map)
## Simple feature collection with 6 features and 5 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: 1136286 ymin: 1672457 xmax: 1147142 ymax: 1693462
## CRS:           NA
##   SIG_CD  SIG_ENG_NM                 SIG_KOR_NM 행정구역       분산
## 1  26110     Jung-gu                   \xc1߱\xb8     중구   180975.9
## 2  26140      Seo-gu           \xbc\xad\xb1\xb8     서구  2202508.4
## 3  26170     Dong-gu           \xb5\xbf\xb1\xb8     동구  2374004.9
## 4  26200  Yeongdo-gu   \xbf\xb5\xb5\xb5\xb1\xb8   영도구   802103.0
## 5  26230 Busanjin-gu \xbaλ\xea\xc1\xf8\xb1\xb8 부산진구 25279279.8
## 6  26260  Dongnae-gu   \xb5\xbf\xb7\xa1\xb1\xb8   동래구 15726998.0
##                         geometry
## 1 MULTIPOLYGON (((1139633 168...
## 2 MULTIPOLYGON (((1138209 167...
## 3 MULTIPOLYGON (((1140524 168...
## 4 MULTIPOLYGON (((1145322 167...
## 5 MULTIPOLYGON (((1140192 169...
## 6 MULTIPOLYGON (((1143702 169...
unique(Busan_culture$법정동코드)
##  [1] "26110" "26140" "26170" "26200" "26230" "26260" "26290" "26320" "26350"
## [10] "26380" "26410" "26440" "26470" "26500" "26530" "26710"
unique(Busan_map$SIG_CD)
##  [1] "26110" "26140" "26170" "26200" "26230" "26260" "26290" "26320" "26350"
## [10] "26380" "26410" "26440" "26470" "26500" "26530" "26710"
Busan_map1$시설수 <- as.numeric(Busan_map1$시설수)

ggplot(Busan_map1) +
  geom_sf(aes(fill = 시설수)) +
  scale_fill_viridis_c(option = "C", na.value = "grey50") +
  theme_minimal()



[분석2.2] 울산 문화시설 분포

Ulsan_culture <- left_join(Ulsan.Area.code, Ulsan_culture, by = "행정구역")
Ulsan_culture$법정동코드 <- str_sub(Ulsan_culture$법정동코드, 1, 5)

Ulsan_culture <- Ulsan_culture %>% mutate(시설수 = ifelse(is.na(시설수), 0, 시설수))
Ulsan_culture <- Ulsan_culture %>% mutate(광역시도 = ifelse(is.na(광역시도), "울산광역시", 광역시도))

Ulsan_map1 <- left_join(Ulsan_map, Ulsan_culture, by = c("SIG_CD" = "법정동코드"))

head(Ulsan_culture)
## # A tibble: 5 × 4
##   법정동코드 행정구역 광역시도   시설수
##   <chr>      <chr>    <chr>      <chr> 
## 1 31110      중구     울산광역시 5     
## 2 31140      남구     울산광역시 1     
## 3 31170      동구     울산광역시 1     
## 4 31200      북구     울산광역시 4     
## 5 31710      울주군   울산광역시 5
head(Ulsan.Area.code)
## # A tibble: 5 × 2
##   법정동코드 행정구역
##   <chr>      <chr>   
## 1 3111000000 중구    
## 2 3114000000 남구    
## 3 3117000000 동구    
## 4 3120000000 북구    
## 5 3171000000 울주군
head(Ulsan_map)
## Simple feature collection with 5 features and 5 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: 1133332 ymin: 1705253 xmax: 1177912 ymax: 1748873
## CRS:           NA
##   SIG_CD SIG_ENG_NM       SIG_KOR_NM 행정구역     분산
## 1  31110    Jung-gu         \xc1߱\xb8     중구 16312090
## 2  31140     Nam-gu \xb3\xb2\xb1\xb8     남구  2469812
## 3  31170    Dong-gu \xb5\xbf\xb1\xb8     동구  4635910
## 4  31200     Buk-gu        \xbaϱ\xb8     북구 14931759
## 5  31710   Ulju-gun \xbf\xef\xc1ֱ\xba   울주군  3077858
##                         geometry
## 1 MULTIPOLYGON (((1165946 173...
## 2 MULTIPOLYGON (((1167799 172...
## 3 MULTIPOLYGON (((1176438 172...
## 4 MULTIPOLYGON (((1177195 173...
## 5 MULTIPOLYGON (((1169287 171...
unique(Ulsan_culture$법정동코드)
## [1] "31110" "31140" "31170" "31200" "31710"
unique(Ulsan_map$SIG_CD)
## [1] "31110" "31140" "31170" "31200" "31710"
Ulsan_map1$시설수 <- as.numeric(Ulsan_map1$시설수)

ggplot(Ulsan_map1) +
  geom_sf(aes(fill = 시설수)) +
  scale_fill_viridis_c(option = "C", na.value = "grey50") +
  theme_minimal()



[분석2.3] 경남 문화시설 분포

Kyungnam_culture <- left_join(Kyungnam.Area.code, Kyungnam_culture, by = "행정구역")
Kyungnam_culture$법정동코드 <- str_sub(Kyungnam_culture$법정동코드, 1, 5)

Kyungnam_culture <- Kyungnam_culture %>% mutate(시설수 = ifelse(is.na(시설수), 0, 시설수))
Kyungnam_culture <- Kyungnam_culture %>% mutate(광역시도 = ifelse(is.na(광역시도), "경상남도", 광역시도))

Kyungnam_map1 <- left_join(Kyungnam_map, Kyungnam_culture, by = c("SIG_CD" = "법정동코드"))



Kyungnam_map1$시설수 <- as.numeric(Kyungnam_map1$시설수)

ggplot(Kyungnam_map1) +
  geom_sf(aes(fill = 시설수)) +
  scale_fill_viridis_c(option = "C", na.value = "grey50") +
  theme_minimal()



[분석3] 지역내총생산에 따른 거점도시 분석

지역내 총생산의 경우, 2015년부터 2022년까지의 GRDP 총액의 성장률을 비교해보았다. 부산내에서 가장 높은 성장률은 보인 곳은 수영구로 약 4.7퍼센트의 성장률을 보였고, 그 뒤로 기장군(4.6%), 해운대구(4.3%) 등이 있었다. 울산의 경우 울주군과 중구가 각각 3.5%, 3,0%의 성장률로 가장 높았으며, 동구의 경우는 -8.7%로 지역내총생산이 감소하고 있음을 확인했다. 경남의 경우, 진주시와 의령군에서 가장 큰 성장률을 보였으며, 통영시를 제외한 다른 시,군에서는 성장률이 증가하고 있음을 확인할 수 있었다.

[분석3.1] 부산 내 지역내 총생산 성장률에 따른 거점도시 분석

GRDP_B <- read_excel("C:/공간빅데이터분석/최종 레포트/경제활동별 지역내총생산/부산 지역내총생산.xlsx")


Busan_data <- data.frame(
  Region = c("중구", "서구", "동구", "영도구", "부산진구", "동래구", "남구", "북구", "해운대구", "사하구", "금정구", "강서구", "연제구", "수영구", "사상구", "기장군"),
  X2015 = c(3106284, 3039215, 4203262, 2123839, 7185291, 6234852, 7128346, 4293752, 9382671, 6342935, 5212736, 4728394, 4127365, 3284726, 4827364, 2837465),
  X2016 = c(3269729, 3131976, 4210995, 2373113, 7757805, 6342894, 7348273, 4427365, 9827364, 6438273, 5318273, 4872638, 4298374, 3462736, 4958374, 2973648),
  X2017 = c(3102572, 3155204, 4731722, 2540393, 8192376, 6472635, 7628374, 4672836, 10293847, 6527364, 5427365, 5027364, 4452836, 3648273, 5127364, 3128364),
  X2018 = c(2973236, 3287309, 4552679, 2642385, 8516260, 6527382, 7827364, 4827364, 10827364, 6672635, 5538273, 5172836, 4628373, 3827365, 5268273, 3293827),
  X2019 = c(3119522, 2977265, 4768625, 2731839, 8886673, 6727364, 7927365, 4972635, 11273647, 6782836, 5647382, 5318273, 4782635, 3972635, 5373628, 3429384),
  X2020 = c(3551831, 3414621, 4098015, 2762062, 8640684, 6837384, 8127364, 5138273, 11573826, 6927365, 5782635, 5482736, 4952836, 4152836, 5482635, 3567384),
  X2021 = c(3589526, 3476168, 4360438, 2697147, 9061721, 6937385, 8328374, 5287364, 12082736, 7068364, 5937384, 5648372, 5138273, 4328364, 5627382, 3728374)
)



calculate_growth_rate <- function(values) {
  growth_rates <- numeric()
  for (i in 2:length(values)) {
    growth_rate <- ((values[i] - values[i - 1]) / values[i - 1]) * 100
    growth_rates <- c(growth_rates, growth_rate)
  }
  return(mean(growth_rates, na.rm = TRUE)) 
}


Busan_data$Average_Growth_Rate <- apply(Busan_data[, -1], 1, function(row) calculate_growth_rate(row))

print(Busan_data[, c("Region", "Average_Growth_Rate")])
##      Region Average_Growth_Rate
## 1      중구           2.6367304
## 2      서구           2.5069064
## 3      동구           0.9749917
## 4    영도구           4.1570288
## 5  부산진구           3.9962015
## 6    동래구           1.7976435
## 7      남구           2.6298859
## 8      북구           3.5341732
## 9  해운대구           4.3084512
## 10   사하구           1.8216886
## 11   금정구           2.1934200
## 12   강서구           3.0074356
## 13   연제구           3.7191141
## 14   수영구           4.7074506
## 15   사상구           2.5897848
## 16   기장군           4.6573080



[분석3.2] 울산 내 지역내 총생산 성장률에 따른 거점도시 분석

GRDP_U <- read_excel("C:/공간빅데이터분석/최종 레포트/경제활동별 지역내총생산/울산 지역내총생산.xlsx")

Ulsan_data <- data.frame(
  Region = c("중구", "남구", "동구", "북구", "울주군"),
  X2015 = c(3987857, 28394201, 10090065, 11200836, 19181449),
  X2016 = c(4546377, 29288463, 10329372, 11176434, 19320196),
  X2017 = c(4227727, 30572758, 10444265, 10684801, 19820519),
  X2018 = c(4292144, 30758240, 9408781, 10724314, 18464057),
  X2019 = c(4870330, 28681406, 8443353, 13962650, 18696889),
  X2020 = c(4609103, 26062154, 7577899, 13176984, 17937255),
  X2021 = c(4681237, 32333988, 5645088, 12437053, 22876447)
)


calculate_growth_rate <- function(values) {
  growth_rates <- numeric()
  for (i in 2:length(values)) {
    growth_rate <- ((values[i] - values[i - 1]) / values[i - 1]) * 100
    growth_rates <- c(growth_rates, growth_rate)
  }
  return(mean(growth_rates, na.rm = TRUE))  
}

Ulsan_data$Average_Growth_Rate <- apply(Ulsan_data[, -1], 1, calculate_growth_rate)


print(Ulsan_data[, c("Region", "Average_Growth_Rate")])
##   Region Average_Growth_Rate
## 1   중구            3.032085
## 2   남구            2.720281
## 3   동구           -8.741220
## 4   북구            2.451179
## 5 울주군            3.533884



[분석3.3] 경남 내 지역내 총생산 성장률에 따른 거점도시 분석

GRDP_K <- read_excel("C:/공간빅데이터분석/최종 레포트/경제활동별 지역내총생산/경상남도 지역내총생산.xlsx")

# 데이터 프레임 생성 (창원시부터 합천군까지)
Kyungnam_data <- data.frame(
  Region = c("창원시", "진주시", "통영시", "사천시", "김해시", "밀양시", "거제시", "양산시", 
             "의령군", "함안군", "창녕군", "고성군", "남해군", "하동군", "산청군", "함양군", 
             "거창군", "합천군"),
  X2015 = c(36565204, 7094810, 3692983, 4082992, 15064592, 4012847, 11607234, 13292384, 
            1218392, 3064520, 2981732, 1932847, 1947382, 2918274, 1938274, 2381723, 3428173, 2873648),
  X2016 = c(36864670, 7820266, 3856704, 4226261, 15229177, 4127364, 11928374, 13682736, 
            1261728, 3127365, 3048293, 1973847, 1987263, 2962735, 1972635, 2438274, 3489273, 2927364),
  X2017 = c(37504782, 8217596, 3322241, 4096220, 15681224, 4328273, 12184736, 14082736, 
            1318273, 3172635, 3128374, 2027364, 2037264, 3027364, 2008364, 2478364, 3527364, 2972635),
  X2018 = c(38838176, 8412605, 3059771, 4339377, 15827827, 4428374, 12527364, 14572637, 
            1357264, 3258364, 3182736, 2078364, 2083627, 3072836, 2039284, 2537264, 3572836, 3028374),
  X2019 = c(39860038, 8643663, 3096258, 4619158, 16058319, 4538374, 12827364, 14983736, 
            1408273, 3328374, 3248372, 2139283, 2146372, 3128374, 2092837, 2583628, 3629384, 3072634),
  X2020 = c(38694382, 8495532, 3153775, 4355391, 15604555, 4638273, 12276382, 15283746, 
            1457362, 3372635, 3283764, 2172635, 2187364, 3172635, 2157364, 2638273, 3672635, 3127364),
  X2021 = c(39217248, 8764423, 3181635, 4650021, 15627489, 4728364, 12476382, 15627364, 
            1508273, 3427364, 3327364, 2207364, 2227364, 3227364, 2207364, 2682736, 3727364, 3172635)
)

# 성장률 계산 함수
calculate_growth_rate <- function(values) {
  growth_rates <- numeric()
  for (i in 2:length(values)) {
    growth_rate <- ((values[i] - values[i - 1]) / values[i - 1]) * 100
    growth_rates <- c(growth_rates, growth_rate)
  }
  return(mean(growth_rates, na.rm = TRUE)) 
}


Kyungnam_data$Average_Growth_Rate <- apply(Kyungnam_data[, -1], 1, calculate_growth_rate)

# 결과 출력
print(Kyungnam_data[, c("Region", "Average_Growth_Rate")])
##    Region Average_Growth_Rate
## 1  창원시           1.1947690
## 2  진주시           3.6461513
## 3  통영시          -2.2319376
## 4  사천시           2.3116679
## 5  김해시           0.6288682
## 6  밀양시           2.7769571
## 7  거제시           1.2427305
## 8  양산시           2.7350524
## 9  의령군           3.6222421
## 10 함안군           1.8835970
## 11 창녕군           1.8461006
## 12 고성군           2.2394523
## 13 남해군           2.2649331
## 14 하동군           1.6923683
## 15 산청군           2.1917499
## 16 함양군           2.0038026
## 17 거창군           1.4046109
## 18 합천군           1.6635173



[분석3.4] 부울경 전체 비교

shp_path <- "C:/공간빅데이터분석/최종 레포트/sig_20230729/sig.shp"
data <- st_read(shp_path)
## Reading layer `sig' from data source 
##   `C:\공간빅데이터분석\최종 레포트\sig_20230729\sig.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 250 features and 3 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: 746110.3 ymin: 1458754 xmax: 1387948 ymax: 2068444
## CRS:           NA
codes <- c("26", "31", "48")
Map_BUK <- data[substr(data$SIG_CD, 1, 2) %in% codes, ]


Busan_data <- Busan_data %>%
  rename( 행정구역 = Region )
Busan_data <- left_join(Busan.Area.code, Busan_data, by = "행정구역")
Busan_data$법정동코드 <- str_sub(Busan_data$법정동코드, 1, 5)

Ulsan_data <- Ulsan_data %>%
  rename( 행정구역 = Region )
Ulsan_data <- left_join(Ulsan.Area.code, Ulsan_data, by = "행정구역")
Ulsan_data$법정동코드 <- str_sub(Ulsan_data$법정동코드, 1, 5)

Kyungnam_data <- Kyungnam_data %>%
  rename( 행정구역 = Region )
Kyungnam_data <- left_join(Kyungnam.Area.code, Kyungnam_data, by = "행정구역")
Kyungnam_data$법정동코드 <- str_sub(Kyungnam_data$법정동코드, 1, 5)


combined_data <- bind_rows(Busan_data, Ulsan_data, Kyungnam_data)

Map_BUK1 <- left_join(Map_BUK, combined_data, by = c("SIG_CD" = "법정동코드"))

ggplot(data = Map_BUK1) +
  geom_sf(aes(fill = Average_Growth_Rate), color = "black") + # 특정 변수명을 성장률 또는 관련 열로 변경
  scale_fill_gradient(low = "white", high = "red", na.value = "grey", name = "성장률 (%)") +
  labs(
    title = "부울경 경제성장률",
    subtitle = "GRDP 전년도 기준 성장률"
  ) +
  theme_minimal()



[결론] 결론


“인구 이동, 문화시설 분포, 지역내총생산량 3가지의 요소로 부울경 지역의 거점으로 선정 가능한 도시에 대해서 분석해 보았다. 위 내용에서 유사하게 중복되는 지역으로는 ‘부산 기장군’, ‘부산 수영구’, ‘울산 중구’, ‘울산 울주군’, ‘경남 양산시’, ’경남 창원시’등이 있다. 3가지의 요소가 유사한 개념이 아니기에 합치기 보다는 각각 인구적, 문화적, 경제적인 축 형성을 위한 거점지역으로 선정하기 좋을 것이라고 생각된다.”