[Dacon]따릉이 이용 예측 AI모델

2021. 1. 27. 13:03Project

오늘은 데이콘에서 열린 서울시 따릉이 자전거 이용 예측 AI모델을 만들어 보려 합니다.

 

2017년 4월 1일부터, 5월 31일까지 시간별로 서울시 따릉이 대여수와 기상상황 데이터가 주어집니다.

 

각 날짜의 1시간 전의 기상상황을 가지고 1시간 후의 따릉이 대여수를 예측해보는 문제입니다.

 

해당 데이콘 주소는 아래와 같고, 여기서 train데이터와 test데이터를 얻을 수 있습니다.

https://dacon.io/competitions/open/235576/overview/

 

[공공] 서울시 따릉이 자전거 이용 예측 AI모델

출처 : DACON - Data Science Competition

dacon.io

 

이번에도, 저는 JupyterNotebook을 사용하여 프로젝트를 진행하였으며, 제 코드 작성과 제출물은 제 github따로 올려놓을 예정이고, 링크또한 아래에 작성해 두겠습니다.

 

 

먼저, 필요한 라이브러리를 불러오고,

모델을 학습할 파일들을 불러왔습니다.

 

이번에는 탐색적 자료분석을 통해 데이터들을 살펴보겠습니다.

trian데이터의 상위5개 데이터를 살펴본 결과 모두 수치형으로 되어 있는것을 확인할 수 있습니다.

머신러닝을 사용할때, 데이터는 모두 수치형이어야 하며 만약 문자열이라면 모두 수치화를 시켜주어야 합니다.

전에 했던, 타이타닉 프로젝트의 데이터의 경우 문자형의 수치화작업이 필요했는데, 이번 데이터는 수치화 작업이 필요가 없다는 것을 확인할 수 있었습니다.

 

각 컬럼의 수는 위와 같습니다.

따라서 저는 위의 변수들에 맞추어 test데이터의 count를 예측하는 모델을 만들 예정입니다.

 

이번에는 결측값을 확인해 보았습니다.

수치형 자료 뿐만 아니라, 머신러닝을 작동시키기 위해서는 결측값 또한 제거해주어야 합니다.

위의 데이터의 정보를 확인해보면, id는 1459인데 hour_bef_temperature는 1457등 2개의 데이터가 결측값으로 되어 있고 다른 컬럼 또한 id의 개수와 맞지 않는 경우가 있습니다.

따라서 데이터 전처리가 필요하다는 사실을 인지하고 있어야 합니다.

 

test데이터를 확인해 본 결과, test데이터도 마찬가지인것을 확인할 수 있습니다.

 

이번에는 train데이터를 좀 더 자세히 살펴보았습니다.

위 내용들은 평균값, 중앙값, 최대,최소값들을 보여주는 지표입니다. 각 컬럼의 값들을 확인할 수 있습니다.

 

이번에는 시간을 기준으로 대여량을 확인해 보았습니다.

x축은 시간, y축은 대여량으로 plot을 만들어 보았습니다.

위의 그림을 보아, 8시, 17시에 대여량이 갑자기 증가하는것을 보고 저는 출퇴근 시간이나, 등하교 시간에 대여량이 증가할 것이라는 정보를 추측하였습니다. 

따라서 저는 hour(시간)이 유의미한 정보라 판단하고, 이후 분석할때 hour를 활용할 계획입니다.

 

위의 그래프를 좀더 시각화여 보겠습니다.

 위와 같이 작성하여 나온 그래프입니다.

하나씩 설명해보면, 'go-'의 경우 (g:초록색, o:점으로 표현, -:실선) 으로 표현된것입니다.

 

 그리고 위 코드의 주석처리 내용처럼, 그래프의 제목, 각 축의 내용, 강조 보조선, 폰트 크기 처리와 작성등의 코드를 확인할 수 있습니다.

 

어느정도 데이터의 분석이 끝났다면 이제 데이터 모델링을 위한 데이터 전처리 과정을 진행해보려 합니다.

먼저, 저는 현재 count를 구하는데 있어 변수들이 너무 많다고 생각하였습니다.

 따라서, 저는 여러 변수(컬럼)간의 상관계수를 파악해서 서로 유의미한 관계에 있는 변수들을 골라서 사용할 예정입니다. 특히 hour(변수)를 기준으로 상관관계가 높은 유의미한 변수를 찾아 분석할 예정입니다.

 

상관계수란, 두개의 변수가 같이 일어나는 강도를 나타내는 수치이며 범위는 -1과 +1사이 입니다.

보통 상관계수가 0.4이상이면 두개의 변수가 상관성이 있다고 판단합니다.

 

