데이터 과학

군집 분석 활용

「신나는 노래」라고 적혀 있는 데이터는 없습니다.
그래도 골라낼 수 있을까요?

학습 목표

  1. 군집 분석이 실제로 쓰이는 사례를 찾아 무엇을 무엇으로 묶었는지 설명할 수 있다.
  2. 군집 분석에 알맞은 속성을 고르고, 정규화가 필요한 까닭을 말할 수 있다.
  3. 분석 도구로 k-평균 군집 모델을 만들고 실루엣 계수로 평가할 수 있다.
  4. 군집에 이름을 붙이는 일이 사람의 몫임을 알고 결과를 해석할 수 있다.

이미 여러분을 묶어 두었습니다

실습에 들어가기 전에, 군집 분석이 실제로 어디서 쓰이는지 봅시다.

신용 카드는 종류가 무척 많습니다. 주유 할인 카드, 대중교통 할인 카드, 온라인 쇼핑 적립 카드… 카드 회사는 고객들이 실제로 어디에 돈을 쓰는지를 모아 놓고, 비슷한 소비를 하는 사람끼리 묶은 다음 묶음마다 다른 카드를 내놓기도 합니다. 이때 묶는 일이 군집 분석입니다.

단계 실제로 한 일
데이터 수집 2019년 7월 초부터 12월 말까지의 결제 기록. 그중 결제 건수가 184건 이상 294건 이하인 고객만 골랐다
데이터 전처리 매출이 400억 원에 못 미치는 업종은 「기타」로 합쳤고, 업종별 매출이 유난히 크거나 작은 고객 약 5%를 이상치로 보고 뺐다
탐색적 데이터 분석 업종별로 얼마를, 몇 번 결제했는지를 살펴 고객의 소비 비중을 파악했다
군집 분석 수행 알맞은 군집 개수를 검토한 뒤 40개의 군집으로 나누었다

신용 카드 고객 군집 분석 사례 — 한국데이터산업진흥원 데이터안심구역 (dsz.kdata.or.kr)

왜 184건 – 294건일까?

카드를 거의 안 쓰는 사람과 지나치게 많이 쓰는 사람을 미리 걸러 낸 것으로 보입니다. 결제 기록이 몇 건뿐인 사람에게서는 소비 성향을 읽을 수 없고, 너무 많이 쓰는 사람은 혼자서 결과를 끌고 갑니다. 분석은 누구를 볼 것인지 정하는 일에서 시작합니다.

군집이 40개라고요?

예제에서는 k를 2나 3으로 두는 경우가 많아 군집은 몇 개 안 되는 것이라고 생각하기 쉽습니다. 하지만 k를 얼마로 할지는 목적이 정합니다. 카드 상품을 40가지쯤 만들 수 있는 회사라면 40개로 나누는 것이 쓸모 있습니다.

편리함의 뒷면도 함께 봅시다

내 소비 습관에 딱 맞는 카드를 추천받는 것은 분명 편리합니다. 그런데 군집에 따라 다른 혜택을 준다는 말은 어떤 군집에는 그 혜택을 주지 않는다는 말이기도 합니다. 군집 분석은 이름을 모르는 채로 사람을 묶지만, 묶은 결과로 사람을 다르게 대하면 그것은 더 이상 숫자만의 문제가 아닙니다. 무엇으로 묶었는지, 그 기준이 공정한지를 묻는 것까지가 분석하는 사람의 몫입니다. 다만 공정한 기준이 무엇인지는 한 가지로 정해지지 않습니다. 소비가 많은 고객에게 혜택을 몰아주는 기준은 회사의 이익을 지키지만, 소비가 적은 고객이 받을 수 있는 혜택을 줄입니다.

실습 순서 1 — 무엇을 하려는가

인기 차트 50곡에서 신나는 노래만 골라 추천 리스트를 만들어 봅시다.

목표

음악의 1분당 박자 수와 에너지를 가지고 k-평균 군집 분석을 해서, 비슷한 느낌의 곡끼리 묶은 추천 리스트를 만든다.

왜 이것이 군집 문제일까요?

