본문 바로가기

AI & Data analystics/Data

서울시 공영주차장 실시간 현황 지도 만들기 | 데이터 분석 기초(6)

안녕하세요. 데이터 CPA, Cloud입니다.

 

저번 글까지 저희는 데이터 분석의 기초 중 중간정도까지 배워봤습니다.

아래와 같은 과정이었는데, 잘 기억나시나요?


문제 인식  ->  공공사이트 또는 API를 통한 데이터 수집  ->  데이터 형태 파악 및 전처리  ->  EDA

 

이번에는 여태까지 배운 과정에 따르면서, 더 나아가 수집한 데이터를 다듬어 지도에 시각화하고 이를 배포하는 방법을 배워보겠습니다.

 

1. 문제 인식

저는 강남같은 너무 복잡한 곳만 아니라면, 차를 몰고 다니는 것을 선호합니다. 하지만 차를 갖고 나갈 때 가장 신경 쓰이는 것은 주차입니다. 이럴 땐 보통 공영주차장을 먼저 찾게 됩니다. 아무래도 골목에 대는 것보다는 마음이 편하고, 주차요금이 너무 비싸지도 않기 때문이죠. 다만, 보통은 공영주차장이 어디 있는지도 잘 모를뿐더러, 막상 갔더니 너무 복잡해서 돌아 나오는 경우도 있습니다. 따라서 이를 해결하기 위해 공영주차장의 위치를 표시해주고, 실시간으로 남은 자리까지 확인해 주는 웹사이트가 있으면 좋겠다고 생각하였습니다.

 

2. 데이터 수집

서울 열린데이터 광장이라는 사이트가 있습니다. 서울시에서 수집한 대량의 데이터를 제공해 주는 사이트인데요, 들어가서 구경해 보시면 분석해 볼 만한 데이터가 정말 많습니다. 참고로 서울시 외의 데이터는 공공데이터포털에 가시면 더욱 풍부한 자료가 있습니다.

 

열린데이터광장 메인

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

data.seoul.go.kr

 

저희는 여기서, 서울시 시영주차장 실시간 주차대수 정보 API를 이용해보도록 하겠습니다.

 

이제 저희는 API를 앞으로도 자주 사용할 거니까, API 보안을 강화할 수 있도록 하는 방식으로 데이터를 불러와보겠습니다.

작업하려는 폴더에 가서 폴더 주소창에 powershell을 칩니다.

 

그럼 아래와 같은 창이 뜨는데,

여기에 API키를 입력해두면, 재부팅 후에도 유지되는 동시에 내가 쓴 코드를 배포하거나 다른 사람이 이용할 수 있도록 할 때 나도 모르게 나의 API가 유출될 가능성을 차단해 줍니다.

setx SEOUL_OPENAPI_KEY "여기에_본인키_붙여넣기"

 

큰따옴표 사이에 본인의 API키를 넣어 powershell에 입력한 뒤, 창을 닫고 나서 주피터노트북을 실행해 줍니다.

서울 openAPI키가 없으시다면, 이것도 쉽게 발급받으실 수 있습니다!

발급링크

 

이후 주피터노트북에서 키를 불러올 땐 아래와 같이 입력해 주면 됩니다.

import os
API_KEY = os.getenv("SEOUL_OPENAPI_KEY")
print(API_KEY)   # 값이 잘 들어왔는지 확인

 

정보명세서입니다. 이를 바탕으로 데이터를 받아보실 수 있습니다.

아래는 제가 글을 쓰고 있는 시점인 2025년 9월 7일 실시간 주차장 정보입니다.

seoul_parking_realtime.csv
0.06MB

 

3. 전처리

 

1) 완전하지 않은 데이터 걸러내기

