공공데이터포털(https://www.data.go.kr/)은 정부에서 지원하는 공공데이터 수집 및 제공 웹사이트입니다. 공공데이터 포털을 통해 다방면의 공공데이터를 활용할 수 있습니다. 이를 통해 제공되는 데이터는 정부 기관이나 지자체, 공공기관 등에서 수집하고 지원하는 데이터이기 때문에 높은 신뢰성을 갖고 있습니다.
지원되는 자료로는 교육, 공공행정, 사회복지, 식품 건강, 환경, 교통 등 굉장히 다양한 통계자료가 있으며 누구나 회원가입만 하면 원하는 자료를 검색해 필요로 하는 곳에 이용할 수 있습니다. 뿐만 아니라 다음처럼 데이터 활용에 들어가 다른 이용자들은 데이터를 어떻게 활용했나에 대한 인사이트를 얻을 수도 있습니다.
OpenAPI란?
OpenAPI란 누구든지 사용할 수 있도록 공개된 API입니다. 데이터를 표준화하고 프로그래밍해 다른 소프트웨어 개발자나 사용자와 상호작용하고 서비스를 개발할 수 있도록 제공되는 인터페이스입니다. 공공데이터포털에서는 개인 고유의 API 인증키와 함께 사용할 수 있습니다.
4.2 데이터 활용
활용 데이터
‘가맹정보_업종별 가맹본부 변동현황 제공 서비스’의 ‘외식별 변동 현황’ 데이터입니다.
‘가맹정보_업종별 가맹본부 변동현황 제공 서비스’에서는 4개(업종별, 외식별, 도소매별, 서비스별)의 데이터를 제공합니다.
4개의 데이터 중 연도를 기준으로 가맹본부 증가수, 가맹본부 증가율, 신규등록 가맹본부수, 신규등록 가맹본부율, 등록취소 가맹본부수 등의 정보를 제공하는 ‘외식별’ 데이터를 사용하겠습니다.
활용 목적 및 방향성
현재 시장의 트렌드와 현황을 파악하고 분석할 수 있습니다.
연도 정보를 통해 최근 몇 년간의 추세 파악과 예측이 가능합니다.
4.2.1 URL과 매개변수
공공데이터포털에서 OpenAPI를 사용하여 데이터를 크롤링하기 위해서는 해당 데이터의 URL과 매개변수를 알아야 데이터 요청이 가능합니다.
매개변수(Parameters)
공공데이터포털 OpenAPI에서 매개변수는 선택 매개변수와 필수 매개변수가 있습니다.
- 선택 매개변수 : 입력하지 않아도 API가 정상적으로 실행됨
- 필수 매개변수(* required) : 입력하지 않으면 API가 실행되지 않으며 입력하는 값에 따라
결과 데이터가 달라짐
4.2.2 JSON 데이터 크롤링
라이브러리 호출
JSON 데이터를 크롤링하기 위해 필요한 라이브러리를 호출합니다.
import json
import requests
import pandas as pd
데이터 불러오기
requests를 통해 URL요청을 하여 JSON 데이터를 불러오도록 하겠습니다.
공공데이터포털 OpenAPI - ServiceKey 입력
공공데이터포털 → 마이페이지 → Decoding Key 복사 → 변수 ‘key’에 입력
key = 'DecodingKey 입력'
URL, 매개변수 입력 - requests 요청
2021년도를 기준으로 한 페이지에 최대 15개의 데이터 JSON형태로 불러오도록 하겠습니다.
SERVICE KEY IS NOT REGISTERED ERROR
해당 에러는 서비스키가 등록되지 않았다는 에러입니다.
방법1. ServiceKey → EncodingKey로 변경하여 실행
방법2. 기다리기 : OpenAPI는 데이터에 따라 승인받기까지 시간이 걸릴 수 있습니다.
데이터 변환
요청받은 JSON 데이터를 Python 데이터 구조로 변환 후 DataFrame으로 출력해보도록 하겠습니다.
SERVICE KEY IS NOT REGISTERED ERROR
해당 에러는 서비스키가 등록되지 않았다는 에러입니다.
방법1. ServiceKey → EncodingKey로 변경하여 실행
방법2. 기다리기 : OpenAPI는 데이터에 따라 승인을 받기까지 시간이 걸릴 수 있습니다.
데이터 변환
요청받은 XML 데이터를 DataFrame으로 변환하도록 하겠습니다.
XML 데이터 확인
XML 데이터를 확인해보면 저희에게 필요한 데이터는 <item>태그에 담겨있는 것을 확인할 수 있습니다.
JupyterNotebook을 MySQL과 연동하여 DB와 Table을 만든 뒤 위에서 만든 데이터를 입력하고 SQL 구문을 사용해서 원하는 데이터를 조회해보도록 하겠습니다.
4.3.1 MySQL DB생성
먼저, root 계정에 ‘data_db’ DB를 생성하겠습니다.
MySQL DB와 연동을 도와줄 pymysql 라이브러리를 import하고, root 계정의 password를 변수에 저장합니다. 코드에선 ‘0000’으로 설정되어있지만 본인의 password를 입력하시면 됩니다.
import pymysql
# password 입력
password = '0000'
앞서 저장한 password를 이용하여 MySQL DB에 root 계정으로 접속하는 Connection 객체를 생성합니다.
# MySQL Connection
conn = pymysql.connect(host = '127.0.0.1',
port = 3306,
user = 'root',
password = password,
charset='utf8')
Connection 객체의 Cusor 객체를 생성하고, ‘affiliate_db’ DB를 생성하는 CREATE문을 실행합니다. 실행한 SQL문을 실제 DB에 적용하기 위해 commit을 실행합니다. with 절을 이용하였기에 Connection과 Cusor는 모든 작업을 끝낸 후 자동으로 close 됩니다.
# SQL문 실행
with conn:
with conn.cursor() as cur:
cur.execute('CREATE DATABASE affiliate_db')
conn.commit()
4.3.2 MySQL 테이블 생성
앞에서 생성한 ‘affiliate_db’ DB에 접속하여 테이블을 생성하고 데이터를 저장해 보겠습니다.
먼저 ‘affiliate_db’ DB에 root 계정으로 접속하는 Connection 객체를 생성합니다.
# MySQL DB Connection
conn = pymysql.connect(host = '127.0.0.1',
port = 3306,
user = 'root',
password = password,
charset='utf8',
database='affiliate_db')
생성할 테이블은 아래와 같이 설정하도록 하겠습니다.
테이블 이름: category
Columns
category_name(업종_중분류명): 문자형(VARCHAR(50)), 고유한 값을 가지고 있으므로 primary key로 설정
Connection 객체의 Cusor 객체를 생성하고, ‘affiliate_db’ DB에 ‘category’ 테이블을 생성하는 SQL문을 실행합니다. 실행한 SQL문을 실제 DB에 적용하기 위해 commit을 실행합니다. with 절을 이용하였기에 Cusor는 SQL문을 실행한 후 자동으로 close 됩니다.
with conn.cursor() as cur:
cur.execute(sql)
conn.commit()
4.3.3 MySQL 데이터 저장
앞서 생성한 ‘category’ 테이블에 데이터를 저장하겠습니다.
Connection 객체의 Cusor 객체를 생성하고, INSERT문을 실행하여 각 상품의 6개 속성들을 테이블에 저장합니다. 실행한 SQL문을 영구적으로 저장하기 위해 commit을 실행합니다. with 절을 이용하였기에 커서는 SQL문을 실행한 후 자동으로 close 됩니다.
with conn.cursor() as cursor:
for _, row in df.iterrows():
sql = '''
INSERT INTO category (category_name, year, new_store, new_store_per,
cancel_store, cancel_store_per)
VALUES (%s, %s, %s, %s, %s, %s)
'''
values = (
row['업종_중분류명'], row['기준년도'], row['신규등록_가맹본부수'],
row['신규등록_가맹본부율'], row['등록취소_가맹본부수'],
row['등록취소_가맹본부율']
)
cursor.execute(sql, values)
# 커밋
conn.commit()
테이블 생성 및 데이터 저장 작업을 모두 마쳤으니 ‘affiliate_db’ DB에 연결되어있는 Connection 객체를 close 합니다.
# MySQL DB Connection 종료
conn.close()
4.3.4 MySQL 데이터 조회
DB 연결
# MySQL DB Connection
conn = pymysql.connect(host = '127.0.0.1',
port = 3306,
user = 'root',
password = password,
charset='utf8',
database='affiliate_db')
조건문 실행
SQL구문을 작성하여 query변수에 넣고 코드를 실행합니다.
— new_store 갯수 30개 이상
— new_store_per 기준 오름차순
# query
query = '''SELECT *
FROM category
WHERE new_store >= 30
ORDER BY new_store_per ;'''
# query 실행
with conn.cursor() as cursor:
cursor.execute(query)
result = cursor.fetchall()
# 결과 출력
print(f'조건에 일치하는 카테고리: 총 {len(result)}개')
result_df = pd.DataFrame(result, columns=['category_name', 'year', 'new_store', 'new_store_per', 'cancel_store', 'cancel_store_per'])
result_df
➡️
결과
— cancel_store_per 10% 이상
— cancel_store 상위 5개
# query
query = '''SELECT *
FROM category
WHERE cancel_store_per >= 10
ORDER BY cancel_store DESC
LIMIT 5 ;'''
# query 실행
with conn.cursor() as cursor:
cursor.execute(query)
result = cursor.fetchall()
# 결과 출력
print(f'조건에 일치하는 카테고리: 총 {len(result)}개')
result_df = pd.DataFrame(result, columns=['category_name', 'year', 'new_store', 'new_store_per', 'cancel_store', 'cancel_store_per'])
result_df
➡️
결과
DB 연결 종료
테이블 생성 및 데이터 저장 작업을 모두 마쳤으니 DB에 연결해둔 Connection 객체를 close 합니다.