공공데이터 API로 그리는 지속가능발전의 미래

SDG 13 기후행동 · 온실가스 배출량 20년 추세 분석 · 10년 후 전망 · 데이터 기반 정책 개발

공공데이터 API지속가능발전SDG 13

데이터가 말하는
탄소중립의 골든타임

지난 20년의 온실가스 배출량을 분석하고 앞으로 10년의 추세선을 그리면, 우리 지역과 기관이 어떤 정책을 우선해야 하는지 더 명확하게 판단할 수 있습니다.

핵심 질문

Q1. 배출량은 줄고 있는가, 늘고 있는가?

Q2. 현재 추세가 10년 더 이어지면 어떤 미래가 오는가?

Q3. 학생·학교·지자체가 실행할 정책은 무엇인가?

20년과거 추세
10년미래 전망
6개정책 제안

1. 예제 주제 선정

항목내용
지속가능발전 목표SDG 13 기후행동
분석 주제공공기관 또는 공항의 온실가스 배출량 추세 분석
활용 데이터공공데이터포털 온실가스 배출량 관련 OpenAPI 또는 파일 데이터
분석 기간지난 20년 자료 + 앞으로 10년 예측
분석 방법pandas 데이터 정리, scikit-learn 선형회귀, matplotlib 시각화
실제 API의 URL, XML 태그명, 파라미터명은 공공데이터포털의 각 API 활용가이드에 따라 조금씩 다릅니다. 아래 코드는 인증키와 태그명만 수정하면 수업 실습에 사용할 수 있도록 작성되었습니다.

2. 분석 절차

① API 인증키 발급
② 배출량 데이터 호출
③ 20년 자료 정리
④ 10년 추세선 예측
⑤ 정책 제안 도출

3. 파이썬 전체 코드

# 지속가능발전 SDG 13 기후행동 프로젝트
# 공공데이터 API 인증키를 활용한 온실가스 배출량 추세 분석

import requests
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from xml.etree import ElementTree as ET
from sklearn.linear_model import LinearRegression

SERVICE_KEY = "여기에_공공데이터_API_인증키를_입력하세요"
API_URL = "https://apis.data.go.kr/B551177/AirportGreenGas/getGreenGasInfo"

def make_sample_data():
    years = np.arange(2006, 2026)
    emissions = [115,118,121,126,130,133,136,139,141,143,
                 146,148,147,145,142,139,135,132,128,125]
    return pd.DataFrame({"year": years, "emission": emissions})

def fetch_public_data(service_key):
    params = {
        "serviceKey": service_key,
        "numOfRows": 100,
        "pageNo": 1,
        "type": "xml"
    }
    try:
        response = requests.get(API_URL, params=params, timeout=10)
        response.raise_for_status()
        root = ET.fromstring(response.content)
        rows = []

        for item in root.iter("item"):
            year_text = item.findtext("year") or item.findtext("stdYear") or item.findtext("baseYear")
            emission_text = item.findtext("emission") or item.findtext("ghgEmis") or item.findtext("totEmis")

            if year_text and emission_text:
                rows.append({
                    "year": int(year_text),
                    "emission": float(str(emission_text).replace(",", ""))
                })

        df = pd.DataFrame(rows)
        if df.empty:
            return make_sample_data()
        return df

    except Exception as e:
        print("API 호출 또는 파싱 실패:", e)
        print("수업 실습용 샘플 데이터를 사용합니다.")
        return make_sample_data()

df = fetch_public_data(SERVICE_KEY)
df = df.dropna().sort_values("year")

current_year = df["year"].max()
df_20 = df[df["year"] >= current_year - 19].copy()

X = df_20[["year"]]
y = df_20["emission"]

model = LinearRegression()
model.fit(X, y)

future_years = np.arange(df_20["year"].min(), current_year + 11)
future_X = pd.DataFrame({"year": future_years})
predicted = model.predict(future_X)