총 178개 주차장 중 53개의 데이터가 갱신이 되고 있지 않다는 것을 확인하실 수 있습니다. 또한, G열을 보시면 버스전용주차장 항목들이 많은데(25개), 이는 제가 이용할 가능성은 없어 보입니다. 따라서 이 항목들을 제거하도록 하겠습니다. 모두 제거하니 100개의 주차장이 남습니다.

버스기사님들을 위한 서비스도 나중에 따로 만들어 볼 수 있을 것 같습니다.

 

이처럼 공공데이터를 받더라도 항상 데이터의 불완전한 부분이나 내게 필요없는 부분이 있습니다. 늘 이를 확인하고 전처리 해주어야 합니다. 만약 하지 않고 만든다면, 

이렇게 전체가 비어있다고 나와있는 주차장이 여럿이 되어버립니다. 완전히 잘못된 정보를 전달하는 어플이 완성된 것입니다..

 

전처리 후 데이터가 나타내는 같은 시점의 실시간 현황은 이와 같았습니다. 위엔 있지만 아래에는 없는 곳은 버스 전용이거나 데이터 갱신이 되지 않는 지점들입니다. 대표적으로 윗 사진에 표시된 해방촌 노외 공영주차장은 2025년 2월 28일부로 운영이 종료되어 데이터가 갱신되지 않고 있어서 전처리 된 주차장입니다.

전처리의 중요성을 여실히 느낄 수 있는 경험이었습니다.

 

2) 빈자리(타겟) 열 만들기

현재 칼럼을 보면, 총 주차면수와 현재 주차대수는 있는데, 저희가 보고자 하는 타겟인 남은 빈자리 수는 없으므로 새로 컬럼을 하나 만들겠습니다. 현재 주차 중인 차 대수 또는 총 주차면수 집계가 제대로 되어있지 않은 경우 빈자리가 음수로 나오게 되는데 그 경우, 그냥 빈자리가 없는 것으로 표시되도록 함수를 입력하였습니다. 물론 파이썬으로 쓱 해도 되겠지만, 후에 데이터분석을 해보고 싶을 수 있으니 간단하게 직접 하고 파일을 저장해 두었습니다.

함수식: =if(K2-L2>0,K2-L2,0)

 

 

 

4. 지오코딩(Geocoding) - 카카오 REST API 활용

이제 가장 중요한 마지막 단계입니다.

주차장 정보를 지도에 나타내기 위해선 우선 지오코딩(geocoding)을 해야 합니다.

저희가 갖고 있는 정보에는 위도, 경도가 없어 지도에 정확히 나타낼 수가 없기 때문에 위도, 경도 데이터를 다른 곳에서 가져와서 지도에 점을 찍는 것이죠.

 

저희는 카카오맵에서 해당 데이터를 가져올 것이니, 카카오API 키를 발급받아야 합니다.

카카오 개발자 홈페이지에 들어가서, 회원가입, 로그인을 합니다.

(가만히 앉아서 수많은 데이터를 얻을 수 있는 것이니 귀찮음을 잠시 접어두고...)

 

Kakao Developers

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

developers.kakao.com

위쪽 메뉴를 보면 "앱"이라는 게 있는데, 들어가서 오른쪽에 파란색 +앱 생성을 눌러 아래와 같이 앱을 만듭니다. 요구 사항 중 이미지는 생략해도 되고, 내용도 적당히 채워 넣으시면 됩니다.

어플 하나 뚝딱 만드는 거, 어렵지 않죠?

 

앱을 만드셨다면, 들어가서 아래 사진과 같이 제품설정 - 카카오맵 으로 가신 뒤 오른쪽의 사용설정 상태를 ON으로 바꿔주셔야 합니다. 이럼 이제 카카오맵 데이터를 가져올 준비는 끝났습니다.

 

왼쪽 메뉴 중 앱 - 일반으로 가셔서 스크롤을 조금 내리시면 '앱 키'라는 항목을 보실 수 있습니다. 이 중 REST API키를 복사해서 가져오시면 됩니다.

 

