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
복사


