K-means clustering으로 번화가 상권 찾아보기

dataong·2020년 10월 10일
4

K-means clustering를 통해 서울의 번화가 상권을 찾아보는 실습을 해보겠습니다. 데이터는 서울시 열린데이터 광장의 상권별 집객시설 수 공공데이터를 다운받아 사용했습니다. csv파일을 다운받아 data에 넣어두었습니다.


데이터는 이렇게 생겼습니다. 년도, 분기, 상권구분명을 시작으로 각종 집객 시설의 수가 나와있습니다! 이 수많은 상권에서 번화가 상권만 뽑고 싶기 때문에 번화가의 기준을 정해보았습니다.

번화가 정의하기

번화가하면 제일 먼저 생각나는 곳이 어디인가요?

제가 생각하는 번화가는 홍대/신촌처럼 큰 백화점이 있고 사람들이 많이 모이는 곳이 떠오르더라구요! 그래서 백화점을 중심으로 번화가 기준을 만들었습니다.

data[['상권_코드_명','백화점_수']].max()를 통해 상권별로 가지는 백화점의 최대개수를 살펴보았습니다. 1이라는 결과가 나온걸 보니 상권별로 많아봐야 백화점이 1개가 있네요!(상권 구분을 서울시에서 촘촘히 해놓았기 때문에 그런 것 같습니다😁) 따라서 0또는 1의 값을 가지는 백화점은 K-means clustering을 하기에 적합한 변수가 아니라고 생각했습니다.

그렇다면 어떤 변수를 활용할 수 있을까요?

저는 번화가엔 백화점이 있다!는 생각을 포기하고 싶지 않아서(?) 백화점과 상관관계가 높은 변수를 활용하기로 했습니다.

data.corr()를 통해 상관계수를 살펴보았습니다.

극장수은행수가 백화점 수와 상관관계가 제일 높네요. 백화점이 있는 곳은 극장은행이 있을 가능성이 높을 것 같습니다. 이제 이 두 변수를 활용해서 K-means clustering을 해보겠습니다.

데이터 프레임 정리하기

본격 분석 시작 전에 필요한 데이터만 뽑아 데이터 프레임을 다시 만들어주었습니다.

data = data.fillna(0)
data = data[(data['기준_년_코드'] == 2020) & (data['기준_분기_코드'] == 2)]
data2 = data[['상권_코드_명','극장_수','은행_수']]
data.head()

깔끔하게 정리가 되었습니다. 분석의 정확성을 높이기 위해 극장 수와 은행 수는 한개 이상인 상권만 뽑았습니다! 2020년 2분기에 조건을 만족하는 상권은 88개가 있네요.

K-means clustering

1. 그래프를 통해 데이터 분포 살펴보기

극장 수은행 수칼럼을 따로 뽑아 X값에 넣어주었습니다.

X = data2.iloc[:,[1,2]].values #x값으로 극장수, 은행 수 지정
m = X.shape[0] #전체 데이터 개수
n = X.shape[1] #특징 개수(극장수, 은행 수)

그러면 m은 전체 데이터(행의 개수)인 2360이 나오고 n은 칼럼의 개수인 2가 나오네요!

그래프를 통해 데이터 분포를 확인해보겠습니다.

X = data2.iloc[:,[1,2]].values #x값으로 극장수, 백화점 수 지정
plt.scatter(X[:,0], X[:,1], c='black', label='상권')
plt.xlabel('극장 수')
plt.ylabel('은행 수')
plt.legend()
plt.title('주요 집객 시설')
plt.show


오오.. 극장수와 은행수가 몰려있는 부분을 잘 군집화하는게 필요할 것 같습니다.

from sklearn.cluster import KMeans를 통해 K-means clustering에 필요한 KMeans 함수를 불러옵니다.

2. k값 정하기

inertia = []

for k in range(1,11):
    kmeans = KMeans(n_clusters=k).fit(X)
    value = kmeans.inertia_
    inertia.append(value)

pd.DataFrame(inertia).plot()

먼저 몇개의 군집으로 나눌건지 정해줘야겠죠? 요 부분은 k값은 어떻게 선정할까?을 참고했습니다.

