brunch

You can make anything
by writing

C.S.Lewis

by 스토너 Dec 19. 2022

데이터와 일상 - 우리 동네 옷체통 위치를 시각화해보자

실생활 데이터 분석 프로젝트

전에 모 출판사에서 실생활에서 의미있는 데이터를 가지고 분석 프로젝트를 해보는 게 어떻냐는 출간 제의가 온 적이 있습니다. 


긍정적인 답변을 드리긴 했지만 개인적으로 시간을 내기가 힘들어 유야무야 엎어지고 말았습니다.


언젠가 시간이 된다면 여러가지 다양한 재미있는 주제로 데이터를 분석한 책을 출간해보고 싶어

실생활에서 쉽게 찾아볼 수 있는 주제로 데이터를 시각화 해보도록 하겠습니다.


사실 데이터 분석을 하는 이유도 우리가 살아가는 실질적인 삶이나 비즈니스에 도움이 되기 위해서라고 생각합니다.






'우리 동네 옷체통 찾기'로 주제를 잡았지만 '옷체통'이란 단어가 생소하신 분들도 계실 것 같습니다. 


'옷체통'은 서초구에서 사용하는 용어로 의류수거함 대신 '옷+우체통'이라는 합성어로 이미지와 의미를 담았다고 합니다.



옷체통 이미지  출처 : 한강 Times


의류를 버리러 나갈 때 옷체통을 찾아 나서는데 주변에 지나갈 때 흔히 보이지만 막상 찾아서 버리려고 하면 어디 있는지 기억이 잘 나지 않더라고요. 


또 그 위치도 정기적으로 바뀌는 것 같았습니다.

어플이나 따로 네이버 지도에서도 검색해도 나오지 않고요.


그래서 옷체통 위치 데이터를 가지고 지도로 시각화하여 어디에 위치해 있는지 알아보려고 합니다.

옷체통 위치 데이터는 서초 구청에서 다운받아왔습니다.



옷체통 위치 data


사이트 : https://www.seocho.go.kr/site/seocho/04/10413041300002020041010.jsp

최종 수정일 2022-09-13


엑셀 파일의 데이터의 모양은 이렇습니다.



위도, 경도가 없어 지도에 시각화하기 어렵네요.

주소를 위,경도로 변환하는 과정이 필요합니다.


위, 경도로 변환할 수 있는 방법은 다양한데요,

지오코딩프로그램을 사용하거나 geopy 패키지, 또는 맵 서비스 API를 이용해도 되고요.

아니면 엑셀에서 Google sheet로 저장>확장프로그램>geocode>start를 사용해도 변환 가능합니다.


지오코딩(Geocoding)이란 고유명칭(주소나 산,호수의 이름등)을 가지고 위도와 경도의 좌표값를 얻는 것을 말합니다.


우선 geopy 라이브러리를 사용해서 위경도를 구해보기로 했습니다.

geopy 설치후 라이브러리를 import해줍니다.



엑셀 데이터를 불러와 불필요한 데이터를 삭제하고 칼럼을 지정해주었습니다.



다음 Geocoding 함수를 정의하여 우선 주소 데이터 1개만 넣어봤습니다.



구한 위경도로 네이버 지도에 찍어보았습니다. 



실제로는 서초1동 1610-4가 나와야 하는데 geopy로 구한 위경도로 네이버 지도에 찍어보니 다른 주소로 나옵니다. 도로명으로 바꿔서 넣어도 마찬가지입니다.


구글맵에 찍어보니 마찬가지로 위,경도 주소지는 다르게 나옵니다.



geopy에서 south Korea로 지역 설정했을 때 주소지명과 위경도가 정확하지 않은 걸 보니 사용하면 안될 것 같네요.


지오코딩 프로그램을 사용할까 했지만 이번에는 네이버 API 지오코딩 기능을 한번 사용해보려고 합니다. 


네이버 지오코딩 API 사용하기 위해 콘솔가입 후 Application 설정에서 Geocoding에 체크합니다.


네이버 Geocoding API



Geocoding API 사용시 최대 경유지 검색 5개 기준 6만건이 초과되면 5원, 15개 기준 3000건 초과될 시 20원이 과금됩니다.  

제가 사용하려고 하는 기능은 그 정도 범위로 서비스를 이용하려는 게 아니니 무료로 사용 가능할 것 같습니다.


Geocoding 서비스 이용 요금



Geocoding 개요 (ncloud-docs.com)