발급받은 REST API키를 아까처럼 powershell에다가 영구히 저장해 두겠습니다.

setx KAKAO_REST_KEY "여기에_본인키_붙여넣기"

 

전처리된 파일과 위의 API를 이용해서 각 주차장마다 위도와 경도 정보를 입력해줍니다.

아래는 이를 위한 코드와 결과물입니다.

지오코딩.ipynb
0.00MB
seoul_parking_realtime_with_coords.csv
0.04MB

 

 

5. 시각화 (Folium 활용)

그럼 이제 모든 준비물이 갖춰졌습니다.

 

1. 전처리된 주차장 정보를 바탕으로,

2. 카카오맵에서 위도와 경도를 가져와 Folium을 활용하여 지도에 나타낸 뒤에, 

3. 서울 열린데이터광장에서 빈자리 정보를 계속 불러와 지도 위에 주차장과 함께 나타낼 겁니다.

4. 지도 내에선 주차장 이름이 검색가능하도록 하고, 남은 빈자리 개수에 따라 신호등 색깔로 표시하며,

5. 새로고침 버튼을 누를 때만 그 시간의 실시간 정보가 갱신되도록 하겠습니다. 이렇게 하지 않으면 프로그램이 정보를 계속해서 불러와서, 금방 하루 호출 제한량이 끝나고 말 겁니다. API를 활용할 땐 이렇게 늘 호출량을 관리하는 시스템을 생각해야 합니다.

 

아래는 그 결과를 보여주는 화면입니다.

 

FinalReal.ipynb
0.31MB

 

전체 코드를 올려드립니다.

 

1) 이용하기 전에, 위젯을 쓴 적이 없다면 아래 코드를 먼저 실행해 줍니다. 그럼에도 잘 작동하지 않는다면 커널을 재시작해줍니다.

pip install pandas requests folium ipywidgets

 

2) 첫 셀에서 이번 프로젝트를 위한 폴더 위치, 지오코딩이 완료된 파일명을 수정해 주시면 됩니다. 지오코딩이 완료된 파일은 글 아래쪽에 첨부해 두었습니다.

 

3) API키는 환경변수를 powershell에서 저를 따라오시면서 그대로 설정하셨다면 추가로 할 것은 없습니다.

    혹시나, 본인의 컴퓨터가 아니라면, 이번 세션에서만 유지되도록 하는 환경변수를 이용해야 합니다. (끄면 지워지도록)

$env:SEOUL_OPENAPI_KEY="여기에_서울열린데이터_키"
$env:KAKAO_REST_KEY="여기에_카카오_REST_키"   # 지오코딩/보정할 때만 필요

 

 

이번 글의 핵심을 정리하자면,

1. 해결하고 싶은 문제를 인식하고 나면, 공공데이터포털이나 서울열린데이터광장에서 관련 데이터를 찾아보면 됩니다.

    (나중에 쓸만한 데이터를 구할 수 있는 곳을 정리해서 올려두겠습니다.)

 

2. 데이터를 받은 다음엔 늘 데이터의 형태를 확인하고 필요한 전처리를 해주어야 합니다.

 

3. 데이터를 지도에 나타내고 싶다면 좌표를 알아야 하고, 이를 위해 카카오맵을 활용한 지오코딩을 해보았습니다.

 

4. 만들고자 하는 서비스의 개요는 구체적일 수록 좋습니다. 요즘은 GPT에게 시키기만 해도 코딩을 해주는데, 구체적으로 지시할 수록 내가 원하던 결과물이 나올 확률이 높아집니다.

 

다음 글에서는,

이렇게 만든 기능을 본인의 핸드폰이나 다른 사람들도 확인할 수 있도록 배포하는 법을 다뤄보겠습니다.

 

 

 

필수는 아니지만 중요한 추가 정보들

