콘텐츠로 건너뛰기

K-Means 클러스터링 파이썬 연습 예제 – 고객 구매 데이터 분석

K-Means 클러스터링의 파이썬 예제이다. 본 예제에서는 고객 구매 데이터를 분석하여 유의미한 인사이트를 얻어보는 과정을 다룬다. K-Means에 대한 개념적인 설명은 다음 글(클릭)을 참고하면 좋다.

** 연습을 위한 엑셀 데이터와 가이드 노트북 파일은 글 하단에 깃허브 주소에서 확인해주세요. 댓글은 블로그를 운영하는 데 큰 기쁨이 됩니다 🙂

** [2021년 11월 6일 코드 업데이트: Joon님의 제보로 오타 수정하였습니다. 코드 작성하고 블로그에 옮길 때 변수명을 수정했는데 전부 수정되지 않은 실수가 있었습니다. 알려주셔서 감사합니다.

■ K 값이 변하면 클러스터링에 어떤 영향을 미치나?

우선 연습 데이터인 엑셀 파일을 파이썬 주피터 노트북에 pandas 패키지를 이용하여 읽어오도록 한다. 파이썬 기초가 필요하신 분들은 다음 시리즈: 파이썬 첫걸음 을 참고하길 바란다.

# pandas 패키지 임포트
import pandas as pd

# read_excel() 함수를 이용하여 파일 불러오기
data = pd.read_excel('CustomerDataSet.xls')

# 데이터 몇 행만 보기
data.head()

데이터는 5개의 열(Customer ID, ItemsBought, ItemsReturned, ZipCode, Product)로 이뤄져있다. 우리가 알고 싶은 것은 우리의 제품 포트폴리오와 지역의 관계라고 하자. Customer ID는 고객 ID로 각 고객을 구분해주는 유니크한 값이나 본 분석에는 크게 의미가 없으므로 사용하지 않는다. ZipCode와 Product는 군집 분석 결과를 해석할 때 사용한다. 즉,남은 ItemsBought과 ItemsReturned로 클러스터링을 한다.

이제 레코드끼리의 거리를 계산하여 클러스터링을 해야하는데 그 전에 ItemsBought과 ItemsReturned의 측정 단위을 같게하는 작업, 즉 데이터의 정규화(normalization) 작업이 필요하다. 여기서는 MinMaxScaler()를 이용해 정규화를 진행해보기로 한다.

# 필요 패키지 불러오기 (KMeans, matplotlib, preprocessing)
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn import preprocessing

# 원본 데이터를 복사해서 전처리하기 (원본 데이터를 가지고 바로 전처리하지 않는다)
processed_data = data.copy()

# 데이터 전처리 - 정규화를 위한 작업
scaler = preprocessing.MinMaxScaler()
processed_data[['ItemsBought', 'ItemsReturned']] = scaler.fit_transform(processed_data[['ItemsBought', 'ItemsReturned']])

# 화면(figure) 생성
plt.figure(figsize = (10, 6))
# K 값을 늘려가며 반복 테스트
for i in range(1, 7)
       # 클러스터 생성
       estimator = KMeans(n_clusters = i)
       ids = estimator.fit_predict(processed_data[['ItemsBought', 'ItemsReturned']])
       # 2행 3열을 가진 서브플롯 추가 (인덱스 = i)
        plt.subplot(3, 2, i)
        plt.tight_layout()
        # 서브플롯의 라벨링
        plt.title("K value = {}".format(i))
        plt.xlabel('ItemsBought')
        plt.ylabel('ItemsReturned')
        # 클러스터링 그리기
        plt.scatter(processed_data['ItemsBought'], processed_data['ItemsReturned'], c=ids)  
plt.show()

결과값은 다음과 같다.

해석해보면, K가 3이나 4일때 군집화가 잘 되는 것을 확인할 수 있다. 구분을 하자면 제품을 많이 사고 유지하는 고객군 – 제품을 많이 사나 환불을 조금 하는 고객군 – 제품을 많이 안사고 환불도 많이 하는 고객군 으로 나눌 수 있겠다.

■ 각 군집과 제품 ID의 관계를 살펴보자

이번에는 K를 3으로 잡아 product id를 기준으로 범례를 붙여보자.

# K = 3으로 클러스터링
estimator = KMeans(n_clusters = 3)

# 클러스터링 생성
cluster_ids = estimator.fit_predict(processed_data[['ItemsBought', 'ItemsReturned']])

# create a scatter plot
plt.scatter(processed_data['ItemsBought'], processed_data['ItemsReturned'], c=cluster_ids)

# 제품과 클러스터 id로 데이터에 범례 달기
for index, c_id, bought, returned, zip_code, product in processed_data.itertuples():
    plt.annotate("Clu{}: {}".format(cluster_ids[index], product),(bought, returned))
    
plt.xlabel('ItemsBought')
plt.ylabel('ItemsReturned')
plt.show()

코드를 돌리면 다음과 같은 결과를 얻는다.

그래프를 살펴보면 Clu1인 제품 2435이 많이 안팔릴 뿐만 아니라 환불이 발생하는 것을 알 수 있다. 현재 그래프 상에는 데이터가 정규화되었기 때문에 면밀히 파악하기 어려우니 원래 데이터로 돌아가서 해당 제품을 찾아보자.

# 클러스터 1로 분류된 데이터를 추출해보자
data[ cluster_ids == 1 ]

안좋은 고객으로 할당된 고객 데이터를 보고 이제 문제점을 찾아 개선하면 된다!

■ 각 군집과 지역의 관계를 살펴보자

이번에는 클러스터링을 이용하여 지역마다의 마케팅 활동에 대해 인사이트를 얻어보자. 우편번호이기 때문에 따로 전처리를 할 필요는 없다. 다만, 전처리된 데이터 세트와 원 데이터의 세트의 레코드가 동일한 순서이기 때문에 cluster로는 전처리된 데이터에서 생성된 것을 그대로 사용해도 된다.

# 플로팅하기
plt.scatter(data['ItemsBought'], data['ItemsReturned'], c=cluster_ids)

# 우편번호로 범례달기
for (index, c_id, bought, returned, zip_code, product) in data.itertuples():
    plt.annotate(zip_code,(bought + 0.6, returned + 0.6))
    
plt.xlabel('ItemsBought')
plt.ylabel('ItemsReturned')

plt.show()

결과를 살펴보면, 우편번호가 1과 2인 지역에서 성과가 좋음을 알 수 있다. 1, 2 지역에서 어떤 마케팅을 진행하는지 확인하고 다른 지역에도 적용할 수 있는지 살펴보고, 다른 지역의 성과를 개선할 방안을 찾는다!

파이썬 가이드 자료 공유에 대한 문의가 많아 깃허브를 만들었습니다. 아래 링크로 가이드 파일을 확인해주세요. https://github.com/lucy-the-marketer/k-means-clustering
도움이 되셨다면 댓글 하나 써주시면 감사하겠습니다 🙂

“K-Means 클러스터링 파이썬 연습 예제 – 고객 구매 데이터 분석”의 44개의 댓글

  1. 이제 막 입문하여 한번 해보고자 요청드립니다. 저는 왜 —-> 2 import matplotlib.byplot as plt
    이 부분에서 에러가 날까요 ModuleNotFoundError: No module named ‘matplotlib.byplot’

    1. 안녕하세요, 메일로 자료 보내드렸습니다. 해당 에러는 현재 파이썬에 matplotlib가 설치되어 있지 않아보이네요. CMD 창 또는 아나콘다 Powershell prompt를 이용해서 설치를 진행해보세요! matplotlib 설치 등으로 검색하시면 많이 나와요 🙂

  2. 안녕하세요
    실행해보려고하는데 중간중간 막혀서요
    주피터노트북 자료 보내주시면 감사드릴게요
    좋은 설명 감사해요 🙂

  3. 안녕하세요.

    좋은 사이트를 만들어주셔서 감사드립니다.

    관련 내용을 자세히 살펴보고 싶은데

    엑셀 데이터와 파이썬 주피터 노트북 가이드를 송부부탁드립니다.

    감사합니다.

  4. 안녕하세요
    딥러닝관련 공부중인 학생입니다.
    좋은 사이트와 데이터보고 잘 공부중인데 실제 데이터를 적용하면 어떻게 되나도 알고싶어서 엑셀데이터와 파이썬주피터노트북 강의 파일 받아보고싶습니다!

  5. 안녕하세요. k-means 을 공부하다가 좋은 글을 보고 댓글을 남깁니다.
    정말 친절하고 자세한 설명 감사합니다. 추가적으로 데이터와 가이드를 참고하여
    공부해보고 싶은데, 혹시 부탁드려도 될까요?🙂

  6. 안녕하세요 클러스터링 공부하다가 방문하게 되었는데요 도움이 많이 되었습니다:) 혹시 직접 실행해볼 수 있는 자료나 가이드 부탁드려도 될까요?

  7. 안녕하십니까, 좋은 게시글 감사합니다.

    저도 공부를 위해 실행해보신 데이터셋에 대해서 공유해주실 수 있을까요?

    혹시 가능하시다면 yanago@naver.com 으로 주시면 감사하겠습니다.

    고맙습니다 !!!

  8. 자료 감사합니다. 파이썬 초보자가 ML 공부 하기에 딱 좋은 실습예제이네요..
    안내주신 이 사이트와 깃에 들어가서 자료 참조하며 따라가는데
    중간중간 막히기도 하고, 제가 워낙 초보라 중간중간 에러가 나면 대처가 안되네요..ㅠㅠ
    제게도… 공부를 하기 위한 쥬피터노트북 자료을 포함한 도움을 받을 만한 자료들 공유 주시면
    감사하겠습닌다.

    1. 안녕하세요, 향후 더 왕초보를 위한 자료 제작도 생각하고 있지만 지금 당장 공유해드릴만한 자료가 없습니다. 일단은 에러를 검색해가면서 공부하셔야 할 듯 합니다. 파이썬/프로그래밍 자체에 익숙하지 않다면 온라인 강의라도 먼저 찾아서 들어보셔야 할 것 같아요.

  9. ModuleNotFoundError: No module named ‘matplotlib.byplot’
    저는 matplotlib을 pip로 설치했는데 이렇게 뜹니다.
    혹시 추가파일이 있다면 받을 수 있을까요?

    1. 안녕하세요, https://matplotlib.org/stable/users/installing.html 참고하시면 좋을 것 같아요. 만약 안된다면 여러 패키지를 설치하는 와중에 버전이 충돌날 경우가 있으니 가상 환경에서 시도해보시는 것도 추천드립니다. 그러나 충돌날만큼 무거운 패키지가 아닌만큼 제 생각에는 인스톨 과정에서 문제가 있었을 것 같아요..! 인스톨하셨을 때 성공적으로 설치되었다고 뜨는지 다시 한 번 확인해보시면 좋을 것 같아요. (아나콘다로 깔았다면 conda install matplotlib으로 사용해보세요)

  10. 선생님 안녕하세요? 포스팅 공유 감사드립니다! 저는 k means clustering을 연구방법론으로 사용해보려고 하고 있습니다. 만약에 위에 있는 반품데이터를 연도별로 측정하고 k means를 하였고 1년차에는 고객 a,b,c,d가 각각 0,0,1,1로, 2년차에는 1,1,0,0로 분류가 되었다면 결국은 2년차와 1년차와 구분이 없는 것으로 보입니다. 그러나 코딩의 문제로 1이 0이 되고 0은 1이 되버린 것 같은데..이를 고정하는 방법이 있을지 여쭤보고 싶습니다.
    감사합니다.

    1. 안녕하세요, 어떤 오류가 나나요? 말씀해주신 것으로 보아서는 첫 줄 패키지 임포트부터 오류가 나신 것 같은데 당연히 임포트 전에 해당 패키지를 설치하셔야 합니다~! 그 외에 다른 오류가 난다면 알려주세요. 코드는 잘 돌아가는 것 맞습니다 🙂

  11. 쉽고 괜찮은 예제인 것 같아 학생들에게 강의를 하려고 보니, 오타들이 좀 있어서 공유드립니다.
    1. matplotlib.byplot –> matplotlib.pyplot
    2. preprocessed[[‘ItemsBought’, ‘ItemsReturned’]] –> processed_data
    3. ids = estimator.fit_predict(processed_data[[‘ItemsBought’, ‘ ItemsReturned’]]) –> ‘ItemsReturned’
    4. plt.ylabel(‘ItemsReturned’) 추가
    5. for (index, c_id, bought, returned, zip_code, product) in customer_data.itertuples(): –> data.itertuples()

    1. 안녕하세요! 꼼꼼히 봐주셔서 감사합니다. 처음 코드를 작성하고 블로그에 올릴 때 정리한답시고 좀 수정했더니 오히려 오타가 있었군요 ㅠ.. 이참에 한 번 다시 돌려보고 수정해서 올리겠습니다. 감사합니다!!

  12. data = pd.read_excel(‘CustomerDataSet.xls’)

    저는 코랩 또는 VSC에서 파이썬으로 클러스터링 하고 있는데
    위의 엑셀? 데이터 파일로 해보고 싶은데 자료 좀 부탁드려도 될까요

  13. 자료 감사합니다. 아주 좋은 예제인 것 같습니다.

    올려 주신 내용 실습중에 오류가 나서 어려움이 있습니다.
    주피터 파일 보내주시면 다시 해보고 싶습니다.

    감사합니다.

      1. 알려주신 github에는 설명주신 주피터 파일이 주석만 있고 내용이 없어서 실행 해 볼 수가 없네요.

        그리고 오류는 여기 첨부할 수 있는 기능이 없는데 이메일 주소를 알려주시면 보내드리겠습니다.

Lucy에 답글 남기기 응답 취소

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다