분류로 풀면 안 될까요? 분류를 하려면 「이 곡은 신나는 곡」이라고 미리 적혀 있는 데이터가 있어야 합니다. 그런 열은 어디에도 없습니다. 누가 하나하나 들어 보고 적어 주지 않는 한 생기지도 않습니다. 정답이 적혀 있지 않은 데이터에서 무리를 찾아야 하므로 군집 분석으로 풉니다. 실제 음악 서비스는 주로 사람들이 함께 들은 기록으로 곡을 추천하고, 그런 기록이 아직 없는 신곡이나 새 사용자에게는 곡의 속성으로 묶는 방식을 함께 씁니다. 이번 실습은 그 두 번째 방식입니다.

실습 순서

1

문제 정의 — 무엇을 묶어 무엇에 쓸 것인가

2

데이터 수집 — 인기 차트 50곡 데이터 내려받기

3

데이터 전처리 — 쓸 속성 고르기

4

모델 생성 — k-평균으로 묶고 실루엣으로 평가하기

5

분석 수행 — 군집을 열어 보고 추천 리스트로 만들기

실습 순서 2 — 데이터를 열어 봅시다

음악의 무엇이 숫자로 적혀 있는지 먼저 확인합니다.

내려받을 데이터

2019년 한 해 동안 한 음악 스트리밍 서비스에서 가장 많이 재생된 50곡을 정리한 자료입니다.
kaggle.com/datasets/leonardopena/top50spotify2019

파일을 열었더니 경고가 뜬다면

원본 top50.csv에는 유럽 언어에서 쓰는 특수한 글자가 섞여 있어 글자가 깨지거나 경고가 나올 수 있습니다. 이럴 때는 글자를 저장하는 방식을 바꾼 파일을 대신 받으면 됩니다.
kaggle.com/datasets/chochochosam/top-50-spotify-modify

사소한 일 같지만 실제 분석에서 자주 부딪히는 문제입니다. 분석보다 데이터를 쓸 수 있게 만드는 데 시간이 더 드는 일이 흔합니다.

File 위젯으로 열고 속성을 살펴봅니다

곡 50개가 들어 있고, 속성은 다음과 같이 문자형 셋과 수치형 열 개로 나뉩니다.

속성 무엇을 담고 있나 유형
Track.Name곡 이름문자형
Artist.Name가수 또는 그룹 이름
Genre장르 — 이 곡이 어떤 갈래에 속하는가
Beats.Per.Minute1분당 박자 수 — 곡이 얼마나 빠른가수치형
Energy에너지 — 힘차고 강렬할수록 값이 크다
Danceability춤추기 좋은 정도
Loudness (dB)음량 — 소리가 얼마나 큰가
Liveness현장감 — 공연장에서 녹음한 느낌일수록 값이 크다
Valence밝은 정도 — 곡의 분위기가 긍정적일수록 값이 크다
Length곡 길이(초)
Acousticness어쿠스틱한 정도 — 전자 음향을 덜 쓸수록 값이 크다
Speechiness말의 비율 — 가사나 말이 많을수록 값이 크다
Popularity인기 정도

표에서 바탕색을 칠한 두 속성, Beats.Per.Minute와 Energy를 이번 분석에 씁니다.

스스로 확인

Genre도 곡의 느낌과 관련이 깊어 보입니다. 그런데 이 속성은 군집 분석에 그대로 넣을 수 없습니다. 왜 그럴까요? k-평균이 무엇을 계산하는지를 떠올려 보세요.

실습 순서 3 — 쓸 속성을 고릅니다

열 개나 되는 숫자 속성 중 둘만 씁니다.

File

데이터를 연다

Select Columns

쓸 속성을 고른다

Scatter Plot

흩어진 모양을 본다

칸 넣을 속성
Features Beats.Per.Minute와 Energy 둘
Target 비워 둔다 — 아무것도 넣지 않는다
Metas Track.Name, Artist.Name, Genre

Target을 비워 두는 까닭

회귀 분석이라면 선수 가치나 시험 점수처럼 맞혀야 할 값을 여기에 넣습니다. 군집 분석에는 맞혀야 할 값이 없습니다. 여기에 무언가를 넣으면 정답을 미리 알려 주고 시작하는 셈이 되어 군집 분석이 아니게 됩니다.

곡 이름을 Metas에 두는 까닭

