/////
Search

Project ~ ing

URL 1 (1)
Tags
Archive
ETA
2025/11/21 → 2025/11/28
Main Task
Sub Task
담당자
메모
보고서
상태
Done
생성 일시
2025/11/19 11:30
생성자
우선 순위
진행률 %
Task : 분석주제 정하기
H&M 새로운 트랜드의 주인공 '엑스틴(X-teen)' 을 위한 제품 분석
Task : 분석 기획
대주제 적어주세요.
데이터를 확인하면서(eda) → 살을 붙여나가는 형태로
반드시 우리팀만의 why(기준)이 있는 분석을 진행해주시기 바랍니다.
Task : 역할 분담
팀장 : 권혜인
데이터 분석: merge_all
ppt 제작: 임준성
영상 발표자: 임준성
발표회 발표자: 정다솜
보고서 작성: 권혜인
코드 정리: 배진욱
실행 및 진행 사항 정리

진행상황

파일 업로드 및 라이브러리 임포트

import pandas as pd df_a = pd.read_csv(r"C:\Users\LIM.J.S\Desktop\부캠 프로젝트 1\hm_dataset\h&m dataset\articles_hm.csv") df_c = pd.read_csv(r"C:\Users\LIM.J.S\Desktop\부캠 프로젝트 1\hm_dataset\h&m dataset\customer_hm.csv") df_t = pd.read_csv(r"C:\Users\LIM.J.S\Desktop\부캠 프로젝트 1\hm_dataset\h&m dataset\transactions_hm.csv")
C
복사

테이블 조인 , 결측지 제거 - 결측치 그래프만 제작

merge_c_t = pd.merge(df_c,df_t,how='inner',on='customer_id') merge_all = pd.merge(merge_c_t,df_a,how='inner',on='article_id') merge_all_drop = merge_all.dropna(axis=0, how='any')
Python
복사

#나이 그룹화 - 그래프

df_10 = merge_all_drop[(merge_all_drop['age']>=10) & (merge_all_drop['age']<20)] df_20 = merge_all_drop[(merge_all_drop['age']>=20) & (merge_all_drop['age']<30)] df_30 = merge_all_drop[(merge_all_drop['age']>=30) & (merge_all_drop['age']<40)] df_40 = merge_all_drop[(merge_all_drop['age']>=40) & (merge_all_drop['age']<50)] df_50 = merge_all_drop[(merge_all_drop['age']>=50) & (merge_all_drop['age']<60)]
Python
복사

#최종 set을 사용하여 자동으로 중복값 없애고, 교집합으로 모두 포함하는 스터디 셀러 추출

set_10 = set(df_10['prod_name']) set_20 = set(df_20['prod_name']) set_30 = set(df_30['prod_name']) set_40 = set(df_40['prod_name']) set_50 = set(df_50['prod_name']) product_10_50_check = list(set_10 & set_20 & set_30 & set_40 & set_50)
Python
복사

# 유사 제품이 몇개인지 확인용

product_check_cnt = 0 for i in product_10_50_check: if True: product_check_cnt+= 1 product_check_cnt
Python
복사

# 스테디샐러 제품 제거하기 _ (시각화)나이대 별로 스테디샐러 몇개 구매했는지

df_10_drop = df_10[df_10['prod_name'].apply(lambda x: x not in product_10_50_check)] df_20_drop = df_20[df_20['prod_name'].apply(lambda x: x not in product_10_50_check)] df_30_drop = df_30[df_30['prod_name'].apply(lambda x: x not in product_10_50_check)] df_40_drop = df_40[df_40['prod_name'].apply(lambda x: x not in product_10_50_check)] df_50_drop = df_50[df_50['prod_name'].apply(lambda x: x not in product_10_50_check)]
Python
복사

#20대 와 40대 제품간에 중복되는 제품 추출_그래프

a = set(df_40_drop['prod_name']) b = set(df_20_drop['prod_name']) product_20_40_check = list(a & b)
Python
복사

20대 와 40대 제품간에 중복되는 제품이 몇개인지 확인용

product_check_cnt = 0 for i in product_20_40_check: if True: product_check_cnt+= 1 product_check_cnt
Python
복사

# 고객 id 별 정리

df_40_unique = df_40_drop.groupby('customer_id').agg(lambda x: list(x)) df_40_unique = df_40_unique.reset_index()
Python
복사

#유사율 50% 기반 영포티, 40대 일반 데이터 나누기

rows = [] for cid, prod in zip(df_40_unique['customer_id'], df_40_unique['prod_name']): match_list = [x for x in prod if x in product_20_40_check] total_cnt = len(prod) match_cnt = len(match_list) if total_cnt > 0: similarity = match_cnt / total_cnt else: similarity = 0 label = '영포티' if similarity >= 0.5 else '일반40대' rows.append({ 'customer_id': cid, 'all_products': prod, 'matched_products': match_list, 'total_count': total_cnt, 'matched_count': match_cnt, 'similarity': similarity, 'label': label }) df_y40_and_no_y40 = pd.DataFrame(rows)
Python
복사

# 영포티, 일반40대 데이터 각각 나누기_각각의 퍼센테이지 시각화

df_no_young40 = df_y40_and_no_y40[df_y40_and_no_y40['label'] == '일반40대'] df_young40 = df_y40_and_no_y40[df_y40_and_no_y40['label'] == '영포티']
Python
복사

#각각의 데이터 저장

