서울 지하철 지도
- 불금이라고 불리는 금요일 저녁 시간대 및 토요일 첫차 시간대 지하철 이용 인원이 많을것으로 예상
데이터 전처리
# 라이브러리 호출
import pandas as pd
import folium
# 데이터 불러오기 및 데이터 확인
data = pd.read_csv('/content/drive/MyDrive/AI스쿨 파일/seoul-metro-2021.logs.csv')
info = pd.read_csv('/content/drive/MyDrive/AI스쿨 파일/seoul-metro-station-info.csv')
data.head()
info.head()
# 필요한 컬럼만 추출하기
info = info[['station.code','geo.latitude','geo.longitude']]
info.head()
# 역 정보 기준으로 그룹화
data_sum = data.groupby('station_code').sum(numeric_only=False) # 숫자형 데이터 타입 아닌거 있는 경우는 numeric_only=False 해줘야함
data_sum
# 데이터 합치기 위해 info의 인덱스 재설정
info = info.set_index('station.code')
# join 사용해 두 데이터 합치기
joined_data = data_sum.join(info)
joined_data.head()
문제 1
- 불금 지하철 하차 히트맵 & 토요일 아침 복귀 인원 히트맵
필요 데이터 추출
- 불금 데이터 추출하기(19시~)
- 토요일 오전 5~8시 데이터 추출(첫차 시간대)
- 각각의 데이터를 그룹화 해서 합치기
# 불금 데이터 추출하기(19시~)
friday_data = data[(pd.to_datetime(data.timestamp).dt.weekday == 4) & (pd.to_datetime(data.timestamp).dt.hour > 18)]
friday_data.head()
# 토요일 오전 5~8시 데이터 추출
saturday_data = data[(pd.to_datetime(data.timestamp).dt.weekday==5) & (pd.to_datetime(data.timestamp).dt.hour < 9)]
saturday_data.head()
# 각각의 데이터 그룹화
friday_group = friday_data.groupby('station_code').sum(numeric_only=False)
friday_group.head()
saturday_group = saturday_data.groupby('station_code').sum(numeric_only=False)
saturday_group.head()
# 각각의 데이터 합치기
friday_join = friday_group.join(info)
friday_join.head()
saturday_join = saturday_group.join(info)
saturday_join.head()
금요일 데이터 지도 시각화
from folium.plugins import HeatMap
friday = folium.Map(location=[37.55, 126.98], zoom_start = 12) # zoom_size - 좌표 위치에서 얼마나 확대된 화면이 첫 화면 될지(0~18)
HeatMap(data=friday_join[['geo.latitude','geo.longitude','people_in']]).add_to(friday)
friday
토요일 아침 데이터 지도 시각화
saturday= folium.Map(location=[37.55, 126.98], zoom_start = 12)
HeatMap(data=saturday_join[['geo.latitude','geo.longitude','people_out']]).add_to(saturday)
saturday
문제 2
- 2021년 1월 승하차 상위 3개역 하위 3개역 마커로 표시
데이터 처리
# 라이브러리 호출
import pandas as pd
import folium
# 데이터 불러오기 및 데이터 확인
data = pd.read_csv('/content/drive/MyDrive/AI스쿨 파일/seoul-metro-2021.logs.csv')
info = pd.read_csv('/content/drive/MyDrive/AI스쿨 파일/seoul-metro-station-info.csv')
data.head()
info.head()
# 필요한 컬럼만 추출하기
info = info[['station.code', 'station.name_full', 'geo.latitude','geo.longitude']]
info.head()
# 역 정보 기준으로 그룹화
data_sum = data.groupby('station_code').sum(numeric_only=False) # 숫자형 데이터 타입 아닌거 있는 경우는 numeric_only=False 해줘야함
data_sum
# 데이터 합치기 위해 info의 인덱스 재설정
info = info.set_index('station.code')
# join 사용해 두 데이터 합치기
joined_data = data_sum.join(info)
joined_data.head()
# 2021년 1월 데이터만 추출
data_jan = data[(pd.to_datetime(data.timestamp).dt.year == 2021) & (pd.to_datetime(data.timestamp).dt.month == 1)]
jan_group = data_jan.groupby('station_code').sum(numeric_only=False)
jan_join = jan_group.join(info)
# 승차 상하위 3개 데이터
top_in = jan_join.sort_values(by='people_in')[-3:]
top_in
low_in = jan_join.sort_values(by='people_in')[:3]
low_in
# 하차 상하위 3개 데이터
top_out = jan_join.sort_values(by='people_out')[-3:]
top_out[-3:]
low_out = jan_join.sort_values(by='people_out')[:3]
low_out
승차 상위 3개 역 시각화
# 승차 top 3 역 지도에 표시
top_in_map = folium.Map(location=[37.55, 126.98], zoom_start = 12)
for idx, row in top_in.iterrows():
folium.Marker(location=[row['geo.latitude'], row['geo.longitude']], popup=row['station.name_full'],
icon=folium.Icon(color='blue',icon='star')).add_to(top_in_map)
top_in_map
승차 하위 3개 역 시각화
low_in_map = folium.Map(location=[37.55, 126.98], zoom_start = 12)
for idx, row in low_in.iterrows():
folium.Marker(location=[row['geo.latitude'], row['geo.longitude']], popup=row['station.name_full'],
icon=folium.Icon(color='blue',icon='star')).add_to(low_in_map)
low_in_map
하차 상위 3개 역 시각화
top_out_map = folium.Map(location=[37.55, 126.98], zoom_start = 12)
for idx, row in top_out.iterrows():
folium.Marker(location=[row['geo.latitude'], row['geo.longitude']], popup=row['station.name_full'],
icon=folium.Icon(color='blue',icon='star')).add_to(top_out_map)
top_out_map
하차 하위 3개 역 시각화
low_out_map = folium.Map(location=[37.55, 126.98], zoom_start = 12)
for idx, row in low_out.iterrows():
folium.Marker(location=[row['geo.latitude'], row['geo.longitude']], popup=row['station.name_full'],
icon=folium.Icon(color='blue',icon='star')).add_to(low_out_map)
low_out_map