Blair  - Soul Eater [데이터_분석] 코로나 데이터 분석 (P1)

• program/앨리스_python

[데이터_분석] 코로나 데이터 분석 (P1)

oujin 2022. 1. 26. 14:45
728x90

프로젝트 목차

1. 데이터 읽기

코로나 데이터를 불러오고 dataframe 구조를 확인

1-1. 데이터 불러오기

2. 데이터 정제

비어 있는 데이터 또는 쓸모 없는 데이터를 삭제

2-1. 비어있는 column 지우기

3. 데이터 시각화

각 변수 별로 축적인 정제 또는 feature engineering 과정을 거치고 시각화를 통하여 데이터의 특성 파악

3-1. 확진일 데이터 전처리 하기

3-2. 월별 확진자 수 출력 (확진자수가 가장 많았던 달 찾기)

3-3. 8월 일별 확진자 수 출력 (특정 달의 일별 데이터 출력)

3-4. 지역별 확진자 수 출력 (확진자 수 가 가장 많은 지역 찾기)

3-5. 8월달 지역별 확진자 수 출력 (특정 달의 지역별 확진자 수 출력)

3-6. 월별 관악구 확진 자 수 찾기 (특정 지역의 확진자 수 찾기)

3-7. 서울 지역에서 확지자를 지도에 출력 (지도에 데이터 출력하기)

데이터 출처: www.data.go.kr

1. 데이터 읽기

필요한 패키지 설치 및 import 한 후 pandas를 사용하여 데이터를 읽고 어떠한 데이터가 저장되어 있는지 확인합니다

1-1. 데이터 불러오기

import numpy as np #()

Import pandas as pd #()

Import matplotlib.pyplot as plt #()

Import seaborn as sns #()

#pd.read_csv를 이용하여 datagrame형태로 읽어옵니다

corona_all = pd.read_csv("./data/서울시 코로나19 확진자 현황.csv")

#.head를 이용하여 상위 5개 데이터를 추출하여 데이터의 형태를 확인합니다

corona_all.head

#.info()를 이용하여 dataframe 정보를 요약하여 출력합니다

corona_all.info()

2. 데이터 정제

데이터를 읽고 확인했다면 결측값(missing data), 이상치(outlier)를 처리하는 데이터 정제과정을 수행하여 봅시다

2-1. 비어있는 column 지우기

corona_all.info()코드를 통하여 국적, 환자정보,조치사항 에 해당하는 데이터가 존재하지 않는 것을 알 수 있습니다

dataframe.drop()를 사용하여 불필요한 국적, 환자정보,조치사항의 column데이터를 삭제하고 이 dataframe을 corona_del_col에 저장하자

#.drop 함수를 사용하여 국적, 환자정보,조치사항 column 데이터를 삭제하자

corona_del_col = corona_all.drop(columns = ['국적', '환자정보'.'조치사항'])

#정제 처리된 dtaframe 정보를 출력합니다

corona_del_col.info()

3. 데이터 시각화

데이터 정제를 완료한 corona_del_col 데이터를 바탕을로 각 column의 변수별로 어떠한 데이터 분포를 하고 있는지 시각화하여 알아봅시다

3-1. 확진일 데이터 전처리 하기

확진일 데이터를 간단히 출력해 보면 월,일 형태의 날짜 형식임을 알 수 있습니다

월별,일별 분석을 위해서는 문자열 형식의 데이터를 나누어 숫자 형 데이터로 변환해 보겠습니다

corona_del_col['확진일']

확진일 데이터를 month, day 데이터로 나누기

확진일에 저장된 문자열 데이터를 나누어 month, day column에 int64형태로 저장해 봅시다

#dataframe에 추가하기 전, 임시로 저장해 둘 list를 선언합니다

month = []

day = []

For data in corona_del_col['확진일']:

#split 함수를 사용하여 월,일을 나누어 list에 저장합니다.

month.append(data.split('.')[0]) #'확진일'데이터가 10.21. 이렇게 .으로 구분되어있기 때문에

day.append(data.split('.')[1])

#corona_del_col에 'month' , 'day' column을 생성하여 동시에 list에 임시 저장된 데이터를 입력한다