곡 이름은 거리를 측정할 수 없는 값입니다. 하지만 버리면 나중에 「그래서 어떤 곡들이 묶였는데?」를 확인할 수 없습니다. Metas는 계산에는 쓰지 않지만 곁에 달고 다니는 꼬리표를 두는 칸입니다.

왜 열 개 중 둘만 쓸까요?

k-평균은 속성이 몇 개든 거리를 측정할 수 있습니다. 열 개를 다 넣어도 계산은 됩니다. 둘로 줄이는 이유는 계산 때문이 아니라 우리 눈 때문입니다. 속성이 둘이면 가로축과 세로축에 놓아 그림으로 볼 수 있습니다. 셋만 되어도 산점도 한 장으로는 그릴 수 없고, 결과가 왜 그렇게 나왔는지 눈으로 확인하기 어려워집니다.

그리고 빠르기와 에너지는 「신나는 곡」이라는 우리 목적과 어떻게 이어지는지 설명할 수 있는 속성입니다. 속성을 하나 넣을 때마다 그 이유를 말할 수 있어야 합니다.

Scatter Plot으로 먼저 봅니다

Select Columns에 Scatter Plot을 잇고, 가로축에 Beats.Per.Minute, 세로축에 Energy를 놓습니다.

가로 — 1분당 박자 수 · 세로 — 에너지

눈으로는 어디서 잘라야 할지 모르겠습니다

점이 몇 개뿐이고 두 무리로 떨어져 있다면 덩어리가 눈에 훤히 보이지만, 여기는 그렇지 않습니다. 점들이 고르게 흩어져 있어 어디에 선을 그어야 할지 알 수 없습니다. 눈으로 나눌 수 없으니 나누는 기준을 알고리즘에 맡깁니다. 다만 이렇게 고르게 흩어진 점에도 k-평균은 반드시 k개의 군집을 만들어 내므로, 나온 군집에 뜻이 있는지는 결과를 보고 따로 판단해야 합니다.

실습 순서 4 — k-평균으로 묶습니다

체크 상자 하나로 정규화(속성값의 눈금을 맞추는 작업)를 켭니다. 오렌지의 이 상자는 평균을 빼고 표준 편차로 나누는 표준화 방식으로 눈금을 맞춥니다.

Select Columns에 k-Means 위젯을 잇고 두 가지를 설정합니다.

설정 이렇게 둡니다
Fixed 3으로 둔다. 군집을 세 개로 나누겠다는 뜻이다
Normalize columns 체크한다. 표준화 방식으로 두 속성의 눈금을 맞춰 준다

정규화가 왜 필요한지 직접 확인해 봅시다

File에 Data Table을 이어 두 속성의 값을 살펴보고, 가장 작은 값과 가장 큰 값을 적어 보세요.

속성 가장 작은 값 가장 큰 값 차이
Beats.Per.Minute
Energy

어느 쪽이 더 넓게 퍼져 있나요? 정규화를 하지 않으면 넓게 퍼진 속성이 거리를 거의 혼자 결정합니다. 좁게 퍼진 속성은 아무리 달라 봐야 거리에 보태는 몫이 작기 때문입니다.

왜 이번에는 From X to Y를 쓰지 않을까요?

k의 범위를 주고 오렌지가 고르게 할 수도 있지만, 이번에는 3으로 못 박습니다. 신나는 곡, 잔잔한 곡, 그 사이의 세 갈래로 나누어야 추천 리스트로 쓰기 좋기 때문입니다. k를 쓰임새에 맞춰 정한 경우입니다. 다만 3이 정말 나았는지는 결과로 확인해야 합니다.

잘 묶였는지 평가해 봅니다

실루엣 계수를 이번에는 그림으로 봅니다.

k-Means에 Silhouette Plot 위젯을 잇고 Distance는 유클리드 거리, Grouping은 Cluster로 둡니다. 곡 하나에 막대 하나가 그려집니다. 막대의 길이가 그 곡의 실루엣 계수입니다.

군집 하나 군집 둘 — 아래 두 막대가 음수 군집 셋 전체 평균

실루엣 그림이 어떻게 생겼는지 보여 주는 예시입니다. 여러분이 얻을 값은 이와 다릅니다.

왼쪽으로 뻗은 막대 — 음수인 실루엣 계수

