안녕하세요

모두를 위한 R 데이터 분석 입문 연습문제 13장 본문

Study_exam/모두를 위한 R 데이터 분석 입문 연습문제

모두를 위한 R 데이터 분석 입문 연습문제 13장

godxxy1229 2023. 6. 15. 06:45
library(ggplot2)
library(ggmap)
library(readxl)
register_google(key = "구글 api 키를 이곳에")
files <- c("201512","201606","201612","201706","201712")
columns <- c( "상가업소번호", "상호명", "상권업종대분류명", "상권업종중분류명", 
  			                    "상권업종소분류명", "시군구명", "행정동명", "경도", "위도")     
ds.total <- NULL
Sys.setlocale("LC_ALL", "korean")

for (i in 1:length(files)) {
  filename <- paste("./source/Ch13/seoul_", files[i], ".xlsx", sep="")
  cat("read ", filename, "...\n")           
  ds <- read_excel(filename)              
  ds <- data.frame(ds)                    
  ds <- ds[,columns]                      
  ds$수집연월 <- rep(i, nrow(ds))         
  ds.total <- rbind(ds.total,ds)          
}

 

01 성북구와 강남구의 데이터 수집 시점에 따른 점포수 변화를 그래프 상에 나타내시오.

 

store.gu <- aggregate(ds.total[, 1], 
 	by = list(연월=ds.total$수집연월, 구이름 = ds.total$시군구명), FUN = length)
names(store.gu)[3] = "count"
library(ggplot2)
ggplot(subset(x = store.gu, 구이름 %in% c("성북구", "강남구")), 
 				      aes(x=연월, y=count, colour = 구이름, group = 구이름)) + 
  geom_line() + geom_point(size = 6, shape = 15, alpha = 0.7) + 
  ggtitle("성북구, 강남구 수집시점별 점포수 변화") + ylab("점포수") + 
  scale_x_continuous(breaks = 1:5, labels = files)


02 강동구의 데이터 수집 시점에 따른 음식 업종(대분류 기준) 점포수 변화를 그래프 상에 나타내시오.

tmp <- subset(x = ds.total, 시군구명 == "강동구" & 상권업종대분류명 == "음식")
store.gangdong <- aggregate(x = tmp[,1], 
   by = list(연월 = tmp$수집연월, 중분류업종 = tmp$상권업종중분류명),   FUN = length)
names(store.gangdong)[3] = "count"
ggplot(store.gangdong, aes(x=연월, y=count, colour = 중분류업종, group = 중분류업종)) + 
  geom_line() + geom_point(size = 6, shape = 15, alpha = 0.7) + 
  ggtitle("강동구 수집시점별 음식 업종 점포수 변화") + ylab("점포수") + 
  scale_x_continuous(breaks = 1:5, labels = files)

 


03 관악구의 데이터 수집 시점에 따른 중식 업종(중분류 기준) 점포수 변화를 그래프 상에 나타내시오.

 

tmp <- subset(x = ds.total, 시군구명 == "관악구" & 상권업종중분류명 == "중식")
store.kw <- aggregate(x = tmp[,1], 
  by = list(연월 = tmp$수집연월,소분류업종 = tmp$상권업종소분류명), FUN = length)
names(store.kw)[3] = "count"
ggplot(store.kw, aes(x=연월, y=count, colour = 소분류업종, group = 소분류업종)) + 
  geom_line() + geom_point(size = 6, shape = 15, alpha = 0.7) + 
  ggtitle("강동구 수집시점별 중식 점포수 변화") + ylab("점포수") + 
  scale_x_continuous(breaks = 1:5, labels = files)


04 교육 관련 점포(소분류 기준)가 가장 많은 상위 10개 동을 구하여 막대그래프로 점포수를 표시하시오(2017년 12월 수집 데이터 기준).

 

# 제가 생각했을 땐 소분류 기준 교육 관련 점포라는 말이 굉장히 이상합니다.
# 왜냐하면 소분류 기준에서 보면 교육 관련 소분류명이 한두가지가 아닙니다.
# 그래서 대분류에서 학문/교육 대분류명을 가진 점포로 검색했습니다.
ds.201712 <- subset( x = ds.total, 수집연월 == 5 & 상권업종대분류명 == "학문/교육")
store.edu <- aggregate( ds.201712[,1], 
 				by = list(동이름 = ds.201712$행정동명),  FUN = length)
names(store.edu)[2] = "count"
store.edu.top10 <- store.edu[order(store.edu$count, decreasing = T)[1:10],]
store.edu.top10
ggplot(store.edu.top10, aes(x=reorder(동이름, -count), y = count)) + 
  geom_bar(stat = "identity", width = 0.6, fill = "lightcoral") + 
  ggtitle("교육관련 점포수 상위 10개 동")  + xlab("동이름") + ylab("점포수")


05 종로구의 점포수를 점포 대분류 기준으로 집계하여 막대그래프로 나타내시오(2017년 12월 수집 데이터 기준).

 

myds <- subset(x = ds.total, 수집연월 == 5 & 시군구명 == "종로구")
myds <- aggregate(x = myds[, 1], 
 				by = list(대분류명 = myds$상권업종대분류명), FUN = length)
ggplot(myds, aes(x=대분류명, y = x)) + 
  geom_bar(stat = "identity", width = 0.6, fill = "lightcoral") + 
  ggtitle("종로구 대분류별 점포수")  + xlab("점포 업종") + ylab("점포수")


06 관악구의 동별 점포수를 집계하여 막대그래프로 나타내시오(2017년 12월 수집 데이터 기준).

 

