공공데이터포털 사이트에서 공공데이터를 모두 개방하고 있습니다.
국민권익위원회_민원빅데이터_분석정보 라는 이름의 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)
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)
xpathSApply(rootnode,"//count",xmlValue)
xpathSApply(rootnode,"//topic",xmlValue)
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
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() 에 저장됨