인공지능 개발자 양성 과정

[0419] 데이터 분석 실습 - 홍대입구 주변 아파트 시세

AI gina 2022. 4. 19. 17:07

- 지하철역 주변 아파트 시세 분석

- '지하철역 주변의 아파트 시세를 알아보고,

  지하철역에서 아파트까지의 거리에 따라 가격 분포가 어떻게 다른지를 비교'

- 결과 시각화 : 구글 지도를 활용하여 서울시 지도에 지하철역과 주변 아파트 실거래가 표시

 

1. 공공 데이터 다운로드

  1-1. 지하철역 정보 다운로드 및 전처리

    지하철역 주소 정보 : 서울 열린 데이터 광장 URL : http://data.seoul.go.kr

    URL2 : http://data.seoul.go.kr/dataList/datasetView.do?infId=OA-12035&srvType=S&serviceKind=1

  1-2. 아파트 실거래가 다운로드 및 전처리

    국토교통부 실거래가 공개 시스템 URL : http://rtdown.molit.go.kr

  1-3. 구글 지도 정보

    library(ggmap)

 

2. ==========지하철역 데이터 가공하기============

#1. 지하철역 주소 파일 읽어들이기
#1-1. 원시데이터 가져오기
station_data <- read.csv("./data/역별_주소_및_전화번호.csv")
str(station_data)

#2. 지하철역 좌표 정보 구하기
#만약 구주소가 Factor형일 경우, as.character() 함수로 문자형 변환 할 것.
station_code <- as.character(station_data$"구주소")

library(ggmap)
googleAPIKey <- "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" #본인 코드 입력할 것.
register_google(key = googleAPIKey) #google api key 등록

station_code <- geocode(station_code) #geocode()함수로 station_code 값을 위도와 경도로 변환
head(station_code)

station_code <- as.character(station_data$"구주소") %>% 
                 enc2utf8() %>% geocode() # utf8로 인코딩해서 geocode 불러온다.

#기존 station_data와 위도, 경도 가진 station_code를 합친후,
#station_code_final에 할당
station_code_final <-  cbind(station_data, station_code)

head(station_code_final) #station_code_final의 앞부분 확인
                역명                    구주소      lon
1               시청     서울 중구 서소문동 27 126.9753
2         을지로입구  서울 중구 을지로1가 89-1 126.9826
3          을지로3가  서울 중구 을지로3가 70-1 126.9917
4          을지로4가 서울 중구 을지로4가 261-1 126.9973
5 동대문역사문화공원     서울 중구 을지로7가 1 127.0110
6               신당   서울 중구 신당5동 106-1 127.0196
       lat
1 37.56389
2 37.56598
3 37.56613
4 37.56639
5 37.56728
6 37.56565

 

3. ==========아파트 실거래가 데이터 가공하기============

#원시데이터 가져오기
apart_data <- read.csv("./data/아파트_실거래가.csv")
head(apart_data)

#전용면적 데이터 반올림하여 정수로 표현
apart_data$전용면적 <- round(apart_data$전용면적)
head(apart_data)

#가장 거래 빈도가 높은 전용면적 구하기 #count() 지정한 변수의 그룹별 개수 반환
count(apart_data, 전용면적) %>% 
  arrange(desc(n))
#전용면적 85의 개수가 가장 많다. (n=434)

#전용면적 85와 같은 데이터 추출
apart_data_85 <- subset(apart_data, 전용면적 =="85")  #subset() 지정한 조건에 맞는 데이터만 추출해주는 함수. 기본함수. dplyr패키지의 filter()와 유사
head(apart_data_85)
#===========================================================

#거래금액 chr 문자열로 되어 있고, ","가 들어있음
#쉼표를 공백("")으로 대체하여 제거
apart_data_85$거래금액 <- gsub(",", "", apart_data_85$거래금액) #gsub() 값 변환하는 함수
head(apart_data_85)

#거래금액을 정수형으로 변환하여 단지명별 평균을 구한후
#apart_data_85_cost 변수에 할당
apart_data_85_cost <- aggregate(as.integer(거래금액) ~ 단지명,
                      apart_data_85, mean) #aggregate() 그룹화하는 함수
