Post

1.웹에서 주문 수를 분석하는 테크닉 10

1.웹에서 주문 수를 분석하는 테크닉 10

이용할 데이터 정보

alt text

001. 데이터를 읽어 들이자

1
2
3
4
5
import pandas as pd
# 라이브러리 판다스 임포트
customer_master = pd.read_csv('customer_master.csv')
customer_master.head()
# 5행 출력

alt text

1
2
item_master = pd.read_csv('item_master.csv')
item_master.head()

alt text

1
2
transaction_1 = pd.read_csv('transaction_1.csv')
transaction_1.head()

alt text

1
2
transaction_detail_1 = pd.read_csv('transaction_detail_1.csv')
transaction_detail_1.head()

alt text

❗상세하게 나와 있는 쪽에 맞추어 데이터를 가공.

🔖 transaction_detail을 기준으로 할 때

  1. transaction_1과 transaction_2, 그리고 transation_detail_1과 transation_detail_2를 세로로 결합.
  2. transaction_detail을 기준으로, transaction, customer_master, item_master을 가로로 결합.

002.데이터를 결합해 보자

❗기본적으로 같은 작업이니 transaction_1과 transaction_2만 설명.

1
2
3
4
transaction_2 = pd.read_csv('transaction_2')
transaction = pd.concat([transaction_1, transaction_2], ignore_index=True)
# ignore_index: 기존 인덱스를 무시하거나 유지
transaction.head()

alt text

1
2
3
4
5
6
print(len(transaction_1))
# 5000
print(len(transaction_2))
# 1786
print(len(transaction))
# 6786

003.매출 데이터끼리 결합해 보자

생각할점

  • 기준이 되는 데이터를 정확하게 결정, 어떤 칼럼을 키로 조인할지 생각.
    1. 부족한(추가하고 싶은) 데이터 칼럼이 무엇인가 생각
    2. 공통되는 데이터 칼럼은 무엇인가를 생각

조인

1
2
3
4
5
6
7
8
9
10
join_data = pd.merge(transaction_detail, transaction[["transaction_id", "payment_date", "customer_id"]], on="transaction_id", how="left")
# price는 transaction_detail의 quantity와 item_master의 item_price로부터 계산된 것입니다. 중복해서 계산되기에 price는 추가x
join_data.head()

print(len(transaction_detail))
# 7144
print(len(transaction))
# 6786
print(len(join_data))
# 7144

alt text ❗조인할 데이터의 조인키에 중복 데이터가 존재하는 경우에는 데이터의 개수가 늘어날 수 있음.

  • pd.merge
    • 첫번째 인수: 기준
    • 두번째 인수: 병합할 데이터
    • on: 조인키
    • how: 조인 종류

데이터 정규화

  • 정규화: ‘데이터의 정합성(데이터에 대해서, 컴퓨터에 설정된 처리 규칙과의 일관성 여부를 확인하는 검사)’을 담보하는 설계 사상.

🔖비정규형 데이터

alt text

  • 데이터가 반복/중복 저장. => 데이터의 확장성⬇️

🔖정규화 시키기

  • 거래처 데이터 분할 => 데이터의 확장성⬆️

alt text

데이터 결합의 종류

  • 내부 결합(inner join):
    • 결합할 2개의 데이터에 모두 존재하는 데이터로만 구성.
    • 두 개의 데이터에서 공통 데이터만을 추출.
      ⚠️정확하게 결합 조건을 설정하지 않으면 데이터의 누락 발생.
  • 외부 결합(outer join):
    • 어느 한 쪽만 존재하면 데이터가 결합
      ⚠️데이터 1에만 있는 데이터의 데이터 2 부분에는 모두 NULL이 들어간다는 점.
      ⚠️레코드 수도 불필요하게 늘어나기 때문에 결합 조건을 정확하게 설정해야함.
  • 레프트 조인:
    • 좌측의 데이터가 모두 사용
  • 라이트 조인:
    • 우측의 데이터가 모두 사용 alt text

004.마스터데이터를 결합해 보자

1
2
3
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()

alt text

005.필요한 데이터 칼럼을 만들자

