Open API 사용하기 (Using Open API)
preface 이번 포스트에서는 Open API 서비스를 이용하여 R 로 직접 자료를 읽어오는 방법에 대하여 알아봅니다.
공공데이터 포털 - 아파트매매 실거래 상세 자료
다음 자료를 참고하였습니다:
- 공공데이터포털에 접속하여 회원가입을 합니다.
- 국토교통부 실거래가정보 Open API에 들어갑니다.
- 아파트매매 실거래 상세 자료를 활용 신청 합니다.
- 바로 뜨는 안내 링크 혹은 마이페이지 > OPEN API > 개발계정 상세보기 에서 일반 인증키를 발급받습니다.
- 계발계정 상세보기 하단에 있는 개발가이드를 클릭하면 상세한 기술 문서를 얻을 수 있습니다.
- 요청주소: http://openapi.molit.go.kr/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcAptTradeDev
- 요청변수 항목을 보면 서비스키(ServiceKey), 지역코드(LAWD_CD), 계약월(DEAL_YMD) 이 필수임을 알 수 있습니다.
library(XML)
library(data.table)
library(stringr)
library(ggplot2)
# Service Key
service_key <- "YOUR_SERVICE_KEY"
# 지역코드
locCode <-c("11110","11140","11170","11200","11215")
locCode_nm <-c("종로구","중구","용산구","성동구","광진구")
# 날짜
datelist <-c("201601","201602","201603","201604","201605","201606","201607","201608","201609","201610","201611","201612")
# 하나의 지역코드 x 날짜 당 출력 관측치 수 (따로 설정하지 않으면 default = 10 입니다)
Num_of_Rows <- 100
# 지역코드 x 날짜 별로 자료를 요청하는 url 생성
urllist <- list()
cnt <-0
for(i in 1:length(locCode)){
for(j in 1:length(datelist)){
cnt=cnt+1
urllist[cnt] <-paste0("http://openapi.molit.go.kr/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcAptTradeDev?LAWD_CD=",locCode[i],
"&DEAL_YMD=",datelist[j],
"&numOfRows=",Num_of_Rows,
"&serviceKey=",service_key)
}
}
# 5 개 지역 x 12 개월 = 총 60 개의 url 요청
# (Open API 서비스에 따라 접속 횟수를 제한하기도 하므로 따로 저장)
# (아파트매매 실거래 상세 자료의 경우 하루 1000건)
raw.data <- list()
rootNode <- list()
for(i in 1:length(urllist)){
raw.data[[i]] <- xmlTreeParse(urllist[i], useInternalNodes = TRUE,encoding = "utf-8") # 생성한 URL 대로 XML 을 요청한다
rootNode[[i]] <- xmlRoot(raw.data[[i]])
}
# 저장한 XML을 분석가능한 형태로 수정
total<-list()
for(i in 1:length(urllist)){
item <- list()
item_temp_dt<-data.table()
items <- rootNode[[i]][[2]][['items']] # items 항목만 골라낸다
size <- xmlSize(items) # 몇개의 item 이 있는지 확인한다
for(j in 1:size){
item_temp <- xmlSApply(items[[j]],xmlValue)
item_temp_dt <- data.table( GU = locCode_nm[i%/%12+1],
GU_CODE = locCode[i%/%12+1],
DATE = datelist[(i-1)%%12+1],
VAR1=item_temp[1],
VAR2=item_temp[2],
VAR3=item_temp[3],
VAR4=item_temp[4],
VAR5=item_temp[5],
VAR6=item_temp[6],
VAR7=item_temp[7],
VAR8=item_temp[8],
VAR9=item_temp[9],
VAR10=item_temp[10],
VAR11=item_temp[11],
VAR12=item_temp[12],
VAR13=item_temp[13],
VAR14=item_temp[14],
VAR15=item_temp[15],
VAR16=item_temp[16],
VAR17=item_temp[17],
VAR18=item_temp[18],
VAR19=item_temp[19],
VAR20=item_temp[20],
VAR21=item_temp[21],
VAR22=item_temp[22],
VAR23=item_temp[23],
VAR24=item_temp[24])
item[[j]]<-item_temp_dt
}
total[[i]] <- rbindlist(item)
}
RESULTS_APT_SALES <- rbindlist(total)
names(RESULTS_APT_SALES) <- c("시군구코드","시군구","날짜","거래금액","건축년도","년","도로명","도로명건물본번호코드","도로명건물부번호코드",
"도로명시군구코드","도로명일련번호코드","도로명지상지하코드","도로명코드","법정동",
"법정동본번코드","법정동부번코드","법정동시군구코드","법정도읍면동코드","법정동지번코드",
"아파트","월","일","일련번호","전용면적","지번","지역코드","층")
데이터를 받고나면, 중간중간 이가 빠진 데이터들 때문에 한번 더 cleansing 작업을 해줘야 합니다.
마지막 변수에 NA 가 들어간 자료들을 뽑아내서, 문제를 확인하고 수정하는 과정을 거칩시다.
한국은행 Open API 이용하기
다음 자료를 참고하였습니다:
- 한국은행 경제통계시스템에 회원가입을 합니다.
- Open API 서비스로 들어갑니다. 우측 배너에 링크가 있습니다.
- Open API 인증키 신청을 합니다.
한국은행 100대 통계지표
아래 예제는 한국은행 100대 통계지표를 불러오는 코드입니다. 시계열 자료가 아니라 현재 snapshot 이므로 활용가치는 다소 떨어집니다.
# 한국은행 100대 통계지표 불러오기
library(XML)
library(data.table)
library(stringr)
BOK_urllist <- list()
BOK_urllist[[1]] <- "http://ecos.bok.or.kr/api/KeyStatisticList/YOUR_AUTH_KEY/xml/kr/1/101/"
BOK_raw.data <- list()
BOK_rootNode <- list()
BOK_raw.data[[1]] <- xmlTreeParse(BOK_urllist[1], useInternalNodes = TRUE,encoding = "utf-8") # 생성한 URL 대로 XML 을 요청
BOK_rootNode[[1]] <- xmlRoot(BOK_raw.data[[1]])
BOK_total <- list()
for(i in 1:length(BOK_urllist)){
BOK_item <- list()
BOK_item_temp_dt <- data.table()
BOK_items <- BOK_rootNode[[i]]
BOK_size <- xmlSize(BOK_items) # 몇개의 item 이 있는지 확인
for(j in 1:BOK_size){
BOK_item_temp <- xmlSApply(BOK_items[[j]],xmlValue)
BOK_item_temp_dt <- data.table(VAR1=BOK_item_temp[1],
VAR2=BOK_item_temp[2],
VAR3=BOK_item_temp[3],
VAR4=BOK_item_temp[4],
VAR5=BOK_item_temp[5])
BOK_item[[j]]<-BOK_item_temp_dt
}
BOK_total[[i]] <- rbindlist(BOK_item)
}
RESULTS <- rbindlist(BOK_total)
한국은행 시장금리
아래 예제는 한국은행 4.1.2 시장금리(월,분기,년)를 월별로 불러오는 코드입니다. 여러 통계 지표를 테스트해보니 자료에 따라 601 SQL 에러가 뜨는 경우도 있었습니다.
# 한국은행 4.1.2 시장금리(월,분기,년)
library(XML)
library(data.table)
library(stringr)
BOK_urllist <- list()
AUTH_KEY = "YOUR_AUTH_KEY"
REQ_TYPE = "xml"
LANG = "kr"
START_COUNT = "1"
END_COUNT = "1000"
STAT_CODE = "028Y001"
CYCLE_TYPE = "MM"
START_DATE = "201401"
END_DATE = "201405"
ITEM_1 = "?"
ITEM_2 = "?"
ITEM_3 = "?"
BOK_urllist[[1]] <- paste0("http://ecos.bok.or.kr/api/StatisticSearch/",
AUTH_KEY,"/",REQ_TYPE,"/",LANG,"/",START_COUNT,"/",END_COUNT,"/",
STAT_CODE,"/",CYCLE_TYPE,"/",START_DATE,"/",END_DATE,"/",ITEM_1,"/",ITEM_2,"/",ITEM_3)
BOK_raw.data <- list()
BOK_rootNode <- list()
BOK_raw.data[[1]] <- xmlTreeParse(BOK_urllist[1], useInternalNodes = TRUE,encoding = "utf-8") # 생성한 URL 대로 XML 을 요청
BOK_rootNode[[1]] <- xmlRoot(BOK_raw.data[[1]])
BOK_total <- list()
for(i in 1:length(BOK_urllist)){
BOK_item <- list()
BOK_item_temp_dt <- data.table()
BOK_items <- BOK_rootNode[[i]]
BOK_size <- xmlSize(BOK_items) # 몇개의 item 이 있는지 확인
for(j in 1:BOK_size){
BOK_item_temp <- xmlSApply(BOK_items[[j]],xmlValue)
BOK_item_temp_dt <- data.table(VAR1=BOK_item_temp[1],
VAR2=BOK_item_temp[2],
VAR3=BOK_item_temp[3],
VAR4=BOK_item_temp[4],
VAR5=BOK_item_temp[5],
VAR6=BOK_item_temp[6],
VAR7=BOK_item_temp[7],
VAR8=BOK_item_temp[8],
VAR9=BOK_item_temp[9],
VAR10=BOK_item_temp[10],
VAR11=BOK_item_temp[11])
BOK_item[[j]]<-BOK_item_temp_dt
}
BOK_total[[i]] <- rbindlist(BOK_item)
}
RESULTS <- rbindlist(BOK_total)