1 / 25
← 이전 · → 다음 · F 전체화면
WEEK 6

Pandas를 활용한
코로나19 데이터 분석 ②

한국과 하와이 데이터 결합 및 시각화

00

학습목표

01

날짜 데이터 정리

문자열로 저장된 날짜를 날짜 자료형으로 변환하고 시간순으로 정렬한다.

02

데이터 결합

서로 다른 데이터의 색인과 단위를 맞추어 하나의 DataFrame으로 구성한다.

03

시각화 선택

분석 내용에 따라 선 그래프, 막대그래프, 히스토그램을 선택한다.

04

결과 해석

그래프에서 확인한 변화와 비교 결과를 문장으로 설명한다.

00

주요 학습내용

01

지난 시간 확인

한국 데이터와 열 이름을 다시 확인한다.

02

하와이 데이터 정리

결측값과 자료형을 확인하고 날짜를 정리한다.

03

데이터 결합

비교 단위와 색인을 맞추어 두 데이터를 합친다.

04

시각화 실습

분석 내용에 맞는 그래프를 작성하고 해석한다.

실습 구성 실습 1: 하와이 데이터 정리 및 결합  실습 2: 그래프 작성 및 결과 해석

SECTION 01

분석 과제와 데이터 준비

지난 시간의 분석 결과 · 열 이름 확인 · 하와이 데이터 내려받기

01

지난 시간의 분석 결과

한국과 미국의 인구 대비 확진율을 선 그래프로 비교하였다.

CSV 불러오기›행·열 선택›비율 계산›선 그래프
!

미국 전체의 결과만으로 하와이주의 상황을 판단하기는 어렵다. 이번 시간에는 하와이주 데이터를 별도로 추가한다.

대한민국미국 날짜비율
01

OWID compact 데이터의 열 이름

열 이름내용
code국가 코드
country국가 또는 지역 이름
date날짜
total_cases누적 확진자 수
new_cases일일 신규 확진자 수
population전체 인구

코드 실행 전 확인

# 코드 Week6-1: OWID 데이터 확인
# Pandas 라이브러리 불러오기
import pandas as pd
import urllib.request
import matplotlib.pyplot as plt

# CSV 파일 내려받기 및 파일 이름 지정
url = "https://catalog.ourworldindata.org/garden/covid/latest/compact/compact.csv"
urllib.request.urlretrieve(url, "owid-covid-data.csv")  

raw_df = pd.read_csv("owid-covid-data.csv")
# 마지막 줄의 결과에서 열 이름과 앞부분을 확인한다.
raw_df.head()
!

현재 compact 데이터에서는 국가 이름 열로 country, 국가 코드 열로 code를 사용한다.

01

분석 과제

PROJECT QUESTION

한국과 하와이의 코로나19 확산 추이는 어떻게 달랐을까?

인구 규모가 다른 두 지역을 어떤 기준으로 비교할 것인가?
누적 확진자와 신규 확진자는 같은 양상으로 나타나는가?
비교 목적에 따라 어떤 그래프를 선택할 것인가?

비교 기준

  • 같은 날짜의 값을 비교한다.
  • 전체 인구 대비 확진율(%)로 비교한다.
  • 누적 확진자와 신규 확진자를 구분한다.
  • 그래프와 함께 해석 문장을 작성한다.
01

데이터 출처와 범위

국가별 데이터

Our World in Data

  • 한국을 포함한 국가별 자료
  • 날짜별 누적 확진자와 신규 확진자
  • 인구 자료 포함

Week 5에서 내려받은 owid-covid-data.csv를 계속 사용한다.

미국 주별 데이터

미국 CDC 공개 데이터

  • 미국 주·관할지역별 코로나19 자료
  • 하와이주 코드 HI 사용
  • 1주일 단위로 집계된 보관 자료

해당 자료는 보관 자료이며 더 이상 갱신되지 않는다. 수업에서는 확산 기간의 자료 분석에 사용한다.

01

