초봉5센티미터

TIL 12. 서울시 코로나 발생동향 분석 본문

교육/멋쟁이사자처럼 AI School 7기

TIL 12. 서울시 코로나 발생동향 분석

삶은돼지고기 2022. 10. 6. 19:50
728x90
  • 빈도수 구하기
    • 한 개의 변수 : series.value_counts()
    • 두 개의 변수 : pd.crosstab()
  • 파일 불러오기
    • to_csv("파일명", index=False) : csv 파일로 저장하기
    • read_csv("파일명") : csv 파일 불러오기
  • Pandas의 DataFrame과 Series의 이해
    • Series : 1차원 벡터구조
    • DataFrame : 2차원 행렬구조
  • 중복확인: duplicated()
  • 중복제거: drop_duplicates()
#csv 파일이 같은 경로에 있는지 확인
from glob import glob
# 라이브러리 로드
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

#한글 폰트 사용을 위해 불러오기
import koreanize_matplotlib

 

 

서울시에서 조사한 코로나19 데이터로 실습을 진행하도록 하겠습니다.

코로나 데이터 불러오기 

 

df_01 = pd.read_csv("seoul-covid19-2021-12-18.csv")
df_02 = pd.read_csv("seoul-covid19-2021-12-26.csv")

 

 

총 두개의 데이터를 불러왔습니다. head()를 통해 데이터 일부를 살펴보면 같은 열의 값을 가지는것을

알 수 있습니다. 

concat 으로 두개의 데이터프레임을 합치도록 하겠습니다.

axis = 0이면 행방향으로 합쳐지게 됩니다. (밑으로)

axis = 1이면 열방향으로 합쳐지게 됩니다. (옆으로)

 

 

위의 두개의 데이터는 같은 열의 값을 가지고 있음으로 같은 열을 기준으로 행방향(밑으로) 합쳐줘야 됩니다.

df = pd.concat([df_01,df_02], axis = 0)

 

합친 데이터를 확인해보면 잘 합쳐진것을 확인할 수 있습니다.

df.head(2)

          연번	환자  	확진일	  거주지	 여행력 접촉력	퇴원현황
0	200000	561465	2021-12-18	중구	-	기타 확진자 접촉	NaN
1	199999	562278	2021-12-18	구로구	-	구로구 소재 요양시설 관련('21.11.)	NaN

 

 

합쳐진 DataFrame에 중복된 데이터가 있을 수 있음으로 중복제거를 하겠습니다.

  • 중복확인: duplicated()
  • 중복제거: drop_duplicates()
df[df.duplicated()]

 

 

데이터프레임을 살펴보면 왼쪽에 0,1,2,3와 같은 숫자가 인덱스로 설정되어 있습니다.

전체 데이터중 "연번"이 중복값이 없는 unique값이기 때문에 "연번"을 인덱스로 설정하도록 하겠습니다.

 

# 연번의 유니크개수 확인 nunique() 
df["연번"].nunique()

218646

# 데이터프레임 행과 열 확인 shape
df.shape
(218646, 7)

 

 

위와같이 연번의 유니크값의 개수는 218646개로 전체 데이터 프레임의 행의 개수와 같음을 알 수 있습니다.

따라서 중복값이 없다고 판단됩니다.

# set_index 를 통해 인덱스 값을 변경합니다.
df = df.set_index("연번")

 

 

다음은 인덱스(연번)값 기준으로 데이터를 정렬해보도록 하겠습니다. 

# sort_index 를 통해 인덱스값 기준으로 정렬합니다.
# 기존의 인덱스를 연번을 바꿔주기
df.sort_index(ascending = False)

 

날짜 데이터 타입 변경하기

  • 확진일 Series 형태로 가져오기

"확진일"을 살펴보면 dtype: object로 되어있습니다. 

이 날짜 데이터를 datetime형태로 변경해보도록 하겠습니다.

# pd.to_datetime 을 통한 데이터 타입 변경하기
df["확진일"] = pd.to_datetime(df["확진일"])

# df["확진일"]을 head() 로 일부만 가져와서 타입이  datetime64 형태로 변경되었는지 확인하기
df["확진일"].head()

---------------------#출력값---------------------

연번
200000   2021-12-18
199999   2021-12-18
199998   2021-12-18
199997   2021-12-18
199996   2021-12-18
Name: 확진일, dtype: datetime64[ns]

 

 

dtype이 datetime으로 변경된 것을 알 수 있습니다.

바뀐 확진일 컬럼을 이용하여 연, 월, 일, 요일등의 파생변수를 만들어 보도록 하겠습니다.

 

# 연도 파생변수 만들기
# df["연도"]
df["연도"] = df["확진일"].dt.year

# 월(month), 일(day), 요일(dayofweek) 만들기
df["월"]= df["확진일"].dt.month
df["일"]= df["확진일"].dt.day
df["요일"]= df["확진일"].dt.dayofweek
df.head(1)

 

 

생성된 연도와 월 컬럼을 이용하여 연도-월 형태의 파생변수를 만들어보도록 하겠습니다.

# astype(str) 을 통해 수치 데이터를 문자 데이터로 변환하고 문자열 연결하기

df["연도월"] = df["연도"].astype(str) +"-"+ df["월"].astype(str)


----------------출력값----------------
연번
200000    2021-12
199999    2021-12
199998    2021-12
199997    2021-12
199996    2021-12
# 문자열 슬라이싱으로도 만들 수 있습니다.
df["연도월"] = df["확진일"].astype(str).str[:7]

 

 

이제는 map을 활용해 요일별 한글을 만들어 보도록 하겠습니다.

dayofweek = "월화수목금토일"
dayofweek[1]

def find_dayofweek(day_no):
    dayofweek = "월화수목금토일"
    return dayofweek[day_no]
    
# 함수가 잘 만들어졌는지 확인하기
find_dayofweek(1)
---출력----
'화'

# map을 사용해서 요일 컬럼을 요일명으로 변환하고 "요일명"이라는 새로운 컬럼에 저장하기
df["요일명"] = df["요일"].map(find_dayofweek)
Comments