본문 바로가기

빅데이터 in r/비정형데이터

Open API 데이터 수집, XML 데이터 추출 in R

 

공공데이터포털 사이트에서 공공데이터를 모두 개방하고 있습니다.

국민권익위원회_민원빅데이터_분석정보 라는 이름의 Open API (XML) 데이터를 활용신청 합니다.

(국민신문고 등 각급 기관의 민원 창구를 통해 신청되는 민원 빅데이터를 분석한 정보)

 

신청 허가까지 1~2시간 정도 걸립니다.

 

받은 데이터 중 샘플데이터를 가지고 r에서 불러오고 데이터 추출 방법을 확인해봅시다

 

| XML 정의

- XML은 데이터를 저장하거나 전송하기 위한 도구, 마크업 언어입니다.

- 데이터를 구조화하여 다른 프로그래밍 언어간에 전송할 때나 혹은 open API에서 데이터를 얻을 때 json 이나 xml 형태로 얻는 경우가 많습니다.

- 기본적으로 데이터를 저장하는 수단일 뿐이기 때문에 그리 어렵게 정의된 언어는 아니지요.

- 자세한 것은 위키백과나 W3C에서 살펴보시면 될 것 같습니다.

 

 

| XML 구조

 <item>
    <topic>산업 안전 보건 도급 산업재해 예방</topic>
    <rank>1</rank>
    <count>56</count>

    <price currency="$">6.78</price>
  </item>

 

markup

 - markup 이라는 것은 tag와 동일한 단어입니다. < 로 시작해서 > 로 끝나는 부분을 markup 이라고 합니다. 역할은 텍스트에 의미를 부여하거나 구조화하기 위해 있습니다.

 

content

 - XML 문서 중 markup 을 제외한 텍스트들을 의미합니다.

 

 


 <item>
    <topic>산업 안전 보건 도급 산업재해 예방</topic>
    <rank>1</rank>
    <count>56</count>

    <price currency="$">6.78</price>
  </item>

 

element

 - 시작tag와 종료tag 사이의 한 chunk를 의미합니다. 

 - 예를 들어, <topic>산업 안전 보건 도급 산업재해 예방</topic> 와 같습니다.

 - 엘리먼트 안의 엘리먼트를 자식 엘리먼트(child element)라고 칭합니다.

 

attribute

 - 태그 내에 있는 정보를 의미합니다.

 

 

 

 

 

| XML 파싱하기 

xml을 파싱했다라고 하기도 하지만

xml로 데이터를 담으면 마샬링, 반대로 데이터를 푸는 거를 언마샬링 이라고도 합니다.

 

1. xml을 파일로 갖고있든 url로 갖고있든 이렇게 읽어올 수 있습니다.

library(XML)

# 전체 문서 document

doc <- xmlTreeParse("C:/Users/kimty/Downloads/minone_bogun_.txt", useInternalNodes=TRUE, encoding="UTF-8")

 

 

 

2. 한글 인코딩 변환

<topic> content에 한글이 있어서 인코딩에 애를 먹었습니다.

 

# 1. OS별 인코딩 (운영체제별 인코딩 방식이 다름)
# Mac OS, Linux: UTF-8
# Windows: Euc-kr, cp949

 

그냥 encoding="UTF-8" 만 있어선 안되고

getEncoding() 함수도 호출해야 합니다.

 

n <- getNodeSet(doc, "//topic")[[1]]
getEncoding(n)

topic[[1]] 인코딩 변환

 

 

rootnode <- xmlRoot(doc)

 

 

# top node(root element)의 이름, 사이즈, 속성을 알아보자 
xmlName(rootnode)  # [1] "response"
xmlSize(rootnode)   # [1] 2
xmlAttrs(rootnode)  # NULL   # 마크업 안에 속성이 없기 때문에

 

# 물론 하위 요소도 똑같은 명령어로 알아볼 수 있습니다. 
xmlName(rootnode[[1]]) # [1] "header"

xmlSize(rootnode[[1]])   # [1] 2

xmlAttrs(rootnode[[1]])  # NULL  # 마크업 안에 속성이 없기 때문에

 

 


3. 데이터 추출 

xpathSApply(rootnode,"//rank",xmlValue)

'rank 순위' 변수만 추출


xpathSApply(rootnode,"//count",xmlValue)

'count 건수' 변수만 추출


xpathSApply(rootnode,"//topic",xmlValue)

 

'topic' 요소만 추출

 

4. xml to DataFrame 데이터프레임 변환

# 데이터 분석할 가공을 위해 한번씩 거치는 프로세스

 

df <- xmlToDataFrame("C:/Users/kimty/Downloads/minone_bogun_.txt")

df
View(df)

 

또는

 

df <- xmlToDataFrame(doc)

df

 

근데 한꺼번에 모여서 나옵니다 ;

 

그럴땐 다음과 같이 이렇게 하면 됩니다.

 


topic <- xmlToDataFrame(nodes = getNodeSet(doc, "//topic"))
View(topic)

> topic

topic만 추출해서 데이터프레임으로

rank <- xmlToDataFrame(nodes = getNodeSet(doc, "//rank"))
View(rank)


count <- xmlToDataFrame(nodes = getNodeSet(doc, "//count"))
View(count)

 

 

 

# 데이터프레임 병합

newone <- data.frame(topic,  rank, count)

분석 가공을 위해 데이터프레임 생성

 

 

 

4. csv 데이터프레임으로 저장

write.csv(newone, file="new_dataframe.csv")  # getwd(). setwd() 에 저장됨