본문 바로가기

배운 책들 정리/공공데이터로 배우는 R 데이터 분석 with 샤이니

공공데이터 with 샤이니 1~3 - 데이터 분석가, API 크롤링

0. 목차분석

1) 목차

목차는 간단하게 확인

 

 

1. 데이터 분석가

1) 개념

- 데이터 엔지니어 DE : 수집 -> 저장

- 데이터 분석가 DA : 분석 -> 시각화

 

2) 데이터 분석 프로젝트 5단계 (문제정의 -> 데이터 수집 -> 전처리 -> 분석과 시각화 -> 서비스구현과 운용)

문제 정의 : 계획 (주제선정, 어떤데이터, 분석방법, 시각화)

데이터 수집 : 저장 // 자료원

전처리 : 이상치, 결측치, 중복 등 (데이터 질, 신뢰성)

분석과 시각화 : 통계분석 등(머신러닝 등) // 어떤 변수를 표현하고 어떤 종류로 나타낼 것인지 (시각화에 필요한)

서비스 구현과 운용 : 웹 어플리케이션 개발 및 배포

 

* 데이터 분석에서는 데이터 수집, 전처리가 50%임.

 

2. 자료 수집 전에 알아야 할 내용

1) 개념

- 정형 데이터 : 구조가 있는 데이터들 (성별, 나이 등등)

- 비정형 데이터 : 영상, 스캔, 음성, 지도, 위성 데이터 같은 구조가 없는 데이터들

- 반정형 데이터 : 구조가 있지만 구조가 없는 것처럼 보이는 데이터. XML,JSON // 확장이 가능한.

 

2) 공공데이터 포털

 

공공데이터 포털

국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Datase

www.data.go.kr

 

3) API

- 클라이언트와 서버와의 인증키를 통해 중간 매개체를 해주는 역할임.

- 정보를 자동으로 찾아주는 자동수집도구임

https://github.com/cmman75/Open_data_R_with_Shiny/tree/main/01_code

 

GitHub - cmman75/Open_data_R_with_Shiny: DO IT BOOK CODE

DO IT BOOK CODE. Contribute to cmman75/Open_data_R_with_Shiny development by creating an account on GitHub.

github.com

새로운 프로젝트에 01 폴더 데이터 집어 넣기

 

3. 자료 수집 : API 크롤러 만들기

 

1) 실습 : 연월 정보 추출

# 일반 인증키
# cZEnm%2Be51lu8ba7U34oZTyxGDLdkcIw7tow8gDrF%2FWonedFYWrZUELmTKw9VhMqYkLCclEeY%2B2iiWEm4VOmkHQ%3D%3D

# call back url
# http://openapi.molit.go.kr:8081/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcAptTrade?_wadl&type=xml



# 지역코드, 계약연월, 인증키
# 계약연월 : 20210101 ~ 20211231 (12개월)
# 지역코드 데이터 준비

# 자료 수집
install.packages("rstudioapi")
library(rstudioapi)
# 수집 대상 지역 코드
# 구글에서 법정동코드 조회 자료
library(readxl)
# 데이터 불러오기
sgg <- read_excel("./data/sgcode.xls")
head(sgg)
# 코드는 총 10자리, 앞에서 5자리 구 정보, 뒤에서 5자리 동 정보
# 구 정보까지 추출
# xx동이 없고 xx구만 있는 것들은 다 뒤에 있는 숫자가 0이 5개임
substr(sgg$법정동코드,1,5 )
substr(sgg$법정동코드,6,10)
View(sgg)
sgg_new <- sgg[substr(sgg$법정동코드,6,10) == "00000", ]
str(sgg_new)
colnames(sgg_new) <- c("code","addr_2")

# 아래처럼 하기 귀찮으면 위처럼 간단하게
# install.packages("tidyverse")
# library(tidyverse)
# sgg_new <- rename(sgg_new,
#                   code = 법정동코드,
#                   addr_2 = 법정동명)
str(sgg_new)
# 코드를 5자리로 추출
sgg_new$code <- substr(sgg_new$code, 1,5)
# 서울특별시 11000 빼기
sgg_new <- sgg_new[sgg_new$code != "11000",]
# 시 변수 만들기
sgg_new$sido <- substr(sgg_new$addr_2,1,5)
sgg_new
# 구 변수 만들기
sgg_new$sigungu <- substr(sgg_new$addr_2,7,nchar(sgg_new$addr_2))
sgg_new
# addr_1 변수 만들기 = sido_sigungu 형태로 만들기
sgg_new$addr_1 <-paste0(sgg_new$sido,"_",sgg_new$sigungu)
sgg_new
# 열 순서 조정해서 loc로 저장하기
loc <- sgg_new[,c(1,3:5,2)]
head(loc)
write.csv(loc,file = "./data/sigun_code.csv", fileEncoding = "UTF-8", row.names = F)
# 저장한 데이터 불러오기
loc <- read.csv("./data/sigun_code.csv", fileEncoding = "UTF-8")
head(loc)
# 수집 기간 : 2021.01 ~ 2021.0
datelist <- seq(as.Date('2021-01-01'), as.Date('2021-12-31'), by = '1 month')