corona_del_col['month'] = month

corona_del_col['day'] = day

#int64형태로 저장한다

corona_del_col['month'].astype('int64')

Corona_del_col['day'].astype(int64')

3-2. 월별 확진자 수 출력

나누어진 month의 데이터를 바탕으로 달별 확진자 수를 막대그래프로 출력해 보겠습니다

#그래프에서 x축의 순서를 정리하기 위하여 order list를 생성합니다

order = []

#1월~10월까지의 자료만 있음

for i in range(1,11):

order.append(str(i))

order

#그래프의 사이즈를 조절합니다

plt.figure(figsize = (10,5))

#seaborn의 countplot 함수를 사용하여 출력합니다

sns.set(style = "darkgrid")

ax = sns.countplot(x = "month" , data = corona_del_col, palette = "Set2", order = order)

#series의 plot 함수를 사용한 출력방법도 있습니다

corona_del_col['month'].value_counts().plot(kind = 'bar')

#value_counts()는 각 데이터를 세어서 내림차순으로 정리하는 함수이다

corona_del_col['month'].value

3-3. 8월달 일별 확진자 수 출력

월별 확진자 수를 출력해 보면 알 수 있듯이 8월에 확진자 수가 가장 많았습니다

이번엔 8월 동안 확진자 수가 어떻게 늘었는지 일별 확진자 수를 막대그래프로 출력해 봅시다

#그래프에서 x축의 순서를 정리하기 위해서 order list를 생성합니다

order2 = []

For i in range(1,32):

order2.append(str(i))

order2

#seaborn의 countplot 함수를 사용하여 출력합니다

plt.figure(figsize=(20,10))

sns.set(style="darkgrid")

ax = sns.countplot(x="day', data = corona_del_col[corona_del_col['month'] == '8'], palette = "Set2")

#8월 평균 일별 확진자 수를 구하기 (8월 총 확진자/31)

corona_del_col[corona_del_col['month'] == '8']['day'].count()/31

corona_del_col[corona_del_col['month'] == '8']['day'].value_counts().mean()

#8월 평균 확진자 수를 구해서 m_e_ave 변수에 저장하자.

#float 형 상수값으로 저장하기.

m_e_ave = corona_del_col[corona_del_col['month'] == '8']['day'].value_counts().mean()

print(m_e_ave)

3-4.지역별 확진자 수 출력

#지역 데이터를 간단히 출력해 보면 --구 형태의 문자열 데이터임을 알 수 있습니다

corona_del_col['지역']

#지역별로 확진자가 얼마나 있는지 막대그래프로 출력

import matplotlib.font_manager as fm

font_dirs = ['/usr/share/fonts/truetype/nanum', ]

font_files = fm.findSystemFonts(fontpaths = font_dirs)

for font_file in font_files:

fm.fontManager.addfont(font_file)

plt.figure(figsize = (20,10))

#한글 출력을 위해서 폰트 옵션을 설정합니다

sns.set(font = "NanumBarunGothic",

rc = {"axes.unicode_minus":False},

Style = 'darkgrid')

ax = sns.countplot(x = "지역", data = corona_del_col, palette = "Set2")

지역 이상치 데이터 처리

위의 출력된 데이터를 보면 종랑구라는 잘못된 데이터와 한국 이라는 지역과는 맞지 않는 데이터가 있음을 알 수 있다

기존 지역 데이터 특성에 맞도록 종랑구->중랑구, 한국->기타 로 데이터를 변경하자

#replace 함수를 사용하여 해당 데이터를 변경합니다

#이상차가 처리된 데이터이기에 새로운 Dataframe으로 저장한다

corona_out_region = corona_del_col.replace({'종랑구' : '중랑구', '한국' : '기타'})

#이상차가 처리된 데이터를 다시 출력해 봅시다

plt.figure(figsize = (20,10))

sns.set(font = "NanumBarunGothic",

rc = {"axes.unicode_minus":False},

style = 'darkgrid')

ax = sns.countplot(x = "지역", data = corona_out_region, palette = "Set2")

3-5. 8월달 지역별 확진자 수 출력

감염자가 많았던 8월에는 지역별로 확진가 어떻게 분포되어 있는지 막대그래프로 출력해 봅시다

#논리연산을 이용한 조건을 다음과 같이 사용하면 해당 조건에 맞는 데이터를 출력할 수 있다

corona_out_region[corona_del_col['month'] == '8']

#그래프를 출력합니다

plt.figure(figsize = (20,10))

sns.set(font = "NamumBarunGothic",

rc = {"axes.unicode_minus":False},

style = 'darkgrid')

ax = sns.countplot(x = "지역", data = corona_out_region[corona_del_col['month'] == '8'], palete = "Set2")

3-6. 월별 관악구 확지자 수 출력

이번에는 확진자가 가장 많았던 관악구 내의 확진자 수가 월별로 어떻게 증가했는지 그 분포를 막대그래프로 출력해 봅시다

#해당 colunm을 지정하여 series 형태로 출력할 수 있습니다

corona_out_region['month'][corona_out_region['지역'] == '관악구']

#그래프를 출력합니다

plt.figure(figsize = (10,5))

sns.set(style = "darkgrid")

ax = sns.countplot(x = "month", data = coona_out_region[corona_out_region['지역'] == '관악구'], palette = "Set2", order = order)

3.7. 서울 지역에서 확진자를 지도에 출력

지도를 출력하기 위한 라이브러리로 folium을 사용하자

#지도 출력을 위한 라이브러리 folium을 import합니다

import folium

#Map함수를 사용하여 지도를 출력합니다

map_osm = folium.Map(location = [37.529622, 126.984307], zoom_start = 11)

map_osm

지역마다 지도에 정보를 출력하기 위해서는 각 지역의 좌표정보가 필요합니다

이를 해결하기 위해서 서울시 행정구역 시군 정보 데이터를 불러와 사용합니다

데이터 출처: https://data.seoul.go.kr

#CRS에 저장합니다

CRS=pd.read_csv("./data/서울시 행정구역 시군구 정보 (좌표계_ WGS1984).csv")

#Dataframe을 출력해 봅니다

CRS

저장된 데이터에서 지역명이 서울의 중심지 중구인 데이터를 뽑아봅시다

CRS[CRS['시군구명_한글'] == '중구']

이제 for문을 사용하여 지역마다 확진자를 원형마커를 사용하여 지도에 출력해 봅시다

#corona_out_region의 지역에는 '00구' 이외로 '타시도', '기타' 에 해당하는 데이터가 존재 합니다

#위 데이터에 해당하는 위도, 경도를 찾을 수 없기에 삭제하여 corona_seoul로 저장합니다

corona_seoul = corona_out_region.drop(corona_out_region[corona_out_region['지역'] =='타시도'].index)

corona_seoul = corona_seoul.drop(corona_out_region[corona_out_region['지역'] == '기타'].index)

#서울 중심지 중구를 가운데 좌표로 잡아 지도를 출력합니다

map_osm = folium.Map(location = [37.529622, 126.984307], zoom_start = 11)

#지역 정보를 set 함수를 사용하여 25개 고유의 지역을 뽑아냅니다

for region in set(corona_seoul['지역']):

 

#해당 지역의 데이터 개수를 count에 저장합니다

count = len(corona_seoul[corona_seoul['지역'] == region])

# 해당 지역의 데이터를 CRS에서 뽑아냅니다

CRS_region = CRS[CRS['시군구명_한글'] ==region]

#CircleMarker를 사용하여 지역마다 원형마커를 생성합니다

marker = folium.CircleMarker([CRS_region['위도'], CRS_region['경도']] # 위치

radius = count/10 +10, #범위

color = '#3186cc', #선색상

fill_color = '#3186cc', #면색상

popup = ' '.join((region, str(count), '명'))) #팝업설정

# 생성한 원형마커를 지도에 추가합니다

marker.add_to(map_osm)

map_osm

#6월에 확진자가 가장 많이 나온 지역을 구하세요

top = corona_out_region[corona_del_col['month'] =='6']['지역'].value_counts()

top.index[0]

#6월에 확진자가 가장 많이 나온 지역을 top_s_r 변수에 문자형으로 저장하기

top_s_r = top.index[0]

728x90