하와이 데이터 다운로드 ① 조회 화면

CDC 원본 데이터 페이지

페이지를 연 뒤 다음 순서로 선택한다.

  1. Data 탭
  2. Actions 메뉴
  3. Query data

자료명에 Weekly가 있는지 확인한다. 한 행은 한 지역의 1주일 자료이다.

Data 탭, Actions 메뉴, Query data 선택 순서
01

하와이 데이터 다운로드 ② 지역 필터

아래쪽 Filters에서 조건을 지정한다.

  1. 열: state
    조건: is one of
  2. 값: HI
  3. Apply 클릭

표의 state 열에 HI만 남았는지 확인한다.

HI는 하와이주 코드이다. 전체 파일을 받은 뒤 나누지 않고, 원본에서 하와이 행만 선택한다.

Filters에서 state is one of HI를 지정하고 Apply 선택
01

하와이 데이터 다운로드 ③ CSV 내보내기

  1. 오른쪽 위 Export
  2. Download file 탭에서
    CSV for Excel 선택
  3. Download 클릭

필터가 적용된 조회 결과만 내려받는다.

CSV for Excel도 CSV 파일이다. 실습에서는 Pandas의 read_csv()로 읽는다.

Export 창에서 CSV for Excel을 선택하고 Download 클릭
01

하와이 데이터 다운로드 ④ 파일 저장

  1. 파일 이름 지정
    hawaii-covid-data.csv
  2. 저장 클릭

저장한 파일을 주피터 노트북과 같은 폴더에 둔다.

저장 창 없이 바로 내려받았다면 다운로드 폴더에서 이름을 변경하고 이동한다.

확장자가 .csv.csv가 되지 않도록 확인한다. 이미지는 클릭하면 크게 볼 수 있다.

파일 이름을 hawaii-covid-data.csv로 지정하고 저장
01

하와이 데이터 다운로드 ⑤ Colab에 파일 올리기

  1. Colab 왼쪽 폴더 아이콘 클릭
  2. 탐색기에서
    hawaii-covid-data.csv 선택
  3. Colab 파일 영역으로
    끌어다 놓기
  4. 목록에 파일이 보이는지 확인
    보이지 않으면 새로고침
!

런타임이 다시 시작되면 올린 파일이 삭제된다. 그때는 파일을 다시 올린다.

Colab 폴더 아이콘을 누르고 탐색기의 hawaii-covid-data.csv를 Colab 파일 영역으로 끌어다 놓는 순서
SECTION 02 · 실습 1

하와이 데이터 정리 및 결합

결측값 확인 · 날짜 변환 · 전체 중 비율(%) 계산 · 색인 맞추기

02

하와이 데이터 불러오기

먼저 확인할 내용

  • 한 행이 나타내는 내용
  • 날짜와 확진자 수가 저장된 열
  • 각 열의 자료형
  • 결측값의 존재 여부

자료형 확인
end_date가 날짜처럼 보여도 실제 자료형은 문자열일 수 있다.

# 코드 Week6-2: 하와이 CSV 불러오기
# 표를 다루고 그래프를 그릴 도구를 불러온다.
import pandas as pd
import matplotlib.pyplot as plt
import urllib.request

# CSV 파일 내려받기 및 파일 이름 지정 (hawaii-covid-data.csv를 Colab에 업로드 했다면 아래 코드는 불필요하다)
url = "https://docs.shga.kr/kyu/2026/bigdata/week6/hawaii-covid-data.csv"
urllib.request.urlretrieve(url, "hawaii-covid-data.csv")  

# 내려받은 하와이 CSV를 DataFrame으로 읽는다.
raw_hawaii_df = pd.read_csv(
    "hawaii-covid-data.csv"
)

# 처음 다섯 행으로 열 이름과 값의 형태를 확인한다.
raw_hawaii_df.head()
02

분석에 필요한 열 선택

열 이름내용활용
end_date집계 종료일(수요일)시간순 정렬
tot_cases누적 확진자 수누적 추이
new_cases7일간 신규 확진자 합계주간 변화

