Blair  - Soul Eater [데이터_분석] 지하철 승하차 인원 분석 (P2)

• program/앨리스_python

[데이터_분석] 지하철 승하차 인원 분석 (P2)

oujin 2022. 8. 17. 11:37
728x90

프로젝트 목표

승차 또는 하차 시 해당 시간, 해당역의 승객 수를 확인하기 위해 개찰구 통과 승객 수 데이터와 지하철 위치좌표 데이터를 활용

탐색적 데이터 분석을 수행하기 위한 데이터 정제, 특성 엔지니어링, 시각화 방법 학습

프로젝트 목차

1. 데이터 읽기: 승하차 인원 정보 데이터를 불러오고 DataFrame 구조를 확인

1-1. 데이터 불러오기

1-2. 데이터 확인하기

2. 데이터 정제: 데이터 확인 후 형 변환 및 이상치 데이터 처리

2-1. 2021년 6월 승하차 인원만 추출

3. 데이터 시각화: 각 변수별로 추가적인 정제 또는 feature engineering 괒ㅇ을 거치고 시가화를 통해 데이터 특성 파악

3-1. 호선 별 이용객 수 출력

3-2. 특정 호선에서 역별 평균 승하차 인원 데이터 추출

3.3. 평균 승하차 인원 수 내림차순으로 인원 데이터 추출

3-4. 특정 호선의 혼잡 정도와 위치좌표로 막대그래프 출력

3-5. 특정 호선의 혼잡정도를 지도에 출력

데이터 출처

서울시 지하철 호선별 역별 승하차 인원 정보 데이터

http://data.seoul.go.kr

 

열린데이터광장 메인

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

data.seoul.go.kr

 

프로젝트 개요

지하철 이용 승객 수를 확인하여 혼잡도 높은 지역을 확인하자

이번 프로젝트에서는 서울 열린 데이터 공장에서 제공하는 서울시 지하철 호선별 역별 승하차인원 정보 데이터를 분석하고

지하철 역 위치 좌표 데이터를 활용해 특정 호선에서 어떤 역이 가장 혼잡한지 직관적으로 확인하자

1. 데이터 읽기

필요한 패키지 설치 및 import 한 후 pandas를 사용하여 데이터를 읽고 어떠한 데이터가 저장되어있는지 확인하자

1-1. 데이터 불러오기

import numpy as np

Import pandas as pd

Import matplotlib.pyplot as plt

서울시 지하철 호선별 역별 승하차 인원 정보 데이터를 불러와 metro_all에 저장합니다

#pd.read_csv를 통하여 승하차 인원 정보 데이터를 데이터 프레인 형대로 불러옵니다

metro_all = pd.read_csv("./data/서울시 지하철 호선별 역별 시간대별 승하차 인원 정보_20210705.csv", encoding = 'cp949')

#승하차 인원 정보 상위 5개 데이터를 출력합니다

metro_all.head()

#승하차 인원 정보 데이터프레인 정보를 요약하여 출력합니다.

metro_all.info()

1-2. 데이터 확인하기

불러온 두 데이터프레임의 특정 컬럼 데이터를 중복없이 오름차순 정렬하여 확인해봅시다.

#metro_all DataFrame 사용월 데이터 확인

sorted(list(set(metro_all['사용월'])))

#metro_all DataFrame 호선명 데이터 확인

sorted(list(set(metro_all['호선명'])))

#DataFrame 지하철역 데이터 확인

sorted(list(set(metro_all['지하철역'])))

#DataFrame 지하철역 데이터 개수 확인

len(list(set(mro_all['지하철역'])))

2. 데이터 정제

데이터를 확인해 보면 2015년 1월 부터 2021년 6월까지 수집된 데이터인 것을 알 수 있다

이번 프로젝트에서는 가장 최근 한달간 수집된 데이터를 기준으로 특정 호선에서 어떤 역이 가장 혼잡한지 확인하자

2-1. 2021년 6월 승하차 인원만 추출

수집된 데이터 중 가장 최근인 6월에 수집한 데이터만 추출하고 불필요한 컬럼을 제거하자

#2021년 6월 총 승객수만 추출

metro_recent = metro_all['사용월'] == 202106

metro_recent

#불필요한 작업일자 컬럼 제거

metro_recent = metro_recent.drop(column = {'작업일자'})

metro_recent

3. 데이터 시각화

2021년 6월 데이터마 추출한 metro_recent를 활용하여 다양한 데이터 시각화 및 혼잡도 분석을 진행해 봅시다.

3-1. 호선 별 이용객 수 출력

