데이터
- 월별매출데이터.xlsx
- 제품별_가격정보.xlsx
목표
- 시각화를 통한 월별 매출 추이 파악
- 조건에 따른 판매 통계 분석
- 충성 고객 파악
문제 상황
- 월별로 시트가 구분되어 있는 매출 데이터
- 분석에 불필요한 부분이 있음
- read_excel의 sheet_name을 이용하여 sheet 데이터 순회후 concat으로 병합
- skiprows를 이용하여 불필요한 데이터 제거
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("월별 매출 추이")
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)
threshold_2 = grouped_df_by_customer['count'].quantile(0.9)
grouped_df_by_customer.head()
cond1 = grouped_df_by_customer['sum'] >= threshold_1
cond2 = grouped_df_by_customer['count'] >= threshold_2
grouped_df_by_customer.loc[cond1 & cond2].sort_values(by = ['sum', 'count'], ascending = False).head(10)