확진자 수의 쉼표를 제거해 숫자 열로 저장한다. 이후 계산에는 변환한 열을 사용한다.

# 코드 Week6-3: 확진자 열 선택 및 변환
# 분석에 쓸 날짜와 확진자 수 열만 복사한다.
hawaii_df = raw_hawaii_df[
    [
        "end_date",
        "tot_cases",
        "new_cases"
    ]
].copy()

# 원본 파일의 값에 '12,308'과 같이 ','가 들어있으므로, 이를 제거하고 정수(int)형으로 변환한다.
hawaii_df["tot_cases_int"] = hawaii_df["tot_cases"].str.replace(",", "").astype(int)
hawaii_df["new_cases_int"] = hawaii_df["new_cases"].str.replace(",", "").astype(int)
02

날짜 자료형 변환 및 정렬

pd.to_datetime()

문자열을 Pandas의 날짜 자료형으로 변환한다.

sort_values()

변환한 날짜를 기준으로 오래된 날짜부터 정렬한다.

변환 확인
hawaii_df["date"].dtype의 결과를 확인한다.

# 코드 Week6-4: 날짜 변환 및 정렬
# 집계 종료일을 날짜 자료형으로 변환한다.
hawaii_df["date"] = pd.to_datetime(
    hawaii_df["end_date"]
)

# 실제 날짜 순서로 행을 정렬한다.
hawaii_df = hawaii_df.sort_values(
    "date"
)

# 변환한 열의 자료형을 확인한다.
hawaii_df["date"].dtype
02

날짜 색인 설정

날짜를 색인으로 설정

# 코드 Week6-5: 날짜 색인 설정
# 날짜를 행의 색인으로 지정한다.
hawaii_df = hawaii_df.set_index(
    "date"
)

# 색인이 날짜 자료형인지 확인한다.
hawaii_df.index.dtype

날짜를 행의 이름표로 사용하면 같은 날짜의 값을 맞추기 쉽다.

날짜 색인을 쓰는 이유

  • DataFrame의 열 하나를 선택하면 날짜 색인이 붙은 Series가 된다.
  • pd.concat()으로 결합할 때 같은 날짜의 값끼리 맞춰진다.
  • 그래프를 그리면 날짜 색인이 가로축이 된다.
02

인구 대비 확진율 계산

인구 대비 확진율(%)

확진자 수 ÷ 전체 인구 수 × 100

날짜별 누적 확진자 수를 전체 인구로 나누어 확진율을 계산한다.

!

하와이 인구는 2020년 미국 인구조사 값 1,455,271명을 사용한다. 주간 신규 확진율도 같은 인구를 분모로 계산한다.

# 코드 Week6-6: 하와이 확진율 계산
# 2020년 인구조사 기준 하와이 전체 인구를 사용한다.
hawaii_population = 1_455_271

# 누적 확진자 수를 인구로 나누어 확진율을 구한다.
hawaii_df["case_rate_pct"] = (
    hawaii_df["tot_cases_int"] / hawaii_population * 100
).astype(float)
# 주간 신규 확진자 수도 같은 인구로 나눈다.
hawaii_df["weekly_case_rate_pct"] = (
    hawaii_df["new_cases_int"] / hawaii_population * 100
).astype(float)

하와이 인구 출처: 미국 Census Bureau, 2020 Census

02

한국 데이터 정리

사용할 열

  • country
  • date
  • total_cases
  • new_cases
  • population

확인
country == "South Korea"인 행만 선택한다.

# 코드 Week6-7: 대한민국 데이터 준비
# OWID CSV에서 한국에 해당하는 행만 선택한다.
owid_df = pd.read_csv("owid-covid-data.csv")

korea_df = owid_df[
    owid_df["country"] == "South Korea"
].copy()

# 날짜를 변환하고 날짜순으로 정렬한 뒤 색인으로 쓴다.
korea_df["date"] = pd.to_datetime(korea_df["date"])
korea_df = korea_df.sort_values("date").set_index("date")

