본캠프/TIL ♨

[48일차] 금융 클러스터링 프로젝트 1일차 | 머신러닝 완강|

yssummer 2025. 4. 18. 21:42

250418

🌠오늘 느낀 점

👉프로젝트 빡셀만한거 골라서 진짜 빡센듯 ? 이거 하면 난 성장한다! 

아침에 집중해서 끝내고,

오전 10시에 발제듣고,

데이터셋 내려받아서 살펴보고,

지금 우리가 도전해보고 싶은것, 해볼만한 것, 등 여러 기준으로 프로젝트 주제 회의하고,

추려진 데이터를 더 깊게 만져본 뒤 후보 2개 중에서 하나로 결정하고,

(금융 클러스터링 - 고객 맞춤별 카드 추천하기 주제로 고름),

결정하고나니 저녁시간이 돼서 저녁먹고 다시 모여서,

머신러닝으로 넘어가기 위한 코드 다들 각자 써봤고,

나의 경우 제공된 데이터셋 3개 합치고

eda하려고 이것 저것 코드 적용해보니

하루 끝났다. 와 대박 지쳤다.!!!!! 

🫀 주말 할일

💡 기초 eda와 시각화 코드 해보기로 하고, 

vs code로 다들 통일하기 위해 설치하고,

모르는 거랑 작업 공유사항은 슬랙에 올려놓기로 하고,

재밌는 클러스터링 인사이트 도출하기 위해 시장조사도 해보기!

월요일 화요일쯤에 Eda 각자 해본 결과물 갖고 논의해서 통일된 기준으로 완성하게 되지 않을까 얘기됨.

그 이후에는테스트 데이터 분리 등도 생각해봐야겠다.

 

🎯 오늘 우선순위 3개

🫀 🫀 🫀  프로젝트 1일차::::: 발제듣고 프로젝트 제공 데이터 살펴보고 결정하기...✔️

> 머신러닝 인강 완강✔️

 

 

 

⌛시간활용 기록

07:00 - 08:00 기상 후 인강  
08:00 - 09:00 인강 듣기, 커피or말차 + 착석 + 출첵 + TIL 켜기  
09:00 - 10:00 머신러닝 완강~🙋🏼‍♀️오전 스크럼  
10:00 - 11:00 🫀프로젝트 시작! : 발제 듣고 데이터 살펴보기 시작  어떤 데이터가 있는지 확인 & 후보 탐색
11:00 - 12:30 🫀 프로젝트 회의💡 프로젝트 후보 데이터셋 1~2개 골라서 분석 방향 스케치    
  저엄심  
14:00 - 15:00 🫀  데이터셋 담당 튜터님의 QnA 들으러 다녀옴  
  🫀 프로젝트 회의💡 주제선정 회의  
16:00 - 17:00 🫀 프로젝트 회의 💡 주제선정 회의 주제: 군집 클러스터륑,,,,,,,,!!!!!!!!!!!!
주17:00 - 18:00 🫀  프로젝트 회의 💡 기초 eda와 시각화 코드 돌려본 후 최종 결정  
18:00 - 19:00 저녁밥  
19:00 - 20:30 🫀  프로젝트 회의 💡 기초 eda와 시각화 코드  
20:30 - 21:00 🫀 주말 할일 논의💡 기초 eda와 시각화 코드 해보기로 하고,  vs code로 다들 통일하기 위해 설치하고, 모르는 거랑 작업 공유사항은 슬랙에 올려놓기로 하고, 재밌는 클러스터링 후 인사이트 도출하기 위해 시장조사도 해보기! 월요일 화요일쯤에 Eda 각자 해본 결과물 갖고 논의해서 통일된 기준으로 완성하게 될듯. 그 이후에는테스트 데이터 분리 등도 생각해봐야겠다.  
21:00 - 22:00 🤖 머신러닝 강의 다시 들으며 이완............................힘드루!  
22:00 - 23:00 잘준비  

 

 





 

🧠공부메모

 

📚 1.  머신러닝 프로젝트 발제 메모🤖

 

🔵발제듣고 프로젝트 시작

📌 핵심

    • 11일 남음
    • 입실은 6시 이후, 퇴실은 12시 전에 하기!!!! 큐알체크 여유로워졌다.
    • 젭에서 통보 없이 30분 이상 없어지면 부정출결!
    • 열심히하자!

 

🧩2시 반, 클러스터링 데이터 튜터님 방 가서 30분간 큐앤에이 설명 들은 거 아래 메모했다.

 

