Pandas를 활용한
코로나19 데이터 분석
대한민국과 미국의 인구 대비 누적 확진자 비율 비교
학습목표
데이터 확인
CSV 파일을 불러오고 head()와 info()를 이용하여 데이터의 구조를 확인한다.
데이터 선택
열 이름과 조건식을 이용하여 분석에 필요한 행과 열을 선택한다.
비율 계산
지역별 인구 규모를 고려하여 인구 대비 누적 확진자 비율을 계산한다.
시각화와 해석
대한민국과 미국의 누적 확진자 비율을 선 그래프로 표현하고 결과를 해석한다.
주요 학습내용
선수학습 확인
리스트, 튜플, 딕셔너리, DataFrame의 특징을 확인한다.
프로젝트 개요
분석 질문과 비교 지표를 설정한다.
데이터 확인 및 정제
CSV 파일을 읽고 필요한 행과 열을 선택한다.
데이터 시각화
인구 대비 누적 확진자 비율을 계산하여 선 그래프로 표현한다.
실습 구성 실습 1: 데이터 다운로드 및 확인 실습 2: 국가별 데이터 비교 및 시각화
선수학습 확인
파이썬 자료형과 Pandas 자료구조 복습
파이썬 자료형과 DataFrame
리스트
scores = [88, 92, 75]
여러 값을 순서대로 저장하며, 값을 추가하거나 수정할 수 있다.
튜플
student = ("김하늘", 20)여러 값을 순서대로 저장하지만, 생성한 뒤에는 값을 바꿀 수 없다.
딕셔너리
course = {
"week": 5
}키와 값을 한 쌍으로 저장하며, 키를 이용하여 값을 찾는다.
DataFrame
df = pd.DataFrame(data)
여러 데이터를 행과 열로 구성된 표 형태로 다룬다.
이번 실습에서는 리스트와 딕셔너리의 구조가 DataFrame의 열 선택 및 생성 과정에 다시 사용된다.
확인문제
course["week"]의 실행 결과를 예상한다.scores[1]의 실행 결과를 예상한다.student[0] = "김민준"을 실행하면 어떻게 되는지 설명한다.# 다음 코드를 읽고 질문에 답한다.
scores = [88, 92, 75]
student = ("김하늘", 20)
course = {
"name": "데이터 분석",
"week": 5
}
개별 확인 3분 · 옆 학생과 답 비교 2분
프로젝트 개요
분석 질문과 비교 지표 설정
분석 과제
안나는 대한민국에서 미국 하와이로 이사했다. 한국에 있는 친구를 하와이로 초대하기 전에 두 지역의 코로나19 상황을 비교하려고 한다.
최종 분석 질문
해당 기간의 하와이와 대한민국 중 인구 대비 누적 확진자 비율은 어느 지역이 더 높았는가?
Week 5
국가 단위 데이터를 이용하여 대한민국과 미국을 비교한다.
Week 6
하와이주 데이터를 추가하여 대한민국과 하와이를 비교한다.
미국 전체의 결과는 하와이주의 상황을 그대로 나타내지 않는다. 이번 주 분석은 최종 분석을 위한 준비 단계에 해당한다.
인구 규모를 고려한 비교
대한민국과 미국은 전체 인구가 다르므로 누적 확진자 수만으로 두 지역을 직접 비교하기 어렵다.
계산 결과가 10이라면 누적 확진자 수가 전체 인구의 약 10%에 해당한다는 뜻이다.
해석 시 유의사항
- 이번 분석에서는 일일 신규 확진자가 아니라 누적 확진자 수를 사용한다.
- 검사 규모와 보고 방식은 국가마다 다를 수 있다.
- 누적 확진자 비율만으로 코로나19 상황 전체를 판단할 수는 없다.
데이터 분석 절차
문제 정의
대한민국과 미국의 누적 확진자 비율 변화를 비교한다.
데이터 수집
지역, 날짜, 누적 확진자 수, 인구가 포함된 자료를 준비한다.
데이터 정제
필요한 열과 행을 선택하고 날짜 자료형을 정리한다.
시각화 및 해석
선 그래프를 작성하고 지역별 변화와 분석의 한계를 설명한다.
이번 실습에서는 문제 정의 → 데이터 수집 → 데이터 정제 → 시각화 및 해석의 순서에 따라 분석을 진행한다.
데이터 다운로드 및 확인
CSV 파일 내려받기 · 데이터 구조 확인 · 분석 변수 선택
CSV 다운로드 링크 찾기
웹 브라우저에서 Our World in Data COVID-19 Data Explorer에 접속한다.
화면 왼쪽 위의 Download this dataset을 클릭한다.
Download this dataset을 누르면 CSV 링크가 있는 다운로드 페이지로 이동한다. 파일은 다음 단계에서 코드로 내려받는다.
CSV 링크 주소 복사
Download our compact dataset (CSV) 위에서 마우스 오른쪽 버튼을 누른다.
링크 주소 복사를 선택한다.
복사한 주소를 다음 슬라이드의 url 변수에 붙여 넣는다.
파일은 브라우저에서 직접 저장하지 않는다. 다음 슬라이드의 코드가 복사한 주소에서 약 174MB의 CSV를 내려받아 지정한 이름으로 저장한다.
코드로 CSV 다운로드 및 불러오기
실행 순서
- 복사한 링크 주소를
url에 붙여 넣는다. - 첫 번째 셀을 최초 1회만 실행한다.
owid-covid-data.csv가 현재 폴더에 생성된다.
주의 · 다운로드가 끝난 뒤에는 두 번째 셀만 실행한다. 첫 번째 셀을 다시 실행하면 큰 CSV 파일을 다시 내려받는다.
최초 1회만 실행 · CSV 파일 내려받기
# Pandas 라이브러리 불러오기 import pandas as pd import urllib.request # CSV 파일 내려받기 및 파일 이름 지정 url = "https://catalog.ourworldindata.org/garden/covid/latest/compact/compact.csv" urllib.request.urlretrieve(url, "owid-covid-data.csv")
이후에는 이 셀만 실행 · CSV 파일 불러오기
# 이름을 바꾼 CSV 파일 불러오기 raw_df = pd.read_csv( "owid-covid-data.csv" ) raw_df
read_csv()는 CSV 파일을 읽어 DataFrame으로 변환한다.
내려받은 데이터 구조 확인
head()
코드로 내려받아 불러온 DataFrame의 위쪽 5개 행을 출력한다.
raw_df.head()
- 열 이름과 값의 형태를 확인한다.
- 한 행이 무엇을 의미하는지 확인한다.
- 날짜와 숫자의 저장 형태를 살펴본다.
info()
내려받은 DataFrame의 전체 구조를 요약하여 출력한다.
raw_df.info()
- 전체 행과 열의 개수를 확인한다.
- 열별 결측값 여부를 확인한다.
- 각 열의 자료형을 확인한다.
분석에 필요한 열 선택
| 열 이름 | 내용 |
|---|---|
| code | 국가 코드 |
| country | 국가 이름 |
| date | 날짜 |
| total_cases | 누적 확진자 수 |
| population | 전체 인구 |
코드로 불러온 raw_df에서 열 이름을 리스트로 만든 뒤, 필요한 열만 선택한다. .copy()로 독립된 DataFrame을 만들어 이후 날짜 열을 안전하게 수정한다.
# 필요한 열 이름 selected_columns = [ "code", "country", "date", "total_cases", "population" ] # 필요한 열만 선택 revised_df = raw_df[ selected_columns ].copy() revised_df.head()
실습 1: 데이터 다운로드 및 확인
실습 내용
- Our World in Data의 CSV 링크 주소를 복사한다.
- 코드의
url에 주소를 넣어 CSV를 내려받고owid-covid-data.csv로 저장한다. - 다운로드 후에는 두 번째 셀로 CSV 파일을 DataFrame에 불러온다.
head()로 상위 5개 행을 확인한다.info()로 행과 열의 개수 및 자료형을 확인한다.- 분석에 필요한 5개 열을 선택한다.
추가 실습
revised_df["country"].unique()를 실행하여 데이터에 포함된 국가를 확인한다.
결과 확인 1
DataFrame에 5개 열만 남아 있는가?
결과 확인 2date 열의 현재 자료형은 무엇인가?
결과 확인 3
한 행은 특정 지역의 특정 날짜에 대한 정보를 나타내는가?
실습 시간 25분 · 실행 결과는 다음 단계에서 계속 사용한다.
국가별 데이터 비교
행 선택 · 날짜 색인 설정 · 비율 계산 · 선 그래프 작성
조건에 따른 행 선택
country 열의 값이 지정한 국가 이름과 같은 행만 선택한다.
조건식의 결과
revised_df["country"] == "South Korea"
각 행에 대하여 조건을 만족하면 True, 만족하지 않으면 False를 반환한다.
# 대한민국 데이터 kor_df = revised_df[ revised_df["country"] == "South Korea" ].copy() # 미국 데이터 usa_df = revised_df[ revised_df["country"] == "United States" ].copy() kor_df.head() usa_df.head()
날짜 자료형 변환 및 색인 설정
날짜 자료형 변환
문자열로 저장된 날짜를 Pandas의 날짜 자료형으로 변환한다.
kor_df["date"] = pd.to_datetime( kor_df["date"] ) usa_df["date"] = pd.to_datetime( usa_df["date"] )
날짜를 색인으로 설정
날짜를 행의 이름표로 사용하여 같은 날짜의 값을 맞춘다.
kor_df.set_index( "date", inplace=True ) usa_df.set_index( "date", inplace=True )
누적 확진자 비율 계산 및 시각화
# 인구 대비 누적 확진자 비율 kor_df["case_rate"] = ( kor_df["total_cases"] / kor_df["population"] * 100 ) usa_df["case_rate"] = ( usa_df["total_cases"] / usa_df["population"] * 100 ) # 비교용 DataFrame comparison_df = pd.DataFrame({ "South Korea": kor_df["case_rate"], "United States": usa_df["case_rate"] }) comparison_df.plot.line( figsize=(10, 5), rot=45 )
그래프를 읽기 쉽게 만드는 요소
제목
그래프가 무엇을 비교하는지 한눈에 알려 준다.
x축 · y축
x축은 날짜, y축은 비교하는 값과 단위를 표시한다.
범례
선의 색이 어떤 국가를 뜻하는지 알려 준다.
격자선
선의 높이와 값의 변화를 더 쉽게 읽게 해 준다.
그래프 제목과 축 이름 넣기
그래프를 그린 뒤 ax에 설정을 추가하면, 보는 사람이 값의 의미를 쉽게 이해할 수 있다.
코드의 핵심
set_title(): 그래프 제목set_xlabel(),set_ylabel(): 축 이름과 단위legend(): 선과 국가 이름 연결grid(): 값 읽기를 돕는 격자선
열 이름이 범례에 자동으로 표시되지만, legend(title="국가")로 범례 제목을 더할 수 있다.
import matplotlib.pyplot as plt ax = comparison_df.plot.line( figsize=(10, 5), rot=45 ) ax.set_title("COVID-19 Case Rate: South Korea vs United States") ax.set_xlabel("Date") ax.set_ylabel("Cumulative Case Rate (%)") ax.legend(title="Country") ax.grid(True, alpha=0.3) plt.tight_layout() plt.show()
실습 2: 국가별 데이터 비교 및 결과 해석
실습 내용
- 대한민국과 미국의 행을 각각 선택한다.
- 날짜 자료형을 변환하고 날짜를 색인으로 설정한다.
- 인구 대비 누적 확진자 비율을 계산한다.
- 두 지역의 비율을 하나의 선 그래프로 표현한다.
추가 실습
comparison_df.loc["2022-01-01":]을 이용하여 2022년 이후의 변화만 그래프로 표현한다.
결과 작성
그래프에서 확인한 사실 2가지를 작성한다.
분석의 한계
누적 확진자 비율만으로 판단하기 어려운 점을 1가지 작성한다.
다음 주 학습내용
하와이주 데이터를 추가하고 결측값, 날짜 정렬, 색인 자료형 불일치 문제를 처리한다.
실습 시간 30분
과제 제출 안내
오늘 실습 2에서 그린 그래프를 업로드하세요.
대한민국과 미국의 인구 대비 누적 확진자 비율을 비교한 선 그래프가 보이도록 제출합니다.
이번 주차 퀴즈를 풉니다.
LXP에서 5주차 퀴즈를 완료해 주세요.
다음 주 수업일
전날 밤(23:59)까지
제출 전 확인 · 그래프의 제목, x축·y축 라벨, 범례가 모두 표시되는지 확인한다.