파이썬 데이터 분석 실무 테크닉 100은 주어진 데이터에 적용할 여러 라이브러리의 함수 사용법을 설명하는 책들과 달리, 실무에서 데이터가 주어졌을 때 가장 먼저 해야할 일과 이후 순차적으로 분석방법에 대해 설명한다.
01장 웹에서 주문수를 분석하는 테크닉 10¶
목표 : 어떤 기업 쇼핑몰 사이트의 상품 주문 수의 추세를 분석하여 판매량 개선의 방향 찾기.
쇼핑몰 사이트는 비교적 깨끗한 데이터인 경우가 많다. 쇼핑몰 사이트는 매출 추세뿐만 아니라 언제, 누가 구입했는지 등, 상세 데이터가 많을 수록 깊게 분석이 가능하다. 그러나 현장에서 데이터를 관리할 때, 한 곳에서 관리되지 않는 것이 일반적이다. 이러한 경우 데이터를 연결하는 작업이 필요할 때도 있다.
전제조건¶
- 쇼핑몰 사이트의 데이터를 다룬다.
- 주요 품목은 컴퓨터이다.
- 가격대별 5개의 상품이 존재함.
- 데이터는 4종류의 6개 데이터이다.
- customer_master.csv : 고객 정보 - 회원가입 시 입력하는 데이터가 저장된다.
- item_master.csv : 상품 정보 - 상품명과 가격이 포함되어 있다.
- transaction_1.csv : 구매내역 - 언제, 누가, 얼마나 구매했는지에 대한 정보
- transaction_2.csv : 구매내역 - 언제, 누가, 얼마나 구매했는지에 대한 정보(transaction_1의 분할 데이터)
- transaction_detail_1.csv : 구매내역 상세 데이터 - 어떤 상품을 몇 개 샀는지와 같은 상세 정보 포함
- transaction_detail_2.csv : 구매내역 상세 데이터 - 어떤 상품을 몇 개 샀는지와 같은 상세 정보 포함(transaction_detail_1의 분할 데이터)
001 데이터 읽기¶
import pandas as pd
customer_master = pd.read_csv('./customer_master.csv')
customer_master.head()
item_master = pd.read_csv('./item_master.csv')
item_master.head()
transaction_1 = pd.read_csv('./transaction_1.csv')
transaction_1.head()
transaction_detail_1 = pd.read_csv('./transaction_detail_1.csv')
transaction_detail_1.head()
각 데이터셋 파악¶
- customer_master에는 고객의 성별, 나이, 주소, 이메일, 이름, 가입일자 등
- item_master에는 상품아이디, 상품명, 상품가격
- transcation에는 고객 아이디, 가격, 구입 일자 등
- transaction_detail에는 상품아이디, 수량, 상세 아이디 등
매출과 관련된 데이터를 생각해보자. 상세 데이터가 매출과 직결된다. 왜냐하면, 상세 데이터에 각 상품 주문 수량이 포함되기 때문이다.
1차적으로 transaction 관련 데이터셋들이 1, 2로 분할되어 있기 때문에 결합시켜주는 작업이 필요하다.
002 데이터 결합¶
transaction_2 = pd.read_csv('./transaction_2.csv')
transaction = pd.concat([transaction_1, transaction_2])
transaction.head()
print(transaction_1.shape, transaction_2.shape, transaction.shape)
transaction_detail_2 = pd.read_csv('transaction_detail_2.csv')
transaction_detail = pd.concat([transaction_detail_1, transaction_detail_2])
transaction_detail.head()
print(transaction_detail_1.shape, transaction_detail_2.shape, transaction_detail.shape)
003 매출 관련 데이터 결합하기¶
데이터를 조인할 때, 기준이 되는 데이터를 정확하게 결정하고 어떤 컬럼을 키로 조인할지 생각해야한다.
가장 상세한 데이터인 transaction_detail
을 기준 데이터로 결정한다.
데이터셋 조인 시, 부족한 데이터 컬럼이 무엇인가와 공통되는 데이터 컬럼은 무엇인가를 생각한다.
이번에 추가할 데이터는 transaction의 구입 일자와 구매 고객 아이디이다.
transaction의 price는 한 번 구매 시 합계 금액이다. transaction_detail의 quantity와 item_master의 item_price로부터 계산된 것.
=transaction[price] = transaction_detail[quantity]*item_master[item_price]
공통 데이터 컬럼은 transaction_id
이다.
join_data = pd.merge(transaction_detail, transaction[["transaction_id", "payment_date", "customer_id"]], on="transaction_id", how="left")
join_data.head()
print(join_data.shape, transaction.shape, transaction_detail.shape)
004 마스터 데이터 결합¶
위에서 결합한 매출관련 데이터셋을 customer_master
와 item_master
각각 결합한다.
두 데이터셋은 customer_id
, item_id
로 연결할 수 있다.
join_data = pd.merge(join_data, customer_master, on='customer_id', how="left")
join_data = pd.merge(join_data, item_master, on='item_id', how="left")
join_data.head()
join_data['price'] = join_data['quantity']*join_data['item_price']
join_data[['price', 'quantity', 'item_price']].head(10)
006 데이터 검산¶
잘못된 데이터를 제공하는 것은 회사 경영에 막대한 영향을 끼친다.
따라서 데이터 결합 시 개수 확인은 신중하게 해야하며, 되도록 검산 가능한 데이터를 찾아 계산해야한다.
print(join_data['price'].sum())
print(transaction['price'].sum())
여기까지 데이터를 읽고 파악하는 과정을 진행하였다. 이제 데이터 분석을 적용한다.
007 각종 통계량 파악¶
데이터 분석을 할 때, 먼저 두 가지 숫자를 파악해야 한다.
- 결손치의 개수
- 전체를 파악할 수 있는 숫자감이다.
join_data.isnull().sum() # null인 데이터의 개수를 표현
join_data.describe() # 각 기준에 따라 통계치 표현
print(join_data['payment_date'].min())
print(join_data['payment_date'].max())
008 월별 데이터 집계¶
pandas의 dt를 사용하여 년, 월 추출을 한다.
join_data['payment_date'] = pd.to_datetime(join_data['payment_date'])
join_data['payment_month'] = join_data['payment_date'].dt.strftime("%Y%m")#년, 월로 표현
join_data[['payment_date','payment_month']].head()
009 월별, 상품별 집계¶
groupby를 사용하여 집계 가능하다.
join_data.groupby(["payment_month","item_name"]).sum()[["price", "quantity"]]
#pivot table 사용 시 더 쉽게 볼 수 있다.
pd.pivot_table(join_data, index='item_name', columns='payment_month', values=['price', 'quantity'], aggfunc='sum')
pivot_table
은 행과 칼럼을 지정할 수 있다.
index에는 상품명, columns에는 구입월이 오도록 지정한다.
values에는 집계하고 싶은 컬럼들을 지정해준다.
aggfunc는 집계 방법을 의미한다.
결과 표를 보면, PC-E가 price(매출합)가 높지만 quantity(수량)에 있어서는 가장 싼 PC-A가 판매량이 가장 높다.
월별 추세에 따르면, 5월에 PC-B와 D는 매출액이 증가하였으나 가장 큰 매출을 차지하는 PC-E는 오히려 감소하는 것을 보인다. PC-E는 6, 7월에 매출이 크게 증가하였다.
graph_data = pd.pivot_table(join_data, values='price', index='payment_month', columns='item_name', aggfunc='sum')
graph_data.head()
import matplotlib.pyplot as plt
%matplotlib inline
for item in sorted(join_data['item_name'].unique()):
plt.plot(list(graph_data.index), graph_data[item], label=item)
plt.legend()
'Machine Learning > Statistics' 카테고리의 다른 글
파이썬 데이터분석 실무 테크닉 100 - 6장 (1) | 2021.07.01 |
---|---|
파이썬 데이터분석 실무 테크닉 100 - 5장 (1) | 2021.03.03 |
파이썬 데이터분석 실무 테크닉 100 - 4장 (0) | 2021.01.07 |
파이썬 데이터 분석 실무 테크닉 100 - 3장 (0) | 2020.12.17 |
파이썬 데이터 분석 실무 테크닉 100 - 2장 (0) | 2020.12.07 |