프로젝트 목차
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]
'• program > 앨리스_python' 카테고리의 다른 글
[2022 AI SW 온라인 코딩입문훈련 교육과정] (0) | 2022.11.13 |
---|---|
[데이터_분석] 자동차 리콜 데이터 분석 (P3) (0) | 2022.08.17 |
[데이터_분석] 지하철 승하차 인원 분석 (P2) (0) | 2022.08.17 |