
▶ 이전 게시글 보기
2024.07.14 - [분류 전체보기] - 공모전 | 서울시 공공자전거 데이터셋, 분석 방향, EDA
공모전 | 서울시 공공자전거 데이터셋, 분석 방향, EDA
EDA 및 전처리 코드_주피터 노트북1. 데이터셋 서울시 공공자전거 대여이력 정보 (2023.08~2023.12)https://data.seoul.go.kr/dataList/OA-15182/F/1/datasetView.do 열린데이터광장 메인데이터분류,데이터검색,데이터
nasena.tistory.com
▶ 군집분석 코드_주피터 노트북
4. k-means 군집분석 모델링
4-1) 모델링 전 전처리
▶ 내국인 데이터 샘플링
내국인 데이터가 너무 커서 샘플링 진행 → 전체 데이터의 50% 추출 (절반)
성별, 연령대, 대여월 기준 층화 추출
import pandas as pd
from sklearn.model_selection import train_test_split
# train_test_split 층화 추출
_, stratified_sample = train_test_split(df_in, test_size=0.5, stratify=df_in[['성별', '연령대', '대여월']], random_state=42)
# 추출된 데이터 확인
print(stratified_sample.head())
# 결과를 파일로 저장
stratified_sample.to_csv('./서울시 따릉이 내국인 데이터(층화추출1).csv', index=False)
▶ 대여구, 반납구 간단 EDA
외국인 | 내국인 | 비고 | |
대여구 | ![]() |
![]() |
(외국인) 중구 > 종로구 > 마포구 > 용산구 (내국인) 강서구 > 영등포구 > 송파구 > 양천구 |
반납구 | ![]() |
![]() |
(외국인) 중구 > 종로구 > 마포구 > 용산구 (내국인) 강서구 > 영등포구 > 송파구 > 양천구 |
4-2) 특성추출
대여소 별,
외국인 | 사용 컬럼 | 특성 기준 |
총대여횟수 | 대여일자 | count |
평균 이용시간 | 이용시간(분) | mean |
평균 이용거리 | 이용거리(M) | mean |
주말 대여 비율 (<> 주중 대여 비율) | 주말여부 | 주말 1, 주중 0 |
새벽 대여 비율 | 새벽시간 | 0시 ~ 7시 |
오전 대여 비율 | 오전시간 | 7시 ~ 10시 |
점심 대여 비율 | 점심시간 | 10시 ~ 14시 |
오후 대여 비율 | 오후시간 | 14시 ~ 18시 |
저녁 대여 비율 | 저녁시간 | 18시 ~ 22시 |
야간 대여 비율 | 야간시간 | 22시 ~ 24시 |
대여소 별,
내국인 | 사용 컬럼 | 특성 기준 |
총대여횟수 | 대여일자 | count |
평균 이용시간 | 이용시간(분) | mean |
평균 이용거리 | 이용거리(M) | mean |
남성고객 비율 (<> 여성고객 비율) | 성별_M | 남자 1, 여자 0 |
주말 대여 비율 (<> 주중 대여 비율) | 주말여부 | 주말 1, 주중 0 |
새벽 방문고객 비율 | 새벽시간 | 0시 ~ 7시 |
출근시간 대여 비율 | 출근시간 | 7시 ~ 10시 |
오전시간 대여비율 | 오전시간 | 10 ~ 12시 |
점심시간 대여 비율 | 점심시간 | 12 ~ 14시 |
오후시간 대여 비율 | 오후시간 | 14 ~ 17시 |
퇴근시간 대여 비율 | 퇴근시간 | 17 ~ 19시 |
야간 대여 비율 | 야간시간 | 19 ~ 24시 |
주중 청소년고객 비율 | 주말여부, 연령대 | 주말 0, 청소년 : 10대 |
주말 청소년고객 비율 | 주말여부, 연령대 | 주말 1, 청소년 : 10대 |
주중 청년고객 비율 | 주말여부, 연령대 | 주말 0, 청년 : 20대, 30대 |
주말 청년고객 비율 | 주말여부, 연령대 | 주말 1, 청년 : 20대, 30대 |
주중 장년고객 비율 | 주말여부, 연령대 | 주말 0, 장년 : 40대, 50대 |
주말 장년고객 비율 | 주말여부, 연령대 | 주말 1, 장년 : 40대, 50대 |
주중 노인고객 비율 | 주말여부, 연령대 | 주말 0, 노인 : 60대, 70대 |
주말 노인고객 비율 | 주말여부, 연령대 | 주말 1, 노인 : 60대, 70대 |
대여소 별,
그 외 |
특정 요일의 대여 횟수 |
특정 시간대의 대여 횟수 |
청년고객 비율 |
장년고객 비율 |
대여소별 평균 연령대 |
주중 해당 대여구 고객 비율 |
주말 해당 대여구 고객 비율 |
주중 해당 반납구 고객 비율 |
주말 해당 반납구 고객 비율 |
4-3) 군집 분석 (k-means clustering)
▶ k-means와 DB scan 군집분석 비교
K-means 군집분석과 DBSCAN은 둘 다 군집화 알고리즘
K-means 군집분석
특징:
K-means는 데이터셋을 k개의 군집으로 나누는 알고리즘
각 군집은 중심점(centroid) 주변에 데이터가 모이는 형태
군집 수 k를 미리 지정해야 함
중심점을 반복적으로 이동시켜 군집을 최적화함
장점:
계산 속도가 빠르고 대규모 데이터셋에 적합.
이해하기 쉽고 구현이 간단
단점:
군집 수 k를 사전에 지정해야 함
군집의 모양이 구형(원형)에 가까운 경우에만 잘 작동함
이상치(outlier)에 민감함
사용 사례:
고객 세분화: 마케팅에서 고객을 구매 행동에 따라 여러 그룹으로 나눌 때
이미지 압축: 이미지를 여러 색상 군집으로 나누어 색상 수를 줄일 때
##################################3
DBSCAN (Density-Based Spatial Clustering of Applications with Noise)
특징:
DBSCAN은 밀도 기반 군집화 알고리즘
군집의 모양이 불규칙해도 잘 작동함
두 개의 주요 매개변수: ε (epsilon)과 minPts (최소 포인트 수)
ε: 점이 군집에 포함되기 위한 최대 거리
minPts: 군집을 형성하기 위한 최소 포인트 수
이상치(outlier)를 자연스럽게 구분함
장점:
군집 수를 사전에 지정할 필요가 없음
이상치와 노이즈를 효과적으로 처리함
다양한 형태의 군집을 찾을 수 있음
단점:
매개변수 ε와 minPts를 선택하기 어려움
고차원 데이터에서는 성능이 떨어질 수 있음
사용 사례:
지리적 데이터 분석: GPS 데이터를 이용해 사람들이 자주 모이는 장소를 찾을 때
이상치 탐지: 금융 거래 데이터에서 의심스러운 활동을 탐지할 때
########################
사용 사례 비교
K-means를 사용할 때:
데이터가 비교적 균일하고 군집의 크기가 비슷한 경우
군집의 수를 미리 알고 있는 경우
계산 자원이 한정되어 있고, 빠른 결과가 필요한 경우
DBSCAN을 사용할 때:
데이터가 불규칙한 형태로 분포되어 있는 경우
군집의 수를 미리 알 수 없는 경우
이상치가 많고, 이들을 제외하고 군집을 형성하고자 하는 경우
예시
K-means 예시:
온라인 쇼핑몰에서 고객의 구매 데이터를 분석해 여러 고객 군집을 만들고, 각 군집에 맞춘 마케팅 전략을 수립할 때. 예를 들어, 5개의 군집으로 나누어 각 군집에 맞는 맞춤형 이메일 캠페인을 진행할 수 있음
DBSCAN 예시:
도시 내 GPS 데이터를 분석해 사람들이 자주 모이는 장소를 찾고자 할 때. DBSCAN은 사람들이 자주 모이는 장소(군집)를 찾아내고, 동시에 드물게 나타나는 이상치(이동 경로)를 제거하는 데 유용함
▶ k-means 군집분석
(1) 최적의 k 찾기
외국인 | 내국인 | |
Elbow method | ![]() |
![]() |
silhouette_score | ![]() |
![]() |
(2) 대여소 군집 결과 시각화
외국인 | 내국인 | |
k = 2 | ![]() |
![]() |
k = 3 | ![]() |
![]() |
k = 4 | ![]() |
![]() |
(3) 군집 분석 결과 해석
▶외국인
k=2

