내일배움캠프

데이터 분석 트랙 84일차 25.06.04. [TIL]

jjaio8986 2025. 6. 4. 21:07

[최종 프로젝트 진행 4일차]

<목차>

  • 데이터 테이블 및 컬럼 정리
  • 테이블 결합 코드
  • 1차 분석 인사이트

  • 데이터 테이블 및 컬럼 정리

1. “hh_demographic” : 고객 데이터

 1.1. 설명

- 고객 중 일구 가구(801 )의 정보 [전체 고객 중 약 30%를 차지]

- 데이터 특성 상 신상 정보는 마스킹 되어 있다.

 

 1.2. 컬럼 설명

A. HOUSEHOLD_KEY : 각 가구에 대한 고유키 (PK)

# FK) "TRANSACTION_DATA", "CAMPAIGN_TABLE"

B. AGE_DESC : 추정 연령대

C. MARITAL_STATUS_CODE : 결혼 여부 (A=기혼, B=미혼, C=모름)

D. INCOME_DESC : 각 가구의 수입

E. HOMEOWNER_DESC : 각 가구 구성 (Homeowner=세대주, renter=세대원, etc)

F. HH_COMP_DESC : 각 가구 구성

G. HOUSEHOLD_SIZE_DESC : 5인 이상 가구

H. KID_CATEGORY_DESC : 가구 내 자녀의 명수(3명 이상)

 

2. “transaction_data" : 거래 데이터

 2.1. 설명

- “2,500 가구“92,339개의 상품구매 데이터를 의미

- 현 연구 데이터 내에서 각 가구에서 구입한 모든 상품에 대한 정보를 담고 있다.

- 각 행은 매장에서 발행하는 영수증의 내역과 본질적으로 같은 정보를 담고 있습니다.

# , 최종 소비자 결제 금액을 의미! 상품 자체 금액은 따로 구해야 한다는 의미!

 

 2.2. 컬럼 설명

A. HOUSEHOLD_KEY : 각 가정의 고유키(PK)

# FK) "hh_demographic"

B. BASKET_ID : 장바구니 고유값

# , 당근, 양파, 건전지 등을 1번의 거래에서 구입했다면 같은 장바구니 고유값이 매겨진다.

C. DAY : 거래 발생일

D. PRODUCT_ID : 각 상품 고유 ID

# FK) PRODUCT, CAUSAL_DATA와 연결

E. QUANTITY : 구매한 총 상품의 개수

F. SALES_VALUE : 매출로부터 소매상이 벌어들인 수익

G. STORE_ID : 개별 상점 ID

H. COUPON_MATCH_DISC : 소매점(판매점)과 납품점의 쿠폰 2개가 적용된 할인율

I. COUPON_DISC : 납품점(제조점)의 쿠폰 할인이 적용

J. RETAUL_DISC : 소매점(판매점)의 로열티 카드 프로그램이 적용된 할인율

K. TRANS_TIME : 거래 발생한 날의 구체적인 시간

L. WEEK_NO : 거래가 발생한 주

 

3. "campaign_table" : 캠페인 데이터

 3.1. 설명

- 현 데이터 상에서 각 가구가 수신한 캠페인들의 리스트

- 각각의 가구는 서로 다른 캠페인 셋을 수신

- 1,584 가구에 30번의 캠페인들이 시행되었음.

 

 3.2. 컬럼

A. HOUSEHOLD_KEY : 각 가정의 고유키(PK)

B. CAMPAIGN : 1~30까지의 서로 다른 고유한 캠페인들

C. DESCRIPTION : 캠페인 대분류 (TypeA ~ C 까지 3 분류)

 

4. "campaign_desc" : 캠페인 기간 데이터(분석에 사용하지 않을 예정)

4.1. 설명

- 캠페인 운영 기간에 대한 컬럼

 

4.2. 컬럼

A. CAMPAIGN : 1~30까지의 서로 다른 고유한 캠페인들

B. DESCRIPTION : 캠페인 대분류 (TypeA ~ C 까지 3 분류)

C. START_DAY : 캠페인 시작일

D. END_DAY : 캠페인 종료일

 

5. “product" : 상품 데이터

5.1. 설명

- 다양한 상품 종류 중 판매된 각 상품의 정보가 담긴 테이블

