데이터분석/tableau

서울시 따릉이(1)

Null to One 2025. 4. 15. 20:46

아직 Tableau Public 사용에 익숙하진 않지만, 활용법을 더 잘 익히고 싶어 연습 삼아 대시보드를 제작해보았습니다.

서울시의 '따릉이'는 시민들을 위한 공공 자전거 대여 서비스입니다. 이번 시각화에서는 시간대별 따릉이 혼잡도를 분석함으로써, 자전거 수거 인력을 어떤 지역에 보다 집중적으로 배치해야 효율적인 운영이 가능할지에 대한 인사이트를 도출하고자 했습니다.

 

사용한 데이터셋의 출처는 아래와 같습니다.

 

1. 서울시 따릉이 대여소 정보

https://data.seoul.go.kr/dataList/OA-13252/F/1/datasetView.do

 

열린데이터광장 메인

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

data.seoul.go.kr

Tableau에서는 위도와 경도 데이터를 받아 지도 상에 데이터를 표시하는게 가능합니다. 열린데이터광장에서 제공하는 따릉이 대여소 정보에는 위도와 경도 데이터가 포함되기 때문에 여기서 데이터를 다운받아 사용하였습니다.

 

 

2. 서울시 따릉이 이용현황 (2024년 6월~8월 데이터)

https://data.seoul.go.kr/dataList/OA-14994/F/1/datasetView.do#

 

열린데이터광장 메인

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

data.seoul.go.kr

따릉이 이용현황 데이터의 경우, 2024년 전체 데이터를 사용하고 싶었으나, 용량이 너무 큰 나머지 jupyter나 colab notebook을 활용하여 데이터 정제를 시도할때마다 컴퓨터가 다운되어버리는 문제가 발생했습니다. 그래서 어쩔 수 없이 6월~8월 데이터로 한정하여 진행하기로 결정했습니다.

 

 

 

 

3. Tableau 시각화를 위한 데이터셋 정제

두 사이트에서 다운로드 받은 csv파일을 pandas 라이브러리를 활용하여 불러왔습니다. 데이터셋이 어떤 내용을 포함하고 있는지 확인해보니 다음과 같았습니다.

 

 

(1) 따릉이 대여소

 

 

(2) 따릉이 이용현황(6~8월)

 

따릉이 대여소 데이터셋을 확인해보면 대여소ID, 주소, 위도, 경도 컬럼을 갖고 있는 것을 확인할 수 있습니다.

이용현황 데이터셋의 경우, 이번 시각화에 필요한 컬럼만 usecols로 가져와 주었기 때문에 대여일시, 대여대여소ID, 반납대여소ID 컬럼만 출력됩니다. 실제로는 저 컬럼들보다 더 많은 컬럼들로 구성되어 있습니다.

 

우선, 기존의 데이터셋은 6월, 7월, 8월로 월별 분리되어 있었기 때문에, 이를 하나의 데이터로 분석하기 위해 concat 함수를 사용하여 통합하였습니다. 이렇게 합쳐진 데이터셋은 bike_all이라는 이름으로 저장하였습니다.

 

대여일시 컬럼의 경우, datetime으로 형변환시킨 후, 맵핑 함수를 사용하여 요일이름으로 바꾸어 주었습니다.

 

다음으로, hour 값을 추출하여 따릉이 이용 시간을 시각화해보았습니다. 하지만 0시부터 23시까지의 24개 시간대를 그대로 사용하는 것은 오히려 정보 전달에 불필요하게 복잡함을 더할 뿐더러, 시간대별 특징을 파악하기에도 다소 비효율적이라 판단하였습니다. 따라서 분석 목적에 맞게 심야, 출근시간, 오전, 오후, 퇴근시간, 야간 등 주요 시간대 구간으로 나누어 큼직한 범주로 분류하였습니다.

 

이후 bike_all 데이터셋을 확인해보니, weekday, rent_hour, time_slot 컬럼이 아주 잘 만들어져 있는 것을 확인할 수 있었습니다.

0시는 심야 시간대이니 LateNight이라는 time_slot을 갖게 됩니다.

 

아까 위의 스크린샷에서 봤듯이, 따릉이 대여소 데이터셋에는 위도와 경도가 0인 데이터셋이 존재합니다.

일단 이번 시각화에서는 boolean indexing을 이용하여 제거시켜준 카피본을 이용하였지만, 데이터셋 상에서는 주소1, 주소2에 관한 정보가 존재하기 때문에 추후에 다시 진행할때는 저걸 이용하여 잘못 기입된 위도와 경도 값을 보정해줄 계획입니다.

 

 

그 다음으로 데이터프레임에서 대여건수, 반납건수를 집계한 후에 이를 활용하여 혼잡도를 계산하였습니다.

 

혼잡도는 단순한게 다음과 같이 계산하였습니다.

congestion = rent_count - return_count

 

혼잡도가 양수라면 대여 건수가 더 많은 것으로, 해당 대여소의 자전거 양이 줄어들기 때문에 자전거 보충 배치가 필요할 것입니다. 반대의 경우라면, 반납 건수가 더 많기 때문에 해당 대여소에 자전거를 수거 후 재배치를 하기 위한 인력이 투입되어야 할 것입니다.

 

 

이제 이렇게 혼잡도가 계산된 데이터프레임을 위도, 경도 정보를 포함하고 있는 대여소 데이터프레임과 조인시켜주어야 합니다.

 

pandas의 merge() 함수를 활용해 station_id를 기준으로 데이터를 left join 방식으로 병합하였습니다. 이후, 결과 데이터셋의 컬럼들은 추후 .csv 파일로 저장할 때 글자 깨짐이나 인코딩 오류를 방지하기 위해 모두 영문명으로 일괄 변경하였습니다.

 

주소 정보는 주소1과 주소2 두 항목으로 제공되었지만, 이 중 주소1만을 사용하였습니다. 그 이유는 주소1이 "서울특별시 마포구 양화로 93"과 같이 도로명 주소 형식으로 되어 있어 시각화 시 공간적 분포를 파악하기에 충분한 반면, 주소2는 건물명이나 세부 지번 등 과도하게 상세한 정보가 포함되어 있어 오히려 데이터 정리와 분석에 불필요한 복잡성을 유발할 수 있기 때문입니다. 또한, 주소1만으로도 지도 시각화나 구/동 단위 분석에는 무리가 없다고 판단하였습니다.

 

최종적으로 정제된 데이터셋을 csv파일로 다시 변환한 후, 다운받아 Tableau public에 연결해줄 것입니다. 이는 다음 포스트에서 이어서 작성하겠습니다.

'데이터분석 > tableau' 카테고리의 다른 글

서울시 따릉이(2)  (0) 2025.04.17