- 군집 0 : 평균이용시간, 평균이용거리, 주말대여비율, 오후대여비율
- 군집 1 : 총대여횟수, 새벽대여비율, 오전대여비율, 점심대여비율, 저녁대여비율, 야간대여비율
군집 0은 본격적으로 따릉이로 여행하려는 외국인 관광객들
군집 1은 가볍게 이동하기 위한 목적으로 따릉이를 이용하는 외국인 관광객들
k=3

- 군집 0 : 평균이용거리, 주말대여비율, 오후대여비율
- 군집 1 : 새벽대여비율, 점심대여비율, 저녁대여비율, 야간대여비율
- 군집 2 : 총대여횟수, 평균이용시간, 오전대여비율
k=4

- 군집 0 : 평균이용거리, 주말대여비율, 오후대여비율
- 군집 1 : 점심대여비율, 저녁대여비율, 야간대여비율
- 군집 2 : 총대여횟수, 평균이용시간, 오전대여비율
- 군집 3 : 새벽대여비율
▶ 내국인
첫 번째 시도.
다양한 특성 + 청년 기준 20~30대
k=2
![]() |
![]() |
- 군집 0 : 총대여횟수, 새벽대여비율, 퇴근시간대여비율, 야간대여비율, 주중청년고객비율, 주말청년고객비율, (여성고객비율), (주중대여비율)
- 군집 1 : 남성고객비율, 평균이용시간, 평균이용거리, 주말대여비율, 출근시간대여비율, 오전대여비율, 점심대여비율, 오후대여비율, 주중청소년고객비율, 주말청소년고객비율, 주중장년고객비율, 주말장년고객비율, 주중노인고객비율, 주말노인고객비율
k=3
![]() |
![]() |
- 군집 0 : 총대여횟수, 새벽대여비율, 야간대여비율, 주중청년고객비율, 주말청년고객비율, (여성고객비율), (주중대여비율)
- 군집 1 : 남성고객비율, 주말대여비율, 출근시간대여비율, 주중청소년고객비율, 주말청소년고객비율
- 군집2 : 평균이용시간, 평균이용거리, 오전대여비율, 점심대여비율, 오후대여비율, 퇴근시간대여비율, 주중장년고객비율, 주말장년고객비율, 주중노인고객비율, 주말노인고객비율
군집 0은 주중 청년들이 새벽, 야간에 많이 이용
군집 1은 주말이나 출근(통학)시간에 청소년 위주로 많이 이용
군집 2는 오전~점심~저녁까지 장년 위주로 따릉이를 장시간, 장거리로 이용
k=4
![]() |
![]() |
- 군집0 : 총대여횟수, 야간대여비율, 주중청년고객비율, 주말청년고객비율, (여성고객비율)
- 군집1 : 남성고객비율, 오전대여비율, 점심대여비율, 오후대여비율, 퇴근시간대여비율, (주중대여비율)
- 군집2 : 평균이용시간, 평균이용거리, 주말대여비율, 새벽대여비율, 주말장년고객비율, 주중노인고객비율, 주말노인고객비율
- 군집3 : 출근시간대여비율, 주중청소년고객비율, 주말청소년고객비율
군집 0은 야간에 청년들이 많이 이용
군집 1은 주중 오전~점심~오후~퇴근시간대에 이용
군집 2는 주말 장년 위주로 장시간, 장거리 이용
군집 3은 출근(통근)시간대에 청소년 위주로 이용
두 번째 시도.
다양한 특성 + 청년1 기준 20, 청년2 기준 30대로 구분
*이유 : 20대와 30대의 따릉이 이용 상황이 다를 수 있겠다고 판단
(1) 최적의 k 찾기
Elbow method | silhouette_score |
![]() |
![]() |
(2) 대여소 군집 결과 시각화
k=2 | k=3 | k=4 |
![]() |
![]() |
![]() |
(3) 군집 분석 결과 해석
k=2
![]() |
![]() |
- 군집 0 : 총대여횟수, 퇴근시간대여비율, 야간대여비율, 주중청년1고객비율, 주말청년1고객비율, 주중청년2고객비율, 주말청년2고객비율, (여성고객비율), (주중대여비율)
- 군집 1 : 남성고객비율, 평균이용시간, 주말대여비율, 새벽대여비율, 출근시간대여비율, 오전대여비율, 점심대여비율, 오후대여비율, 주중청소년고객비율, 주말청소년고객비율, 주중장년고객비율, 주말장년고객비율, 주중노인고객비율, 주말노인고객비율
k=3
![]() |
![]() |
- 군집 0 : 총대여횟수, 새벽대여비율, 야간대여비율, 주중청년1고객비율, 주말청년1고객비율, 주중청년2고객비율, 주말청년2고개비율, (여성고객비율)
- 군집 1 : 주말대여비율, 출근시간대여비율, 오후대여비율, 주중청소년고객비율, 주말청소년고객비율
- 군집 2 : 남성고객비율, 평균이용시간, 평균이용거리, 오전대여비율, 점심대여비율, 퇴근시간대여비율, 주중장년고객비율, 주말장년고객비율, 주중노인고객비율, 주말노인고객비율, (주중대여비율)
k=4
![]() |
![]() |
- 군집 0 : 총대여횟수, 야간대여비율, 주중청년1고객비율, 주말청년1고객비율, (여성고객비율)
- 군집 1 : 출근시간대여비율, 오후대여비율, 주중청소년고객비율, 주말청소년고객비율
- 군집 2 : 남성고객비율, 오전대여비율, 점심대여비율, 퇴근시간대여비율, 주중청년2고객비율, 주말청년2고객비율, (주중대여비율)
- 군집 3 : 평균이용시간, 평균이용거리, 주말대여비율, 새벽대여비율, 주중장년고객비율, 주말장년고객비율, 주중노인고객비율, 주말노인고객비율 → (관광, 생활)
세 번째 시도.
특성(피처) 단순화 작업 + 청년 기준 20~30대
* 이유 : [주말대여비율] 컬럼이 있는데 주중/주말로 연령대를 세분화하면 특성이 중복된다 판단
(1) 최적의 k 찾기
Elbow method | silhouette_score |
![]() |
![]() |
(2) 대여소 군집 결과 시각화
k=2 | k=3 | k=4 |
![]() |
![]() |
![]() |
(3) 군집 분석 결과 해석
k=2