설명 들으면서 들은 생각:...회귀분석은 전처리처럼 .... 거쳐가고 (?) 그 위에 얹는 게 클러스터링이구나... 회귀분석은 클러스터링 하기 전에 스쳐지나가는 한 챕터(?)인거구나.. 난 아직 회귀분석도 제대로 안해봤는데 군집을 해도 될까? 근데 어차피 다 어려운데 뭐 어때? 회귀 택하든 클러스터링 택하든 비슷하니까 그냥 몸을 던져봐?!?! ㅋㅋ... 그러나.... 선배님들 하신 결과물을 보니까 장난 아니다. 덜덜.. 아직 저실력은 절대 안되는데?? 확실히 군집분석은 그냥 회귀 주제를 선택하는 것보다 할게 많고 어렵기는 하겠구나 ... 좀 무섭다(;;;ㅋㅋㅋ), 그치만 할줄 알게 되면 유의미하고 재미도 있고 현업에서도 쓸 수 있고 참 좋겠다,... 이때다 하고 함 도전해볼까.... 그치만 처참히 부서질지도 몰라..ㅠㅠ.. 다른 분석주제 qna 들으러 간 팀원들 의견 듣고 나서 결정해봐야겠다.!!!!--> 그런데 팀원분들도 군집에 도전해보고 싶은 것 같았지만 하도 까다로워보여서 의견이 분분했으나 결정하기가 너무 어려워가지구 마지막 결정은 핀볼에 맡겨서 결국 군집당첨~ㅎㅎㅎ

 

<eda 관한 학생 질문>
- 금융데이터는 결과에 영향미칠 요소가 많아보인다 유저데이터의 나이, 지역, 연금 등이 많은데, 함부로 만져서 집중하고픈 클러스터를 맘대로 개입해서 정해도 되는걸까.
<답변>
- 클러스터는 모든 집단을 파악해야하는 것임. 피처 컬럼 선택할 떄 중요하다고 생각하는 것은, 내 생각 투영해도 되냐고 질문하신 것 같은데 그건 그렇게 해도 된다. 클러스터링 처음 시작할 때, 일단 어떤 변수에 대해서 셀렉을 하기 애매할 수 있음. 처음 실험할때는 모든 컬럼을 다 넣어라. 은행과 마케팅 모두 다. 그 다음에 스크립플랏을 그린 후 레인지 나눠. 누구는 케이값삼으로 하고 누구는 사로 하고 실험을 돌려봄,. 그렇게 배분해서 초기진행하면 될듯. 중요하다고 생각하는 것들을 그 다음에 넣어라. 그게 중요하다고 생각한 이유를 상관관계라던지 피처임포턴스 등을 만져서 진행할 수 있다. 군집을 쓰고 있지만 주장을 뒷받침하기 위해 다른 분석방법을 맛보기로 사용할 수 있다. 군집을 하면서는 모든 머신러닝기법이 다 들어갈 수 있다.(청천벽력입니가?) 그건 클러스터링을 하기 위한 중간과정이다. 클러스터링 기법만 하나만 있는 것이 아니다. 과정에서 라이트한 개념이 사용된다 .(분류라던가) 그건 작은 개념일 뿐이라서, 큰 그림인 클러스터링을 하는 과정에 다른 머신러닝 기법이 수행된다고 보면 된다

 

<마케팅 데이터에 대해서 질문>
 - 마케팅을 하긴 했지만 대주제를 뭘로 잡을지는 모르겠다. 현재 뭐할지 몰라서 각자 eda부터 하고 있다.
 <답변>
- eda 하면서 기획 세분화 하는 건 좋은 접근이다. 그러나 반드시 뭐를 해낸자고 하지는 말라. 큰 주제로 잡고, 고객에게 맞춤 인사이트를 제공하겠다는 기조를 유지할 것. 제공한 파일은 다섯개 파일을 결합한 것이다. 누구는 고객에 대해 eda, 누구는 상품에 대해 eda, 누구는 매출 관점에서 보기. 이런식으로 각자 eda 한 다음에 중간에 다함께 버무려라.

 

 

 

🧩 클러스터링 프로젝트 개요

1. 프로젝트 배경
- 시장 현황 (마케팅 시장이 지금 이렇더라 근데 우리 데이터는 어떻다)
- 문제제기(또는 흥미)
- 프로젝트 목적

 

2. 분석
- 전체 데이터셋 eda
    1) 결측
    2) 이상
    3) 시각화(분포) --전반적으로 설명해주는 단계
    4) 여기에다가 고객/제품/판매자/대출상품 목차 넣어도 돼요~

 

