[데이터전처리] 주문서 정리하기

Jonie Kwon·2022년 4월 11일
0
post-custom-banner

데이터

  • 월별매출데이터.xlsx
  • 제품별_가격정보.xlsx

목표

  • 시각화를 통한 월별 매출 추이 파악
  • 조건에 따른 판매 통계 분석
  • 충성 고객 파악

문제 상황

  • 월별로 시트가 구분되어 있는 매출 데이터
  • 분석에 불필요한 부분이 있음

  • read_excel의 sheet_name을 이용하여 sheet 데이터 순회후 concat으로 병합
  • skiprows를 이용하여 불필요한 데이터 제거
# sheet명을 리스트로 저장
sheet_names = [str(i+1) +'월' for i in range(12)]

merged_df = pd.DataFrame()
sheets = [pd.read_excel("월별매출데이터.xlsx", sheet_name=sheet_name, skiprows=range(6)).iloc[:,1:] for sheet_name in sheet_names]
merged_df = pd.concat(sheets, ignore_index=True)
merged_df
  • 2018.1.1, 2018-12-31 과 같이 월별로 다른 "일자"열의 형식을 통일
merged_df["일자"] = merged_df["일자"].str.replace(".", "-")
  • 월별 매출 추이를 파악하기 위해 "일자"열에서 "월"데이터를 분리하고 가격정보 데이터를 가져옴
merged_df["월"] = merged_df["일자"].str.split("-", expand=True).iloc[:,1].astype(int)

price_df = pd.read_excel("제품별_가격정보.xlsx").T
price_df.head()
  • 가격정보 데이터를 이용하여 매출데이터에 주문 금액 열을 추가
price_dict = price_df.loc['제품A':'제품F', 0].to_dict()	# 딕셔너리 형태로 변환

merged_df["가격"] = merged_df["품명"].replace(price_dict)
merged_df["주문 금액"] = merged_df["가격"] * merged_df["수량"] * 1.1
merged_df.head()
  • groupby를 이용하여 월별 주문 금액 테이블 생성
grouped_df_by_month = merged_df.groupby(['월'], as_index = False)['주문 금액'].sum()
grouped_df_by_month_and_product = merged_df.groupby(['월', '품명'], as_index = False)['주문 금액'].sum()

제품별 월별 매출 추이 시각화

plt.title("월별 매출 추이")
# plt.plot(grouped_df_by_month['월'],
#          grouped_df_by_month['주문 금액'],
#          label = "주문 금액 합계")
# 
# plt.xticks([x+1 for x in range(12)])
for product in grouped_df_by_month_and_product['품명'].unique():
    plt.plot(grouped_df_by_month_and_product['월'].unique(),
             grouped_df_by_month_and_product.loc[grouped_df_by_month_and_product['품명'] == product]['주문 금액'],             
             label = product)

plt.legend(loc = 'center right')

제품과 결제 수단에 따른 판매량 분석

pivot_df = pd.pivot_table(merged_df, index = '품명', columns = '결제 수단', values = '주문 금액')

import seaborn as sns
f, ax = plt.subplots(figsize=(10, 10))
ax = sns.heatmap(pivot_df,cmap = plt.cm.RdYlBu_r, annot=True)

충성 고객 찾기

  • 주문 금액과 구매 빈도 기준 상위 10% 고객 찾기
grouped_df_by_customer = merged_df.groupby('주문인 ID')['주문 금액'].agg(['sum', 'count'])
threshold_1 = grouped_df_by_customer['sum'].quantile(0.9) # 구매 금액 합계 기준 상위 10%
threshold_2 = grouped_df_by_customer['count'].quantile(0.9) # 구매 빈도 기준 상위 10%
grouped_df_by_customer.head()

  • 두가지 조건을 모두 충족하는 고객 목록 출력
cond1 = grouped_df_by_customer['sum'] >= threshold_1 # 기준 1을 만족하는지 여부
cond2 = grouped_df_by_customer['count'] >= threshold_2 # 기준 2를 만족하는지 여부

grouped_df_by_customer.loc[cond1 & cond2].sort_values(by = ['sum', 'count'], ascending = False).head(10)

profile
메모하는 습관
post-custom-banner

0개의 댓글