공공데이터포털의 특징은 자료를 활용을 요약하자면

1. 회원 가입 후 '사용자 인증키'를 생성해야한다.
2. 이후 원하는 데이터를 '활용 신청'을 해서 승인이 떨어지고 활용 권한을 획득해야한다. (실제 활용 가능 시간까지 약 1일 정도 소요) (파일데이터는 활용 신청 없이 그냥 다운로드 하여 사용 가능)
3. 제공되는 데이터는 파일데이터, JSON, XML 등이 있다.

 

https://kosis.kr/openapi 에 접속

1. 통계자료 활용 신청 및 URL 생성

 

2. Pandas로 불러오기

방법 1. pd.json_normalize()

jsonUrl = 'http://kosis.kr/openapi/statisticsData.do?method=getList&apiKey=OGM2N2RlYTNmMjQ2MGY3NWEyYzg5MGU2NmJjYTI4Zjg=&format=json&jsonVD=Y&userStatsId=ox8eb1f9/101/DT_1B040A3/2/1/20200505230018&prdSe=M&newEstPrdCnt=1'

from pandas.io.json import json_normalize
import requests

# 정상 여부 확인
response = requests.get(jsonUrl)
response

# 결과 : <Response [200]>

# JSON 데이터 획득
json = response.json()
json


# 결과 :

[{'TBL_NM': '행정구역(시군구)별 성별 인구수',
#   'PRD_DE': '202004',
#   'TBL_ID': 'DT_1B040A3',
#   'ITM_NM': '총인구수',
#   'ITM_NM_ENG': 'Koreans (Total)',
#   'ITM_ID': 'T20',
#   'UNIT_NM': '명',
#   'ORG_ID': '101',
#   'UNIT_NM_ENG': 'Person',
#   'C1_OBJ_NM': '행정구역(시군구)별',
#   'C1_OBJ_NM_ENG': 'By Administrative District',
#   'DT': '51842524',
#   'PRD_SE': 'M',
#   'C1': '00',
#   'C1_NM': '전국',
#   'C1_NM_ENG': 'Whole country'},
#  {'TBL_NM': '행정구역(시군구)별 성별 인구수',
#   'PRD_DE': '202004',
#   'TBL_ID': 'DT_1B040A3',
#   'ITM_NM': '총인구수',
#   'ITM_NM_ENG': 'Koreans (Total)',
#   'ITM_ID': 'T20',
#   'UNIT_NM': '명',
#   'ORG_ID': '101',
#   'UNIT_NM_ENG': 'Person',
#   'C1_OBJ_NM': '행정구역(시군구)별',
#   'C1_OBJ_NM_ENG': 'By Administrative District',
#   'DT': '9726787',
#   'PRD_SE': 'M',
#   'C1': '11',
#   'C1_NM': '서울특별시',
#   'C1_NM_ENG': 'Seoul'},
 
#  ...
 
#   {'TBL_NM': '행정구역(시군구)별 성별 인구수',
#   'PRD_DE': '202004',
#   'TBL_ID': 'DT_1B040A3',
#   'ITM_NM': '총인구수',
#   'ITM_NM_ENG': 'Koreans (Total)',
#   'ITM_ID': 'T20',
#   'UNIT_NM': '명',
#   'ORG_ID': '101',
#   'UNIT_NM_ENG': 'Person',
#   'C1_OBJ_NM': '행정구역(시군구)별',
#   'C1_OBJ_NM_ENG': 'By Administrative District',
#   'DT': '670595',
#   'PRD_SE': 'M',
#   'C1': '50',
#   'C1_NM': '제주특별자치도',
#   'C1_NM_ENG': 'Jeju-do'}]

JSON 데이터를 잘 불러오는 것이 확인되었으니 데이터프레임으로 저장하자.

# 데이터프레임으로 저장
population = pd.json_normalize(json)
population.head()

 

방법 2. pd.read_json()

jsonUrl = 'http://kosis.kr/openapi/statisticsData.do?method=getList&apiKey=OGM2N2RlYTNmMjQ2MGY3NWEyYzg5MGU2NmJjYTI4Zjg=&format=json&jsonVD=Y&userStatsId=ox8eb1f9/101/DT_1B040A3/2/1/20200505230018&prdSe=M&newEstPrdCnt=1'

import pandas as pd
import requests

try:
    response = requests.get(jsonUrl)
    if response.status_code == 200:
        population = pd.read_json(jsonUrl)
    else:
        response.close()
except Exception as e:
    print(e)

population.head()

 

 

 

 

완성본

더보기

방법 1. pd.json_normalize()

jsonUrl = 'http://kosis.kr/openapi/statisticsData.do?method=getList&apiKey=OGM2N2RlYTNmMjQ2MGY3NWEyYzg5MGU2NmJjYTI4Zjg=&format=json&jsonVD=Y&userStatsId=ox8eb1f9/101/DT_1B040A3/2/1/20200505230018&prdSe=M&newEstPrdCnt=1'

import pandas as pd
import requests

# 정상 여부 확인
response = requests.get(jsonUrl)
response

# JSON 데이터 획득
json = response.json()
# json

# 데이터프레임으로 저장
population = pd.json_normalize(json)
population.head()

 

방법 2. pd.read_json()

jsonUrl = 'http://kosis.kr/openapi/statisticsData.do?method=getList&apiKey=OGM2N2RlYTNmMjQ2MGY3NWEyYzg5MGU2NmJjYTI4Zjg=&format=json&jsonVD=Y&userStatsId=ox8eb1f9/101/DT_1B040A3/2/1/20200505230018&prdSe=M&newEstPrdCnt=1'

import pandas as pd
import requests

try:
    response = requests.get(jsonUrl)
    if response.status_code == 200:
        population = pd.read_json(jsonUrl)
    else:
        response.close()
except Exception as e:
    print(e)

population.head()

  

 

+ Recent posts