Coding Is My Life

코딩은 인생

파이썬 머신러닝

[머신러닝][코로나 확진자 예측하기]

산기대 컴공 2021. 2. 9. 22:53
728x90

일단 데이터수집은 해당 사이트에서 수집하였다.

https://www.kaggle.com/sudalairajkumar/novel-corona-virus-2019-dataset

 

Novel Corona Virus 2019 Dataset

Day level information on covid-19 affected cases

www.kaggle.com

그리고 사용된 csv파일은

time_series_covid_19_confirmed.csv 파일을 사용하였다.

 

import pandas as pd
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
data2 = pd.read_csv('/content/drive/MyDrive/코로나 데이터/time_series_covid_19_confirmed.csv')
data2.head()

일단 데이터를 판다스를 이용하여 불러왔다.

상위 5개 데이터를 보면 다음과 같다.

여기서 우리가 사용할 데이터는 Korea, South자료이므로 데이터 클리닝을 진행하였다.

 

import numpy as np
col = data2.columns
data = []
for i in range(len(data2)):
  line = data2.iloc[i]['Country/Region']
  if line == 'Korea, South':
    data = data2.iloc[i]
    break
data = pd.DataFrame(data)
data = np.array(data)
data.shape
data = data.reshape(data.shape[0],data.shape[1])
data = pd.DataFrame(data)
data['idx'] = col 
data = data.set_index('idx')
data.head(10)

이렇게 데이터 클리닝을 하고 상위 10개 자료를 보면 다음과 같다.

여기서 우리가 사용할 데이터는 4번째 행 데이터부터 이므로 또 데이터 클리닝을 해준다.

그리고 인덱스는 필요없고 값들만 필요하기 때문에 이것 또한 데이터 클리닝 해준다.

그리고 누적확진자로 데이터가 되어 있으므로 반복문을 통해 일별 데이터로 바꾸어 주는 작업을 해준다.

set_data = data.iloc[4:]
temp = []
for i in range(len(set_data)):
  temp.append(set_data.iloc[i][0])
a = temp
dp = [0 for _ in range(len(a))]
dp[0] = a[0]
for i in range(1,len(a)):
  dp[i] = a[i]-a[i-1]
dp[:10]

상위 5개 데이터를 보면 다음과 같다.

[1, 0, 1, 0, 1, 1, 0, 0, 0, 7]

 

이제 일별 확진자 그래프를 나타내 보겠다.

fig2 = plt.figure(figsize = (16,9))
ax2 = fig2.add_subplot()
ax2.plot(dp)

다음과 같이 그래프로 나타낼 수 있다.

 

이제부터 데이터를 클리닝 했으니 본격적으로 머신러닝을 해보겠다.

skearn에 Linear Regression을 이용하여 예측하였다.

예측 방법은 과거 14일 데이터를 feature로 삼고 과거 14일 데이터의 다음날을 label로 삼아서 모델을 만들었다.

 

일단 feature데이터과 label데이터를 나누었다.

def make_dataset(data,window_size):
  feature_list = []
  label_list = []
  for i in range(len(data)-window_size):
    feature_list.append(np.array(data[i:i+window_size]))
    label_list.append(np.array(data[i+window_size]))
  return np.array(feature_list),np.array(label_list)
feature,label = make_dataset(dp,14)
print(feature.shape,label.shape)
x_train,x_test,y_train,y_test = train_test_split(feature,label,test_size = 0.2,random_state = 10)
print(x_train.shape,y_train.shape)
print(x_train)

다음과 같이 함수를 만들어서 feature데이터와label데이터를 만들과 train_test_split 함수를 이용하여 훈련 데이터와 테스트 데이터를 나누었다.

그리고 훈련데이터의 크기와 데이터가 잘 들어왔는지 x_train을 출력해서 확인해 보았다.

결과는 다음과 같다.

그리고 데이터를 훈련시키고 예측값과 실제 값하고 비교를 해보았다.

from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(x_train,y_train)
pred = model.predict(x_test)
from sklearn.metrics import mean_squared_error
pred

RMSE(평균제곱오차)는 86.43083798338742이라는 값이 나왔다.

mean_squared_error(y_test,pred)**0.5

실제 데이터와 예측 데이터를 그래프로 나타내면 다음과 같다.

fig  = plt.figure(figsize = (16,9))
ax = fig.add_subplot()
ax.plot(pred,label = 'prediction')
ax.plot(y_test,label = 'real')
ax.legend()

얼추 그래프상으로는 추세는 따라가는 것을 볼 수 있다. 랜덤으로 테스트케이를 뽑아서 그런지 그래프가 중구남방이다.(train_test_split사용) 그냥 전날 50일 정도 잘라서 비교했으면 좀더 정갈하게 그래프가 그려졌을 것 같은데 조금 아쉽다.

다른 모델로 하면 어떤 결과가 나올 지 기대가 된다.

그리고 다른 feature값도 줘보면 더 좋은 결과가 나올 수 있을 것이다.

728x90