추출한 metro_recent 데이터를 활용해 이용객 수가 가장 많은 호선 순으로 막대그래프를 출력하자

import matplotlib.font_manager as fm

font_dirs = ['/usr/share/fonts/truetype/nanum', ]

font_files = fm.findSystemFonts(fontpaths = font_dirs)

for font_file in font_files:

fm.fontManager.addfont(font_file)

metro_line = metro_recent.groupby(['호선명']).mean().reset_index()

metro_line = metro_line.drop(columns='사용월').set_index('호선명')

metro_line = metro_line.mean(axis =1).sort_values(ascending = False)

plt.figure(figsize = (20,10))

plt.rc('font', family = "NanumBarunGothic")

plt.rcParams['axes.unicode_minus'] = False

metro_line.plot(kind = (bar'))

.show()

3-2. 특정 호선에서 역별 평균 승하차 인원 데이터 추출

다양한 호선에서 역별 평균 승하차 인원이 많은 역을알아 보자

이용객이 가장많은 2호선을 기준으로 역별 평균승하차 인원 데이터를 추출하자

line = '2호선'

metro_st = metro_recent.groupby(['호선명'], '지하철역']).mean().reset_index()

metro_st_line2 = metro_st[metro_st['호선명'] == line]

line2

#승차 인원 컬럼만 추출

metro_get_on = pd.DataFrame()

metro_get_on['지하철역'] = metro_st_line2['지하철역']

for i in range(int((len(metro_recent.columns)-3/2)):

metro_get_on[metro_st_line2.columns[3+2*i]] = metro_st_line2[metro_st_line2.columns[3+2*i]]

Metro_get_on = metro_get_on.set_index('지하철역')

metro_get_on

#하차 인원 컬럼만 추출

metro_get_off = pd.DataFrame()

metro_get_on['지하철역'] = metro_st_line2['지하철역']

for i in range(int((len(metro_recent.columns)-3/2)):

metro_get_off[metro_st_line2.columns[4+2*i]] = metro_st_line2[metro_st_line2.columns[4+2*i]]

metro_get_off = metro_get_on.set_index('지하철역')

metro_get_off

# 역 별 평균 승하차 인원을 구한 후 정수로 형 변환하여 데이터 프레임으로 저장

df = pd.DataFrame(index = metro_st_line2['지하철역'])

df['평균 승차 인원 수'] = metro_get_on.mean(axis =1).astype(int)

df['평균 하차 인원 수'] = metro_get_off.mean(axis =1).astype(int)

df

3-3. 평균 승하차 인원 수 내림차순으로 막대그래프 출력

2호선 기준 6월 한달간 강남>잠실>신림>구로디지털단지>홍대입구>선릉 순으로 평규 승차인원이 많았음을 알 수 있다

#승차인원 top10

top10_on = df.sort_values(by='평균 승차 인원 수', ascending = False)

plt.figure(figsize = (20,10))

plt.rc('font', family = "NanumBarunGothic")

plt.rcParams['axes.unicode_minus'] = False

plt.bar(top10_on.index, top10_on['평균 승차 인원 수'])

for x, y in enumerate(list(top10_on['평균 승차 인원 수'])):

if x==0:

plt.annotate(y, (x-0.15, y), color = 'red')

else:

plt.annotate(y, (x-0.15, y))

plt.title('2021년 6월 평균 승차 인원 수 top10')

plt.show()

평균 하차 인원은 거의 동일하게 강남>잠실>신림>구로디지털단지>홍대입구>역삼 순으로 많았음을 알 수 있습니다

#하차 인원수 top10

top10_off = df.sort_values(by='평균 하차 인원 수', ascending = False)

plt.figure(figsize = (20,10))

plt.rc('font', family = "NanumBarunGothic")

plt.rcParams['axes.unicode_minus'] = False

plt.bar(top10_off.index, top10_off['평균 하차 인원 수'])

for x, y in enumerate(list(top10_off['평균 하차 인원 수'])):

if x==0:

plt.annotate(y, (x-0.15, y), color = 'red')

else:

plt.annotate(y, (x-0.15, y))

plt.title('2021년 6월 평균 하차 인원 수 top10')

plt.show()

#6호선의 지하철 역중에서 승차인원수가 가장 많은 역명을 구하세요

line = '6호선'

metro_st = metro_recent.groupby(['호선명'], '지하철역']).mean().reset_index()

metro_st_line2 = metro_st[metro_st['호선명'] == line]

line6

#3-2의 첫번째 셸을 6호선으로 변경하고 3-2와 3-3을 차례로 실행하면 나온다

->공덕

3-4. 특정 호선의 혼잡 정도와 위치좌표 데이터 병합

특정 호선의 지하철 역맏 지도에 정보를 출력하기 위해서는 각 위치의 좌표정보가 필요합니다.

이를 해결하기 위해 카카오 API를 활용하여 csv파일로 만들어 두었습니다.

https://developers.kakao.com/docs/latest/ko/local/dev-guide#search-by-keyword

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

 

 

 

#지하철 역별 위치 좌표에 대한 데이터를 불러옵니다

subway_location = pd.reas_csv('./data/지하철 역 위치 좌표.csv')

subway_location

먼저 특정 호선의 역별 평균 승하차 인원 수와 지하철 역별 위치좌표 데이터를 병합하여 데이터프레임을 생성해보자

#특정 호선의 역별 평균 승하차 인원수와 지하철 역 위치 좌표를 데이터 프레임으로

def get_nums_and_location(line, metro_st):

# 특정호선의 데이터만 추출합니다

metro_line_n = metro_st[metro_st['호선명'] == line]

# 승차 인원 컬럼만 추출합니다

metro_get_on = pd.DataFrame()

metro_get_on['지하철역'] = metro_line_n['지하철역']

for i in range(int((len(metro_recent.columns)-3/2)):

metro_get_on[metro_line_m.columns[3+2*i]] = metro_line_n[metro_line_n.columns[3+2*i]]

metro_get_on = metro_get_on.set_index('지하철역')

#하차 인원 컬럼만 추출합니다

metro_get_dff = pd.DataFrame()

metro_get_off['지하철역'] = metro_line_n['지하철역']

for i in range(int((len(metro_recent.columns)-3/2)):

metro_get_off[metro_line_m.columns[4+2*i]] = metro_line_n[metro_line_n.columns[4+2*i]]

metro_get_off = metro_get_off.set_index('지하철역')

#역 별 평규 승하차 인원을 구한 후 정수로 형 변환하여 데이터프레임으로 저장

df = pd.DataFrame(index = metro_line_n['지하철역'])

df['평균 승차 인원 수'] = metro_get_on.mean(axis = 1).astype(int)

df['평균 하차 인원 수'] = metro_get_off.mean(axis = 1).astype(int)

#지하철역 명을 동일하도록 설정

temp = []

df = df.reset_index()

for name in df['지하철역']:

temp.append(name.split('(')[0]+'역')

df[' 지하철역'] = temp

#지하철역 명을 기준으로 두 데이터프레임을 병합하다

df = df.merge(subway_location, left_on = '지하철역', right_on = '지하철역')

return df

get_nums_and_location('6호선', metro_st)

3-5. 특정 호선의 혼잡 정도를 지도에 출력

지도를 출력하기 위한 라이브러리로 folium을 사용해 봅시다

import folium

#특정 위도, 경도 중심으로 하는 OpenStreetMap을 출력

map_osm = folium.map(location = [37.529622, 126.984307], zoom_start = 12)

map_osm

이제 특정 호선의 역별 평균 승차 인원수를 원형마커를 통해 지도에 출력하자

#특정 호선의 역별 평균 승하차 인원 수와 위치좌표 데이터만 추출하다

rail = '6호선'

df = get_nums_and_location(rail, metro_st)

#서울의 중심에 위치하는 명동역의 위도와 경도를 중심으로 지도 출력

latitude = subway_location[subway_location['지하철역'] == '명동역']['x좌표']

longitude = subway_location[subway_location['지하철역'] == '명동역']['y좌표']

map_osm = folium.Map(location = [latitude, longitude], zoom_start =12)

#각 지하철 역의 위치별로 원형마커를 지도에 추가

for i in df.index:

marker = folium.CircleMarker([df['x좌표'][i],df['y좌표'][i]],

radius = (df['평균 승차 인원 수'][i]+1)/3000, #인원 수가 0일때 계산오류 보정

popup = [df['지하철역'][i],df['평균 승차 인원 수'][u]],

fill_color = 'blue'),

marker.add_to(map_osm)

map_osm

#강남역의 x좌표(위도)를 구하세요

#get_nums_and_location() 함수를 사용

강남역은 2호선이기 때문에 df = get_nums_and_location('2호선'. metro_st)으로 데이터 프레임을 추출

#df[df['지하철역']=='강남역']['x좌표']을 통해 컬럼 '지하철역'이 '강남역'인 행을 추출하고 'x좌표' 값을 구하기

728x90