FMB819: R을 이용한 데이터분석
https://opendart.fss.or.kr/api/...).Renviron 파일에 추가. 다음 명령을 실행DART_API_KEY="발급받은_키_번호"을 적어서 저장.
"C:\Users\[사용자명]\Documents\.Renviron" 에 저장이 됨..으로 시작하는 파일은 윈도우나 맥 탐색기에서 기본적으로 숨겨져(Hidden) 있음..Renviron 파일은 R이 시작될 때 딱 한 번 읽어옴httr로 원재료(데이터)를 가져오고, xml2/jsonlite로 포장을 뜯고, rvest로 알맹이를 골라내며, stringr로 예쁘게 다듬어 최종 데이터프레임을 만듬.library(httr): 데이터 운반 (HTTP Request)
library(xml2): 데이터 추출 (Scraping/Harvesting)
library(jsonlite): 데이터 해석 (JSON Parsing)
fromJSON() 함수 한 줄이면 복잡한 텍스트 뭉치를 R에서 바로 분석 가능한 데이터프레임으로 바꿔줌.library(stringr): 데이터 정제 (String Manipulation)
str_pad() 함수 등을 사용하여 자릿수를 맞추거나, URL 주소 문자열을 깔끔하게 조립할 때 매우 유용.DART API는 주식 시장의 ‘종목코드(6자리)’ 대신 자체적인 ‘고유번호(8자리)’를 사용. 따라서 종목코드와 고유번호를 매칭하는 과정이 선행되어야.
고유번호 파일 다운로드 및 파싱
https://opendart.fss.or.kr/guide/detail.do?apiGrpCd=DS001&apiId=2019018
# 1. 고유번호 파일 요청 URL
codezip_url <- paste0('https://opendart.fss.or.kr/api/corpCode.xml?crtfc_key=', dart_api_key)
# 2. 데이터 다운로드
response <- GET(codezip_url)
# 3. 데이터 수령 -> 저장 -> 압축 해제 -> 내용 판독
tf <- tempfile(fileext = '.zip')
writeBin(content(response, as = "raw"), tf)
# 압축 파일 내의 파일 목록 확인
nm <- unzip(tf, list = TRUE)
# 임시 폴더(tempdir)에 압축 해제하여 작업 공간 오염 방지
extracted_file <- unzip(tf, files = nm$Name[1], exdir = tempdir())
# XML 읽기
code_data <- read_xml(extracted_file)
# 4. 데이터프레임 변환
corp_code <- code_data %>% xml_find_all('//corp_code') %>% xml_text()
corp_name <- code_data %>% xml_find_all('//corp_name') %>% xml_text()
stock_code <- code_data %>% xml_find_all('//stock_code') %>% xml_text()
corp_list <- data.frame(
code = corp_code,
name = corp_name,
stock = stock_code,
stringsAsFactors = FALSE
)
# 상장사(stock_code가 6자리인 기업)만 필터링 (공백 문자가 들어올 수 있으므로 trimws())
corp_list_listed <- subset(corp_list, nchar(trimws(stock)) == 6)
# 5. 메모리 정리 (임시 파일 삭제)
unlink(tf)
unlink(extracted_file)
# 6. 결과 확인
head(corp_list_listed)tf <- tempfile(fileext = '.zip')
writeBin(content(response, as = "raw"), tf)
nm <- unzip(tf, list = TRUE)
code_data <- read_xml(unzip(tf, nm$Name, exdir = tempdir()))
unzip(tf, nm$Name, exdir = tempdir()): 상자 안에서 실제 데이터 파일(CORPCODE.xml)만 압축을 풀어 꺼냄. 임시폴더에 저장read_xml(...): 꺼낸 XML 파일을 R이 읽을 수 있는 구조화된 데이터 객체로 변환.xml_find_all('태그이름'):
xml_text():
<tag>...</tag> 같은 XML 문법 기호는 버리고, 그 안의 순수한 글자만 추출.특정 기업의 재무 상태를 분석하기 위해 ‘상장기업 재무정보’ API를 활용하여 주요 항목을 가져옴.
주요 요청 인자 (Parameters):
bsns_year: 사업연도 (예: 2023)reprt_code: 보고서 코드 (1분기: 11013, 반기: 11012, 3분기: 11014, 사업보고서: 11011)https://opendart.fss.or.kr/guide/detail.do?apiGrpCd=DS003&apiId=2019016
# 삼성전자(고유번호: 00126380)의 2023년 사업보고서 재무제표 요청
target_corp <- "00126380"
# 수정 후:
url <- paste0("https://opendart.fss.or.kr/api/fnlttSinglAcnt.json?",
"crtfc_key=", dart_api_key,
"&corp_code=", target_corp,
"&bsns_year=2023",
"&reprt_code=11011")
# JSON 데이터 수집 및 변환
data_json <- fromJSON(url)
financial_table <- data_json$list
# 주요 항목 확인 (자산총계, 매출액, 당기순이익 등)
financial_table[, c("account_nm", "fs_nm", "thstrm_nm", "thstrm_amount")]