버스 운행 시간 예측 프로젝트 – EDA & 모델링

  • by

STEP ① pandas 불러오기 & 파일 불러오기

import pandas as pd

train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")
submission = pd.read_csv("sample_submission.csv")

STEP ② 운행시간을 가시화한다

import warnings
warnings.simplefilter(action="ignore', category=FutureWarning)

import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

fe = fm.FontEntry(fname="NotoSansKR-Regular.otf", name="NotoSansKR")
fm.fontManager.ttflist.insert(0, fe)
plt.rc('font', family='NotoSansKR')

train('next_arrive_time').plot(figsize=(20,10), alpha=0.4)

plt.title('버스 운행시간')
plt.xlabel('인덱스')
plt.ylabel('운행시간')

plt.show()



STEP ③ 버스 운행 시간 구간별 횟수 가시화

x = ('20미만', '20~250', '250~600', '600~2300', '2300이상')
y = (len(a),len(b),len(c),len(d),len(e))

plt.figure(dpi=150)

plt.title('버스 운행시간 구간 별 횟수')
plt.xlabel('버스 운행시간 구간')
plt.ylabel('횟수')

plt.bar(x,y)
plt.show()



STEP ④ 제주대학역 좌표 지도로 찍기

#제주대학교 좌표
locations = (train((train('next_station') == '제주대학교'))(('next_latitude', 'next_longitude')).iloc(0).values.tolist(),
             train((train('next_station') == '제주대학교') & (train('next_arrive_time') > 2300))(('next_latitude', 'next_longitude')).iloc(0).values.tolist())

# 지도 중심 좌표
center = (((train(('now_latitude', 'now_longitude')).loc(1).values(0))+(train(('now_latitude', 'now_longitude')).loc(len(train)-1).values(0)))/2, 
          ((train(('now_latitude', 'now_longitude')).loc(1).values(1))+(train(('now_latitude', 'now_longitude')).loc(len(train)-1).values(1)))/2)

# 지도 그리기
m = folium.Map(location=center, zoom_start=11, tiles="cartodbpositron")

# 점 찍기
for i, location in enumerate(locations):
    folium.Circle(
        radius=10,
        location=location,
        tooltip=i,
        fill=True
    ).add_to(m)

m




STEP ⑤ vh_id 다른 데이터 세트 및 경로 시각화

import folium

my_idx = 700

center = (((train(('now_latitude', 'now_longitude')).loc(1).values(0))+(train(('now_latitude', 'now_longitude')).loc(len(train)-1).values(0)))/2, 
          ((train(('now_latitude', 'now_longitude')).loc(1).values(1))+(train(('now_latitude', 'now_longitude')).loc(len(train)-1).values(1)))/2)

m = folium.Map(location=center, zoom_start=11)

locations = train.loc(idx(my_idx)+1:idx(my_idx+1))(('next_latitude', 'next_longitude')).values

folium.PolyLine(locations=locations).add_to(m)

m



STEP ⑥ train 데이터&test 데이터의 시간대별 데이터수 가시화

x = train('now_arrive_time').value_counts().sort_index().index
y = train('now_arrive_time').value_counts().sort_index().values

plt.figure(dpi=150)
plt.xticks(rotation=90)

plt.bar(x,y)
plt.show()



x = test('now_arrive_time').value_counts().sort_index().index
y = test('now_arrive_time').value_counts().sort_index().values

plt.figure(dpi=150)
plt.xticks(rotation=90)

plt.bar(x,y)
plt.show()



STEP ⑦ 데이터 전처리

my_list = list(train('vh_id').unique())+list(train('now_longitude').unique())+list(train('next_longitude').unique())
my_dict = {text:i for i,text in enumerate(my_list)}

def text_to_time(text:str):   
    return int(text(:2)) 

def transform_df(df:pd.DataFrame):
    df(('vh_id', 'now_longitude', 'next_longitude')) = df(('vh_id', 'now_longitude', 'next_longitude')).applymap(lambda x:my_dict(x))   
    df('now_arrive_time') = df('now_arrive_time').map(text_to_time)    
    return df

train = transform_df(train)   
test = transform_df(test)