노원구 COVID-19 분석 — 25분 walkthrough
서울 노원구의 안심병원 위치, 동별 인구, 환자 이동 동선 데이터를 D.Hub에 올려 컬렉션 → 데이터셋 → 파이프라인 → 대시보드를 한 번에 완성하는 예제입니다. 9개의 CSV(총 12.5 KB)와 D.Hub 계정만 있으면 따라할 수 있습니다.
- D.Hub 계정 (관리자에게 발급받은 사용자명·비밀번호 또는 SSO)
- 웹 브라우저(데스크톱 권장)
- CSV 9개를 받아 압축 해제할 폴더 (다음 단계에서 다운로드)
시나리오와 데이터
이 예제는 2020년 서울 노원구의 COVID-19 hotspot 분석 시나리오를 재구성한 것입니다. 9개의 파일은 크게 4가지 역할로 묶입니다.
| 분류 | 파일 | 행수 | 역할 |
|---|---|---|---|
| 차원·필터 | sido_filter.csv · sigungu_filter.csv | 3 · 6 | 시도·시군구 후보 목록 |
| 마스터 | clinics.csv | 20 | 안심병원·선별진료소 (위·경도 포함) |
| 인구 | residents_population.csv · floating_population.csv | 9 · 9 | 동별 주민 인구, 유동 인구 |
| 인구 (조인본) | region_dong.csv · region_dong_info.csv | 33 · 8 | 인구 조인 결과 + 필터 변형 |
| 팩트 | patient.csv · hotspot_result.csv | 13 · 23 | 환자 위치·감염일, 접촉 hotspot |
walkthrough에서는 clinics(Step 6 지도), patient(Step 7 라인 차트), residents_population + floating_population(Step 4 조인) 세 그룹을 적극적으로 사용합니다. 나머지 6개 CSV는 데이터셋으로만 import 해두고, 본격 분석은 마지막 다음 단계에서 안내합니다.
데이터 다운로드
| 받기 | 크기 | 비고 |
|---|---|---|
| 한 번에 받기 (covid19.zip) | ~10 KB | Step 1에서 사용 |
| clinics.csv | 3.6 KB | 안심병원·선별진료소 (lat/long) |
| patient.csv | 0.9 KB | 환자 위치·감염일 |
| hotspot_result.csv | 4.9 KB | 환자 접촉 hotspot (POINT geom) |
| residents_population.csv | 0.4 KB | 동별 주민 인구 |
| floating_population.csv | 0.4 KB | 동별 유동 인구 |
| region_dong.csv | 1.6 KB | 인구 조인본 |
| region_dong_info.csv | 0.4 KB | 인구 조인본 필터 변형 |
| sido_filter.csv | 0.05 KB | 시도 필터 후보 |
| sigungu_filter.csv | 0.2 KB | 시군구 필터 후보 |
Step 1. 자산 받기 · D.Hub 로그인 (2분)
- 위 표의 한 번에 받기 (covid19.zip) 링크를 클릭해 zip을 내려받습니다.
- zip을 임의의 폴더에 압축 해제합니다. 9개의 CSV 파일이 평탄하게(
covid19/하위 폴더 없이) 풀려야 합니다. - 브라우저에서 D.Hub 포털 URL에 접속합니다.
- 사용자명·비밀번호를 입력하고 Login을 클릭합니다. SSO 환경이면 Login with SSO 버튼으로 진행합니다.
- 로컬 폴더에 9개 CSV 파일이 평탄하게 풀려 있어야 합니다.
- 브라우저는 D.Hub 홈 화면(
/home)에 도착해 있어야 합니다.
Step 2. 컬렉션 노원구 COVID-19 분석 생성 (1분)
- 홈 화면의 Get Started 영역에서 Create Collection을 클릭합니다.
- 컬렉션 이름에
노원구 COVID-19 분석을 입력합니다. - 설명 칸에
2020년 노원구 안심병원·환자·인구 데이터를 입력합니다(선택). - Create를 클릭합니다.
- 좌측 사이드바 Collections 아래에
노원구 COVID-19 분석컬렉션이 보입니다. - 페이지가 자동으로 컬렉션 상세로 이동했습니다 (URL에 컬렉션 ID 포함).
Step 3. 9개 CSV Quick Upload (3분)
- 컬렉션 상세 페이지에서 Quick Upload 버튼을 클릭합니다.
- 업로드 다이얼로그에 Step 1에서 압축 해제한 9개 CSV 파일을 모두 드래그 앤 드롭 하거나, 파일 선택 다이얼로그에서 멀티 선택합니다.
- 9개 항목이 모두 목록에 보이는지 확인 후 Upload를 클릭합니다.
- 업로드가 끝나면 데이터셋 목록에 9개의 새 항목이 자동 생성됩니다.
- 컬렉션의 Items 탭에 다음 9개의 데이터셋이 보입니다:
clinics,floating_population,hotspot_result,patient,region_dong,region_dong_info,residents_population,sido_filter,sigungu_filter. - 각 데이터셋의 행수가 위 §시나리오와 데이터 표의 값과 일치해야 합니다 (
clinics20행,patient13행 등). - 행수 불일치가 있으면 CSV 인코딩(UTF-8) 또는 헤더 라인을 다시 확인하세요.
Step 4. 인구 조인 파이프라인 만들기 (7분)
residents_population(동별 주민 수)과 floating_population(동별 유동 인구 수)을 동(sido·sigungu·dong) 키로 조인해 동별 종합 인구 통계를 만듭니다.
- 컬렉션 상세에서 Add Item → Pipeline → New Pipeline을 선택합니다.
- 파이프라인 이름에
인구 통계 조인을 입력하고 Create를 클릭하면 워크플로우 편집기가 열립니다. - 좌측 패널에서 데이터 소스 노드를 캔버스로 두 번 드래그해 다음과 같이 구성합니다.
- 첫 번째 소스 노드 → 데이터셋
residents_population선택 - 두 번째 소스 노드 → 데이터셋
floating_population선택
- 첫 번째 소스 노드 → 데이터셋
- Transform 카테고리에서 Join 노드를 캔버스에 추가하고, 두 소스 노드의 출력 핸들을 Join 노드의 입력 핸들에 각각 연결합니다.
- Join 노드를 선택하고 우측 구성 패널에서 다음을 설정합니다.
- Join key (양쪽 공통):
sido,sigungu,dong - Join type:
inner
- Join key (양쪽 공통):
- Output 카테고리에서 Save as Dataset 노드를 추가해 Join 노드 출력을 연결하고, 새 데이터셋 이름을
region_population_joined로 지정합니다. - 우상단 Save를 클릭해 파이프라인을 저장합니다.
- 워크플로우 편집기 캔버스에 4개 노드(소스 2 + Join + Save as Dataset)가 연결된 그래프가 보입니다.
- 파이프라인 목록으로 돌아가면
인구 통계 조인항목이 보입니다. - 아직 실행하지는 않았습니다 — 다음 step에서 실행합니다.
Step 5. 파이프라인 실행 · Batch 결과 확인 (2분)
- 파이프라인 상세 페이지 상단의 Run 버튼을 클릭합니다.
- 우측에 새 Batch가 생성되며 상태가
running→completed로 전환됩니다. - Batch 카드를 클릭하면 실행 트레이스(각 노드의 처리 행수, 소요 시간)를 확인할 수 있습니다.
- 좌측 컬렉션의 데이터셋 목록을 새로고침하면
region_population_joined가 새로 생성되어 있습니다.
- Batch 상태가
completed(녹색)이어야 합니다. - 새 데이터셋
region_population_joined의 행수는 9 (양쪽 공통 동 수)이며 컬럼은sido,sigungu,dong,residents_population,float_population5개입니다. - 실패(빨강) 상태라면 트레이스에서 어느 노드가 어떤 오류로 실패했는지 확인합니다 (디버깅 가이드).
Step 6. 대시보드 + 안심병원 지도 위젯 (4분)
clinics 데이터셋의 위·경도 컬럼을 지도 위젯에 매핑합니다.
- 좌측 사이드바에서 Dashboard를 클릭한 뒤 Create Dashboard 버튼을 누릅니다.
- 대시보드 이름에
노원구 COVID-19 현황을 입력하고 Create를 클릭하면 빌더가 열립니다. - 좌측 Widget Library → Visualizations → Map을 캔버스로 드래그합니다.
- 위젯이 선택된 상태에서 우측 구성 패널의 Data 탭을 엽니다.
- Simple Mode를 선택합니다.
- Dataset:
clinics - Latitude column:
latitude - Longitude column:
longitude - Tooltip columns:
clinic_name,clinic_type,sample_available
- Apply를 클릭하면 지도가 노원구 좌표 주변으로 자동 줌인됩니다.
- 대시보드 캔버스 위에 노원구 영역을 보여주는 지도와 20개의 마커(병원·선별진료소)가 보입니다.
- 마커를 클릭하면
clinic_name,clinic_type,sample_available세 값이 툴팁으로 떠야 합니다.
Step 7. 환자 일자별 누적 추이 라인 차트 (3분)
patient 데이터셋의 infection_date를 X축, 누적 감염자 수를 Y축으로 두는 라인 차트를 추가합니다.
- 빌더에서 Widget Library → Visualizations → Line Chart를 캔버스로 드래그해 지도 옆에 배치합니다.
- 위젯의 Data 탭을 엽니다.
-
Query Mode를 선택합니다 (Simple Mode로도 가능하나, 누적 합산이 필요해 SQL이 더 명료합니다).
-
쿼리 영역에 다음을 입력합니다.
SELECT
infection_date,
COUNT(*) AS daily_count,
SUM(COUNT(*)) OVER (ORDER BY infection_date) AS cumulative_count
FROM patient
GROUP BY infection_date
ORDER BY infection_date -
X축:
infection_date, Y축:cumulative_count.
-
- Apply → 차트가 렌더링되면 우상단 Save로 대시보드를 저장합니다.
- 대시보드에 지도와 라인 차트 두 개의 위젯이 나란히 보입니다.
- 라인 차트는 2020년 8월–10월 구간의 누적 감염자 추이를 단조 증가 곡선으로 표시합니다.
- 대시보드 목록(
/dashboard)에노원구 COVID-19 현황항목이 보여야 합니다.
Step 8. 마무리 · 다음 단계 (3분)
축하합니다 — D.Hub의 Collection → Dataset → Pipeline → Dashboard canonical flow를 모두 한 번씩 직접 거쳤습니다. 25분 안에 끝낸 작업을 정리하면 다음과 같습니다.
- ✅ 컬렉션 1개 (
노원구 COVID-19 분석) - ✅ 데이터셋 9개 (Quick Upload) + 1개 (파이프라인 산출물
region_population_joined) - ✅ 파이프라인 1개 (
인구 통계 조인) · Batch 1회 실행 - ✅ 대시보드 1개 + 위젯 2개 (지도 · 라인 차트)
다음 단계
| 더 깊이 가려면 | 가이드 |
|---|---|
환자 동선 hotspot 시각화 (hotspot_result 의 POINT geom) | 지도 데이터 설정 |
patient ↔ clinics ↔ region_dong 을 온톨로지로 모델링 | covid19 온톨로지 튜토리얼 |
| 같은 흐름을 API/cURL로 자동화 | 개발자 가이드 - API 튜토리얼 |
| 컬렉션을 다른 사용자/그룹에 공유 | 공유 및 권한 |
| 파이프라인을 정기 실행하도록 스케줄 | 스케줄링 |
문제 해결
| 증상 | 점검 |
|---|---|
| Quick Upload 시 데이터셋 행수가 표와 다름 | CSV 인코딩이 UTF-8인지, 헤더 라인이 첫 줄에 있는지 확인 |
| Step 4의 Join 결과 행수가 0 | 두 소스의 sido/sigungu/dong 문자열이 정확히 일치하는지 확인 (공백·전각·반각 주의) |
Step 5의 Batch 상태가 failed | Batch 트레이스에서 실패 노드의 오류 메시지를 확인 (디버깅 가이드) |
| Step 6의 지도가 빈 화면 | clinics 데이터셋의 latitude/longitude 컬럼 타입이 숫자인지 확인 (문자열이면 데이터셋 스키마를 수정) |
| Step 7의 라인 차트가 비어 있음 | Query Mode에서 데이터셋 이름이 정확한지 (예제 데이터셋명 patient) 확인 |