- 군집 0 : 총대여횟수, 평균이용시간, 주말대여비율, 새벽대여비율, 퇴근시간대여비율, 야간대여비율,
청년비율, (여성고객비율) - 군집 1 : 남성고객비율, 평균이용거리, 출근시간대여비율, 오전대여비율, 점심대여비율, 오후대여비율,
청소년비율, 장년비율, 노인비율, (주중대여비율)
군집 0은 주말 퇴근시간대 이후 저녁까지 청년들이 장시간 많이 이용
군집 1은 주중 출근시간~점심~오후까지 청소년, 장년 위주로 장거리로 이용
k=3 >> 최종 군집 분리 기준으로 선정!

- 군집 0 : 총대여횟수, 새벽대여비율, 야간대여비율, 청년비율 → (막차대용?)
- 군집 1 : 남성고객비율, 출근시간대여비율, 오전대여비율, 점심대여비율, 청소년비율, 장년비율, (주중대여비율)
→ (생활) - 군집 2 : 평균이용시간, 평균이용거리, 주말대여비율, 오후대여비율, 퇴근시간대비율, 노인비율, (여성고객비율)
→ (관광)
k=4

- 군집 0 : 총대여횟수, 야간대여비율, 청년비율 → (막차대용?)
- 군집 1 : 새벽대여비율, 출근시간대여비율, 청소년비율 → (통학)
- 군집 2 : 평균이용시간, 평균이용거리, 주말대여비율, 노인비율 → (관광)
- 군집 3 : 남성고객비율, 오전대여비율, 점심대여비율, 오후대여비율, 퇴근시간대여비율, 장년비율 → (생활)
네 번째 시도.
특성(피처) 단순화 작업 + 청년1 기준 20, 청년2 기준 30대로 구분
(1) 최적의 k 찾기
Elbow method | silhouette_score |
![]() |
![]() |
(2) 대여소 군집 결과 시각화
k=2 | k=3 | k=4 |
![]() |
![]() |
![]() |
(3) 군집 분석 결과 해석
k=2