이 데이터에서는 실루엣 계수가 음수인 곡이 나오기도 합니다. 실루엣 계수가 음수라는 것은 지금 들어가 있는 군집보다 옆 군집이 더 가깝다는 뜻입니다. 그런 곡이 몇 개 있다고 해서 분석이 실패한 것은 아닙니다. 빠르기와 에너지가 두 군집의 경계 가까이에 있는 곡은 실제로 있으니까요. 다만 「그 곡은 지금 리스트에 잘 어울리지 않을 수 있다」는 경고로 읽습니다.

막대를 끌어 그 곡이 어디 있는지 봅니다

Silhouette Plot에서 막대를 마우스로 끌어 선택하면 그 곡들만 골라집니다. 여기에 Scatter Plot을 이어 Color를 Cluster로, Label을 Silhouette로 두면 값이 낮은 곡이 산점도의 어디에 있는지가 그대로 드러납니다.

값이 낮은 곡들은 대체로 두 군집이 맞닿는 자리에 몰려 있을 것입니다. 숫자로만 보던 「경계에 있다」는 말을 그림 위의 위치로 확인할 수 있습니다.

k를 바꿔 가며 적어 봅시다

k-Means의 Fixed 값만 바꾸면 나머지는 저절로 다시 계산됩니다.

k 실루엣 평균 음수인 곡의 개수
2
3
4
5
스스로 확인

실루엣 평균이 가장 높은 k가 3이 아니었다면 어떻게 해야 할까요? 무조건 그 k로 바꿔야 할까요? 우리가 세 갈래로 나누려던 이유를 함께 떠올려 보세요.

실습 순서 5 — 추천 리스트로 만듭니다

군집을 열어 어떤 곡들이 묶였는지 확인합니다.

k-Means

군집을 붙인다

Silhouette Plot

실루엣 계수를 붙인다

Select Rows

한 군집만 고른다

Data Table

곡 목록을 본다

1

군집이 색으로 나뉜 산점도 보기

k-Means에 Scatter Plot을 이어 축은 그대로 두고 Color만 Cluster로 바꿉니다. 고르게 흩어져만 보이던 점들이 세 가지 색으로 나뉘어 있을 것입니다.

2

한 군집만 뽑아 목록으로 보기

Silhouette Plot에 Select Rows와 Data Table을 차례로 잇습니다. Select Rows에서 조건을 Cluster is C1처럼 주면 Data Table에 그 군집의 곡 목록이 뜹니다. 이것을 그대로 추천 리스트로 쓸 수 있습니다.

여기서 자주 막힙니다. Silhouette Plot과 Select Rows를 이으면 오렌지는 기본으로 「선택한 데이터만」을 보냅니다. 아무것도 끌어 선택하지 않았다면 빈 표가 나옵니다. 두 위젯 사이의 연결선을 두 번 눌러 Data에서 Data로 잇도록 고쳐 주세요. 전체 데이터가 넘어갑니다.

3

군집마다 성격을 적어 두기

군집을 하나씩 열어 보며 빠르기와 에너지가 대체로 어느 쪽인지를 살피고, 어떤 이름을 붙이면 좋을지 적어 보세요.

군집 빠르기는? 에너지는? 내가 붙인 이름
C1
C2
C3

C1, C2, C3에는 아무 뜻도 없습니다

번호는 계산 과정에서 붙은 이름표일 뿐, 빠르기나 에너지의 순서를 뜻하지 않습니다. 오렌지는 같은 데이터 · 같은 설정이면 같은 결과가 나오도록 출발점을 고정해 두지만, 속성이나 k를 바꾸거나 다른 프로그램으로 묶으면 같은 무리에 다른 번호가 붙을 수 있습니다. k-평균은 원래 중심점을 무작위로 찍고 시작하므로 어느 무리에 C1이 붙을지는 정해져 있지 않습니다. 그러니 「C3가 신나는 곡」이라고 외우는 것은 아무 의미가 없습니다.

프로그램이 해 준 일은 비슷한 것끼리 모아 번호를 붙인 것까지입니다. 「신나는 곡 모음」이라는 이름은 사람이 붙입니다. 군집의 값을 살펴보고, 실제로 몇 곡 들어 보고, 뜻을 부여해야 분석이 끝납니다.

