🤪

디비스캔(DBSCAN) 엉뚱하게 쓰기 - 서울 지도를 군집화

DBSCAN으로 한강 이북과 이남 지역을 나눠 군집화할 수 있을까?

DBSCAN 알고리즘 쉽게 이해하기

머신러닝 군집화(클러스터링) 알고리즘을 공부하면 중후반부에는 디비스캔DBSCAN을 공부하게 됩니다.
디비스캔은 특정 공간 내의 데이터 밀도 차이를 기반으로 분류하는 알고리즘으로, 약자는 길어서 생략 ...
Density Based Spatial Clustering of Applications with Noise ...
데이터 밀도 기반??
→ '데이터가 몰려 있으면 그 방향대로 군집화한다' 라고 받아들이면 빠른 이해가 가능합니다.
위 이미지는 결과적으로는 파란 원주황색 원으로 군집화가 완료되었습니다.
겉 동그라미속 동그라미 사이에 거리가 있어서, (즉 그 사이엔 데이터가 없고, 그래서 데이터 밀도가 없는) DBSCAN 알고리즘이 둘을 다르게 군집화한 것입니다.
데이터로부터 가까이 또 다른 데이터가 있다면, 그걸 포섭하는 것입니다.
그렇다면 알고리즘의 하이퍼 파라미터 역시 예상이 가능합니다.
1.
얼마나 떨어져있어도 포섭할 것인가?
2.
해당 거리 안에 데이터가 몇 개나 있어야 포섭 할 만하다고 보는가?
알고리즘과 구성요소 이해하기 (클릭)
하지만 김문과는 DBSCAN을 공부하고 난 뒤 엉뚱한 생각에 빠지게 되는데 ...

거리 기반? xy좌표평면? ... 지도map도 결국 좌표평면이 아닌가?

"입실론 반경" 개념이 점과 점 사이의 거리라는 점에 착안하여,
x축과 y축 좌표평면에도 응용할 수 있겠다는 생각을 했고,
그렇다면 세상에서 가장 큰 좌표평면인 위경도의 지도를 사용해도 재밌겠다는 생각이 들었습니다.
머신러닝 학회 스터디 발표 때 실제로 쓴 슬라이드 등판
그렇다면, 서울 지도가 한강을 기준으로 남북으로 나뉘어져 있으니,
한강 북쪽과 남쪽의 데이터들은 DBSCAN에 의해 나뉘어 군집화 될 수 있지 않을까요?
바로 테스트에 들어갔습니다.

토이 프로젝트 절차와 1차 삽질

구상한 절차는 다음과 같습니다.
1.
위치 값을 가진 데이터가 "충분히" 많아야한다. 다만 너무 많아도 무거워져서 문제. → 서울에는 카페가 많을테니까 공공데이터로 불러와 카페들 주소를 찍으면, 수천 개가 찍히기 때문에 충분히 서울 지도처럼 보이게 된다
→ 공공데이터를 다운받아 맵핑한다
2.
임의의 입실론과 파라미터값을 주고 강북과 강남으로 나뉘어 본 뒤 실패하면 파라미터값들을 조절해본다
(실제 지도 축척에는 어떤 입실론 값이 적당한지 알지 못했음)
3.
가설이 맞는지 확인한다
서울시 카페 매장 위치 데이터 다운로드 및 맵핑 코드
사이킷런을 통한 DBSCAN 실행 코드
중간 결과 보기 :
뭔 가 이 상 하 다
원래 의도했던, 한강 중심으로 DBSCAN이 클러스터링을 한 게 아닌,
강서구쪽을 조금 (빨간색) 구분지었고 + 서울 외곽 부분에 산발적으로 있는 멀리 떨어진 데이터들을 노이즈로 인식했다.
왜 실패했을까?? → folium 패키지를 이용해서 자세한 지형 + 지도로 같이 확인해보자.
지도 세팅 코드
흐음....
DBSCAN 실패 원인 파악하기
1.
한강 다리에도 카페들이 있어서 이어져버렸다
2.
의외로 한강 폭이 좁은 반포대교….
3.
한강으로 나누기엔, 그린벨트나 산 등 서울 외곽 쪽 카페들이 더 뚝 떨어져있다. 정확한 학습이 불가능.

이대로 좌절할 순 없다. 2차 시도 (영등포구 - 마포구만 따로)

서울 전체는 데이터가 방대해 어려우니, 한강을 두고 마주한 2개 행정구만 따로 진행해본다.
세팅 코드
다행히 결과는 성공적이었다!
김문과의 데이터
직접 공부한 데이터 분석 · 활용법을 기록합니다.
포스팅에 대한 Q&A 및 다양한 논의를 기다립니다. contact or email