PYTHON 웹 스크래핑

통계청 SGIS API 사용하기 두번째 - 인구통계 데이터 조회

나루하루001 2025. 6. 24. 23:50
반응형



이전 포스팅 요약


이전 포스팅에서는 통계청 통계지리정보 서비스(SGIS) API를 사용하기 위한 기본 설정과

AccessToken 발급 방법에 대해 알아보았습니다.

 

요약하자면:

1. SGIS API를 사용하기 위해서는 서비스ID(consumer_key)와 보안Key(consumer_secret)가 필요합니다.

2. 이 키를 사용하여 AccessToken을 발급받아야 실제 API를 호출할 수 있습니다.

3. AccessToken은 24시간 동안 유효하며, 만료 후에는 새로 발급받아야 합니다.

 

위 내용은 아래 블로그를 참고하시면 됩니다.

통계청 SGIS API 사용하기 첫번째 - AccessToken 발급 방법

중요!
이번 포스팅에서는 발급받은 AccessToken을 활용하여 실제 SGIS API를 호출하고, 인구통계 데이터를 조회하는 방법에 대해 자세히 알아보겠습니다.



SGIS API로 인구통계 데이터 조회하기


통계청 SGIS API는 다양한 통계 데이터를 제공합니다.

그 중에서도 인구통계 데이터는 지역별 인구수, 평균 연령 등 다양한 정보를 포함하고 있어 매우 유용합니다.

 

인구통계 API 엔드포인트

 

인구통계 데이터를 조회하기 위한 API 엔드포인트는 다음과 같습니다:

https://sgisapi.kostat.go.kr/OpenAPI3/stats/searchpopulation.json

 

주요 요청 파라미터

 

- accessToken: 발급받은 인증 토큰

- year: 조회할 연도 (2015-2023)

 

인구통계 데이터 조회 함수

 

다음은 Python을 사용하여 인구통계 데이터를 조회하는 함수입니다:

def get_population_stats(access_token, year):
    url = f"{BASE_URL}/OpenAPI3/stats/searchpopulation.json"
    
    params = {
        'accessToken': access_token,
        'year': year
    }
    
    response = requests.get(url, params=params)
    print(f"인구통계 API 응답코드: {response.status_code}")
    
    if response.status_code == 200:
        data = response.json()
        
        if 'result' in data:
            population_data = data['result']
            
            print(f"\n=== {year}년 전국 인구 통계 ===")
            print("-" * 50)
            
            for item in population_data:
                adm_cd = item.get('adm_cd')
                adm_nm = item.get('adm_nm')
                population = item.get('population')
                avg_age = item.get('avg_age')
                
                print(f"행정구역코드: {adm_cd}")
                print(f"행정구역명: {adm_nm}")
                
                if population != 'N/A':
                    try:
                        pop_num = int(population)
                        print(f"인구수: {pop_num:,}명")
                    except (ValueError, TypeError):
                        print(f"인구수: {population}명")
                else:
                    print(f"인구수: {population}")
                
                print(f"평균나이: {avg_age}세")
                print("-" * 30)
        else:
            print("데이터를 찾을 수 없습니다.")
            print("응답 내용:", data)
    else:
        print(f"API 호출 실패: {response.status_code}")
        print("응답 내용:", response.text)

 

반응형

전체 코드 분석


이제 전체 코드를 단계별로 분석해보겠습니다.

 

1. 기본 설정 및 라이브러리 임포트

import requests

# SGIS API 기본 설정
CONSUMER_KEY = "서비스ID"
CONSUMER_SECRET = "보안Key"
BASE_URL = "https://sgisapi.kostat.go.kr"

 

코드의 시작 부분에서는 필요한 라이브러리를 임포트하고

API 사용에 필요한 기본 설정을 정의합니다.

 

여기서는 서비스ID(CONSUMER_KEY),

보안Key(CONSUMER_SECRET),

그리고 API의 기본 URL을 설정합니다.

보안 주의사항
실제 프로젝트에서는 CONSUMER_KEY와 CONSUMER_SECRET을 코드에 직접 하드코딩하지 마세요. 대신 환경 변수나 별도의 설정 파일을 사용하여 보안을 강화하는 것이 좋습니다.

2. AccessToken 발급 함수

def get_access_token():
    """인증 토큰 발급"""
    url = f"{BASE_URL}/OpenAPI3/auth/authentication.json"
    
    params = {
        'consumer_key': CONSUMER_KEY,
        'consumer_secret': CONSUMER_SECRET
    }
    
    response = requests.get(url, params=params)
    print(f"응답코드: {response.status_code}")
    
    data = response.json()
    token = data['result']['accessToken']
    
    return token

이 함수는 이전 포스팅에서 설명한 방법으로 AccessToken을 발급받습니다.

API 엔드포인트에 서비스ID와 보안Key를 파라미터로 전송하고,

응답에서 AccessToken을 추출하여 반환합니다.

 

3. 인구통계 데이터 조회 함수

 

위에서 설명한 `get_population_stats` 함수는