Application을 생성하여 Client ID와 Client Secret을 발급 받습니다.



requests와 Json을 Import하여 Naver API Json을 파싱합니다. 

우선 '사임당로 8길 29' 주소지 데이터를 넣어서 위,경도 좌표가 제대로 나오는지 확인하려고 합니다.



헤더에 발급받은 Client Key와 Client Secret을 문자열을 넣어서 데이터를 요청합니다.

정상적으로 응답 시 map_data 변수로 JSON 데이터를 호출합니다.


addresses에 x(경도), y(위도) 값을 확인합니다.

여기서 x는 경도 y가 위도입니다.


네이버 지도에 y, x 순서대로 값을 입력하니 주소지 위치가 정상적으로 나왔습니다. 


이번에는 불러온 전체 엑셀데이터 값을 한꺼번에 위경도 값으로 변환해보겠습니다.


엑셀 자체 내에서 데이터를 다루는 openpyxl라이브러리로 구현해도 되지만 

데이터 분석은 pandas 데이터프레임이 더 간편합니다. 


앞서 불러온 데이터프레임의 도로명 주소 컬럼을 반복문으로 데이터를 호출하니 186번째 데이터에서 오류가 발생합니다.





도로명 주소를 확인해보니 '강남대로 23길 72'입니다.

데이터를 호출해보니 비어 있습니다.

없는 데이터를 불러오려고 하다보니 오류가 발생한 것입니다.



반면 똑같은 주소를 지번 주소로 바꿔서 넣어보니 호출이 됩니다.


도로명주소 대신 '동' 칼럼과 '지번주소' 칼럼을 문자열로 타입 변경하여 내용을 합친 칼럼을 'address'열로 추가해줬습니다.



'address'칼럼 주소로 돌려보니 169번째 '방배4동 840-28'주소 위경도 값을 호출할 때 오류가 발생합니다.

도로명으로 변환한 주소를 호출해보니 값이 나오네요.


도로명주소 혹은 지번주소로 호출할 때 하나가 비어 있으면 'address'열의 지번 주소 또는 도로명 주소로 호출하는 로직을 구현해야 합니다.


client key, client secret 블러 처리


호출한 지번주소 값이 비어 있으면 도로명 주소로 바꿔서 위,경도 값을 리스트에 추가하는 것으로 로직을 변경했습니다. 


리스트 자료형에 들어간 위경도 값 갯수를 확인해보니 모두 250개로 전체 주소지 갯수와 같습니다.



위경도 좌표값을 넣은 리스트를 데이터프레임으로 변환합니다.


지번주소로 오류가 났던 169번째 방배동 849-28번지 주소를 도로명 주소로 바꿔 호출한 위경도 값으로 네이버 지도에 찍어봤습니다.



지번주소로 확인해보니 맞게 잘 나오네요.





데이터 지도 시각화


이번엔 위경도로 변환한 값을 지도 시각화해보겠습니다.

folium을 설치하고 import해줍니다.

서초구청 위경도 값을 가지고 지도를 생성하였습니다.


생성한 지도에 위경도 데이터를 모두 지도에 표시해봅니다.

folium엔 yellow 색이 없어 lightred color로 표시하였습니다.



우리 동네를 지도로 확대해보면 옷체통이 설치된 자세한 위치를 지도로 확인할 수 있습니다.



옷체통 위치 지도 시각화하는 간단한 토이 프로젝트를 해보았습니다.

좀더 이어서 해본다면 서버에 webapp구현해서 지도를 띄워보는 것도 좋겠네요.


데이터 분석은 jupyter notebook이 단계 별로 과정을 보면서 하는 게 편하지만

함수 기능을 구현하거나 중간에 오류가 날 때 디버깅이 불편합니다.


이럴 땐 pycharm을 쓰고 싶지만

두가지 툴을 번갈아 사용하기도 불편해서

어쩔 수 없이 jupyter notebook으로만 사용하기도 합니다.


브런치는 가볍게 ebook을 내기엔 좋은 플랫폼이지만

개발 친화적인 플랫폼이 아니네요. 


코딩하는 과정을 소스코드로 일일이 GitHub Gist에 붙여서 링크를 첨부하기도 매우 번거로울 뿐더러

분석하는 과정은 스크린샷을 떠서 이미지로 첨부해야 하니까요.


이부분이 개선되면 좀 더 많은 IT 전문가들이 유입될텐데 하는 생각입니다.







브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari