← 전체 목록

지도 데이터 유형별 샘플

자료를 검토한 결과, 모든 지도를 SVG 하나로 처리하기보다 데이터 유형별로 맞는 방식을 나누는 것이 가장 정확합니다. 행정구역 단위 데이터는 경계 지도, 위도·경도 데이터는 점 지도로 시각화합니다.

1) 행정구역 단위 데이터: 색칠 지도

데이터를 불러오는 중입니다…

경계 출처: Wikimedia Commons 행정구역 SVG 및 southkorea/seoul-maps GeoJSON. 데이터 출처: Wikidata SPARQL(P1082 인구, P2046 면적), GeoJSON 속성값. 출처 상세는 assets/*.SOURCE.txt에 기록했습니다.

2) 위도·경도 위치 데이터: 점 지도

데이터를 불러오는 중입니다…

3) 데이터 출처와 선택 이유

유형사용 자료원본/출처수업 포인트
전국 광역시도 경계skorea_provinces_geo_simple.jsonsouthkorea/southkorea-maps · KOSTAT 센서스 경계 기반경계 파일의 지역명과 통계 CSV의 지역명을 매칭
서울 구 경계seoul_municipalities_geo_simple.jsonsouthkorea/seoul-maps · KOSTAT 201325개 구가 모두 1:1로 매칭되는지 확인
서울 동 경계seoul_neighborhoods_geo_simple.jsonsouthkorea/seoul-maps · JUSO 2015동 단위는 명칭·개편 이력이 있어 매칭 전처리가 중요
인구/면적seoul_district_wikidata_population.csv, korea_sido_wikidata_population.csvWikidata SPARQL P1082/P2046. 공식 인구 수업 확장은 행정안전부 주민등록 인구통계 권장출처별 최신성·공식성·재현성을 비교
위치점 데이터지진, 병원, 자전거, 생물종 등 위경도 CSV각 데이터셋 상세 페이지의 공식 API 링크경계 데이터가 아니라 좌표 데이터이므로 점 지도가 적합

주의: 현재 인구 CSV는 키 없이 재현 가능한 공개 지식그래프 샘플입니다. 공식 행정 수업에서는 행정안전부 주민등록 인구통계 CSV를 내려받아 같은 열 이름으로 바꾸면 동일 코드로 교체할 수 있습니다.

4) 수업용 샘플 코드

Python/pandas: 행정구역 데이터 매칭 확인

import pandas as pd

pop = pd.read_csv("https://thinkervis.github.io/free-api-data-science-edu/data/seoul_district_wikidata_population.csv")
print(pop.head())
print("구 개수:", pop["district"].nunique())

# 수업 질문: 인구밀도가 가장 높은 구와 낮은 구는?
print(pop.sort_values("population_density_per_km2", ascending=False)[["district", "population_density_per_km2"]].head())
print(pop.sort_values("population_density_per_km2")[["district", "population_density_per_km2"]].head())

Python/Plotly: 간단한 막대그래프로 먼저 읽기

import pandas as pd
import plotly.express as px

url = "https://thinkervis.github.io/free-api-data-science-edu/data/korea_sido_wikidata_population.csv"
df = pd.read_csv(url)
fig = px.bar(df.sort_values("population"), x="population", y="region", orientation="h",
             title="전국 광역시도별 인구")
fig.show()

JavaScript: CSV를 읽어 지도 색상에 연결하는 핵심 구조

const rows = await fetch("../data/seoul_district_wikidata_population.csv")
  .then(r => r.text())
  .then(parseCsvRows)
  .then(toObjects);

// 핵심: 경계 파일의 properties.name과 CSV의 district가 같아야 색칠 가능
const rowByDistrict = Object.fromEntries(rows.map(r => [r.district, r]));
const value = Number(rowByDistrict["강남구"].population_density_per_km2);

5) 수업 활동 예시

  1. 데이터 유형 분류: 이 데이터는 행정구역 통계인가, 위경도 위치점인가?
  2. 매칭 검증: 경계 파일의 지역명과 CSV 지역명이 모두 일치하는지 확인한다.
  3. 해석: 인구가 많은 지역과 인구밀도가 높은 지역은 왜 다를까?
  4. 출처 토론: Wikidata와 행정안전부 주민등록 인구통계 중 어떤 자료가 더 적합한가?
  5. 확장 과제: 행정안전부 CSV를 내려받아 같은 지도에 공식 최신 인구로 교체한다.