codestates / codestates/ds-blog

[조보현][beginner to beginner] 서울시 코로나19 발생동향 분석 튜토리얼

Open
#127 2 comments 0 reactions 0 assignees View on GitHub
documentation tech
Dominant language
No language data
Stars
2
Forks
4
PR merge metrics
No merged PRs in 30d

Description

사설)
늘 정리 글만 쓰다가, 이대로 가면 추석 내내 정리만 하겠구나 싶어서 진행하는 글!
나중에 코린일 때와 조금 자란 코린이 일 때 얼마나 다르게 분석하는지 시험해보려고요.
### 언젠가!
![image](https://user-images.githubusercontent.com/70356749/94239756-3d0c4380-ff4d-11ea-815a-663d0a4c1988.png)

-------------------------

# 이 글은 코딩에 갓 입문한 분과 수다를 떨듯이 튜토리얼이 진행됩니다. 🥰

> 자, 잔잔한 노래 하나 틀어놓으시고요. 그동안 고생한 자신에게 힘냈다고 합시다.

>[ 제가 추천하는 음악 ](https://youtu.be/cGGEpOk3Q94)
![image](https://user-images.githubusercontent.com/70356749/94242972-c32a8900-ff51-11ea-9d12-f2f665c97b56.png)

# 목차
[1. 데이터 준비](#데이터-준비)
[2. 데이터 정리](#데이터-정리)
[2.1 확진일 : 날짜 변환](#확진일)
[3. 기본 시각화](#기본-시각화)
[3.1 선그래프 응용](#선그래프-응용)

## 데이터 준비
시작하기 전에 사설로 우리 이제 막 기본 공부하고 이리저리 **데이터 찾아다니고**,
정작 궁금한 페이지가 있어도 **csv 파일 없어서 엑셀로 옮기고** 얼마나 답답해요...

### 그래서 준비했어요.

우리가 사용할 **'코로나19 발생 동향 분석'** 데이터는 홈페이지에 있습니다.
## [출처](http://www.seoul.go.kr/coronaV/coronaStatus.do)

우리는 **크롤링**이라는걸 할거에요.
> [크롤링이란?](https://namu.wiki/w/크롤링)

자, 준비물은 따로 필요 없어요. 원래 연습하던 그곳에서 코드만 입력하면 돼요.

```python
# 필요한 라이브러리 소환!
import pandas as pd
import numpy as np

# 크롤링으로 가져올 url 주소를 입력
test_url = "http://www.seoul.go.kr/coronaV/coronaStatus.do"

# pandas의 read_html 기능을 통해 변수에 지정
# read_html : 사이트 내에 있는 html 태그를 불러오는 기능
df = pd.read_html(test_url)

#제대로 불러왔는지 기본적인 eda 진행
len(df)
df[0].T
df.shape
df.head()
df.tail()
#등등..

# 파일명 지정
file_name = f"seoul_covid_19.csv"

#csv 파일저장
df.to_csv(file_name, index = False)

#csv가 제대로 저장되었는지 확인
pd.read_csv(file_name)

```
+)
> [Pandas란?](https://en.wikipedia.org/wiki/Pandas_(software))
> [pandas의 read_html 설명서](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_html.html)
> [NumPy란?](https://namu.wiki/w/NumPy)
### 이제 해당하는 사이트에 파일 항목을 확인해 주시면 파일을 다운로드할 수 있을 거예요!

![image](https://user-images.githubusercontent.com/70356749/94241820-21ef0300-ff50-11ea-8347-fe77974af8ea.png)

받으셨나요?
잘했어요!
![image](https://user-images.githubusercontent.com/70356749/94242037-6ed2d980-ff50-11ea-9f30-546a0ef77668.png)

이제 우리는 csv를 만들 방법을 알았으니 평소처럼 사용하면 되요!

```python
# 방법 1: 구글 코랩 파일 업로드 패키지
from google.colab import files
uploaded = files.upload()

# 방법 2: GUI (Graphical User Interface) 사용
df = pd.read.csv('adult (6).data') # after upload
```
## 데이터 정리
> 만약 불러왔는데 데이터가 이렇다면?

```python
df['연번'] = df['연번'].apply(lambda x: x.split('')[0])
df.head()
```

> ## 확진일
```python
# 확진일의 빈도수 확인
df["확진일"].value_counts()
# 확진일의 데이터타입 확인
df["확진일"].dtype
# 확진일의 형태 확인 > 날짜 형태가 아니라 문자형태로 저장되어있음 9/29 이런식
df["확진일"].head(1)
```
> 우리는 데이터 타입을 날짜 형태로 변환하는 과정이 필요합니다.
> 판다스의 to_datetime 을 사용해서 날짜 타입으로 변경할 수 있습니다.

```python

# 연도확인을 위해 2020년을 날짜에 추가
# "-" 문자로 날짜를 연결
df["확진일자"] = pd.to_datetime("2020-"+ df["확진일"].str.replace(".", "-"))

# 변경이 원활하게 되었는지 확인
df[["확진일", "확진일자"]].head(2)
```

```python
# 필요 날짜로 추출해서 사용가능
#월 추출
df["월"] = df["확진일자"].dt.month
# 주 추출
df["주"] = df["확진일자"].dt.week
# 일 추출
df["일"] = df["확진일자"].dt.day
# 월(문자)
df['확진일자_month_name'] = df['확진일자'].dt.month_name()

#확인
df[["확진일", "확진일자", "월", "주",'확진일자_month_name']].head()
```

> 시간과 관련된 tip

접기/펼치기

```python
# object 타입을 datetime64[ns] 타입으로 변경
df['확진일자'] = pd.to_datetime(df['확진일자'], format='%Y-%m-%d %H:%M:%S', errors='raise')

df['확진일자_date'] = df['확진일자'].dt.date # YYYY-MM-DD(문자)
df['확진일자_year'] = df['확진일자'].dt.year # 연(4자리숫자)
df['확진일자_month'] = df['확진일자'].dt.month # 월(숫자)
df['확진일자_month_name'] = df['확진일자'].dt.month_name() # 월(문자)

df['확진일자_day'] = df['확진일자'].dt.day # 일(숫자)
df['확진일자_time'] = df['확진일자'].dt.time # HH:MM:SS(문자)
df['확진일자_hour'] = df['확진일자'].dt.hour # 시(숫자)
df['확진일자_minute'] = df['확진일자'].dt.minute # 분(숫자)
df['확진일자_second'] = df['확진일자'].dt.second # 초(숫자)

df['확진일자_quarter'] = df['확진일자'].dt.quarter # 분기(숫자)
df['확진일자_weekday_name'] = df['확진일자'].dt.weekday_name # 요일이름(문자) (=day_name())
df['확진일자_weekday'] = df['확진일자'].dt.weekday # 요일숫자(0-월, 1-화) (=dayofweek)
df['확진일자_weekofyear'] = df['확진일자'].dt.weekofyear # 연 기준 몇주째(숫자) (=week)
df['확진일자_dayofyear'] = df['확진일자'].dt.dayofyear # 연 기준 몇일째(숫자)
df['확진일자_days_in_month'] = df['확진일자'].dt.days_in_month # 월 일수(숫자) (=daysinmonth)

df['확진일자_is_leap_year'] = df['확진일자'].dt.is_leap_year # 윤년 여부
df['확진일자_is_month_start'] = df['확진일자'].dt.is_month_start # 월 시작일 여부
df['확진일자_is_month_end'] = df['확진일자'].dt.is_month_end # 월 마지막일 여부
df['확진일자_is_quarter_start'] = df['확진일자'].dt.is_quarter_start # 분기 시작일 여부
df['확진일자_is_quarter_end'] = df['확진일자'].dt.is_quarter_end # 분기 마지막일 여부
df['확진일자_is_year_start'] = df['확진일자'].dt.is_year_start # 연 시작일 여부
df['확진일자_is_year_end'] = df['확진일자'].dt.is_year_end # 연 마지막일 여부

```

+)
> [datetime 설명서](https://docs.python.org/ko/3/library/datetime.html#strftime-and-strptime-behavior)

> [pandas.to_datetime 설명서](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.to_datetime.html)

> 확진일자 데이터 응용

```python
# 월일만 표기되도록 "월일" 칼럼 생성
df["월일"] = df["확진일자"].astype(str).map(lambda x : x[-5:])
day_count = df["월일"].value_counts().sort_index()

# describe 를 통해 일자별 확진자수 요약
day_count.describe()

# 확진자가 가장 많았던 날을 확인
day_count[day_count == day_count.max()]

# 확진자가 가장 많았던 날의 발생이력을 확인
df[df["월일"] == "08-29"].head()
# 08-29은 변경가능
```

## 기본 시각화

```python
import matplotlib.pyplot as plt
# matplotlib.pyplot 을 통해 한글폰트를 설정
# 안할경우 타이틀에서 한글 폰트가 깨질 수 있음
# 자신의 OS에서 갖고있는 폰트로 지정
# plt.rc("font", family="Malgun Gothic") / 윈도우용
# plt.rc("font", family="AppleGothic")/ mac용
plt.rc("font", family="AppleGothic")
# plt.rc("axes", unicode_minus=False) / 시각화된 그래프에서 -값 깨지는 것 방지
plt.rc("axes", unicode_minus=False)
pd.Series([1, 3, 5, -7, 9]).plot.bar(title="한글제목")
```

```python
# .bar가 없으면 선그래프
pd.Series([1, 3, 5, -7, 9]).plot

```

> tip : 시각화 선명하게 설정
```python
# retina 디스플레이가 지원되는 환경에서 시각화의 폰트가 좀 더 선명해지는 효과
from IPython.display import set_matplotlib_formats
set_matplotlib_formats("retina")

```

> ## 선그래프 응용
```python
# 확진일자를 활용한 선그래프
df["확진일자"].value_counts().sort_index().plot(figsize=(15, 4))
plt.axhline(30, color="#f56a79", linestyle="-")
```

+)
> [pandas_Visualization](https://pandas.pydata.org/pandas-docs/stable/user_guide/visualization.html)
> [matplotlib.pyplot 사용설명서](https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.html)

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.