- 군집 0 : 총대여횟수, 평균이용시간, 주말대여비율, 새벽대여비율, 퇴근시간대여비율, 야간대여비율,
청년1비율, 청년2비율, (여성고객비율) - 군집 1 : 남성고객비율, 평균이용거리, 출근시간대여비율, 오전대여비율, 점심대여비율, 오후대여비율,
청소년비율, 장년비율, 노인비율, (주중대여비율)
군집 0은 주말 퇴근시간대 이후 저녁까지 청년1,2들이 장시간 많이 이용
군집 1은 주중 출근시간~점심~오후까지 청소년, 장년 위주로 장거리로 이용
k=3

- 군집 0 : 총대여횟수, 새벽대여비율, 야간대여비율, 청년1비율, 청년2비율 → (막차대용?)
- 군집 1 : 남성고객비율, 출근시간대여비율, 오전대여비율, 점심대여비율, 청소년비율, 장년비율, (주중대여비율)
→ (생활) - 군집 2 : 평균이용시간, 평균이용거리, 주말대여비용, 오후대여비율, 퇴근시간대여비율, 노인비율 (여성고객비율)
→ (관광)
k=4

- 군집 0 : 총대여횟수, 야간대여비율, 청년1비율 → (막차대용?)
- 군집 1 : 남성고객비율, 새벽대여비율, 출근시간대여비율, 청소년비율 → (통근, 통학)
- 군집 2 : 평균이용시간, 평균이용거리, 주말대여비율, 노인비율, (여성고객비율) → (관광)
- 군집 3 : 남성고객, 오전대여비율, 점심대여비율, 오후대여비율, 퇴근시간대여비율, 청년2비율, 장년비율, (주중대여비율) → (생활)
https://velog.io/@ljs7463/%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0%EB%A7%81
클러스터링(군집화) 정리
INDEX >1. 목적 종류 similarity 종류 1 : 계층군집 종류 2 : PointAssignment(K-means) 계층군집과 PointAssignment(K-means)의 장단점 내가 클러스터링을 공부하면서 겪었던 개념적 착오 정리 군집분석 단계 최적의
velog.io
4-4) 대여소 별 특성 확인
- 출/퇴근 외 관광으로 주로 활용되는 주 대여소 추정 (관광 군집)
- 관광 관련 대여소 좌표 확인 ('서울시 따릉이 마스터 정보' 데이터와 조인)
- 찍힌 좌표 반경 내 관광지(방문할 수 있는 시설, 장소) 추천
세 번째 시도,
k=3일 때 버전 결과 사용
군집0 : 막차 대용 대여소 | 군집1 : 출근 도우미 대여소 | 군집2 : 여가생활 대여소 |
![]() |
![]() |
![]() |
총대여횟수, 청년비율, 새벽대여비율, 퇴근시간대여비율, 야간대여비율, |
남성고객비율, 장년비율, 출근시간대여비율, 오전대여비율, 점심대여비율, | 평균이용시간, 평균이용거리, 주말대여비율, 오후대여비율, 퇴근시간대여비율 |
▶ (참고) 대여소 별 최단 거리 도출 알고리즘
[알고리즘] 외판원 순회(TSP) 알고리즘
외판원 순회 문제 (Traveling Salesman Problem)는 조합 최적화 문제의 일종이다.
velog.io
▶ 이어지는 다음 게시글 보기
2024.07.14 - [분류 전체보기] - 공모전 | 서울시 공공자전거 관광지 및 문화시설 추천
공모전 | 서울시 공공자전거 관광지 및 문화시설 추천
(팀원1 코드_주피터 노트북) (팀원2 코드_주피터 노트북)5. 관광지 및 문화시설 추천5-1) 각 군집 별 지도 시각화▶ 외국인의 경우, k=2 데이터 사용군집 0 : 본격적으로 따릉이로 여행하려는 외국인
nasena.tistory.com
'공모전 > 서울시 따릉이 관광 활성화' 카테고리의 다른 글
공모전 | 서울시 공공자전거 관광지 및 문화시설 추천_지도시각화 (0) | 2024.07.14 |
---|---|
공모전 | 서울시 공공자전거 데이터셋, 분석 방향, EDA (3) | 2024.07.14 |
댓글