.. Cover Letter

ㅇ 프로젝트/TEAM_서울시 교통 인프라 분석

3. (EDA_프로젝트) 서울시 지하철 데이터를 수집하고 가공하자.

BrainKimDu 2022. 11. 14. 05:49

데이터 수집


서울시 지하철역 위치정보

https://observablehq.com/@taekie/seoul_subway_station_coordinate

 

서울 지하철역 좌표

아래 station_coordinate에 마우스를 올리면 나오는 왼쪽의 점세개를 누르면 csv,json 파일로 다운 받을 수 있는 메뉴가 나옵니다. data 서울특별시 노선별 지하철역 정보 서울 열린 데이타 광장 한글 인

observablehq.com

 

서울시 지하철역별 시간대별 승하차 인원 정보

https://data.seoul.go.kr/dataList/OA-12252/S/1/datasetView.do

 

열린데이터광장 메인

데이터분류,데이터검색,데이터활용

data.seoul.go.kr

 


데이터 전처리 진행하기


버스데이터를 한 번 처리하고 나니 지하철은 쉽습니다.

 

버스와 다를게 하나도 없습니다.

 

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