kyejin0412 님의 블로그

[TIL] Week 6-1 기초 프로젝트 본문

내일배움캠프-데이터분석

[TIL] Week 6-1 기초 프로젝트

kyejin0412 2025. 11. 24. 21:26

오늘은 기초 프로젝트에서 각자 부분을 맡아 분석 및 시각화를 진행하고, ppt 개요를 잡았다.

그동안 다른 팀원분이 시각화 진행을 많이 해주셨더라. 나도 최소 하나는 분석과 시각화를 하고 싶어서 차근차근 해봤다.

혼자 하고 있을 땐 막히는 부분이 생겨서 막막했는데, 팀원들에게 도움을 요청하니 금방금방 해결되는 걸 보고 역시 집단지성이 좋은 것 같다고 느꼈다.

허진성 튜터님이 시각화에 특화된 분이라 어떤 그래프를 사용할 지도  물어봤었다. 금방 조언을 주셔서 좋았다. 튜터님들을 많이 활용해야겠다.


 

[오늘의 진행상황]

 

1. 주제 정하기

연준 튜터님에게 조언을 얻어, 매출 데이터를 분석하여 웹페이지 UI/UX 개선을 제시하는 프로젝트로 정하게 되었다. UI/UX 개선은 생각도 못해봤어서 아직 시야가 좁다는 생각이 들었다. 

 

 

2. 도메인 조사

2019년 H&M에 영향을 끼쳤을만한 도메인을 조사했다.

환차 이익을 제외하고는 대체로 소비가 위축되고, 친환경이 대두가 되며 매출이 하락했던 것으로 파악했다.

 

 

3. EDA 및 시각화

내가 맡은 부분은 "채널별 인기상품" 이었다. 메인 페이지 및 팝업으로 노출할 상품들을 정하고, 쿠폰 또는 할인 등의 프로모션에 활용될 예정이다. 

인기상품군의 분포를 살펴보기에 직관적인 바 그래프가 적합할 것 같았다.

 

먼저 [sales_channel_id]에 1,2가 아닌 다른 값이 들어있을 수도 있으므로, 1,2만 들어갈 수 있도록 이상치를 처리했다.

그 후, [price]는 transactions에, [product_type_name]은 articles에 있으므로 join을 진행했다.

채널과 상품군별 매출액 집계를 위해 groupby로 묶어줬다. 이 때 컬럼이 두 개 이상이므로, [] 로 묶어줬다. 이 부분을 까먹어서 에러가 났다..

 

채널별로 그래프를 그리고 싶었어서 컬럼에 조건을 주어 필터링했고, 이를 다른 변수에 저장했다.

원래는 전체 데이터를 그리는 것 밖에 몰랐는데, 허진성 튜터님이 전체 데이터를 뽑으면 너무 많아서 인사이트를 찾기 어렵고, 그래프를 그리는 데에도 오래걸리며, x축 값들이 겹쳐서 보이지 않을 것이라고 했다. 보통은 상위 n개, 하위 n개와 같이 유의미한 부분을 뽑아쓴다고 한다. 

상위 10개를 뽑아봤을 때 하위 5개의 수치가 거의 비슷해서 상위 5개로 추렸다.

sort_values로 값들을 내림차순 정렬하고 head(5)로 5행을 추출한다.

 

# 라이브러리 불러오기
import pandas as pd
import matplotlib.pyplot as plt

# raw data 불러오기
customer = pd.read_csv("customer_hm.csv")
articles = pd.read_csv("articles_hm.csv")
transactions = pd.read_csv("transactions_hm.csv")

# 이상치 처리 - 채널 1,2만 남김
transactions = transactions[transactions["sales_channel_id"].isin([1, 2])]

# 거래 데이터와 상품 데이터 조인
merge_df = transactions.merge(articles, on="article_id", how="inner")

# 채널별, 상품군별 그룹화해서 매출액 합계 구하기
grouped = merge_df.groupby(["sales_channel_id","product_type_name"])["price"].sum().reset_index()

grouped_channel1 = grouped[grouped["sales_channel_id"] == 1]
grouped_channel2 = grouped[grouped["sales_channel_id"] == 2]

# 상위 5개 sorting
grouped_channel1_top5 = grouped_channel1.sort_values(by="price", ascending=False).head(5)
grouped_channel2_top5 = grouped_channel2.sort_values(by="price", ascending=False).head(5)

# 오프라인(1) 인기상품 top5 그래프 
plt.bar(grouped_channel1_top5["product_type_name"], grouped_channel1_top5["price"], width=0.7, color="black") # 상위 10개 하위 10개
plt.show()

# 온라인(2) 인기상품 top5 그래프
plt.bar(grouped_channel2_top5["product_type_name"], grouped_channel2_top5["price"], width=0.7, color="black") # 상위 10개 하위 10개
plt.show()

 

오프라인 top5 상품군
온라인 top5 상품군