3-1. 상세분석 목차 아이디어 1
    1) 고객   -- 각 팀원마다 한 부분씩 보고 나중에 seg 
    2) 제품
    3) 판매자
    4) 대출상품
    5) 위 4개를 모아서 --> segmentation(고객과 제품을 기준으로 비교)  -- 점점 깊어지게 가져가자

 

3-2. 상세분석 목차 아이디어 2 

(상세분석에서는
상관관계 및 통계적 가설검정 넣기, 혹은 시장 동향자료)

 

1) 가설 1
2) 가설 1 결과해석
3) 가설 2
4) 가설 2 결과해석

 

4. 상세분석(ML)
    1) 실험을 반복한다.   

 2) 인원을 나눠서 k 값을 분배한다: 

 4) 분석결과
      (1) 클러스터별 인사이트 및 기대효과
      (2) 회고

 

 실험결과를 계속 기록하고 공유하기 위해 엑셀 공유문서로 진행

진행할수록 필요 컬럼 점점 드랍하는 느낌으로 가져가기
  

 

📌우리 팀 주제 

신규 고객 유입을 위한 소비 패턴 클러스터링 분석
신규 고객 유입을 위한 소비 패턴 클러스터링 분석을 통해 새로운 캠페인 제안

프로젝트명: 카드한입 잡숴 (백종원 컨셉)
 
 
슬랙에 썼던 거 가져오니까 글자 배경 검정색인게 왜 안사라지냐 ;;;; ㅎㅎㅎㅎ
 
🧩  우리 데이터 보면서 진행 방향 혼자 대충 써봤음.

 

가설

 

시고객을 몇 개 그룹으로 나눠서, 그 특성에 맞춰 다른 마케팅 전략을 세우기
나이- 연소득-부채-신용점수-보유카드수 컬럼을 사용한다 치면,

 

과정
  1. 전처리 -- 필요한 컬럼 선택
  2. 최적의 k 구하기 위해 3,4,5로 여러번 돌려보기
  3. k means 를 해서 고객을 그룹화한다 -군집이 나옴
  4. 군집별로 평균이나 뭐를 본다
  5. 해석한다 - 군집 0번: 청년 저소득, 군집 1번: 중년 고소득 등등
  6. 시각화한다
  7. 마케팅 전략 - 예를 들면 0번 군집이라면 - ~한 카드 제안
  8. 예를 들어서 1번 군집이라면 고소득층이니까 골드카드 프로모션한다던가, 
  9. 어디서 많이 지출했는지, 신용등급에 따라서 추천이 어떻게 달라지는지 그런 인사이트 실험을 통해서 볼 수 있겠

 

🧩  군집분석과 해석과정에 필요할 mcc 코드 엑셀파일:  이거는 번역한 거다. 109개가 있었는데 영어로 된 국제코드였다.

카드 거래 기록마다 나와있는 어느 업종에서 결제했는지에 대한 정보를 유용하게 쓸 수 있을 것 같다는 의견이 나왔다.

주말에 나도 데이터를 더 봐보며 이걸 활용하는 방법을 생각해보려고 한다. 

 

 