1
2
3
4
join_data["price"] = join_data["quantity"] * join_data["item_price"]
# 곱셈은 행마다 계산이 실행
join_data[["quantity", "item_price", "price"]].head()
# price를 열을 그냥 병합하기에는 NULL이 생길수도 있으니 이렇게 계산하자!

alt text

006.데이터를 검산하자

  • 데이터 가공 전 transaction의 price 총합과 데이터 가공 후에 계산한 price의 총합은 같은 값이다.
1
2
3
4
5
6
7
print(join_data["price"].sum())
# 971135000
print(transaction["price"].sum())
# 971135000

join_data["price"].sum() == transaction["price"].sum()
# True

007.각종 통계량을 파악하자

🔖파악해야할 숫자

  1. 결손치의 개수
  2. 전체를 파악할 수 있는 숫자감

통계량, 결측치 확인

1
2
join_data.isnull().sum()
join_data.describe()

alt text alt text

❗describe()는 숫자 데이터를 집계해주므로 기간 등의 데이터는 따로 확인!

1
2
3
4
print(join_data["payment_date"].min())
# 2019-02-01 01:36:57
print(join_data["payment_date"].max())
# 2019-07-31 23:41:38

008.월별로 데이터를 집계해 보자

❗시계열 상황을 살펴보자! 과거 수년의 데이터에는 여러가지 비즈니스 모델이 포함되어 있을 수 있기 때문에 전체 데이터를 한 번에 분석하면 데이터의 시계열 변화를 잘못 파악할 수 있다. 이럴땐 데이터 범위를 줄여 분석하자.

1
join_data.dtypes

alt text

1
2
3
4
5
6
join_data["payment_date"] = pd.to_datetime(join_data["payment_date"])
# datetime 형으로 변환
join_data["payment_month"] = join_data["payment_date"].dt.strftime("%Y%m")
# 연월 단위로 작성
# datetime의 dt를 사용하면 년, 월의 추출이 가능
join_data[["payment_date", "payment_month"]].head()

alt text

pd.to_datetime, strptime, strftime

  • pd.to_datetime: 문자열 -> datetime
  • dt.date:
    • 년, 월, 일 정보만 추출
    • dt.strftime(%Y-%m-%d)와 같음
    • dtype: object
  • dt.days: 일 수(Number of days)를 구한다.
  • strptime: 문자열 -> datetime 형태로 바꾸기
  • strftime: datetime -> 문자열 형태로 바꾸기

009.월별, 상품별로 데이터를 집계해 보자

1
2
3
# join_data.groupby(["payment_month","item_name"]).sum()[["price","quantity"]] -> 오류 발생
join_data.groupby(["payment_month","item_name"]).sum(numeric_only=True)[["price","quantity"]]
# groupby에서 출력하고 싶은 칼럼이 여러 개 있을 경우, 리스트형으로 지정.

alt text

1
2
3
4
pd.pivot_table(join_data, index = "item_name", columns = "payment_month", values = ["price", "quantity"], aggfunc="sum")
# pivot_table은 행과 칼럼을 지정할 수 있음
# values에는 집계하고 싶은 칼럼
# aggfunc에는 집계 방법을 지정

alt text

010.상품별 매출 추이를 가시화해 보자

1
2
graph_data = pd.pivot_table(join_data, index="payment_month", columns="item_name", values="price", aggfunc="sum")
graph_data.head()

alt text

1
2
3
4
5
6
7
8
9
10
import matplotlib.pyplot as plt
%matplotlib inline
plt.plot(list(graph_data.index), graph_data["PC-A"], label="PC-A")
# graph_data를 list 형태로 변환해서 지정
plt.plot(list(graph_data.index), graph_data["PC-B"], label="PC-B")
plt.plot(list(graph_data.index), graph_data["PC-C"], label="PC-C")
plt.plot(list(graph_data.index), graph_data["PC-D"], label="PC-D")
plt.plot(list(graph_data.index), graph_data["PC-E"], label="PC-E")
plt.legend()
# 범례 표시

alt text

This post is licensed under CC BY 4.0 by the author.

Trending Tags