iBetter Books
수정

Ch 01. 공공데이터 포털 활용하기

분석을 시작하기 전에 데이터가 있어야 합니다. 어디서 구할까요? 직접 설문하거나 크롤링하는 방법도 있지만, 가장 빠르고 합법적인 방법은 공공데이터 포털을 이용하는 것입니다.

대한민국 정부는 각 기관이 보유한 데이터를 한곳에 모아 공개하고 있습니다. 서울시 버스 운행 현황, 전국 도서관 목록, 국민건강보험 청구 통계까지 수십만 건의 데이터셋이 무료로 제공됩니다.

이 챕터에서는 공공데이터 포털 사용법과 함께, R에서 공공데이터를 불러올 때 가장 자주 마주치는 문제인 인코딩 처리를 집중적으로 다룹니다.

공공데이터 포털 소개

공공데이터 포털의 주소는 data.go.kr입니다. 행정안전부가 운영하며 중앙부처, 지방자치단체, 공공기관이 보유한 데이터를 파일(CSV, Excel, JSON)과 오픈 API 형태로 제공합니다.

접근하는 방법은 간단합니다. 브라우저에서 data.go.kr에 접속한 뒤 원하는 키워드로 검색하면 됩니다. 로그인 없이도 대부분의 파일 데이터를 다운로드할 수 있고, 오픈 API를 사용하려면 회원가입 후 API 키를 발급받아야 합니다.

회원가입과 API 키 발급

오픈 API가 필요한 경우에는 다음 순서로 진행합니다.

  1. data.go.kr 접속 후 우측 상단에서 회원가입을 합니다.
  2. 로그인 후 마이페이지에서 API 키를 확인합니다. 기본 키는 가입 즉시 발급됩니다.
  3. 사용하려는 API의 상세 페이지에서 활용신청을 합니다. 즉시 승인되는 경우가 많고, 일부는 1~3일이 걸립니다.
  4. 승인 후 API 키와 함께 엔드포인트 URL을 사용합니다.

이 챕터에서는 파일 다운로드 방식을 주로 사용합니다. API 활용은 Ch 02에서 간략히 소개합니다.

데이터 검색과 다운로드

파일 데이터를 내려받는 절차를 살펴보겠습니다.

  1. data.go.kr에서 원하는 키워드를 검색합니다. 예를 들어 '서울시 지하철 승하차'를 입력합니다.
  2. 검색 결과에서 파일데이터 탭을 선택합니다.
  3. 원하는 데이터셋 카드를 클릭하면 상세 페이지로 이동합니다.
  4. 다운로드 버튼을 클릭합니다. CSV나 Excel 파일이 내려받아집니다.

파일을 받았다면 프로젝트 폴더 안에 data/ 폴더를 만들어 보관하는 것이 좋습니다.

# 새 분석 프로젝트를 시작할 때 폴더 구조를 미리 만들어두면 편합니다
dir.create("data",    showWarnings = FALSE)
dir.create("output",  showWarnings = FALSE)
dir.create("scripts", showWarnings = FALSE)

CSV 인코딩 처리

공공데이터를 내려받아 열어보면 한글이 깨지는 경우가 있습니다. 국내 공공데이터는 오래된 시스템에서 생성된 경우가 많아 EUC-KR(CP949) 인코딩을 사용하는 파일이 많습니다. R의 기본 환경은 UTF-8이기 때문에 그대로 읽으면 글자가 깨집니다.

문제 확인

library(readr)

# 인코딩을 지정하지 않으면 한글이 깨집니다
df_broken <- read_csv("data/subway.csv")
head(df_broken)

<U+C5ED><U+BA85> 같은 이상한 문자열이 보인다면 인코딩 문제입니다.

해결 방법 1: read_csv에서 인코딩 지정

library(readr)

# locale 인수로 인코딩을 지정합니다
df <- read_csv(
  "data/subway.csv",
  locale = locale(encoding = "EUC-KR")
)

head(df)

해결 방법 2: base R의 read.csv 사용

# base R의 read.csv도 fileEncoding 인수를 지원합니다
df <- read.csv(
  "data/subway.csv",
  fileEncoding = "EUC-KR",
  stringsAsFactors = FALSE
)

head(df)

해결 방법 3: 파일을 UTF-8로 미리 변환

파일을 아예 UTF-8로 바꿔두면 이후 작업이 편해집니다.

library(readr)

# EUC-KR로 읽어서 UTF-8로 다시 저장합니다
df_raw <- read_csv("data/subway_euckr.csv", locale = locale(encoding = "EUC-KR"))
write_csv(df_raw, "data/subway_utf8.csv")

# 이제 인코딩 걱정 없이 읽을 수 있습니다
df <- read_csv("data/subway_utf8.csv")

인코딩 자동 탐지

어떤 인코딩인지 모를 때는 readr::guess_encoding()으로 추정할 수 있습니다.

library(readr)

# 인코딩 후보 목록을 반환합니다
guess_encoding("data/subway.csv")

결과에서 confidence가 높은 인코딩을 사용합니다. 국내 파일은 대부분 UTF-8 또는 EUC-KR(windows에서는 CP949) 두 가지 중 하나입니다.

Excel 파일 불러오기

공공데이터는 Excel 형식으로 제공되기도 합니다. readxl 패키지를 사용합니다.

library(readxl)

# xlsx 파일을 읽습니다
df <- read_excel("data/population.xlsx", sheet = 1)

# 특정 범위만 읽을 수도 있습니다
df <- read_excel(
  "data/population.xlsx",
  sheet   = "2023년",
  range   = "A3:H500",
  col_names = TRUE
)

head(df)

Excel 파일은 인코딩 문제가 없습니다. 단, 파일 안에 병합 셀이나 불필요한 헤더 행이 있으면 skip 인수로 건너뛸 행 수를 지정해야 합니다.

# 상위 2행을 건너뛰고 읽기
df <- read_excel("data/population.xlsx", skip = 2)

데이터 확인 루틴

파일을 불러온 뒤에는 항상 데이터 구조를 먼저 확인합니다. 이 루틴을 습관으로 만들어두면 나중에 헤매는 시간이 줄어듭니다.

library(dplyr)

# 크기와 컬럼 이름 확인
dim(df)
names(df)

# 데이터 타입과 샘플값 확인
glimpse(df)

# 기초 통계 요약
summary(df)

# 결측치 현황
colSums(is.na(df))

공공데이터는 제공 기관마다 컬럼 이름 형식이 제각각입니다. 분석을 시작하기 전에 rename()으로 컬럼 이름을 정리해두면 이후 코드가 훨씬 읽기 쉬워집니다.

library(dplyr)

df <- df |>
  rename(
    station  = `역명`,
    line     = `호선`,
    get_on   = `승차총승객수`,
    get_off  = `하차총승객수`
  )

이제 데이터를 가져오고 기본 점검을 마치는 방법을 익혔습니다. 다음 챕터에서는 서울시 지하철 승하차 데이터를 실제로 분석해보겠습니다.