-
서울 열린데이터광장을 통해 버스 정류장 합정역의 승하차 승객 수를 분석해보자~Data Analysis/LifeStyles 2021. 8. 8. 16:02
합정은 내가 지난 2년 간 매일 갔었던 내 출근지다. 합정은 강남, 영의도, 판교처럼 오피스 밀집 지역이 아니기 때문에 엄청나게 많은 사람이 출근하는 곳은 아니지만 그래도 항상 사람이 많다고 느껴져서 이번 분석을 진행하기로 결심했다. 지난 7월 한 달간 도대체 얼마나 많은 사람들이 합정역 정류장에서 버스를 승차했고, 하차했는지 데이터를 통해 알아보도록 하겠다. 데이터는 아래 링크와 같이 서울 열린데이터광장 사이트에서 가져왔다.
http://data.seoul.go.kr/dataList/OA-12912/S/1/datasetView.do
1. 7월 한달 합정역 버스 정류장 승하차 데이터 가져오기
import pandas as pd import requests key='~~~' data_=[] for date in range(20210701,20210732): a=f'http://openapi.seoul.go.kr:8088/{key}/json/CardBusStatisticsServiceNew/1/1/{date}/' ab=requests.get(url).json() total=ab['CardBusStatisticsServiceNew']['list_total_count'] total=round(total+1000,-3) for i in range(1000, total,1000): url=f'http://openapi.seoul.go.kr:8088/{key}/json/CardBusStatisticsServiceNew/{i-999}/{i}/{date}/' res=requests.get(url).json() data=res['CardBusStatisticsServiceNew']['row'] data_.extend(data) df=pd.DataFrame(data_) hj=df[df['BUS_STA_NM'].str.contains('합정')]
위 코드가 문제 없이 돌아간다면 아래와 같이 날짜 별로 합정역에 지나가는 버스 데이터, 그리고 버스별 승하차 승객 수를 확인할 수 있다.
2. 7월 버스별 합정역 평균 승하차 승객 수
import numpy as np import matplotlib.pyplot as plt hj=df[df['BUS_STA_NM'].str.contains('합정')] alight=pd.DataFrame(hj.groupby(['BUS_ROUTE_NO']).mean()['ALIGHT_PASGR_NUM']) ride=pd.DataFrame(hj.groupby(['BUS_ROUTE_NO']).mean()['RIDE_PASGR_NUM']) alight=alight.sort_values(by='ALIGHT_PASGR_NUM',ascending=False) ride=ride.sort_values(by='RIDE_PASGR_NUM',ascending=False) df_=pd.merge(left=ride, right=alight,how='inner',left_on=ride.index,right_on=alight.index) df_.columns=['Bus','승차','하차'] df_['승차']=round(df_['승차'],2) df_['하차']=round(df_['하차'],2) plt.rcParams["font.family"] = 'Malgun Gothic' plt.rcParams["font.size"] = 15 fig, ax = plt.subplots(figsize=(30, 16)) x = np.arange(len(df_.index)) width = 0.2 rects1 = ax.bar(x-width, df_['승차'], 0.4, label='비정규직 비중') rects2 = ax.bar(x+width, df_['하차'], 0.4, label='해외 근무 직원 비중') ax.legend(fontsize=25) ax.set_xticks(x) ax.set_xticklabels(df_['Bus'],fontsize=30) ax.set_title('7월 평균 승하차 승객 수',fontsize=40) def autolabel(rects): """Attach a text label above each bar in *rects*, displaying its height.""" for rect in rects: height = rect.get_height() ax.annotate(height, xy=(rect.get_x()+width, height), xytext=(0, 3), # 3 points vertical offset textcoords="offset points", ha='center', va='bottom',size=25) autolabel(rects1) autolabel(rects2) fig.tight_layout() plt.show()
아래와 같이 버스별 합정역 승하차 승객 수 데이터를 추출할 수 있다. 확실히 마포16 마을 버스를 사람들이 가장 많이 타고 다니는 점을 확인할 수 있고, N62/N26과 같은 심야 버스의 평균 승하차 승객 수가 가장 낮다.
3. 7월 날짜별 합정역 버스 정류장 총 승하차 승객 수
import plotly.graph_objects as go hj_date=hj.groupby(['USE_DT']).sum()[['RIDE_PASGR_NUM','ALIGHT_PASGR_NUM']] hj_date.columns=['승차','하차'] fig = go.Figure() fig.add_trace(go.Scatter(x=hj_date.index, y=hj_date['승차'], mode='lines', name='lines')) fig.add_trace(go.Scatter(x=hj_date.index, y=hj_date['하차'], mode='lines', name='lines')) fig.update_layout(title='7월 날짜별 총 승하차 승객 수', xaxis_title='Date', yaxis_title='승객 수')
확실히 주말에 승객 수가 급감하는 점을 볼 수 있다.
4. 7월 요일별 합정역 버스 정류장 총 승하차 승객 수
from datetime import datetime as dt hj['weekday']=hj['USE_DT'].apply(lambda x: dt.strptime(x,'%Y%m%d').weekday()) weeknum=hj.groupby(['weekday']).mean()[['RIDE_PASGR_NUM','ALIGHT_PASGR_NUM']] weeknum['요일']=['월','화','수','목','금','토','일'] weeknum.columns=['승차','하차','요일'] weeknum['승차']=weeknum['승차'].astype(int) weeknum['하차']=weeknum['하차'].astype(int) fig, ax = plt.subplots(figsize=(30, 16)) x = np.arange(len(weeknum.index)) width = 0.2 rects1 = ax.bar(x-width, weeknum['승차'], 0.4, label='요일별 평균 승차 승객 수') rects2 = ax.bar(x+width, weeknum['하차'], 0.4, label='요일별 평균 하차 승객 수') ax.legend(fontsize=25) ax.set_xticks(x) ax.set_xticklabels(weeknum['요일'],fontsize=30) ax.set_title('7월 요일별 평균 승하차 승객 수',fontsize=40) def autolabel(rects): """Attach a text label above each bar in *rects*, displaying its height.""" for rect in rects: height = rect.get_height() ax.annotate(height, xy=(rect.get_x()+width, height), xytext=(0, 3), # 3 points vertical offset textcoords="offset points", ha='center', va='bottom',size=25) autolabel(rects1) autolabel(rects2) fig.tight_layout() plt.show()
마지막으로 요일별 합정역 총 승하차 승객 수를 알아봤다.생각보다 목요일과 금요일에 합정역에 하차하는 승객 수가 가장 많은 점을 볼 수 있다. 워낙 합정에 맛집이 많다보니 목요일과 금요일에 약속을 많이 잡다 보니 이런 결과가 나오지 않나 예측해본다.
'Data Analysis > LifeStyles' 카테고리의 다른 글
Google Trends에서 3대 운동(스쿼트, 벤치프레스, 데드리프트) Youtube 검색량 비교 With Python (0) 2021.08.19 Youtube API에서 3대 운동 검색 결과 가져오기 #1 - 벤치프레스, 데드리프트, 스쿼트 (0) 2021.08.14 전국 프랜차이즈 빵집(파리바게뜨, 뚜레쥬르) 지점 위치 시각화 (0) 2021.07.08 2021 NBA 파이널 - 야니스 아데토쿤보 없는 밀워키 벅스의 희망 크리스 미들턴(Kris Middleton) (0) 2021.07.06 카카오 지도에서 오레노라멘 맛집 리뷰 파이썬으로 크롤링 & 분석 해보자 (0) 2021.07.02