0. 목차분석
1) 목차
목차는 간단하게 확인
1. 데이터 분석가
1) 개념
- 데이터 엔지니어 DE : 수집 -> 저장
- 데이터 분석가 DA : 분석 -> 시각화
2) 데이터 분석 프로젝트 5단계 (문제정의 -> 데이터 수집 -> 전처리 -> 분석과 시각화 -> 서비스구현과 운용)
문제 정의 : 계획 (주제선정, 어떤데이터, 분석방법, 시각화)
데이터 수집 : 저장 // 자료원
전처리 : 이상치, 결측치, 중복 등 (데이터 질, 신뢰성)
분석과 시각화 : 통계분석 등(머신러닝 등) // 어떤 변수를 표현하고 어떤 종류로 나타낼 것인지 (시각화에 필요한)
서비스 구현과 운용 : 웹 어플리케이션 개발 및 배포
* 데이터 분석에서는 데이터 수집, 전처리가 50%임.
2. 자료 수집 전에 알아야 할 내용
1) 개념
- 정형 데이터 : 구조가 있는 데이터들 (성별, 나이 등등)
- 비정형 데이터 : 영상, 스캔, 음성, 지도, 위성 데이터 같은 구조가 없는 데이터들
- 반정형 데이터 : 구조가 있지만 구조가 없는 것처럼 보이는 데이터. XML,JSON // 확장이 가능한.
2) 공공데이터 포털
3) API
- 클라이언트와 서버와의 인증키를 통해 중간 매개체를 해주는 역할임.
- 정보를 자동으로 찾아주는 자동수집도구임
https://github.com/cmman75/Open_data_R_with_Shiny/tree/main/01_code
새로운 프로젝트에 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')
xx구는 00000으로 끝난다.
6자리부터 10자리까지 00000인것들
코드 5자리 추출
서울특별시 제거
시도 생성
구 변수 생성
시군구 생성
열 변경
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
다시 불러오기까지
일정 뽑기
연월정보만 뜸
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]))
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에 해당됨
> items <- root_node[[i]][[2]][['items']]
* 핵심
- 카테고리를 뽑을 때 이중포문을 통해 어떻게 뽑는지에 대해 이해하기
- 노드 내용 저장하는 이유는 리스트를 넣기 위함을 기억하기
- 자료
'배운 책들 정리 > 공공데이터로 배우는 R 데이터 분석 with 샤이니' 카테고리의 다른 글
공공데이터 with 샤이니 12 - 샤이니 app 활용 사례 (지진 발생 분석) (1) | 2023.03.15 |
---|---|
공공데이터 with 샤이니 9,10 - 샤이니 입문하기, 데이터 분석 app 개발하기 (0) | 2023.03.14 |
공공데이터 with 샤이니 7,8 - 분석 주제를 지도로 시각화하기, 통계 분석과 시각화 (0) | 2023.03.09 |
공공데이터 with 샤이니 6,7 - 지오 데이터 프레임, 분석 주제를 지도로 시각화하기 (0) | 2023.03.08 |
공공데이터 with 샤이니 4~5 - 데이터 전처리, 지오 코딩 (0) | 2023.03.07 |