적절한 k값의 조건
✅ 작은 수의 군집으로 나누기
ex. 100개의 데이터를 100개의 군집으로 나누는 것은 의미가 없다!
✅ inertia의 값이 작을 수록 좋다
통계적인 내용이라 나중에 포스팅해보겠습니다💦

for문으로 k에 1부터 10까지의 값을 넣어주어 inertia를 구해주어 그래프로 나타내보았습니다.


k=4이후로는 감소폭이 크지 않아 저는 4개의 군집으로 나누겠습니다.

3. 드디어 K-means clustering

kmeans = KMeans(n_clusters=4).fit(X) #군집 4개로 나누겠다
data2['cluster_id'] = kmeans.labels_
data2

Kmeans함수는 간단해서 좋아요!💙 몇개의 군집으로 나눌건지 정해주면 알아서 다 해줍니다! 군집 라벨을 써줄 cluster_id를 만들어 기존의 데이터 프레임에 컬럼을 추가해주었습니다.

잘 들어갔네요!

4. 시각화

빠르게 시각화를 해보겠습니다. import seaborn as snsimport matplotlib.pyplot as plt을 먼저 실행해줍니다.

sns.lmplot('극장_수','은행_수', data=data2, fit_reg=False, scatter_kws={"s":150}, hue="cluster_id")
plt.title("은행과 극장수로 찾는 번화가")


오호.. 파랑, 초록, 빨강색으로 표시된 그룹이 만들어졌네요! 각각 그룹에 어떤 상권이 있는지 살펴보면서 분류가 잘 됐는지 보겠습니다.

5. 각각의 군집 살펴보기

✔초번화가

먼저 초록색으로 표시된 군집2를 보겠습니다.

data2[data2['cluster_id']==2]


군집2에는 총 6개의 상권이 분류되었어요. 제가 생각했던 유동인구 많고 항상 북적이는 곳들이 잘 들어가 있는 것 같습니다. 주로 관광지나 놀기 위해 가는 상권(비 오피스 상권)이 많은 것 같네요! 요 군집의 이름을 초번화가라고 붙여보겠습니다.

✔번화가

data2[data2['cluster_id']==3]


여기엔 19개의 상권이 분류되었어요. 보시면 코엑스, 잠실역같이 역 주변에 형성된 번화가, 가로수길 처럼 최근에 부상한 번화가 등등 다양한 형태의 상권이 있는 것 같아요. 여기를 번화가로 분류하겠습니다.

✔비번화가..?

마지막으로 그래프에서 파란색에 해당하는 상권을 살펴볼게요.

data2[data2['cluster_id']==0]


흠흠 딱 봐도 위의 상권과 비교했을 때 번화가는 아닌 것 같은 느낌이 들어요.

결론

번화가 상권을 찾고 싶어 K-means clustering을 통해 번화가 상권을 뽑아보았습니다. 초번화가번화가상권을 합쳐 제가 찾는 번화가 상권이라고 할 수 있겠네요. 아쉬운 점은 처음에 은행 수 >=1극장 수>=1를 조건으로 주었기 때문에 미처 발견하지 못한 번화가가 있을 수도 있을 것 같습니다. 예를들어 극장은 없지만 번화가인 상권은 저의 분석에선 제외되었습니다.💦

+) 1로 배정된 상권 한개!?

여기서 주황색으로 특이점을 보였던 상권 기억나시나요? 어딘지 궁금해서 살펴보니

명동 북창동 다동 무교동 관광특구라고 하네요!요 상권은 따로 분류할 수 없었는지 여러 동을 묶어놓아서 자연스럽게 극장 수와 은행 수가 많아졌던 것 같습니다! 이 이상치를 미리 알았더라면 처음부터 제외하고 시작했을 것 같은데 아쉬움이 남네요 흑흑😂

오늘의 결론

분석 전 이상치를 먼저 확인하자💢

참고자료

profile
올리고 보는 데이터 분석 TIL

1개의 댓글

comment-user-thumbnail
2023년 10월 28일

이해하기 쉬운 설명 감사드려요!

답글 달기