패키지

library(rgdal) # readOGR
library(dplyr)
library(sf)
library(ggmap) # 구글맵 키
library(ggplot2)
library(plotly)
library(RColorBrewer)
library(viridis)

데이터 불러오기

# 광주 지역 shp
gwang_ju <- readOGR("LSMD_ADM_SECT_UMD_29.shp",encoding = "euc-kr")
#> OGR data source with driver: ESRI Shapefile 
#> Source: "C:\Users\seong taek\Desktop\3-1 DataVisualize\data_visualize\LSMD_ADM_SECT_UMD_29.shp", layer: "LSMD_ADM_SECT_UMD_29"
#> with 203 features
#> It has 5 fields
gwang_ju %>% class()
#> [1] "SpatialPolygonsDataFrame"
#> attr(,"package")
#> [1] "sp"

# 의류수거함
cloth <- read.csv("광주광역시_주택가주변의류수거함 현황_20221209.csv",fileEncoding = "CP949")
cloth %>% head()
#>   연번 자치구 설치지역.동명. 설치업체
#> 1    1   동구         동명동         
#> 2    2   동구         동명동         
#> 3    3   동구         동명동         
#> 4    4   동구         동명동         
#> 5    5   동구         동명동         
#> 6    6   동구         동명동         
#>                                           설치위치.장소. 데이터기준일자
#> 1 광주광역시 동구 필문대로253번길 5(조대명품타운 건너편)     2022-12-09
#> 2               광주광역시 동구 동명로14번길 27(true 옆)     2022-12-09
#> 3                           광주광역시 동구 동계천로 156     2022-12-09
#> 4         광주광역시 동구 동명로20번길 33(동명아파트 옆)     2022-12-09
#> 5              광주광역시 동구 백서로 226-1(서석교회 옆)     2022-12-09
#> 6     광주광역시 동구 필문대로 261 입구(동천주차장 입구)     2022-12-09

# 구글맵 키
register_google(key = 'AIzaSyCQhISmZrGYjMTh5J42qmSVytOVgzs6YlQ')

전처리

# sp → sf 변환
gwang_ju <- st_as_sf(gwang_ju)
gwang_ju %>% head()
#> Simple feature collection with 6 features and 5 fields
#> Geometry type: MULTIPOLYGON
#> Dimension:     XY
#> Bounding box:  xmin: 922908.9 ymin: 1685904 xmax: 937583.2 ymax: 1691397
#> Projected CRS: Korea 2000 / Unified CS
#>     EMD_CD EMD_NM SGG_OID COL_ADM_SE  GID                       geometry
#> 0 29200202 오선동    3233      29200 3247 MULTIPOLYGON (((934856 1689...
#> 1 29200178 동림동    3232      29200 3248 MULTIPOLYGON (((925403.5 16...
#> 2 29200177 양산동    3231      29200 3249 MULTIPOLYGON (((925032.9 16...
#> 3 29200176 덕림동    1605      29200 3250 MULTIPOLYGON (((925606 1686...
#> 4 29200175 동호동    1604      29200 3251 MULTIPOLYGON (((925167 1688...
#> 5 29200174 명도동    3228      29200 3252 MULTIPOLYGON (((925936.6 16...

# 주소 기반으로 위도/경도 추가
cloth <- mutate_geocode(data = cloth, location = 설치위치.장소., source = "google")
cloth %>% head()
#>   연번 자치구 설치지역.동명. 설치업체
#> 1    1   동구         동명동         
#> 2    2   동구         동명동         
#> 3    3   동구         동명동         
#> 4    4   동구         동명동         
#> 5    5   동구         동명동         
#> 6    6   동구         동명동         
#>                                           설치위치.장소. 데이터기준일자
#> 1 광주광역시 동구 필문대로253번길 5(조대명품타운 건너편)     2022-12-09
#> 2               광주광역시 동구 동명로14번길 27(true 옆)     2022-12-09
#> 3                           광주광역시 동구 동계천로 156     2022-12-09
#> 4         광주광역시 동구 동명로20번길 33(동명아파트 옆)     2022-12-09
#> 5              광주광역시 동구 백서로 226-1(서석교회 옆)     2022-12-09
#> 6     광주광역시 동구 필문대로 261 입구(동천주차장 입구)     2022-12-09
#>        lon      lat
#> 1 126.9295 35.14841
#> 2 126.9262 35.14994
#> 3 126.9221 35.15180
#> 4 126.9273 35.15041
#> 5 126.9269 35.14792
#> 6 126.9234 35.14895

