SK Networks AI 8기 과정 2번째 단위 프로젝트입니다.
왕환민 | 김현우 | 양의정 | 손승일 |
@Hwan-Min |
@hyeonu-kim |
@UiJungYang |
@ajeseung |
이탈 고객 예측 (Lost Customer Prediction)
자체 쇼핑몰에 등록한 고객 데이터를 활용하여 추후 고객이 얼마나 이탈할 것인지 데이터 분석을 통해 예측
고객의 이탈 원인을 파악해 더욱 만족스러운 서비스를 제공할 수 있음
- 데이터 수집
- 데이터 정제/ 전처리
- 데이터 분석을 위한 모델 설정
- 데이터 분석을 위한 그래프 생성
- 분석 결과 해석
- 유의미한 결론 도출
- README.md 작성
Communication & Messenger | |||
Development & Merge |
PyCharm |
과거 정의서들을 일일히 작성하였지만 빠른 속도로 무언가를 개발하는데 한계가 있습니다.
처음부터 많은 것들을 빌드업하면서 빠른 생산성을 기반으로 움직이려면 반드시 애자일해야합니다.
고로 폭포수 설계 방식이 아닌 애자일 프로세스 방식으로 애자일 보드를 작성하면서 진행했습니다.
애자일 보드는 자체적으로 제목이 요구 사항을 내포하며 각 카드 내부에는 정의한 Domain의 세부 사항이 기록됩니다.
고로 빠르게 팀원들과 협업 할 수 있고 소통 비용을 최소화시킬 수 있습니다.
작은 것 같지만 이와 같은 것들이 쌓여서 아주 기민하고 민첩한 조직을 만들어 냅니다.
실제 데이터를 구하지 않고 Faker를 사용해서 가상의 데이터를 만들었다(./data/generate_data.py). 그 이유로는 데이터의 유연성, 실제 데이터의 반복 가능성, 테스트 환경 조성 그리고 데이터 수를 마음대로 조정할 수 있기 때문이다.
Faker를 사용해서 가상의 customer.csv
, product.csv
, purchases.csv
데이터를 만들었다.
products
,purchases
,customers
데이터를 CSV 파일에서 로드합니다.purchases
와products
데이터를ProductID
를 기준으로 결합하여 구매 기록과 제품 정보를 통합합니다.- 결합된 데이터에 고객 정보를 추가하기 위해
CustomerID
를 기준으로customers
데이터와 병합합니다.
purchaseDate
열을datetime
형식으로 변환하여 날짜 데이터를 다룰 수 있도록 합니다.
- RFM은 고객 데이터를 요약하는 지표로, 다음을 계산합니다:
- Recency: 가장 최근 구매일로부터 현재까지 경과한 일수.
- Frequency: 고객의 구매 횟수.
- Monetary: 고객의 총 구매 금액.
- Satisfaction: 고객의 평균 만족도.
- 데이터를 그룹화하여 고객별로 RFM 값을 계산하고, 각 고객의
CustomerID
를 인덱스로 설정합니다.
Recency
값이 90일을 초과하는 경우를 이탈(Churn)으로 간주하여Churn
변수(이진 변수)를 생성합니다.- 이를 통해 고객 이탈 여부를 예측하기 위한 타겟 변수를 정의합니다.
Gender
값을M: 0
,F: 1
로 변환하여 머신러닝 모델이 처리할 수 있도록 숫자로 변환합니다.
- 독립 변수(X)와 종속 변수(y)를 분리합니다:
- X:
Recency
,Frequency
,Monetary
,Satisfaction
,Age
,Gender
. - y:
Churn
.
- X:
- 데이터를 학습 데이터(70%)와 테스트 데이터(30%)로 나누어 모델 평가를 준비합니다.
- 머신러닝 알고리즘의 성능을 높이기 위해
StandardScaler
를 사용하여 데이터 스케일링을 수행합니다. - 스케일링은 평균을 0, 표준 편차를 1로 맞춰 데이터의 분포를 표준화합니다.
- PCA는 고차원 데이터를 저차원으로 압축하는 차원 축소 기법입니다.
Quantity
,Price_KRW
,TotalAmount
,Satisfaction
,Age
,Gender
등 수치 데이터를 대상으로 PCA를 수행하여 주요 성분(Principal Components)을 생성합니다.- 생성된 주요 성분을 데이터로 활용하여 모델을 학습합니다.
prepare_data()
메서드를 사용하여 RFM 데이터 생성 및 전처리를 수행합니다.- 고객 데이터를 기반으로 독립 변수(X)와 종속 변수(y)를 분리하며, 학습 데이터(70%)와 테스트 데이터(30%)로 나눕니다.
StandardScaler
를 사용하여 데이터를 스케일링한 후, Logistic Regression 모델로 학습을 진행합니다.random_state=42
를 설정하여 재현 가능한 결과를 보장합니다.class_weight='balanced'
옵션을 통해 데이터 불균형 문제를 완화합니다.
PCA
를 사용하여 고차원 데이터를 저차원으로 축소합니다.- 주요 성분(Principal Components)을 활용해 데이터를 시각화하거나 분석 효율을 높입니다.
- 축소된 데이터를 기반으로 로지스틱 회귀 모델을 재학습합니다.
- 테스트 데이터에 대해 예측을 수행하며, **정확도(accuracy)**와 **분류 보고서(classification report)**를 생성합니다.
- 이 과정은 일반 데이터와 PCA 적용 데이터를 각각 평가하여 성능을 비교합니다.
- 각 카테고리에 대해 총 구매 수량을 집계하여, 인기 있는 카테고리를 파악합니다.
- 제품별로 총 구매량과 평균 만족도를 계산합니다.
- 만족도를 기준으로 상위 10개 제품과 총 구매량 기준 상위 10개 제품을 선정하여 트렌드를 분석합니다.
- 각 고객의 총 구매 수량 및 구매 금액을 집계합니다.
- 가장 활발한 구매 활동을 보인 상위 고객을 식별하며, 고객 정보(이름, 가입일, 위치 등)를 포함한 프로필을 작성합니다.
- 분석 결과는 고객 세분화, 개인화 마케팅 캠페인, 그리고 비즈니스 전략 수립에 활용됩니다.
PCA(Principal Component Analysis)를 활용하여 차원 축소 후 Logistic Regression 모델을 학습했으나, 성능(정확도와 F1 점수)이 오히려 감소하는 결과를 보였습니다. 이 현상을 분석한 결과, 다음과 같은 요인들이 주요 원인으로 나타났습니다.
- PCA는 데이터의 분산을 최대한 보존하도록 설계되었지만, 이탈 예측에 중요한 변수(
Recency
,Frequency
,Monetary
등)가 주요 성분으로 변환되며 모델의 학습에 필요한 정보가 일부 손실된 것으로 보입니다.
- Logistic Regression은 입력 변수와 출력 간의 선형 관계를 가정합니다. 그러나 PCA를 적용하면서 데이터의 원래 분포와 관계가 왜곡되어, 모델의 학습 성능에 부정적인 영향을 미쳤을 가능성이 있습니다.
- 데이터셋 내 클래스 간 불균형이 존재했으며, PCA는 이러한 불균형 상황에서 소수 클래스의 특성을 충분히 반영하지 못할 수 있습니다. 이로 인해
Churn
예측에서 모델이 특정 클래스에 편향되었을 가능성이 큽니다.
PCA 적용 후 성능 저하를 극복하기 위해 다음과 같은 방안을 고려할 수 있습니다:
-
특성 선택(Feature Selection)
- PCA를 적용하기 전에, 예측 성능에 중요한 변수들을 선별하여 정보 손실을 최소화합니다.
-
대체 차원 축소 기법
- PCA 대신 t-SNE, UMAP 등 비선형 차원 축소 기법을 활용하여 데이터의 본질적인 특성을 보존하는 접근 방식을 시도합니다.
-
데이터 불균형 해결
- SMOTE와 같은 샘플링 기법을 활용하거나, 모델 학습 시 클래스 가중치를 조정하여 불균형 문제를 완화합니다.
PCA는 고차원 데이터를 다루는 데 유용한 도구이지만, 모든 데이터셋과 문제에 적용할 때 항상 성능이 향상되는 것은 아닙니다. 이번 프로젝트에서는 PCA가 모델의 성능에 부정적인 영향을 미쳤으나, 이를 통해 데이터와 모델의 특성을 보다 깊이 이해하고 개선할 수 있는 방법을 모색할 수 있었습니다. 향후 분석에서는 데이터의 특성과 문제의 맥락을 더욱 신중히 고려하여 최적의 접근 방식을 적용하고자 합니다.
🤓김현우
_ 👏_고객이탈 분석에 필요한 데이터를 비록 가상으로 만들었지만 시각화 관련 코드와 데이터 전처리 등 현실적으로 취업에 필요한 기술을 배웠던 좋은 시간이였습니다._
👨💻왕환민
모델링과 데이터 분석을 처음 접해봤는데 아직 어려운 부분이 있지만 좋은 경험이 되었다.👏
😺양의정
모델링에 많은 방법이 있다는 것을 알았고 데이터에 따라 다양한 방식을 적용하고 분석해보는 시간을 가졌습니다.👏
🪐손승일
modeling이나 데이터 분석을 오랜만에 하게 되었는데 대학교 시절에 했던 과제들을 바탕으로 단위 프로젝트를 진행했다.👏