스스로 확인

만든 리스트를 실제로 몇 곡 들어 보세요. 「신나는 곡」이라 붙인 군집에 영 어울리지 않는 곡이 섞여 있나요? 있다면 그 곡의 실루엣 계수는 어떤가요?

속성을 바꿔 다시 묶어 보기

무엇으로 묶느냐가 달라지면 무엇이 나오느냐도 달라집니다.

Select Columns만 다시 열어 Features의 두 속성을 다른 것으로 교체해 보세요. 나머지 배선은 건드리지 않아도 됩니다. 설정을 바꾸는 순간 데이터가 다시 흘러 군집도 실루엣도 저절로 갱신됩니다.

세 가지 조합을 시험하고 적어 봅시다

쓴 두 속성 고른 k 실루엣 평균 이 묶음이 쓸모 있어 보이는가
빠르기 · 에너지
춤추기 좋은 정도 · 에너지
직접 고른 두 속성

속성을 고를 때는 「이 둘로 묶으면 무엇을 알 수 있는가」를 한 문장으로 말할 수 있어야 합니다. 곡 길이와 인기 정도로 묶으면 실루엣 값은 나오겠지만, 그 묶음이 무엇인지 설명하기 어렵습니다.

실루엣이 높다고 좋은 추천 리스트는 아닙니다

실루엣 계수는 「잘 나뉘었는가」만 측정하고, 「쓸모가 있는가」는 측정하지 못합니다. 곡 길이로 묶으면 깔끔하게 나뉠 수도 있지만, 「3분짜리 곡 모음」은 신나는 곡을 찾는 사람에게 도움이 되지 않습니다. 숫자가 좋은 답과 쓸모 있는 답을 구분하는 것은 분석하는 사람이 할 일입니다.

더 해 보기

  1. 속성을 셋으로 늘려 보세요. 군집은 만들어지지만 Scatter Plot에는 두 축밖에 없습니다. 결과를 눈으로 확인하기가 얼마나 어려워지나요?
  2. Normalize columns의 체크를 풀고 다시 실행해 보세요. 군집이 어떻게 달라지나요? 실루엣 평균은요?
  3. 친구들과 각자 만든 추천 리스트를 비교해 보세요. 같은 데이터를 썼는데 왜 다른 리스트가 나왔을까요?

핵심 정리

군집 분석을 쓸 때

where clustering fits

  • 정답이 적혀 있지 않을 때 쓴다
  • 카드 회사는 소비 기록으로 고객을 묶는다
  • k는 목적이 정한다. 2일 수도, 40일 수도 있다
  • 음악 추천은 주로 함께 들은 기록을 쓰고, 그 기록이 없는 신곡이나 새 사용자에게는 곡의 속성으로 묶는 방식을 함께 쓴다

속성 고르기

choosing features

  • 수치형만 넣는다. 거리를 계산해야 하기 때문
  • Target은 비운다. 맞힐 값이 없다
  • 곡 이름은 꼬리표로 달고만 다닌다

평가하기

evaluating clusters

  • 정규화는 체크 상자 하나로 켠다
  • 실루엣 막대가 왼쪽으로 뻗으면 음수 — 옆 군집이 더 가깝다
  • 실루엣이 높다고 쓸모 있는 것은 아니다

해석하기

interpreting the result

  • C1, C2, C3은 붙은 순서일 뿐 뜻이 없다
  • 군집에 이름을 붙이는 것은 사람의 몫
  • 묶은 결과로 사람을 다르게 대할 때는 기준이 공정한지 묻는다

확인 퀴즈

배운 내용을 확인해 봅시다.

Q1

속성을 고르는 창에서 Target 칸을 비워 두는 까닭은?

Q2

곡 이름과 가수 이름을 Metas 칸에 두는 까닭으로 알맞은 것은?

Q3

정규화 상자를 체크하는 까닭은?

Q4

실루엣 그림에서 막대가 왼쪽으로 뻗은 곡이 있습니다. 무슨 뜻인가?

Q5

친구가 같은 데이터를 다른 프로그램으로 묶었더니 신나는 곡 묶음의 번호가 C3가 아니라 C1이었습니다. 왜 그럴까?