1) 카카오맵을 통해 위도 경도를 받는데, 서울시데이터에서 주차장 주소가 동일한 형식으로 되어있지 않아 9건의 좌표를 읽지 못했습니다. 따라서 이는 수동으로 찾아주어야 했는데,

Seoul_Parking_Geocode_Fixer.ipynb
0.01MB

 

이 코드를 실행하고 주소를 직접 확인한 뒤 뒷부분을 제대로 입력해 주면

이와 같이 좌표값이 추가로 저장됩니다.

잘 따라오셨다면, 아래 첨부파일과 같이 좌표까지 저장된 파일을 얻으실 수 있습니다.

seoul_parking_realtime_geocoded.csv
0.04MB

 

 

2) GPT 프롬프트

 

코딩 결과는 위에 올려두었지만, GPT를 이용하여 직접 코딩을 해보고 싶으신 분들을 위해 참고용 프롬프트 올려두겠습니다.

 

ⓐ 지오코딩을 위한 프롬프트(API활용)

(서울시열린데이터광장에서 받은 파일 첨부)
안녕 이건 서울시 공영주차장의 실시간 주차 대수 데이터야. 나는 이 파일에다가 C열에 있는 각 주차장의 ADDR을 바탕으로 위도와 경도 정보를 가져와서 추가하고 싶어. KAKAO_REST_KEY 환경변수에 API키는 저장해뒀고, 이걸 이용해서 카카오맵에서 정보 가져오는 코드 작성해줄래? 주피터노트북으로 작업할거고, 폴더위치는 C:\Users\LG\Desktop\블로그\서울시공공주차장\연습 파일명은 seoul_parking_realtime 이야

 

ⓑ 시각화 및 세부기능 추가

서울시열린데이터포털의 시영주차장 정보 API 명세서 첨부
위에서 위도 경도 추가하고 전처리한 데이터 파일 첨부

안녕. 나는 이 파일을 바탕으로 서울시 지도에 서울시영주차장 위치를 시각화하고, API를 통해 실시간으로 빈자리 정보를 받아서 표시하고 싶어. K열은 전체 자리 L열은 이용중 M열은 빈 자리 인데, M열을 제외한 정보는 저 명세서에 적힌 API를 이용해서 받은 거야. 따라서 K열, L열 정보를 받은 다음에 M열을 계산해서 지도에 표시해야해.

API는 SEOUL_OPENAPI_KEY 라고 환경변수에 저장해뒀어. seoul_parking_realtime.csv파일은 내가 전처리를 해둔 상태야. 그러니 지금 저 파일에 남은 100개 주차장 항목들에 대해서만 표시하고, 새로 정보를 받으면 돼. 지오코딩 결과는 캐시로 남겨서 다음에 켰을 때 빠르게 실행되도록 하고 싶어.

주차장 이름이 검색 가능하도록 하고, 남은 빈자리는 갯수에 따라 색깔로 표시해줘. 초록: 여유 충분 (가용률 40% 이상) 주황: 애매 (10~40%) 빨강: 거의 만차 (10% 미만) 회색: 정보 없음 이정도면 될 것 같아. 검색창에 주차장 이름의 일부를 치면, 그 주차장이 바로 표시되도록 하고 싶어.

폴더 위치는 C:\Users\LG\Desktop\블로그\서울시공공주차장\연습
파일명은 seoul_parking_realtime.csv
터미널(powershell)과 주피터노트북 이용하려고 해.

위 사항들 모두 반영해서 코드 짜줄래?

 

ⓒ 디버깅

GPT를 이용한 코딩은 늘 오류에 부딪히게 됩니다. 이 때는 오류화면을 스크린샷을 찍거나 복사해서 다시 물어보면 됩니다. 이 과정을 반복하다보면 결국 원하는 결과가 나오게 됩니다. 더 빠르고 더 정확하게 원하는 결과를 뽑아내는 것이 새 시대의 코딩 능력의 기준이고, 이를 위해서는 그래도 공부를 해야 하는 것 같습니다.