myds <- subset(x = ds.total, 수집연월 == 5 & 시군구명 == "관악구")
myds <- aggregate(x = myds[, 1], by = list(동이름 = myds$행정동명), FUN = length)
ggplot(myds, aes(x=동이름, y = x)) + 
  geom_bar(stat = "identity", width = 0.6, fill = "lightcoral") + 
  ggtitle("관악구 동별 점포수")  + xlab("동이름") + ylab("점포수")
# Zoom 으로 확대하여 보시면 동이름이 짤리지 않고 보입니다


07 서울 종로구 종로1, 2, 3, 4가 동의 상권을 지도상에 표시하시오(2017년 12월 수집 데이터 기준).

• 지도에 종로1.2.3.4가동 지역이 모두 표시되도록 한다.
• 점포를 업종별(대분류)로 색을 구분하여 지도에 표시한다.

 

Sys.setlocale("LC_ALL", "korean")
ds.jr <- subset(x = ds.total, 수집연월 == 5 & 행정동명 == "종로1.2.3.4가동")
cen <- c(mean(ds.jr[,"경도"]), mean(ds.jr[,"위도"]))
map <- get_googlemap(center = cen, 
 					maptype = "roadmap", size = c(640, 640), zoom = 15)
gmap <- ggmap(map)
gmap + geom_point(data = ds.jr, 
 			aes(x = 경도, y = 위도, color= 상권업종대분류명), size = 2,alpha = 0.7) + 
labs(x = "경도", y = "위도", color = "업종")

 

08 서울 중구 회현동의 상권을 지도상에 표시하시오(2017년 12월 수집 데이터 기준).

• 지도에 회현동 지역이 모두 표시되도록 한다.
• 중식과 한식(중분류) 점포에 대해 색을 구분하여 지도에 표시한다.

 

ds.hoe <- subset(x = ds.total, 수집연월 == 5 & 행정동명 == "회현동" & 
 					                          상권업종중분류명 %in% c("중식", "한식"))
cen <- c(mean(ds.hoe[,"경도"]), mean(ds.hoe[,"위도"]))
map <- get_googlemap(center = cen, maptype = "roadmap", 
 								size = c(640, 640), zoom = 16)
gmap <- ggmap(map)
gmap + geom_point(data = ds.hoe, 
 		  aes(x = 경도, y = 위도, color= 상권업종중분류명), size = 2, alpha = 0.7) + 
labs(x = "경도", y = "위도", color = "업종")

 

09 서울 금천구의 동별 점포수를 지도상에 원의 크기로 표시하시오(2017년 12월 수집 데이터 기준).

• 지도에 금천구 지역이 모두 표시되도록 한다.
• 원의 색은 빨강, 투명도는 0.6으로 한다.

 

Sys.setlocale("LC_ALL", "korean")
ds.geum <- subset(x = ds.total, 수집연월 == 5 & 시군구명 == "금천구")
ds.geum.loc = aggregate(x = ds.geum[,c("경도", "위도")], 
  			                                by = list(동이름 = ds.geum$행정동명), FUN = mean)
ds.geum <- aggregate(x = ds.geum[,1], by=list(구이름 = ds.geum$행정동명), FUN = length)
ds.geum <- data.frame(ds.geum, ds.geum.loc[,2:3])
cen <- c(mean(ds.geum[,"경도"]), mean(ds.geum[,"위도"]))
map <- get_googlemap(center = cen, maptype = "roadmap", 
 								size = c(640, 640), zoom = 14)
gmap <- ggmap(map)
gmap + geom_point(data = ds.geum, aes(x = 경도, y = 위도, size = x), 
 							                 alpha = 0.6, color= "red") + 
    scale_size_continuous(range = c(1,15)) + 
    geom_text(data = ds.geum, aes(x=경도, y=위도), size = 3, label = ds.geum$구이름) +
    labs(x = "경도", y = "위도", color = "점포수")


10 강남역을 중심으로 부근의 상권을 지도상에 표시하시오(2017년 12월 수집 데이터 기준).

• 지도의 중심은 강남역으로 한다.
• 점포의 위치(경도 위도)를 강남역의 위치와 비교하여 일정 거리에 있는 점포들을 추출한다.

(1) 추출된 점포를 업종별(대분류)로 색을 구분하여 지도에 표시하시오.
(2) 커피 관련 점포(소분류 기준)만 지도에 표시하시오.

 

#(1)
Sys.setlocale("LC_ALL", "korean")
cen <- geocode(enc2utf8("강남역"))
cen <- c(cen$lon, cen$lat)
t <- subset(x = ds.total, 수집연월 == 5)
ds.within <- c()

for(i in 1:nrow(t)){
  d <- sqrt((cen[1] - t[i, "경도"])**2 + (cen[2] - t[i, "위도"])**2)
  if(d < 0.011){
    ds.within[i] = TRUE
  }else{
    ds.within[i] = FALSE
  }
}
ds.gn <- t[ds.within,]
map <- get_googlemap(center = cen, maptype = "roadmap", 
 							            size = c(640, 640), zoom = 15)
gmap <- ggmap(map)
gmap + geom_point(data = ds.gn, 
				aes(x = 경도, y = 위도, color = 상권업종대분류명),  alpha = 0.6) + 
  scale_size_continuous(range = c(1,15)) + 
  labs(x = "경도", y = "위도", color = "대분류명")
#(2)
gmap + geom_point(data = subset(x = ds.gn, 상권업종소분류명 == "커피전문점/카페/다방"), 
                  aes(x = 경도, y = 위도, color = 상권업종소분류명),   alpha = 0.6) + 
  scale_size_continuous(range = c(1,15)) + 
  labs(x = "경도", y = "위도", color = "소분류명")