- 상품의 총 개수는 92,353

- 상품 종류는 브랜드(national, private)의 라벨 그리고 극소수의 기타 라벨에서 가져옴

 

5.2. 컬럼

A. PRODUCT_ID : 상품 고유 ID

B. DEPARTMENT : 유사 상품군 (대분류)

C. COMMODITY_DESC : 유사 상품군 하위 분류(중분류)

E. SUB_COMMODITY_DESC : 가장 작은 단위의 상품 하위 분류(소분류)

F. MANUFACTURER : 납품(제조)업체 코드! (유사하거나 같은 제조자를 같이 묶은)

G. BRAND : National 혹은 Private 라벨이 붙은 브랜드! (상품이 납품 단위로 가기에)

H. CURR_SIZE_OF_PRODUCT : 상품 포장 사이즈 (모든 상품에 있는 건 아님)

 

6. "coupon_redempt" : 쿠폰 사용 데이터

6.1. 설명

- 캠페인을 통해 각 가구에 발송된 쿠폰이 사용된 경우!

- 30번의 캠페인을 통해 434 가구에서 556개의 쿠폰이 사용되었다.

 

6.2. 컬럼

A. HOUSEHOLD_KEY : 가구 고유값

B. DAY : 거래가 발생한 날짜

C. DOUPON_UPC : 각 쿠폰의 고유번호(캠페인과 가구별 고유값)

D. CAMPAIGN : 캠페인 고유번호

 

7. "causal_data" : 쿠폰 위치 데이터

7.1. 설명

- 이 표는 주어진 제품이 주간 우편물에 게재되었는지 또는 매장 내 진열(일반 제품 배치 제외)의 일부였는지 여부를 나타냅니다.

- 68,377개의 상품에 대해 정보가 표시됨

 

7.2. 컬럼

A. PRODUCT_ID : 상품 고유 ID

B. STORE_ID : 상점 ID

C. WEEK_NO : 거래가 발생한 주

D. DISPLAY : 실제 매장의 진열 장소

E. MAILER : 홍보지에 상품 이미지의 위치

 

8. "coupon" : 발행된 쿠폰 데이터

8.1. 설명

- 30건의 캠페인 중에서 1,135개의 쿠폰을 통해 혜택이 적용된 44,133개의 상품들

 


  • 테이블 결합 코드
# 1차 merge
df_trans= transaction\
    .merge(hh_demographic, on='household_key', how= 'left' )\
    .merge(product,on='PRODUCT_ID', how= 'left' )

coupon_merge= coupon_redempt\
            .merge(coupon, on=['COUPON_UPC','CAMPAIGN'], how='left')

# 중복 키 제거: PRODUCT_ID, household_key, DAY가 동일한 행이 여러 개 있는 경우 한 개만 남겨두기
coupon_merge_unique = coupon_merge.drop_duplicates(
    subset=['PRODUCT_ID', 'household_key', 'DAY'],
    keep='first'
)

#df와 중복을 제거한 coupon_merge_unique를 PRODUCT_ID, household_key, DAY 기준으로 병합
df_coupon = df_trans.merge(
    coupon_merge_unique,
    on=['PRODUCT_ID', 'household_key', 'DAY'],
    how='left'
)

# 최종 merge
df = df_coupon\
    .merge(campaign_table, on=['household_key','CAMPAIGN'], how='left')

# 소도매 분류 컬럼
house_key= hh_demographic['household_key'].unique()
df['retail']=df['household_key'].apply(lambda x: 'house' if x in house_key else 'whole')
df['retail'].value_counts()

  • 4일차 EDA 도중 의문사항

1. TRANSACTION에서 SALES_VALUE가격이 너무 다양함. DAY별로 너무 가격이 다양한데 사용해도 되는가?

 - 일단 RFM 사용시 기간 잘 나눠서 Monetary에 사용하자!

2.RFM 분석을 해도 괜찮을 까요?

  • 현재 정확한 날짜가 없습니다. 그래서 날짜 형식은 1,2,3,4의 숫자 형식으로 되어있고 마지막 숫자는 711입니다.
  • 그럼 711을 최근 날짜로 생각하고 RFM 분석을 해도 괜찮을까요?

3. 데이터 분석할 때 전체 기간 중 한 가구당 구매한 가격 비교를 할 때