df_young40.to_csv("영포티 데이터.csv" ,index=False,encoding='utf-8-sig') df_no_young40.to_csv("일반40대 데이터.csv" ,index=False,encoding='utf-8-sig')
C
복사

#각 데이터셋의 구매량 구하기 위한 준비 데이터 셋

# 각 데이터셋의 구매량 구하기 위한 준비 데이터 셋 df_y40_cid = df_40_drop[df_40_drop['customer_id'].isin(df_young40['customer_id'])] df_no_y40_cid = df_40_drop[df_40_drop['customer_id'].isin(df_no_young40['customer_id'])]
C
복사

#제품 기준 데이터 정리

df_y40_cid_prod_unique = df_y40_cid.groupby('prod_name').agg(lambda x: list(x)) df_y40_cid_prod_unique = df_y40_cid_prod_unique.reset_index() df_no_y40_cid_prod_unique = df_no_y40_cid.groupby('prod_name').agg(lambda x: list(x)) df_no_y40_cid_prod_unique = df_no_y40_cid_prod_unique.reset_index()
C
복사

#조인을 위한, 데이터프래임 생성.

y40_counts= df_y40_cid['prod_name'].value_counts().reset_index() y40_counts.columns = ['prod_name', '구매량'] no_y40_counts = df_no_y40_cid['prod_name'].value_counts().reset_index() no_y40_counts.columns = ['prod_name', '구매량']
C
복사

# 구매량 추가용 조인 과정

df_y40_cid_prod_unique = df_y40_cid_prod_unique.merge(y40_counts, on='prod_name',how='inner' ) df_no_y40_cid_prod_unique = df_no_y40_cid_prod_unique.merge(no_y40_counts, on='prod_name',how='inner' )
C
복사

# 구매량 기준 내림 차순_그래프(제품명 별 구매량 )

df_y40_cid_prod_unique_desc = df_y40_cid_prod_unique.sort_values(by='구매량',ascending=False) df_no_y40_cid_prod_unique_desc = df_no_y40_cid_prod_unique.sort_values(by='구매량',ascending=False)
C
복사

#최종 영포티, 일반 40대 구매량 추가 데이터 셋 저장

df_y40_cid_prod_unique_desc.to_csv("최종 영포티 구매량 추가.csv",index=False,encoding='utf-8-sig') df_no_y40_cid_prod_unique_desc.to_csv("최종 일반40대 구매량 추가.csv",index=False,encoding='utf-8-sig')
C
복사

#카테고리 중복값 제거 작업.영포티

test_list_y40 = [] for i in df_y40_cid_prod_unique_desc['index_group_name']: test_list_y40.append(list(set(i)))
C
복사

#카테고리 중복값 제거 작업.일반 40

test_list_no_y40 = [] for i in df_no_y40_cid_prod_unique_desc['index_group_name']: test_list_no_y40.append(list(set(i)))
C
복사

#카테고리 컬럼 추가 작업

df_y40_cid_prod_unique_desc['카테고리'] = test_list_y40 df_no_y40_cid_prod_unique_desc['카테고리'] = test_list_no_y40
C
복사

#필요 컬럼 추출 및 저장

y40_test = df_y40_cid_prod_unique_desc[['prod_name','카테고리', '구매량']] y40_test.to_csv("영포티 단일 카테고리 추가.csv",index=False,encoding='utf-8-sig') no_y40_test = df_no_y40_cid_prod_unique_desc[['prod_name','카테고리', '구매량']] no_y40_test.to_csv("일반40대 단일 카테고리 추가.csv",index=False,encoding='utf-8-sig')
C
복사

#카테고리 컬럼 형태 리스트에서 문자열로 변환 작업

y40_test['카테고리'] = y40_test['카테고리'].apply(lambda x: x[0]) no_y40_test['카테고리'] = no_y40_test['카테고리'].apply(lambda x: x[0])
C
복사

#문자열 변환 후, 최신 버전 필요 컬럼 추출 및 재저장

y40_test.to_csv("최신버전 영포티 단일 카테고리 추가.csv",index=False,encoding='utf-8-sig') no_y40_test.to_csv("최신버전 일반40대 단일 카테고리 추가.csv",index=False,encoding='utf-8-sig')
C
복사

#영포티 이상치 제거

y40_test_no_baby= y40_test[y40_test['카테고리'] != 'Baby/Children']
C
복사

#영포티 그룹 상위 100개의 제품 카테고리 비율 계산(시각화)

y40_test_100 = y40_test_no_baby.head(100) y40_test_100['카테고리'].value_counts()
C
복사

#일반 40대 그룹 상위 100개의 제품 카테고리 비율 계산(시각화)

no_y40_test_100 = no_y40_test.head(100) no_y40_test_100['카테고리'].value_counts()
C
복사

#영포티 그룹, 선정된 상위 2개 카테고리 선별 작업

ladieswear_df = y40_test_100[y40_test_100['카테고리'] == 'Ladieswear'] menswear_df = y40_test_100[y40_test_100['카테고리'] == 'Menswear']
C
복사

#일반 40대 그룹, 선정된 1개 카테고리 선별 작업

BabyChildren_df = no_y40_test_100[no_y40_test_100['카테고리'] == 'Baby/Children']
C
복사

#최종 영포티 그룹 상위 2개 카테고리의 제품의 상위 5개 제품 추출, 일반 40대 그룹 상위 1개 카테고리의 제품 상위 10개 제품 추출 완료.

→ 피피티에서 좀 이쁘게 추천 리스트 만들기
ladieswear_df.head(5) menswear_df.head(5) BabyChildren_df.head(10)
C
복사