본문 바로가기
데이터 분석/데이터분석 연습

대중교통 데이터 시각화하기

by 꽃비내린 2020. 5. 10.

※ 이 글은 모두의 데이터 분석 with 파이썬 책의 예제를 연습한 내용입니다.

 

1. 대중교통 데이터 가져오기

수도권 대중교통 데이터는 티머니 홈페이지에서 볼 수 있다. 티머니 홈페이지 왼쪽 상단에 '이용안내'를 클릭하면 아래와 같은 팝업창이 뜬다. 팝업창 왼쪽 하단에 '대중교통 통계자료'를 클릭한다. 최근 월 교통카드 통계자료를 다운받는다.

 

엑셀 파일을 열면 여러 탭이 있는 것을 볼 수 있다. 그중에서 지하철 유무임별 이용현황 탭을 선택하고 다른 이름으로 저장하기를 눌러 'subwayfee.csv' 파일로 저장한다.

 

데이터 타입을 int로 저장하기 위해 엑셀에서 ','(쉼표)를 제거한다. 그다음 맨 마지막 열인 '작업일시'를 전체 삭제한다. 주피터 노트북에서 해당 csv파일을 확인하면 데이터가 잘 정제된 것을 확인할 수 있다.

데이터를 분석하기 위해 헤더를 없애고(next함수) 유임승차, 유임하차, 무임승차, 무임하차 네 개 데이터타입을 문자열에서 정수로 변환한다.

import csv
f = open('subwayfee.csv')
data = csv.reader(f)
next(data)

for row in data:
    for i in range(4, 8):
        row[i] = int(row[i])
    print(row)

 

2. 대중교통 데이터 분석하기

질문, 유임승차비율이 가장 높은 역이 어디일까? 이 비율을 유임승차인원/전체 인원 으로 표현할 수 있다. 이 비율이 최대인 곳을 찾으면 된다. 아래 코드는 순차적으로 최대 비율을 찾아 출력한다. 여기선 홍대입구와 마곡나루가 유임승차비율이 0.95로 높은 것을 알 수 있다.

 

import csv
f = open('subwayfee.csv')
data = csv.reader(f)
next(data)
mx = 0
rate = 0

for row in data:
    for i in range(4, 8):
        row[i] = int(row[i])
    if row[6] != 0 and (row[4]+row[6]) > 100000:
        rate = row[4] / (row[4]+row[6])
        if rate > mx:
            mx = rate
            print(row, round(rate, 2))

가장 유임승차비율이 높은 곳을 mx_station 객체에 입력하도록 코드를 작성하면 다음과 같다.

import csv
f = open('subwayfee.csv')
data = csv.reader(f)
next(data)
mx = 0
rate = 0
mx_station = ''

for row in data:
    for i in range(4, 8):
        row[i] = int(row[i])
    if row[6] != 0 and (row[4]+row[6]) > 100000:
        rate = row[4] / (row[4]+row[6])
        if rate > mx:
            mx = rate
            mx_station = row[3] + ' ' + row[1]
            
print(mx_station, round(mx*100, 2))

'마곡나루(서울식물원) 공항철도 1호선 95.14'로 결과를 확인할 수 있다.

 

다음으로 유무임 승하차 인원이 가장 많은 역을 찾는다. 이번에는 모든 인원을 고려해야 하므로 인원수를 저장할 변수와 역 정보를 저장할 변수를 각각 4개씩 생성한다.

import csv
f = open('subwayfee.csv')
data = csv.reader(f)
next(data)

mx = [0] * 4
mx_station = [''] * 4

코드 실행 시 mx = [0, 0, 0, 0], mx_station = ['', '', '', '']가 생성된다. 유무임 승하차 인원의 최대 인원을 각각 구하면 다음과 같다. 여기서 첫 번째 for문은 mx(최대 인원)을 초기값 0으로 했을 때, 모든 row와 mx를 비교해 row값이 크면 mx를 갱신해서 최대 인원을 구하는 코드이다.

import csv
f = open('subwayfee.csv')
data = csv.reader(f)
next(data)

mx = [0] * 4
mx_station = [' '] * 4
label = ['유임승차', '유임하차', '무임승차', '무임하차']

for row in data:
    for i in range(4, 8):
        row[i] = int(row[i])
        if row[i] > mx[i-4]:
            mx[i-4] = row[i]
            mx_station[i-4] = row[3] + ' ' + row[1]
            
for i in range(4):
    print(label[i]+' : '+mx_station[i], mx[i])

결과에서 알 수 있듯이 유임승하차는 강남2호선, 무임승차는 종로3가, 무임하차는 제기동에서 최대 인원을 보이는 것으로 확인할 수 있다.

모든 수도권 지하철의 유무임승차차 비율을 파이 차트로 보이면 다음과 같다. 여기서 savefig는 파이 차트와 같은 그래프를 이미지 파일로 저장하는 함수이다. 

import matplotlib.pyplot as plt
import csv
f = open('subwayfee.csv')
data = csv.reader(f)
next(data)

c = ['#14CCC0', '#389993', '#FF1C6A', '#CC14AF'] #색상은 RGB로도 나타낼 수 있다.
plt.rc('font', family = 'Malgun Gothic')
for row in data:
    for i in range(4, 8):
        row[i] = int(row[i])
    print(row)
    
    plt.figure(dpi=300)
    plt.title(row[3]+''+row[1])
    plt.pie(row[4:8], labels=label, colors=c, autopct='%1.f%%')
    plt.axis('equal')
    plt.savefig(row[3]+''+row[1]+'.png')
    plt.show()

코드를 실행하면 아래처럼 jupyter notebook 폴더에 자동으로 이미지파일이 생성되는 것을 볼 수 있다.

댓글