datelist <- format(datelist,format='%Y%m')

View

xx구는 00000으로 끝난다.

6자리부터 10자리까지 00000인것들

sgg_new$code <- substr(sgg_new$code, 1,5)

코드 5자리 추출

sgg_new <- sgg_new[sgg_new$code != "11000",]

서울특별시 제거

sgg_new$sido <- substr(sgg_new$addr_2,1,5)

시도 생성

sgg_new$gu <- substr(sgg_new$addr_2,7,nchar(sgg_new$addr_2))

구 변수 생성

sgg_new$addr_1 <-paste0(sgg_new$sido,"_",sgg_new$sigungu)

시군구 생성

loc <- sgg_new[,c(1,3:5,2)]

열 변경

 write.csv(loc,file = "./data/sigun_code.csv", fileEncoding = "UTF-8")

새로운 이름으로 저장까지

> write.csv(loc,file = "./data/sigun_code.csv", fileEncoding = "UTF-8", row.names = F)
> loc <- read.csv("./data/sigun_code.csv", fileEncoding = "UTF-8")
> loc

다시 불러오기까지

datelist <- seq(as.Date('2021-01-01'), as.Date('2021-12-31'), by = '1 month')

일정 뽑기

format(datelist,format='%Y%m')

연월정보만 뜸

 

2) 실습 : 요청 목록 만들기

# 인증키 입력
service_key = "cZEnm%2Be51lu8ba7U34oZTyxGDLdkcIw7tow8gDrF%2FWonedFYWrZUELmTKw9VhMqYkLCclEeY%2B2iiWEm4VOmkHQ%3D%3D"
# 요청 목록 만들기
url_list <- list()
cnt <- 0  
for (i in 1:nrow(loc)) { # 25개의 구 반복 = 25번 반복
  for (j in 1:length(datelist)) { # 12개월의 수집 기간 = 12번 반복
    cnt <- cnt+1
    # 요청 목록 만들기
    url_list[cnt] <- paste0("http://openapi.molit.go.kr:8081/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcAptTrade?",                         "LAWD_CD=", loc[i,1],
                            "&DEAL_YMD=", datelist[j],
                            "&serviceKey=", service_key)
  }
  Sys.sleep(0.1) # 0.1초 텀을 두고 진행
  msg <- paste0(i,"/",nrow(loc))
  cat(msg,"\n\n")
  url_list
  
}

# 요청 목록 확인
head(url_list)
length(url_list)
browseURL(paste0(url_list[1]))

url 마지막에 ? 넣기

 

 

 

 

3) 실습 : 크롤링 실행

# 크롤링 실행
install.packages("XML")
install.packages("data.table")
install.packages("stringr")
library(XML)
library(data.table)
library(stringr)
# 폴더 생성
dir.create("raw_date")
# 크롤링 시작
raw_data <- list()
browseURL(paste0(url_list[1]))
root_node <- list()
total <- list()


# 
url_list

for (i in 1:length(url_list)) {
  raw_data[[i]] <- xmlTreeParse(url_list[i], useInternalNodes = T, encoding = "UTF-8") # XML raw data 저장
  root_node[[i]] <- xmlRoot(raw_data[[i]]) #XML root node 저장
  items <- root_node[[i]][[2]][['items']] #2번째 하위 노드, items 노드 내용 저장
  size <- xmlSize(items) # item의 개수
  item <- list()
  item_temp <- data.table() 
  Sys.sleep(0.1) # 0.1초 텀을 두고 진행
  for (j in 1:size) {
    item_tp <- xmlSApply(items[[j]], xmlValue)
    item_temp <- data.table(year = item_tp[4],
                            month = item_tp[7],
                            day = item_tp[8],
                            price = item_tp[1],
                            code = item_tp[12],
                            dong_nm = item_tp[5],
                            jibun = item_tp[11],
                            con_year = item_tp[3],
                            apt_nm = item_tp[6],
                            area = item_tp[9],
                            floor = item_tp[13])
    item[[j]] <- item_temp
  }

  # 통합저장
  apt_rbind <- rbindlist(item)
  # 파일로 저장
  region_nm <- subset(loc, code == str_sub(url_list[i], 116,120))$addr_1  
  month <- str_sub(url_list[i], 131,136)
  path <- as.character(paste0("./raw_data/",region_nm,"_",month,".csv"))
  write.csv(apt_rbind,file = path)
# 진행 상황 메시지
  msg <- paste0(i,"/",length(url_list))
  cat(msg, "\n\n")
  
  }



head(str)
nchar(service_key)
nchar(url_list[1])
nchar("http://openapi.molit.go.kr:8081/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcAptTrade?_wadl&type=xml
")

 

root_node[[i]]

root_node에 해당됨

> items <- root_node[[i]][[2]][['items']]

items까지 접근됨

 

 

* 핵심

- 카테고리를 뽑을 때 이중포문을 통해 어떻게 뽑는지에 대해 이해하기

- 노드 내용 저장하는 이유는 리스트를 넣기 위함을 기억하기

 

 

 

 

 

 

- 자료 

 

Index of /bin/windows/base/old/4.2.0

 

cran.r-project.org

 

 

728x90
반응형
LIST