Development Project

[ 2021 NIPA AI - 기본 ] 3. 공공데이터를 활용한 파이썬 데이터분석 프로젝트 - 2. 지하철 승하차 인원 정보를 활용한 역별 혼잡도 분석 본문

AI/Edu

[ 2021 NIPA AI - 기본 ] 3. 공공데이터를 활용한 파이썬 데이터분석 프로젝트 - 2. 지하철 승하차 인원 정보를 활용한 역별 혼잡도 분석

나를 위한 시간 2021. 12. 16. 17:54

 

데이터 출처 :  http://data.seoul.go.kr/dataList/OA-12252/S/1/datasetView.do

 

열린데이터광장 메인

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

data.seoul.go.kr

 

[Project 1] 지하철 승하차 인원 정보를 활용한 역별 혼잡도 분석

  1. 데이터 읽기
    1. 데이터 불러오기
      • import
        • import numpy as np
          import pandas as pd
          import matplotlib.pyplot as plt
      • 불러오기 [ read_csv("경로") ]
        • metro_all = pd.read_csv("./data/서울시 지하철 호선별 역별 시간대별 승하차 인원 정보_20210705.csv", encoding = 'cp949')
      • 정보 출력 [ .head() / .info() ]
        • metro_all.head()
        • metro_all.info()
  2. 데이터 정제
    1. 2021년 6월 승하차 인원만 추출
      • '사용월' 이 202106월인 데이터만 필요하므로 이를 추출하고, 불필요한 '작업일자' 컬럼을 제거해야함
      • metro_recent = metro_all[metro_all['사용월'] == 202106]
        metro_recent = metro_recent.drop(columns={'작업일자})
  3. 데이터 시각화
    1. 호선 별 이용객 수 출력
      • 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'))
        plt.show()
    2. 특정 호선에서 역별 평균 승하차 인원 데이터 추출
      • line = '6호선'
        metro_st = metro_recent.groupby(['호선명', '지하철역']).mean().reset_index()
        metro_st_line2 = metro_st[metro_st['호선명'] == line]
        
        # 승차 인원 컬럼만 추출
        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_off = pd.DataFrame()
        metro_get_off['지하철역'] = 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_off.set_index('지하철역')
        
        # 역 별 평균 승하차 인원을 구한 후 정수로 형 변환하여 데이터프레임으로 저장
        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)
    3. 평균 승하차 인원 수 내림차순으로 막대그래프 출력
      • top10_on  df.sort_values(by = '평균 승차 인원 수', ascending = False).head(10)
        
        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()
    4. 특정 호선의 혼잡 정도와 위치좌표 데이터 병합
    5. 특정 호선의 혼잡 정도를 지도에 출력
      • import folium
        
        # 특정 위도, 경도 중심으로 하는 OpenStreetMap을 출력
        map_osm = folium.Map(location = [37.529622, 126.984307], zoom_start=12)
      • # 특정 호선의 역별 평균 승하차 인원 수와 위치좌표 데이터만 추출
        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['평균 승차 인원 수'][i]], 
                                color = 'blue', 
                                fill_color = 'blue')
            marker.add_to(map_osm)
Comments