first_value = df_20.iloc[0]["emission"]
last_value = df_20.iloc[-1]["emission"]
change_rate = (last_value - first_value) / first_value * 100
future_10_value = predicted[-1]
future_change = (future_10_value - last_value) / last_value * 100

print("[핵심 인사이트]")
print(f"지난 20년 변화율: {change_rate:.2f}%")
print(f"10년 후 예측 배출량: {future_10_value:.2f}")
print(f"현재 대비 10년 후 예측 변화율: {future_change:.2f}%")

if future_change > 0:
    print("판단: 현재 추세가 이어지면 배출량 증가 위험이 있습니다.")
else:
    print("판단: 현재 추세가 이어지면 배출량 감소 가능성이 있습니다.")

plt.rcParams["font.family"] = "Malgun Gothic"
plt.rcParams["axes.unicode_minus"] = False

plt.figure(figsize=(12, 7))
plt.plot(df_20["year"], df_20["emission"], marker="o", label="실제 배출량")
plt.plot(future_years, predicted, linestyle="--", label="추세선 및 10년 예측")
plt.axvline(current_year, linestyle=":", label="현재 기준 연도")
plt.title("지속가능발전 SDG 13: 온실가스 배출량 20년 추세와 10년 전망")
plt.xlabel("연도")
plt.ylabel("온실가스 배출량")
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.savefig("sdg13_greenhouse_trend.png", dpi=200)
plt.show()

policies = [
    "공공기관 건물 에너지 효율 등급 개선",
    "태양광·지열 등 재생에너지 설비 확대",
    "전기차·수소차 등 저탄소 교통수단 전환",
    "배출량 공개 대시보드 구축",
    "탄소 감축 실적에 따른 예산 인센티브 제공",
    "학생·시민 참여형 탄소 모니터링 프로젝트 운영"
]

print("\n[정책 제안]")
for i, policy in enumerate(policies, start=1):
    print(f"{i}. {policy}")

4. 도출 가능한 인사이트

  1. 추세가 증가한다면 현재 정책만으로는 탄소중립 목표 달성이 어렵다는 신호입니다.
  2. 추세가 감소한다면 기존 감축 정책의 효과를 확인하고, 감축 속도를 더 높일 필요가 있습니다.
  3. 10년 후 예측치가 높게 나온다면 건물 에너지, 교통, 전력 사용 부문의 구조적 개선이 필요합니다.
  4. 데이터 공개가 꾸준할수록 학생·시민·정책 담당자가 같은 근거로 토론할 수 있습니다.

5. 관련 정책 개발안

정책 1. 공공건물 에너지 효율 개선

노후 조명 LED 교체, 단열 개선, 냉난방 자동제어로 전력 사용량을 줄입니다.

정책 2. 재생에너지 설비 확대

학교·공공기관 옥상 태양광, 지열 냉난방, ESS 저장장치를 단계적으로 도입합니다.

정책 3. 저탄소 교통 전환

공공기관 차량을 전기차·수소차로 전환하고, 통근버스와 대중교통 연계를 강화합니다.

정책 4. 탄소 데이터 대시보드

기관별 배출량, 전년 대비 증감률, 감축 목표 달성률을 시각화하여 공개합니다.

정책 5. 예산 인센티브

감축 목표를 달성한 기관에는 시설 개선 예산과 친환경 인증 가점을 제공합니다.

정책 6. 학생 참여형 탄소 모니터링

정보 수업에서 API 분석 프로젝트를 수행하고, 학생들이 직접 정책 포스터를 제작합니다.

6. 수업 활동지 문항

  1. API 인증키가 필요한 이유를 설명하시오.
  2. 지난 20년 배출량 변화율을 계산하는 코드의 핵심 부분을 찾으시오.
  3. 선형회귀 추세선의 한계를 2가지 이상 쓰시오.
  4. 온실가스 감축을 위해 학교에서 실천할 수 있는 정책을 3가지 제안하시오.
  5. 데이터 기반 정책이 감으로 만든 정책보다 나은 이유를 쓰시오.