먼저 상관계수를 구하는대 필요한 라이브러리를 불러오고, 각 변수들간의 상관관계를 보여주는 그림을 작성하였습니다.

위의 그림이, hour변수와 다른 변수들 간의 상관계수 들을 보여준 그림입니다.

위 그림으로, temperature가 0.41 windspeed 0.46으로 높아 이 두가지의 변수를 선택하여 분석을 할 계획입니다.

 

이제 이 변수들에 대한 값들의 전처리를 진행할 예정입니다.

먼저, temperature변수들에 대한 값들을 확인해 보겠습니다.

두개의 값들이 결측값이 있다는 것을 확인했습니다.

 

값들을 좀더 자세히 살펴보면,

시간을 제외한 모든 값들이 결측값 처리가 되어 있는 것을 확인할 수 있습니다.

hour_bef_temperature값의 결측값을 처리해주어야 하는데, 저는 평균값으로 대체할 것입니다.

 

주어진 0시라는 시간을 가지고 hour가 0 인 데이터들의 평균값을 구해 그 값들을 hour_bef_temperature의 넣어줄 것입니다. 다른 결측값 또한 18시를 기준으로 같은 방법으로 결측값을 넣어줄 계획입니다.

 

각 시간대별로(hour) 평균 hour_bef_temperature를 확인해 보았습니다.

따라서 위 정보를 바탕으로, NaN된 값들을 시간에 따른 평균값으로 대체할것입니다.

 

 

위와 같이 작성하고, 값들을 다시 확인해보면 NaN이었던 값들이 잘 저장된것을 확인할 수 있습니다.

 

같은 방법으로 hour_bef_windspeed 변수의 결측값들을 아래와 같이 지정해주면,

 

 

위와 같이 우리가 사용할 hour, hour_bef_temperature, hour_bef_windspeed변수들의 결측값들이 사라진것을 확인할 수 있습니다.

 

test값들을 확인해본 결과 사용할 변수에 결측값들이 있는것을 확인할 수 있습니다.

이도 train값들의 결측값을 처리한것과 같이 같은 방법으로 결측값을 처리해주면 됩니다.

 

 

모든 데이터 전처리 과정이 끝난후, 변수 선택과 모델 구축을 해보려 합니다.

먼저 사용할 변수들을 features로 넣고,

x_train을 train[features]로 설정하여 train의 설명변수로 지정합니다.

y_train은 train[counts]로 설정하여 train의 종속변수로 지정하고,

x_test는 test값의 설명변수로 지정합니다.

 

그리고 만든 x_train, y_train의 값으로 예측석을 높이는 모델링을 만들고 이를 x_test에 적용하여 최대한 정확성이 높은 결과물을 제출할 예정입니다.

 

저는 3가지 모델을 만들어 보려 합니다.


랜덤포레스트 기법을 사용하여,

숲에 있는 나무의 수를 100개로 한 model100,

나무의 수는 100개로 하고 나무의 최대 깊이를 5로 한 model100_5

숲에 있는 나무를 200으로 한 model200을 만들었습니다.

 

작성한 모델로 x_train과 y_trian을 모델에 넣어 모델링을 한 결과 

나무를 200으로 한 model200이 가장 정확성이 높다는 결과가 나왔습니다.

 

그래서 model200을 선택하여 x_test를 분석하여 결과값을 내보겠습니다.

일단 model200이 정말 제일 정확도가 높은지 점수를 통해 확인해보고 싶서 위와 같이 3개의 결과값들을 만들었고 csv파일로 제출물을 만들어 보았습니다.

 

제출해본 결과, model200을 사용했던 파일이 가장 점수가 높았고 아래와 같은 등수가 나왔습니다.

460개의 팀중 120등의 순위가 나왔습니다.

설명변수를 저는 3개만 사용하여 분석을 시행하였는데 좀더 다양한 변수를 추가하거나 제거한다면 더 높은 점수를 얻을수 있을것이라고 생각합니다.

 

 

제가 작성한 코드와 파일은 모두 제 깃허브 계정에 올려놓겠습니다.

https://github.com/sungmin808/kaggle/tree/master/%EB%94%B0%EB%A6%89%EC%9D%B4%20%EB%8C%80%EC%97%AC%20%EC%98%88%EC%B8%A1

 

sungmin808/kaggle

kaggle competition data. Contribute to sungmin808/kaggle development by creating an account on GitHub.

github.com

 

'Project' 카테고리의 다른 글

[엔지니어링산업 설계대전]  (0) 2021.06.20
[Dacon]영화 관객수 예측 모델  (0) 2021.01.28
[Kaggle]타이타닉 생존자 예측 프로젝트  (1) 2021.01.24
[Kaggle]Covid in 한국  (0) 2021.01.21