발급받은 AccessToken과 조회할 연도를 파라미터로 받아 인구통계 데이터를 조회합니다.

응답 데이터에서 행정구역코드, 행정구역명, 인구수, 평균나이 등의 정보를 추출하여 출력합니다.

 

4. 메인 실행 코드

if __name__ == "__main__":
    try:
        # 토큰 발급
        token = get_access_token()
        
        # 년도 입력 받기
        year = input("\n조회할 년도를 입력하세요 (2015-2023): ")
        
        # 입력 검증
        if year not in ['2015', '2016', '2017', '2018', '2019', '2020', '2021', '2022', '2023']:
            print("올바른 년도를 입력해주세요 (2015-2023)")
        else:
            # 인구 통계 조회
            get_population_stats(token, year)
            
    except Exception as e:
        print(f"오류 발생: {e}")

 

메인 실행 코드에서는 다음과 같은 작업을 수행합니다:

1. AccessToken 발급 함수를 호출하여 토큰을 발급받습니다.

2. 사용자로부터 조회할 연도를 입력받습니다.

3. 입력된 연도가 유효한지 검증합니다 (2015-2023 범위 내).

4. 유효한 연도인 경우, 인구통계 데이터 조회 함수를 호출합니다.

5. 예외 처리를 통해 오류 발생 시 적절한 메시지를 출력합니다.

실행 결과 및 활용 방안


이 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다:

응답코드: 200

조회할 년도를 입력하세요 (2015-2023): 2022
인구통계 API 응답코드: 200

=== 2022년 전국 인구 통계 ===
--------------------------------------------------
행정구역코드: 11
행정구역명: 서울특별시
인구수: 9,487,752명
평균나이: 43.7세
------------------------------
행정구역코드: 21
행정구역명: 부산광역시
인구수: 3,320,333명
평균나이: 45.8세
------------------------------
(이하 생략)

 

활용 방안

 

이렇게 조회한 인구통계 데이터는 다양한 방식으로 활용할 수 있습니다:

1. 데이터 시각화: matplotlib, seaborn, plotly 등의 라이브러리를 사용하여

지역별 인구 분포, 평균 연령 등을 시각화할 수 있습니다.

2. 시계열 분석: 여러 연도의 데이터를 수집하여 인구 변화 추이를 분석할 수 있습니다.

3. 지리정보 시스템(GIS) 연동: 행정구역코드를 기반으로 지도 위에 인구 데이터를 표시할 수 있습니다.

4. 인구 관련 지표 계산: 인구밀도, 노령화 지수 등 다양한 인구 관련 지표를 계산할 수 있습니다.

 

데이터 저장 예시

 

조회한 데이터를 CSV 파일로 저장하는 코드를 추가할 수 있습니다:

import pandas as pd

def save_population_data(data, year):
    """인구통계 데이터를 CSV 파일로 저장"""
    # 데이터 프레임 생성
    df = pd.DataFrame(data)
    
    # 파일명 설정
    filename = f"population_stats_{year}.csv"
    
    # CSV 파일로 저장
    df.to_csv(filename, index=False, encoding='utf-8-sig')
    print(f"\n데이터가 {filename} 파일로 저장되었습니다.")



주의사항 및 팁

 

1. AccessToken 관리

AccessToken은 4시간 동안 유효합니다.

장시간 실행되는 프로그램이나 정기적으로 실행되는 스크립트의 경우,

토큰 만료 시간을 확인하고 필요시 새로운 토큰을 발급받는 로직을 구현하는 것이 좋습니다.

 

2. 에러 처리

 

API 호출 시 발생할 수 있는 다양한 에러 상황에 대비하여 적절한 예외 처리를 구현하는 것이 중요합니다.

특히 네트워크 오류, 서버 오류, 인증 오류 등에 대한 처리를 고려해야 합니다.

 

3. 요청 제한

 

SGIS API는 일정 시간 내에 요청할 수 있는 횟수에 제한이 있을 수 있습니다.

대량의 데이터를 조회하거나 반복적인 요청을 보낼 때는 적절한 간격을 두고 요청하는 것이 좋습니다.

 

4. 데이터 검증

API에서 반환하는 데이터가 예상과 다를 수 있으므로,

데이터를 사용하기 전에 적절한 검증 과정을 거치는 것이 좋습니다.

특히 누락된 값이나 형식이 다른 값에 대한 처리를 고려해야 합니다.

추가 팁
통계청 SGIS API는 인구통계 외에도 다양한 통계 데이터를 제공합니다. 개발자 센터의 API 문서를 참고하여 필요한 데이터를 조회하는 방법을 알아보세요. 또한, 조회한 데이터를 시각화하거나 분석하는 방법에 대해서도 추가로 학습하면 더욱 유용하게 활용할 수 있습니다.

이번 포스팅에서는 통계청 SGIS API를 사용하여 인구통계 데이터를 조회하는 방법에 대해 알아보았습니다.

[ 파이썬 관련 블로그 글 목록 ] 

파이썬(Python) 블로그 목록
반응형