Pandas를 활용한
코로나19 데이터 분석 ②
한국과 하와이 데이터 결합 및 시각화
학습목표
날짜 데이터 정리
문자열로 저장된 날짜를 날짜 자료형으로 변환하고 시간순으로 정렬한다.
데이터 결합
서로 다른 데이터의 색인과 단위를 맞추어 하나의 DataFrame으로 구성한다.
시각화 선택
분석 내용에 따라 선 그래프, 막대그래프, 히스토그램을 선택한다.
결과 해석
그래프에서 확인한 변화와 비교 결과를 문장으로 설명한다.
주요 학습내용
지난 시간 확인
한국 데이터와 열 이름을 다시 확인한다.
하와이 데이터 정리
결측값과 자료형을 확인하고 날짜를 정리한다.
데이터 결합
비교 단위와 색인을 맞추어 두 데이터를 합친다.
시각화 실습
분석 내용에 맞는 그래프를 작성하고 해석한다.
실습 구성 실습 1: 하와이 데이터 정리 및 결합 실습 2: 그래프 작성 및 결과 해석
분석 과제와 데이터 준비
지난 시간의 분석 결과 · 열 이름 확인 · 하와이 데이터 내려받기
지난 시간의 분석 결과
한국과 미국의 인구 대비 확진율을 선 그래프로 비교하였다.
미국 전체의 결과만으로 하와이주의 상황을 판단하기는 어렵다. 이번 시간에는 하와이주 데이터를 별도로 추가한다.
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를 사용한다.
분석 과제
한국과 하와이의 코로나19 확산 추이는 어떻게 달랐을까?
비교 기준
- 같은 날짜의 값을 비교한다.
- 전체 인구 대비 확진율(%)로 비교한다.
- 누적 확진자와 신규 확진자를 구분한다.
- 그래프와 함께 해석 문장을 작성한다.
데이터 출처와 범위
Our World in Data
- 한국을 포함한 국가별 자료
- 날짜별 누적 확진자와 신규 확진자
- 인구 자료 포함
Week 5에서 내려받은 owid-covid-data.csv를 계속 사용한다.
미국 CDC 공개 데이터
- 미국 주·관할지역별 코로나19 자료
- 하와이주 코드
HI사용 - 1주일 단위로 집계된 보관 자료
해당 자료는 보관 자료이며 더 이상 갱신되지 않는다. 수업에서는 확산 기간의 자료 분석에 사용한다.
하와이 데이터 다운로드 ① 조회 화면
페이지를 연 뒤 다음 순서로 선택한다.
- Data 탭
- Actions 메뉴
- Query data
자료명에 Weekly가 있는지 확인한다. 한 행은 한 지역의 1주일 자료이다.
하와이 데이터 다운로드 ② 지역 필터
하와이 데이터 다운로드 ③ CSV 내보내기
하와이 데이터 다운로드 ④ 파일 저장
하와이 데이터 다운로드 ⑤ Colab에 파일 올리기
하와이 데이터 정리 및 결합
결측값 확인 · 날짜 변환 · 전체 중 비율(%) 계산 · 색인 맞추기
하와이 데이터 불러오기
먼저 확인할 내용
- 한 행이 나타내는 내용
- 날짜와 확진자 수가 저장된 열
- 각 열의 자료형
- 결측값의 존재 여부
자료형 확인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()
분석에 필요한 열 선택
| 열 이름 | 내용 | 활용 |
|---|---|---|
| end_date | 집계 종료일(수요일) | 시간순 정렬 |
| tot_cases | 누적 확진자 수 | 누적 추이 |
| new_cases | 7일간 신규 확진자 합계 | 주간 변화 |
확진자 수의 쉼표를 제거해 숫자 열로 저장한다. 이후 계산에는 변환한 열을 사용한다.
# 코드 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)
날짜 자료형 변환 및 정렬
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
날짜 색인 설정
날짜를 색인으로 설정
# 코드 Week6-5: 날짜 색인 설정 # 날짜를 행의 색인으로 지정한다. hawaii_df = hawaii_df.set_index( "date" ) # 색인이 날짜 자료형인지 확인한다. hawaii_df.index.dtype
날짜를 행의 이름표로 사용하면 같은 날짜의 값을 맞추기 쉽다.
날짜 색인을 쓰는 이유
- DataFrame의 열 하나를 선택하면 날짜 색인이 붙은 Series가 된다.
pd.concat()으로 결합할 때 같은 날짜의 값끼리 맞춰진다.- 그래프를 그리면 날짜 색인이 가로축이 된다.
인구 대비 확진율 계산
인구 대비 확진율(%)
확진자 수 ÷ 전체 인구 수 × 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
한국 데이터 정리
사용할 열
countrydatetotal_casesnew_casespopulation
확인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
)
한국과 하와이 데이터 결합
pd.concat()은 색인을 기준으로 여러 Series를 나란히 결합한다.
누적값은 같은 날짜끼리 비교한다. 하와이는 매주 수요일의 누적값이며, 신규 확진자는 별도로 집계 기간을 맞춰야 한다.
# 코드 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()
결합 결과를 간단한 그래프로 확인
공통 날짜의 확진율을 먼저 그려 데이터 결합이 잘 되었는지 확인한다.
빠르게 확인할 점
- 공통 날짜가 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()
비교 그래프에 필요한 이름표
제목
비교 대상과 지표를 함께 쓴다.
가로축 · 세로축
날짜와 확진율의 단위(%)를 밝힌다.
범례
각 선이 나타내는 지역을 구분한다.
격자선
같은 시점의 높이와 변화를 읽기 쉽게 한다.
그래프에 제목·축 이름·범례 넣기
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()
마무리 실습: 한국과 하와이 비교
실습 과제
- 두 지역의 날짜 색인과 확진율(%)을 확인한다.
- 공통 날짜의 누적 확진율 선 그래프를 그린다.
- 제목, 축 이름, 단위, 범례, 격자선을 표시한다.