import pandas as pd# MCC 코드와 상위 카테고리 매핑
mcc_category_map = {
    "5812": "음식/외식", "5814": "음식/외식", "5813": "음식/외식", "5815": "음식/외식",
    "5411": "식료품/편의점", "5499": "식료품/편의점", "5912": "식료품/편의점", "5921": "식료품/편의점",
    "5311": "쇼핑/소매", "5310": "쇼핑/소매", "5300": "쇼핑/소매", "5651": "쇼핑/소매", "5661": "쇼핑/소매",
    "5977": "쇼핑/소매", "5947": "쇼핑/소매", "5732": "쇼핑/소매", "5722": "쇼핑/소매",
    "4111": "교통/이동", "4121": "교통/이동", "4131": "교통/이동", "4112": "교통/이동", "3722": "교통/이동",
    "3771": "교통/이동", "4511": "교통/이동", "4784": "교통/이동", "4411": "교통/이동",
    "7538": "자동차/정비", "7531": "자동차/정비", "7542": "자동차/정비", "7549": "자동차/정비", "5533": "자동차/정비",

 
 
🧩 mcc 원본은 json 파일로 되어있었고 여는 법을 모른다. 근데 엑셀로 따로 올려주셔서 그걸 보고 하라는 의미로 이해했다. 일단 엑셀파일을 보고 있다. json여는 법은 차차 생각해보자.
 
# 결과 미리 보기
print(df[['MCC', '상위카테고리']].head())
 
 1. 음식/외식
  • Eating Places and Restaurants (5812)
  • Fast Food Restaurants (5814)
  • Drinking Places (Alcoholic Beverages) (5813)
  • Digital Goods - Media, Books, Apps (5815)
 2. 식료품/편의점
  • Grocery Stores, Supermarkets (5411)
  • Miscellaneous Food Stores (5499)
  • Drug Stores and Pharmacies (5912)
  • Package Stores, Beer, Wine, Liquor (5921)

 

 

🧩오늘 써본 EDA 코드로 기본 생김새는 살펴봄, 앞으로 써볼 군집화 코드 시도 중~ 어렵다... 강의자료들 다 다시 뒤지고 있음... 대체 켜져있는 탭이 몇개야~~ ?!!?!

# 데이터 불러오기 
cards = pd.read_csv("cards_data.csv") # encoding='utf-8', usecols=['age', 'gender', 'income']
users = pd.read_csv("users_data.csv")
trans = pd.read_csv("transactions_data.csv")

print(cards.shape)
print(users.shape)
print(trans.shape)
print(cards.columns)
print(users.columns)
print(trans.columns)


print(cards.info())
print()
print(users.info())
print()
print(trans.info())

print(cards.head())
print(cards.isnull().sum())


# 3) 1차 병합: cards :양방향_화살표: transactions
#    – 두 테이블에 공통으로 있는 'client_id' 컬럼을 키로 사용
cards_trans = pd.merge(
    cards,
    trans,
    on       = 'client_id',
    how      = 'left',
    suffixes = ('_cards','_trans')
)
# 4) 2차 병합: (cards+transactions) :양방향_화살표: users
full_df = pd.merge(
    cards_trans,
    users,
    left_on  = 'client_id',   # cards_txn 에서
    right_on = 'id',          # users_df 의 PK
    how      = 'left',
    suffixes = ('','_users')
)
# 5) 중복된 ID 컬럼 제거
#    – 두 번째 merge 에서 users_df 의 'id' 컬럼이 'id' 또는 'id_user' 로 들어왔을 텐데,
#      suffixes=('','_user') 로 지정했으니 'id_user' 가 생겼을 거예요.
if 'id_users' in full_df.columns:
    full_df = full_df.drop(columns=['id_users'])
else:
    # suffixes 안 쓰고 그냥 'id' 로 붙었다면, 이걸 지워줍니다.
    full_df = full_df.drop(columns=['id'])
full_df = full_df.rename(columns={
    'id_cards':      'card_record_id',
    'id_trans':       'transaction_record_id',
    'client_id':    'user_id'
})
pd.set_option('display.max_columns', None)
print(full_df)


from sklearn.preprocessing import StandardScaler

# 필요한 컬럼
cols = ['age', 'yearly_income', 'total_debt', 'credit_score', 'num_credit_cards']
X = df[cols]

# 스케일링
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

kmeans = KMeans(n_clusters=4, random_state=42)
df['cluster'] = kmeans.fit_predict(X_scaled)

 

결과출력해보니 대강 이렇게 생긴 데이터였다. 

(6146, 13)
(2000, 14)
(13305915, 12)
Index(['id', 'client_id', 'card_brand', 'card_type', 'card_number', 'expires',
       'cvv', 'has_chip', 'num_cards_issued', 'credit_limit', 'acct_open_date',
       'year_pin_last_changed', 'card_on_dark_web'],
      dtype='object')
Index(['id', 'current_age', 'retirement_age', 'birth_year', 'birth_month',
       'gender', 'address', 'latitude', 'longitude', 'per_capita_income',
       'yearly_income', 'total_debt', 'credit_score', 'num_credit_cards'],
      dtype='object')
Index(['id', 'date', 'client_id', 'card_id', 'amount', 'use_chip',
       'merchant_id', 'merchant_city', 'merchant_state', 'zip', 'mcc',
       'errors'],
      dtype='object')

 

 

📚3.  머신러닝 인강 완강

 

발제 10시에 들을 때 모든 머신러닝 내용을 알고 들어야해서

아침 9시 반까지 머신러닝 인강 완강했음.ㅎㅎㅎㅎ 내일 주말 아니었음 진짜 기절이었을 겁니다.


 

 

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

 

all my best... 열심히하겠다.