우리 지역 버스는 얼마나 많이 탈까? - 버스 데이터 시각화

실습데이터 설명

실습 데이터의 경우 경기도 교통 정보센터에서 얻을 수 있었다.

# 모듈 로드
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
# 6개월간의 버스(수원) 데이터를 한꺼번에 로드한다. 편의상 data[0]에는 0을 추가한다. 


data = []
data.append(0)

for i in range(1,7):
        
    try:
        data.append(pd.read_csv('./data/TransitBusLinePass '+str(i)+'월.csv', encoding = 'cp949'))


    
    except UnicodeDecodeError:
        data.append(pd.read_csv('./data/TransitBusLinePass '+str(i)+'월.csv', encoding = 'utf-8'))

# 데이터를 하나로 합친다.
final_data_1 = pd.merge(data[1],data[2],how = 'outer')
final_data_2 = pd.merge(data[3],data[4],how = 'outer')
final_data_3 = pd.merge(data[5],data[6],how = 'outer')


final_data_4 = pd.merge(final_data_1,final_data_2,how = 'outer')
final_data = pd.merge(final_data_3,final_data_4,how = 'outer')

change_col = ['승차','하차','전체','승차.1','하차.1','전체.1','승차.2','하차.2','전체.2']
# for i in change_col:
# for i in change_col:


for i in change_col:
    
    final_data[i] = final_data[i].str.replace(',', '').astype(float)

print(final_data.dtypes)


지역       object
노선       object
시·종점     object
월         int64
일시       object
시간       object
승차      float64
하차      float64
전체      float64
승차.1    float64
하차.1    float64
전체.1    float64
승차.2    float64
하차.2    float64
전체.2    float64
dtype: object

여기서 시각화 과정에서 문제가 생겨 데이터 타입을 뜯어보니, 승하차 데이터가 str 데이터로 되어 있었다. int로 되어야 시각화 가능하다.

final_data = final_data[final_data['지역'] == '수원시']
final_data

#편의상 전처리 완료 데이터를 bus라고 하자

bus = final_data
# 34번의 버스 시각화
bus34 = bus[(bus['노선'] == '34') & (bus['시간'] != '주간')& (bus['시간'] != '전일')]
bus34
type(bus34['승차.2'].iloc[3])
numpy.float64
# 안깨지도록 애플고딕을 쓴다
plt.style.use(['seaborn'])

plt.rcParams['font.family'] = 'AppleGothic'
plt.rcParams['figure.figsize'] = [20, 5]
plt.xticks(rotation=45)

(array([0. , 0.2, 0.4, 0.6, 0.8, 1. ]),
 [Text(0, 0, ''),
  Text(0, 0, ''),
  Text(0, 0, ''),
  Text(0, 0, ''),
  Text(0, 0, ''),
  Text(0, 0, '')])

g = sns.catplot(x="시간", y="승차.2", hue="일시",
            col="월", aspect=.6,
            kind="swarm", data=bus34)
g.set_xticklabels( rotation=45)
<seaborn.axisgrid.FacetGrid at 0x7fdf82f2d250>

코로나와 관련이 있을까? 3월 4월에는 화실히 이용객이 많이 줄어든 모습을 보여주었다

(array([0. , 0.2, 0.4, 0.6, 0.8, 1. ]),
 [Text(0, 0, ''),
  Text(0, 0, ''),
  Text(0, 0, ''),
  Text(0, 0, ''),
  Text(0, 0, ''),
  Text(0, 0, '')])

g2 = sns.lineplot(data=bus34, x="시간", y="승차.2", hue = "일시")

확실히 평일에는 출퇴근 시간에 이용객이 많음을 알 수 있다.


720-1번 버스도 살펴보자

bus5100 = bus[(bus['노선'] == '5100') & (bus['시간'] != '주간')& (bus['시간'] != '전일')]
bus5100
지역      object
노선      object
시·종점    object
월        int64
일시      object
시간      object
승차       int64
하차       int64
전체       int64
승차.1     int64
하차.1     int64
전체.1     int64
승차.2     int64
하차.2     int64
전체.2     int64
dtype: object
/Users/junhyeoungson/opt/anaconda3/lib/python3.7/site-packages/pandas/core/frame.py:3065: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  self[k1] = value[k2]
g = sns.catplot(x="시간", y="승차.2", hue="일시",
            col="월", aspect=.6,
            kind="swarm", data=bus5100)
g.set_xticklabels( rotation=45)
<seaborn.axisgrid.FacetGrid at 0x7fdf87a3d690>

g2 = sns.lineplot(data=bus5100, x="시간", y="승차.2", hue = "일시")

g2 = sns.lineplot(data=bus5100, x="시간", y="하차.2", hue = "일시")


5100번 버스는 수원과 강남을 오가는 대표적인 출퇴근 버스다. 특이한 점은 주말에 낮에 이 버스를 이용하는 사람이 많은 것을 보아, 주말 오후에는 놀러가려고 이 버스를 타는 사람들이 많을 것으로 생각한다.

확실히 모든 버스 탑승이 06-07시부터 급격히 증가하여 09-10시 이후에는 크게 떨어지는 모습을 보인다.
이후에 17-18시에 버스 탑승자가 급상승하지만, 출근 시간대보다는 완만하게 승객이 이용하는 모습을 알 수 있었다.

IDEA 코로나 셧다운제 이후 - 이게 사실 언제 시작 됐는지 모르겠다. - 버스 이용객의 추이, 출퇴근(재택)의 변화로 인한 버스 이용객 추이까지 나타내 본다면 재밌을 것 같다.

#마지막은 버스를 간단하게 골라서 위 두 그래프를 시각화하는 함수이다.

def bus_how_many(bus_num , df):
    # 중간누계를 제외한 버스 이용객의 수를 불러온다.
    df = df[(df['노선'] == str(bus_num)) & (df['시간'] != '주간')& (df['시간'] != '전일')]
    # 그래프를 그린다.
    g = sns.catplot(x="시간", y="승차.2", hue="일시",
            col="월", aspect=.6,
            kind="swarm", data=df)
    g.set_xticklabels( rotation=45)
    plt.show(g)


    g2 = sns.lineplot(data=df, x="시간", y="하차.2", hue = "일시")


    plt.show(g2)
    





    
# 버스함수(버스번호, data)
bus_how_many(3,bus)

좋은 웹페이지 즐겨찾기