03 결과 도출 — 그림과 본문 수치 검증¶

In [1]:
import os, hashlib
import numpy as np, pandas as pd
import config as C
import landscape as L
pd.set_option("display.float_format", lambda v: f"{v:,.2f}")
C.setup()
import matplotlib.pyplot as plt
import koreanize_matplotlib  # noqa: F401
pat = pd.read_csv(C.FILES["특허_연도"], index_col=0)
cty = pd.read_csv(C.FILES["특허_국가"], index_col=0).iloc[:, 0]
oa = pd.read_csv(C.FILES["논문_OpenAlex"], index_col=0)
pm = pd.read_csv(C.FILES["논문_PubMed"], index_col=0).iloc[:, 0]
er = pd.read_csv(C.FILES["뉴스_EventRegistry"], index_col=0, parse_dates=True).iloc[:, 0]
er_y = L.to_annual(er)
growth = pd.read_csv(os.path.join(C.OUTPUT, "growth_summary.csv"), index_col=0)
Python 3.12.10 · pandas 2.2.3 · numpy 2.4.6 · matplotlib 3.11.0
  ONLINE=0(스냅샷)  OpenAlex 키 없음  Event Registry 키 없음
  특허_연도            있음  data\inputs\findip_g06n_by_year.csv
  특허_국가            있음  data\inputs\findip_g06n_by_country.csv
  특허_동시분류          있음  data\inputs\findip_kr_g06n_coipc.csv
  특허_출원인           있음  data\inputs\findip_kr_g06n_applicants.csv
  논문_OpenAlex      있음  data\inputs\openalex_by_year.csv
  논문_PubMed        있음  data\inputs\pubmed_by_year.csv
  뉴스_EventRegistry 있음  data\inputs\eventregistry_ai_eng_daily.csv
  뉴스_네이버_표본        있음  data\inputs\naver_daily_counts_생성형AI_sample.csv

그림 1. 특허·논문·뉴스의 연도별 추이(2015=1, 로그 축)¶

In [2]:
fig, ax = plt.subplots(figsize=(8.5, 4.6))
yrs = range(2015, 2025)
for lab, s, col in [("특허 G06N(한국)", pat["KR_G06N"], "#1f4e79"), ("특허 G06N(5개국)", pat["5개국_G06N"], "#6fa8dc"),
                    ("논문 AI(OpenAlex)", oa["AI_개념_전체"], "#a9781f"), ("논문 AI·ML(PubMed)", pm, "#d7a94b"),
                    ("뉴스 AI(영문)", er_y, "#7a4fb0")]:
    v = [s.loc[y] / s.loc[2015] for y in yrs]
    ax.plot(list(yrs), v, marker="o", ms=3.5, label=lab, color=col)
ax.set_yscale("log"); ax.axvline(2022, color="#999", ls="--", lw=1)
ax.text(2022.1, 1.2, "생성형 AI 공개(2022.11)", fontsize=8, color="#666")
ax.set_ylabel("2015년 = 1"); ax.grid(alpha=.3, which="both"); ax.legend(frameon=False, fontsize=8, ncol=2)
ax.set_title("AI 확산의 세 갈래 신호", loc="left")
fig.tight_layout(); fig.savefig(os.path.join(C.OUTPUT, "fig1_landscape_index.png"), dpi=150)
No description has been provided for this image

그림 2. 생성형 AI·LLM 논문과 영문 AI 뉴스(2019–2025)¶

In [3]:
fig, ax1 = plt.subplots(figsize=(8.5, 4.2))
yy = list(range(2019, 2026))
ax1.bar(yy, [oa["생성형AI_LLM"].loc[y] / 1e3 for y in yy], color="#a9781f", alpha=.8, label="생성형 AI·LLM 논문(천 편)")
ax2 = ax1.twinx()
ax2.plot(yy, [er_y.loc[y] / 1e4 for y in yy], color="#1f4e79", marker="o", label="영문 AI 뉴스(만 건)")
ax1.set_ylabel("천 편"); ax2.set_ylabel("만 건"); ax1.grid(alpha=.3)
h1, l1 = ax1.get_legend_handles_labels(); h2, l2 = ax2.get_legend_handles_labels()
ax1.legend(h1 + h2, l1 + l2, frameon=False, loc="upper left", fontsize=8)
ax1.set_title("2023년 이후의 급증 — 2025년 값은 색인 미완", loc="left")
fig.tight_layout(); fig.savefig(os.path.join(C.OUTPUT, "fig2_generative_ai.png"), dpi=150)
No description has been provided for this image

검증 — 본문 수치와 대조¶

In [4]:
P = C.PUBLISHED
s5 = cty.sum()
checks = [
    ("한국 G06N 2015", pat.loc[2015, "KR_G06N"], P["KR_특허_2015"], 0),
    ("한국 G06N 2022", pat.loc[2022, "KR_G06N"], P["KR_특허_2022"], 0),
    ("5개국 G06N 2015", pat.loc[2015, "5개국_G06N"], P["세계_특허_2015"], 0),
    ("5개국 G06N 2024", pat.loc[2024, "5개국_G06N"], P["세계_특허_2024"], 0),
    ("5개국 배수(2015→2024)", pat.loc[2024, "5개국_G06N"] / pat.loc[2015, "5개국_G06N"], P["세계_특허_배수"], 0.05),
    ("중국 비중(%)", 100 * cty["CN"] / s5, P["중국_비중_%"], 0.05),
    ("한국 비중(%)", 100 * cty["KR"] / s5, P["한국_비중_%"], 0.05),
    ("생성형 AI 논문 2022", oa.loc[2022, "생성형AI_LLM"], P["생성형논문_2022"], 0),
    ("생성형 AI 논문 2024", oa.loc[2024, "생성형AI_LLM"], P["생성형논문_2024"], 0),
    ("AI 논문 2024(만 편)", oa.loc[2024, "AI_개념_전체"] / 1e4, P["AI논문_2024_만편"], 0.05),
    ("영문 AI 뉴스 2022(만 건)", er_y.loc[2022] / 1e4, P["영문뉴스_2022_만건"], 0.05),
    ("영문 AI 뉴스 2024(만 건)", er_y.loc[2024] / 1e4, P["영문뉴스_2024_만건"], 0.05),
]
res = pd.DataFrame([{"항목": k, "계산": v, "본문": p, "허용오차": t, "통과": abs(v - p) <= t} for k, v, p, t in checks])
display(res)
assert res["통과"].all(), "본문 수치와 계산 결과가 다르다"
print("검증 통과: 본문 수치를 재현했다(스냅샷 기준).")
항목 계산 본문 허용오차 통과
0 한국 G06N 2015 513.00 513.00 0.00 True
1 한국 G06N 2022 14,002.00 14,002.00 0.00 True
2 5개국 G06N 2015 11,236.00 11,236.00 0.00 True
3 5개국 G06N 2024 224,600.00 224,600.00 0.00 True
4 5개국 배수(2015→2024) 19.99 20.00 0.05 True
5 중국 비중(%) 67.31 67.30 0.05 True
6 한국 비중(%) 6.18 6.20 0.05 True
7 생성형 AI 논문 2022 1,071.00 1,071.00 0.00 True
8 생성형 AI 논문 2024 57,411.00 57,411.00 0.00 True
9 AI 논문 2024(만 편) 134.45 134.50 0.05 True
10 영문 AI 뉴스 2022(만 건) 25.17 25.20 0.05 True
11 영문 AI 뉴스 2024(만 건) 94.98 95.00 0.05 True
검증 통과: 본문 수치를 재현했다(스냅샷 기준).