시각화

광주지역 ‘구’ 분류

gwang_ju %>% ggplot(aes(fill=COL_ADM_SE)) +
  geom_sf() +
  theme_minimal() +
  labs(title = "광주") +
  theme(plot.title = element_text(size = 20)) + # 글꼴 크기를 20으로 설정
  scale_fill_discrete(name = "구",
                      labels = c("동구","서구","남구","북구","광산구")) # 범례 설정

광주지역 ‘동’ 분류

gwang_ju_dong <- gwang_ju %>% 
  ggplot(aes(fill=EMD_NM))+ # '동' 별로 채우기
  geom_sf()+
  geom_sf_text(mapping = aes(label = EMD_NM))+
  labs(title = "광주")+
  theme_minimal()+
  scale_fill_discrete(name = "동")
  
# 제목 크기 변경
plotly_gwang_ju <- ggplotly(gwang_ju_dong) %>%
  layout(title = list(text = "광주", font = list(size = 25)))

plotly_gwang_ju

전처리2

# 결측값 제거
cloth <- 
  cloth %>% na.omit()

# 이상치 제거
cloth <- cloth %>% 
    filter(!(`설치지역.동명.` %in% c('건국동','문화동','유덕동','광천동','신안동','임 동','금호2동','상무2동','서창동','금호1동')))

# 데이터프레임 → sf객체
gwang_ju_cloth <- cloth %>%
   st_as_sf(coords = c("lon", "lat"))

# 좌표 할당
st_crs(gwang_ju_cloth) <- 4737
gwang_ju_cloth %>% head()
#> Simple feature collection with 6 features and 6 fields
#> Geometry type: POINT
#> Dimension:     XY
#> Bounding box:  xmin: 126.9221 ymin: 35.14792 xmax: 126.9295 ymax: 35.1518
#> Geodetic CRS:  Korea 2000
#>   연번 자치구 설치지역.동명. 설치업체
#> 1    1   동구         동명동         
#> 2    2   동구         동명동         
#> 3    3   동구         동명동         
#> 4    4   동구         동명동         
#> 5    5   동구         동명동         
#> 6    6   동구         동명동         
#>                                           설치위치.장소. 데이터기준일자
#> 1 광주광역시 동구 필문대로253번길 5(조대명품타운 건너편)     2022-12-09
#> 2               광주광역시 동구 동명로14번길 27(true 옆)     2022-12-09
#> 3                           광주광역시 동구 동계천로 156     2022-12-09
#> 4         광주광역시 동구 동명로20번길 33(동명아파트 옆)     2022-12-09
#> 5              광주광역시 동구 백서로 226-1(서석교회 옆)     2022-12-09
#> 6     광주광역시 동구 필문대로 261 입구(동천주차장 입구)     2022-12-09
#>                    geometry
#> 1 POINT (126.9295 35.14841)
#> 2 POINT (126.9262 35.14994)
#> 3  POINT (126.9221 35.1518)
#> 4 POINT (126.9273 35.15041)
#> 5 POINT (126.9269 35.14792)
#> 6 POINT (126.9234 35.14895)

# '동' 별 의류수거함
existing_categories <- unique(gwang_ju_cloth$설치지역.동명.)

# viridis 색상 팔레트 사용
colors <- magma(length(existing_categories))

# 설치'동'명과 색상을 매칭하는 데이터프레임 생성
color_mapping <- data.frame(번호 = existing_categories,
                            색상 = colors)

color_mapping %>% head()
#>      번호      색상
#> 1  동명동 #000004FF
#> 2 계림1동 #010108FF
#> 3 계림2동 #03030EFF
#> 4 지산1동 #050416FF
#> 5 지산2동 #07061CFF
#> 6 산수1동 #0B0923FF

광주지역 의류수거함 시각화

gwang_ju_all_cloth <- ggplot() +
  geom_sf(data = gwang_ju, fill = 'grey90') +
  geom_sf(data = gwang_ju_cloth, aes(color = 설치지역.동명.), size = 0.8) +
  scale_color_manual(values = color_mapping$색상,
                     breaks = color_mapping$설치지역.동명.,
                     labels = color_mapping$설치지역.동명.) +
  theme_minimal() +
  labs(title = "광주지역 의류수거함 위치")

gwang_ju_all_cloth %>% ggplotly()