SDG 13 기후행동 · 온실가스 배출량 20년 추세 분석 · 10년 후 전망 · 데이터 기반 정책 개발
데이터가 말하는
탄소중립의 골든타임
지난 20년의 온실가스 배출량을 분석하고 앞으로 10년의 추세선을 그리면, 우리 지역과 기관이 어떤 정책을 우선해야 하는지 더 명확하게 판단할 수 있습니다.
Q1. 배출량은 줄고 있는가, 늘고 있는가?
Q2. 현재 추세가 10년 더 이어지면 어떤 미래가 오는가?
Q3. 학생·학교·지자체가 실행할 정책은 무엇인가?
| 항목 | 내용 |
|---|---|
| 지속가능발전 목표 | SDG 13 기후행동 |
| 분석 주제 | 공공기관 또는 공항의 온실가스 배출량 추세 분석 |
| 활용 데이터 | 공공데이터포털 온실가스 배출량 관련 OpenAPI 또는 파일 데이터 |
| 분석 기간 | 지난 20년 자료 + 앞으로 10년 예측 |
| 분석 방법 | pandas 데이터 정리, scikit-learn 선형회귀, matplotlib 시각화 |
# 지속가능발전 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}")
노후 조명 LED 교체, 단열 개선, 냉난방 자동제어로 전력 사용량을 줄입니다.
학교·공공기관 옥상 태양광, 지열 냉난방, ESS 저장장치를 단계적으로 도입합니다.
공공기관 차량을 전기차·수소차로 전환하고, 통근버스와 대중교통 연계를 강화합니다.
기관별 배출량, 전년 대비 증감률, 감축 목표 달성률을 시각화하여 공개합니다.
감축 목표를 달성한 기관에는 시설 개선 예산과 친환경 인증 가점을 제공합니다.
정보 수업에서 API 분석 프로젝트를 수행하고, 학생들이 직접 정책 포스터를 제작합니다.