제주도 교통량 예측 문제
제주도 교통량 예측 문제¶
날씨 및 유동인구에 따른 교통량 추이
import pandas as pd
Attention
제주빅데이터센터 데이터를 활용하여 효율적인 교통량 측정을 위한 날씨/유동인구 활용 교통량 추이 데이터 제공
거주인구, 근무인구, 방문인구는 해당 인구수의 일별 유동인구 수 합계
유동인구는 01~24시 해당 시간 정각 측정 인구 (머문 시간(분)/60분)
교통량 (대), 평균 속도 (km), 평균 소요 시간 (초), 평균 기온 (°C), 일일강수량 (mm), 평균 풍속(m/s)
Question 1
데이터를 로드하고 각데이터의 상위 3개 값을 출력하라
train_X = pd.read_csv("https://raw.githubusercontent.com/Datamanim/jeju/main/Jeju_trainX.csv",encoding='euc-kr')
train_y= pd.read_csv("https://raw.githubusercontent.com/Datamanim/jeju/main/Jeju_trainy.csv",encoding='euc-kr')
test_X= pd.read_csv("https://raw.githubusercontent.com/Datamanim/jeju/main/Jeju_testX.csv",encoding='euc-kr')
sub= pd.read_csv("https://raw.githubusercontent.com/Datamanim/jeju/main/subExample.csv",encoding='euc-kr')
print('train_X')
display(train_X.head(3))
print()
print('train_y')
display(train_y.head(3))
print()
print('test_X')
display(test_X.head(3))
print()
print('sub')
display(sub.head(3))
train_X
id | 일자 | 시도명 | 읍면동명 | 거주인구 | 근무인구 | 방문인구 | 총 유동인구 | 평균 속도 | 평균 소요 시간 | 평균 기온 | 일강수량 | 평균 풍속 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 2018-01-01 | 서귀포시 | 남원읍 | 291408.897 | 18744.131 | 219588.857 | 529741.884 | 53.000 | 40.571 | 2.35 | 0.0 | 3.325 |
1 | 1 | 2018-01-01 | 제주시 | 노형동 | 1215420.248 | 74964.858 | 445735.329 | 1736120.435 | 38.563 | 30.655 | -2.30 | 0.0 | 1.100 |
2 | 2 | 2018-01-01 | 제주시 | 구좌읍 | 276220.023 | 17542.105 | 248104.122 | 541866.250 | 53.188 | 40.719 | 5.90 | 0.0 | 4.100 |
train_y
id | 교통량 | |
---|---|---|
0 | 0 | 76.200 |
1 | 1 | 1291.184 |
2 | 2 | 0.000 |
test_X
id | 일자 | 시도명 | 읍면동명 | 거주인구 | 근무인구 | 방문인구 | 총 유동인구 | 평균 속도 | 평균 소요 시간 | 평균 기온 | 일강수량 | 평균 풍속 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 22448 | 2018-01-01 | 제주시 | 도두동 | 32249.987 | 3418.266 | 102709.092 | 138377.345 | 39.556 | 29.167 | 5.0 | 0.0 | 2.5 |
1 | 22449 | 2018-01-01 | 제주시 | 외도동 | 213500.997 | 10341.172 | 112692.789 | 336534.958 | 32.900 | 30.900 | 5.0 | 0.0 | 2.5 |
2 | 22450 | 2018-01-01 | 제주시 | 이도2동 | 1212382.218 | 96920.834 | 541194.481 | 1850497.533 | 29.538 | 35.692 | 2.9 | 0.0 | 2.4 |
sub
id | 교통량 | |
---|---|---|
0 | 22448 | 0 |
1 | 22449 | 0 |
2 | 22450 | 0 |
Question 2
각데이터의 결측치, 데이터타입, 연속형변수의 분포를 파악하라
info() , insull().sum(), describe() 함수 이용
Question 3
LabelEncoder를 이용하여 trainset의 읍면동, 시도명을 fit하고 train_X,test_X를 각각 transform 하여 pre_train, pre_test 변수에 저장하고 상위 5개값을 출력하라
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
le.fit(train_X['읍면동명'] )
train_X['읍면동명'] = le.transform(train_X['읍면동명'])
test_X['읍면동명'] = le.transform(test_X['읍면동명'])
train_X['시도명'] = train_X['시도명'].map(lambda x: 1 if x=='서귀포시' else 0)
test_X['시도명'] = test_X['시도명'].map(lambda x: 1 if x=='서귀포시' else 0)
train_X[['시도명','읍면동명']].head(6)
시도명 | 읍면동명 | |
---|---|---|
0 | 1 | 2 |
1 | 0 | 3 |
2 | 0 | 1 |
3 | 0 | 24 |
4 | 0 | 0 |
5 | 0 | 25 |
Question 4
‘id’ 컬럼을 제거하라. ‘일자’를 년도,월,일,요일(숫자)로 각각 분리하여 컬럼을 형성하라. 그후 ‘일자’컬럼을 제거하라
def datePreprocessing(df2):
df =df2.copy()
df['일자'] = pd.to_datetime(df['일자'])
df['년도'] = df['일자'].dt.year
df['월'] = df['일자'].dt.month
df['일'] = df['일자'].dt.day
df['weekend'] = df['일자'].dt.weekday
return df
pre_train = datePreprocessing(train_X).drop(['일자','id'],axis=1)
pre_test = datePreprocessing(test_X).drop(['일자','id'],axis=1)
pre_train.head(3)
시도명 | 읍면동명 | 거주인구 | 근무인구 | 방문인구 | 총 유동인구 | 평균 속도 | 평균 소요 시간 | 평균 기온 | 일강수량 | 평균 풍속 | 년도 | 월 | 일 | weekend | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 291408.897 | 18744.131 | 219588.857 | 529741.884 | 53.000 | 40.571 | 2.35 | 0.0 | 3.325 | 2018 | 1 | 1 | 0 |
1 | 0 | 3 | 1215420.248 | 74964.858 | 445735.329 | 1736120.435 | 38.563 | 30.655 | -2.30 | 0.0 | 1.100 | 2018 | 1 | 1 | 0 |
2 | 0 | 1 | 276220.023 | 17542.105 | 248104.122 | 541866.250 | 53.188 | 40.719 | 5.90 | 0.0 | 4.100 | 2018 | 1 | 1 | 0 |
Question 5
인구 관련 컬럼(거주인구,근무인구,방문인구,총 유동인구를 정규화하라. 정규화시 trainset에 대한 fit을 test셋에 적용하라.
from sklearn.preprocessing import StandardScaler
sc =StandardScaler()
def pre2(df,sc =None):
df2 = df.copy()
if sc ==None:
sc = StandardScaler()
sc.fit(df2[['거주인구','근무인구','방문인구','총 유동인구']])
df2[['거주인구','근무인구','방문인구','총 유동인구']] = sc.transform(df2[['거주인구','근무인구','방문인구','총 유동인구']])
return df2,sc
pre_train , sc = pre2(pre_train)
pre_test , sc2 = pre2(pre_test,sc)
pre_train.head(3)
시도명 | 읍면동명 | 거주인구 | 근무인구 | 방문인구 | 총 유동인구 | 평균 속도 | 평균 소요 시간 | 평균 기온 | 일강수량 | 평균 풍속 | 년도 | 월 | 일 | weekend | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | -0.087699 | -0.418008 | 0.166825 | -0.042833 | 53.000 | 40.571 | 2.35 | 0.0 | 3.325 | 2018 | 1 | 1 | 0 |
1 | 0 | 3 | 3.011526 | 0.959452 | 1.775292 | 2.573146 | 38.563 | 30.655 | -2.30 | 0.0 | 1.100 | 2018 | 1 | 1 | 0 |
2 | 0 | 1 | -0.138644 | -0.447459 | 0.369639 | -0.016541 | 53.188 | 40.719 | 5.90 | 0.0 | 4.100 | 2018 | 1 | 1 | 0 |
Question 6
적당한 회귀 모델을 선정하고, 학습 및 mean_squared_error 값을 통해 모델을 검증하라
from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor(random_state=24)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(pre_train, train_y['교통량'], test_size=0.15, random_state=42)
rf.fit(X_train,y_train)
pred = rf.predict(X_test)
from sklearn.metrics import mean_squared_error
mse = mean_squared_error(pred,y_test)
mse
7439.3574478406335
Question 7
모델을 통해 테스트셋의 예측값을 추출하고 제출파일을 생성 및 저장하라.
sub['교통량'] =rf.predict(pre_test)
sub.to_csv('./submission.csv')
sub.head(3)
id | 교통량 | |
---|---|---|
0 | 22448 | 1429.54278 |
1 | 22449 | 1097.88923 |
2 | 22450 | 329.95733 |
Tip
저장이 잘됐다면 저장된 테스트 셋의 mse값을 아래의 코드를 통해 확인해볼수 있습니다.
def FinalMseScore():
import pandas as pd
y_true = pd.read_csv("https://raw.githubusercontent.com/Datamanim/jeju/main/Jeju_testy.csv",encoding='euc-kr')
sub = pd.read_csv('./submission.csv',index_col='id')
pred = sub.iloc[:,-1].values
from sklearn.metrics import mean_squared_error
mse = mean_squared_error(pred,y_true['교통량'])
print('submission mse score : ',mse)
return mse
final_mse = FinalMseScore()
submission mse score : 6882.18429905874
Important
모델 최적화 보다는 제출을 위한 최소한의 코드를 사용했습니다. 점수 올리기 위한 팁있으면 댓글로 알려주세요 ㅎㅎ 피드백 대환영