#데이터 불러오고, 단지명 기준으로 그룹화하여, 거래금액을 실수로변환하고, 금액의 평균값을 구함
head(apart_data_85_cost)
#"as.integer(거래금액")을 "거래금액"으로 변경하여 저장
apart_data_85_cost <- rename(apart_data_85_cost,
                             "거래금액" = "as.integer(거래금액)")
head(apart_data_85_cost)

#단지명이 중복된 행을 제거하고 뽑아서, apart_data_85에 할당
apart_data_85 <- apart_data_85[!duplicated(apart_data_85$단지명),] #duplicated() 중복제거 함수
head(apart_data_85)

#"단지명" 기준으로 apart_data_85와 apart_data_85_cost 합치기
apart_data_85 <- left_join(apart_data_85, apart_data_85_cost, by="단지명")
head(apart_data_85)
#"단지명", "시군구", "번지", "전용면적", "거래금액.y" 만 추출하고 저장
apart_data_85 <- apart_data_85 %>% select("단지명", "시군구", "번지", 
                                          "전용면적", "거래금액.y")
head(apart_data_85)
#"거래금액.y"를 "거래금액"으로 변경한 후 저장
apart_data_85 <- rename(apart_data_85, "거래금액" = "거래금액.y")
head(apart_data_85)
#===========================================================

#paste()함수로 "시군구", "번지"열을 합친후 apart_address에 저장
#paste()는 합칠때 공백이 자동으로 들어가고, paste0()은 공백없이 합쳐진다.
apart_address <- paste(apart_data_85$"시군구", apart_data_85$"번지") %>% 
                  data.frame()
#values(벡터형)으로 apart_address가 저장되므로, data.frame()으로 데이터프레임으로 저장한다.
head(apart_address)
# "."컬럼명을 "주소"로 변경하여 저장
apart_address <- rename(apart_address, "주소" =".")
head(apart_address)

#좌표 정보 추가후, 최종 데이터 만들기
#아파트 주소를 위,경도로 변환하여 apart_address_code에 저장
apart_address_code <- as.character(apart_address$"주소") %>% 
                      enc2utf8() %>% geocode()
head(apart_address_code)

#데이터 세트를 합친후 일부 열만 apart_code_final에 저장
#apart_address, apart_data, apart_address_code
apart_code_final <- cbind(apart_data_85, apart_address, apart_address_code) %>% 
                     select("단지명", "전용면적", "거래금액", "주소", lon, lat)
head(apart_code_final)

4. 구글지도에 아파트 가격 표시하기

#홍대역 지도 정보 가져와 mapo_map에 저장
mapo_map <- get_googlemap("mapogu", maptype = "roadmap", zoom=12)
library(ggmap)
ggmap(mapo_map) #구글 지도 호출

library(ggplot2)
#지하철역 위치 및 아파트 가격 정보 표시하기
#산점도를 이용한 지하철역 위치 표시 및  역명 표시
ggmap(mapo_map) +
  geom_point(data=station_code_final, aes(x=lon, y=lat), colour="red",size=3) +
  geom_text(data=station_code_final, aes(label=역명, vjust=-1)) #vjust는 기본값. 변경x

#홍대입구역 지도 정보를 가져와 hongdae_map 변수에 저장
hongdae_map <- get_googlemap("hongdae station",maptype = "roadmap", zoom=15)

#홍대입구역 지도에 지하철 정보 및 아파트 정보 일괄 표시
ggmap(hongdae_map) +
  geom_point(data = station_code_final, aes(x=lon,y=lat), colour ="red", size=3)+
  geom_text(data=station_code_final, aes(label=역명,vjust=-1))+
  geom_point(data=apart_code_final, aes(x=lon,y=lat))+
  geom_text(data=apart_code_final, aes(label=단지명,vjust=-1))+
  geom_text(data=apart_code_final, aes(label=거래금액, vjust=1), colour="red")

서울 마포구 지하철역 위치
홍대입구 아파트 85(m2) 시세 (현재x)