데이터 수집
서울시 지하철역 위치정보
https://observablehq.com/@taekie/seoul_subway_station_coordinate
서울시 지하철역별 시간대별 승하차 인원 정보
https://data.seoul.go.kr/dataList/OA-12252/S/1/datasetView.do
데이터 전처리 진행하기
버스데이터를 한 번 처리하고 나니 지하철은 쉽습니다.
버스와 다를게 하나도 없습니다.
import pandas as pd
서울시 지하철역별 시간별 승하차 인원 csv 파일
을 준비합니다.
metro = pd.read_csv('./seoul_station_commute.csv', encoding = 'EUC-KR')
metro
우선 2022년 10월, 2021년 10월, 2020년 10월, 2019년 10월로 분리
출근시간
- 승차 : 4시~10시까지 (버스에서는 10시는 제외)
- 하차 : 7시~11시까지 (버스에서는 11시는 제외)
퇴근시간
- 승차 : 16시~20시까지 (버스에서는 20시는 제외)
- 하차 : 17시~21시까지 (버스에서는 21시는 제외)
늦게 퇴근하는 사람
- 승차 : 20시 ~ 01시 (버스에서는 20시 포함, 21시 제외) (지하철은 02시까지 탑승)
- 하차 : 21시 ~ 04시 (버스에서는 21시 포함, 04시 제외) (지하철은 04시까지 탑승)
점심시간
- 출근시간에 하차한 인원이 모두 점심을 먹는다 가정
- 11시 ~ 1시까지 하차한 사람 (버스에서는 1시 제외)
- 11시 ~ 1시까지 승차한 사람 (버스에서는 1시 제외)
- 출근시간하차 11부터1시하차를 더하고 11부터1시승차를 뺀다 = 점심시간유동인구
저녁시간
- 출근시간에 하차한사람에서 17시부터 20시 승차한 인원을 빼고 17시부터 20시 하차한사람을 더한값
- 이 사람이 저녁을 먹는지는 중요하지 않다고 생각함 -> 어차피 상권을 지나는 유동인구이기 때문
모든 시간의 총승차인원
모든 시간의 총하차인원
metro['출근시간(04~09) 승차'] = metro['04시-05시 승차인원'] + metro['05시-06시 승차인원'] +\
metro['07시-08시 승차인원'] + metro['08시-09시 승차인원'] +\
metro['09시-10시 승차인원']
metro['출근시간(07~10) 하차'] = metro['06시-07시 하차인원'] + metro['07시-08시 하차인원'] +\
metro['09시-10시 하차인원'] + metro['10시-11시 하차인원']
metro['퇴근시간(16~20) 승차'] = metro['16시-17시 승차인원'] + metro['17시-18시 승차인원'] +\
metro['18시-19시 승차인원'] + metro['19시-20시 승차인원']
metro['퇴근시간(17~21) 하차'] = metro['17시-18시 하차인원'] + metro['18시-19시 하차인원'] +\
metro['19시-20시 하차인원'] + metro['20시-21시 하차인원']
metro['점심시간'] = metro['출근시간(07~10) 하차'] - metro['11시-12시 승차인원'] -\
metro['12시-13시 승차인원'] + metro['12시-13시 하차인원'] +\
metro['13시-14시 하차인원']
metro['저녁시간'] = metro['출근시간(07~10) 하차'] - metro['17시-18시 승차인원'] -\
metro['18시-19시 하차인원'] + metro['17시-18시 하차인원'] +\
metro['19시-20시 하차인원']
metro['늦은시간퇴근(20~02) 승차'] = metro['20시-21시 승차인원'] + metro['21시-22시 승차인원'] +\
metro['22시-23시 승차인원'] + metro['23시-24시 승차인원'] +\
metro['23시-24시 승차인원'] + metro['00시-01시 승차인원'] + metro['01시-02시 승차인원']
metro['늦은시간퇴근(20~02) 승차'] = metro['21시-22시 하차인원'] +\
metro['22시-23시 하차인원'] + metro['23시-24시 하차인원'] +\
metro['23시-24시 하차인원'] + metro['00시-01시 하차인원'] + \
metro['01시-02시 하차인원'] + metro['02시-03시 하차인원']
metro['총 승차 인원'] = metro['00시-01시 승차인원'] + metro['01시-02시 승차인원'] + metro['02시-03시 승차인원'] +\
metro['03시-04시 승차인원'] + metro['04시-05시 승차인원'] + metro['05시-06시 승차인원'] +\
metro['06시-07시 승차인원'] + metro['07시-08시 승차인원'] + metro['08시-09시 승차인원'] +\
metro['09시-10시 승차인원'] + metro['10시-11시 승차인원'] + metro['11시-12시 승차인원'] +\
metro['12시-13시 승차인원'] + metro['13시-14시 승차인원'] + metro['14시-15시 승차인원'] +\
metro['15시-16시 승차인원'] + metro['16시-17시 승차인원'] + metro['17시-18시 승차인원'] +\
metro['18시-19시 승차인원'] + metro['19시-20시 승차인원'] + metro['20시-21시 승차인원'] +\
metro['21시-22시 승차인원'] + metro['22시-23시 승차인원'] + metro['23시-24시 승차인원']
metro['총 하차 인원'] = metro['00시-01시 하차인원'] + metro['01시-02시 하차인원'] + metro['02시-03시 하차인원'] +\
metro['03시-04시 하차인원'] + metro['04시-05시 하차인원'] + metro['05시-06시 하차인원'] +\
metro['06시-07시 하차인원'] + metro['07시-08시 하차인원'] + metro['08시-09시 하차인원'] +\
metro['09시-10시 하차인원'] + metro['10시-11시 하차인원'] + metro['11시-12시 하차인원'] +\
metro['12시-13시 하차인원'] + metro['13시-14시 하차인원'] + metro['14시-15시 하차인원'] +\
metro['15시-16시 하차인원'] + metro['16시-17시 하차인원'] + metro['17시-18시 하차인원'] +\
metro['18시-19시 하차인원'] + metro['19시-20시 하차인원'] + metro['20시-21시 하차인원'] +\
metro['21시-22시 하차인원'] + metro['22시-23시 하차인원'] + metro['23시-24시 하차인원']
metro = metro.drop(['00시-01시 승차인원', '01시-02시 승차인원' ,'02시-03시 승차인원',
'03시-04시 승차인원', '04시-05시 승차인원' ,'05시-06시 승차인원',
'06시-07시 승차인원', '07시-08시 승차인원', '08시-09시 승차인원',
'09시-10시 승차인원', '10시-11시 승차인원', '11시-12시 승차인원',
'12시-13시 승차인원', '13시-14시 승차인원', '14시-15시 승차인원',
'15시-16시 승차인원', '16시-17시 승차인원', '17시-18시 승차인원',
'18시-19시 승차인원', '19시-20시 승차인원', '20시-21시 승차인원',
'21시-22시 승차인원', '22시-23시 승차인원', '23시-24시 승차인원'], axis = 1)
metro = metro.drop(['00시-01시 하차인원', '01시-02시 하차인원' ,'02시-03시 하차인원',
'03시-04시 하차인원', '04시-05시 하차인원' ,'05시-06시 하차인원',
'06시-07시 하차인원', '07시-08시 하차인원', '08시-09시 하차인원',
'09시-10시 하차인원', '10시-11시 하차인원', '11시-12시 하차인원',
'12시-13시 하차인원', '13시-14시 하차인원', '14시-15시 하차인원',
'15시-16시 하차인원', '16시-17시 하차인원', '17시-18시 하차인원',
'18시-19시 하차인원', '19시-20시 하차인원', '20시-21시 하차인원',
'21시-22시 하차인원', '22시-23시 하차인원', '23시-24시 하차인원'], axis = 1)
metro = metro.drop(['작업일자'], axis = 1)
metro
왜 이따위로 코딩을 했는지 모르겠지만 그 당시에 시간이 너무 부족해서
머리쓸바에 걍 적자 하고 저리 적은거 같음.
여튼 이번 자료는 2015년에서 2022년까지 있기 때문에
2019~2022년의 10월 데이터만 분리하기 위해서
사용월에서 연도와 월을 분리합니다.
metro['월'] = metro['사용월'].str[4:]
metro['연도'] = metro['사용월'].str[:4]
metro
그리고 그 데이터에서 10월의 데이터만 분리하고
2019 ~2022년까지 데이터를 뽑아냅니다.
metro = metro[metro['월'].isin(["10"])]
metro = metro[metro['연도'].isin(["2022", "2021", "2020", "2019"])]
metro
여기까지 데이터를 가공하고
(혹시 왜 이렇게 대충 적는거 같지 싶으면 버스데이터 정리한 글을 봐주세요. 연달아 적으려니 너무 내용이 겹칩니다.)
서울시 지하철 위도경도 데이터를 불러옵니다.
metro_location = pd.read_csv('./station_location.csv', encoding="EUC-KR")
metro_location
두 자료를 이름을 기준으로 합쳐버립시다.
metro_2022_10_file =pd.merge(metro_2022_10, metro_location , left_on='지하철역', right_on='name', how='left')
metro_2022_10_file
문제가 좀 있었습니다.
가공한 데이터의 경우 지하철역 과 (부역명) 이런식으로 되어있어서
() 가 있는 경우 삭제를 해줬스니다.
for i in range(len(metro_2022_10)):
if metro_2022_10['지하철역'][i][-1] == ')':
split = metro_2022_10['지하철역'][i].split('(')
metro_2022_10['지하철역'][i] = split[0]
print(metro_2022_10['지하철역'][i])
metro_2022_10_file =pd.merge(metro_2022_10, metro_location , left_on='지하철역', right_on='name', how='left')
metro_2022_10_file
머지를 하면
이런식으로 나오게 됩니다.
metro_2022_10_file_2 = metro_2022_10_file.drop(["line", "name", "code"], axis=1)
metro_2022_10_file_2
metro_2022_10_file_3 = metro_2022_10_file_2.drop_duplicates(['호선명', '지하철역'])
metro_2022_10_file_3
이런식으로 가공을 합니다.
문제가 있습니다.
2022년인 현재에는 서울시 위도/경도 데이터에 빠진 역명이 있습니다.
이건 뒤에서 설명할 셀레니움이나 구글API로 해결하셔야합니다.
저는 일단 수작업으로 진행을 하였습니다.
문제는 서울이 아닌 곳의 데이터도 들어있는 것인데
다음의 과정을 따라해 서울이 아닌 지역의 지하철역정보를 날릴 수 있습니다.
metro_2022_10_file_3 = metro_2022_10_file_3.reset_index()
metro_2022_10_file_3 = metro_2022_10_file_3.drop(['index'], axis = 1)
metro_2022_10_file_3 = metro_2022_10_file_3.reset_index()
metro_2022_10_file_3
머지하면서 중복데이터를 제거했습니다. 그때문에 인덱스를 리셋하고
구글지도에서 서울의 가장자리에서 경계면을 구해서
a = metro_2022_10_file_3[metro_2022_10_file_3['lng'] < 126.75]
a
b = metro_2022_10_file_3[metro_2022_10_file_3['lng'] > 127.22]
b
c = metro_2022_10_file_3[metro_2022_10_file_3['lat'] > 37.73]
c
d = metro_2022_10_file_3[metro_2022_10_file_3['lat']< 37.42]
d
result1 = pd.concat([a, b, c, d])
result2 = result1.drop_duplicates()
result2
서울시가 아닌 자료는 지워버려
metro_2022_10_file_3 = metro_2022_10_file_3.drop(result2['index'].index)
metro_2022_10_file_3
metro_2022_10_file_3 = metro_2022_10_file_3.dropna()
metro_2022_10_file_3
nan 값을 제거해버리고
인덱스를 리셋하면 최종 데이터를 얻게된다.
metro_2022_10_file_3 = metro_2022_10_file_3.drop(['index'], axis = 1)
metro_2022_10_file_3 = metro_2022_10_file_3.reset_index()
metro_2022_10_file_3 = metro_2022_10_file_3.drop(['index'], axis = 1)
metro_2022_10_file_3
'ㅇ 프로젝트 > TEAM_서울시 교통 인프라 분석' 카테고리의 다른 글
6. 서울시 승용차 평균속도 데이터 가공 (0) | 2022.11.19 |
---|---|
5. 서울시 승용차 평균속도 데이터를 통해 가공하고 네비게이션용 지도를 그려보자. (1) | 2022.11.19 |
4. (EDA_프로젝트) 서울시 지하철 데이터로 지하철 노선도를 그려보자. (1) | 2022.11.14 |
2. (EDA_프로젝트) 서울시 버스 데이터를 수집하고 가공하자. (0) | 2022.11.14 |
1. (EDA_프로젝트) 주제 선정하기 (1) | 2022.11.13 |