# 각 날짜의 누적 확진자 수를 해당 인구로 나눈다.
korea_df["case_rate_pct"] = (
    korea_df["total_cases"]
    / korea_df["population"] * 100
)
02

한국과 하와이 데이터 결합

pd.concat()은 색인을 기준으로 여러 Series를 나란히 결합한다.

한국 Series+하와이 Series›비교 DataFrame
!

누적값은 같은 날짜끼리 비교한다. 하와이는 매주 수요일의 누적값이며, 신규 확진자는 별도로 집계 기간을 맞춰야 한다.

# 코드 Week6-8: 두 지역 확진율 결합
# 날짜 색인을 기준으로 한국과 하와이의 확진율을 결합한다.
total_compare = pd.concat(
    [
        korea_df["case_rate_pct"]
            .rename("South Korea"),
        hawaii_df["case_rate_pct"]
            .rename("Hawaii")
    ],
    axis=1
)

# 앞부분을 보고 같은 날짜의 값이 나란히 놓였는지 확인한다.
total_compare.head()
02

결합 결과를 간단한 그래프로 확인

공통 날짜의 확진율을 먼저 그려 데이터 결합이 잘 되었는지 확인한다.

빠르게 확인할 점

  • 공통 날짜가 1개 이상 있는가?
  • South Korea와 Hawaii 선이 모두 보이는가?
  • 날짜가 시간순으로 이어지는가?
!

이 단계는 데이터 연결 상태를 확인하는 간단한 그래프이다. 뒤에서 제목과 축을 갖춘 그래프를 작성한다.

# 코드 Week6-9: 결합 결과 빠른 그래프 확인
# 두 지역 값이 모두 있는 날짜만 남긴다.
preview_df = total_compare.dropna().sort_index()

# 공통 날짜가 몇 개인지 확인한다.
print("Common dates:", len(preview_df))

# 공통 날짜가 있으면 두 지역의 선이 나오는지 본다.
if preview_df.empty:
    print("No common dates. Check the date index.")
else:
    preview_df.plot.line(figsize=(9, 4))
    plt.show()
03

비교 그래프에 필요한 이름표

누적 확진율: 대한민국과 하와이 South Korea Hawaii 날짜 누적 확진율 (%)

제목

비교 대상과 지표를 함께 쓴다.

가로축 · 세로축

날짜와 확진율의 단위(%)를 밝힌다.

범례

각 선이 나타내는 지역을 구분한다.

격자선

같은 시점의 높이와 변화를 읽기 쉽게 한다.

03

그래프에 제목·축 이름·범례 넣기

22번 슬라이드에서 만든 preview_df로 두 지역의 선을 그린다.

코드의 역할

  • set_title(): 비교 내용 표시
  • set_xlabel(), set_ylabel(): 축과 단위 표시
  • legend(): 선과 지역 연결
  • grid(): 값 읽기 보조

하와이 자료는 주간 값이므로, 공통 날짜만 남긴 preview_df를 그려 선이 끊기지 않게 한다.

# 코드 Week6-10: 비교 그래프 꾸미기
# 22번 슬라이드에서 만든 공통 날짜 데이터로 그린다.
ax = preview_df.plot.line(figsize=(10, 5))

# 제목, 축 이름과 확진율 단위를 적는다.
ax.set_title("Cumulative Case Rate: South Korea vs Hawaii")
ax.set_xlabel("Date")
ax.set_ylabel("Cumulative Case Rate (%)")

# 선의 지역 이름과 격자선을 표시한다.
ax.legend(title="Region")
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
03

마무리 실습: 한국과 하와이 비교

실습 과제

  • 두 지역의 날짜 색인과 확진율(%)을 확인한다.
  • 공통 날짜의 누적 확진율 선 그래프를 그린다.
  • 제목, 축 이름, 단위, 범례, 격자선을 표시한다.