이용할 데이터 정보
001. 데이터를 읽어 들이자
1
2
3
4
5
| import pandas as pd
# 라이브러리 판다스 임포트
customer_master = pd.read_csv('customer_master.csv')
customer_master.head()
# 5행 출력
|
1
2
| item_master = pd.read_csv('item_master.csv')
item_master.head()
|
1
2
| transaction_1 = pd.read_csv('transaction_1.csv')
transaction_1.head()
|
1
2
| transaction_detail_1 = pd.read_csv('transaction_detail_1.csv')
transaction_detail_1.head()
|
❗상세하게 나와 있는 쪽에 맞추어 데이터를 가공.
🔖 transaction_detail을 기준으로 할 때
- transaction_1과 transaction_2, 그리고 transation_detail_1과 transation_detail_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()
|
1
2
3
4
5
6
| print(len(transaction_1))
# 5000
print(len(transaction_2))
# 1786
print(len(transaction))
# 6786
|
003.매출 데이터끼리 결합해 보자
생각할점
- 기준이 되는 데이터를 정확하게 결정, 어떤 칼럼을 키로 조인할지 생각.
- 부족한(추가하고 싶은) 데이터 칼럼이 무엇인가 생각
- 공통되는 데이터 칼럼은 무엇인가를 생각
조인
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
|
❗조인할 데이터의 조인키에 중복 데이터가 존재하는 경우에는 데이터의 개수가 늘어날 수 있음.
- pd.merge
- 첫번째 인수: 기준
- 두번째 인수: 병합할 데이터
- on: 조인키
- how: 조인 종류
데이터 정규화
- 정규화: ‘데이터의 정합성(데이터에 대해서, 컴퓨터에 설정된 처리 규칙과의 일관성 여부를 확인하는 검사)’을 담보하는 설계 사상.
🔖비정규형 데이터
- 데이터가 반복/중복 저장. => 데이터의 확장성⬇️
🔖정규화 시키기
데이터 결합의 종류
- 내부 결합(inner join):
- 결합할 2개의 데이터에 모두 존재하는 데이터로만 구성.
- 두 개의 데이터에서 공통 데이터만을 추출.
⚠️정확하게 결합 조건을 설정하지 않으면 데이터의 누락 발생.
- 외부 결합(outer join):
- 어느 한 쪽만 존재하면 데이터가 결합
⚠️데이터 1에만 있는 데이터의 데이터 2 부분에는 모두 NULL이 들어간다는 점.
⚠️레코드 수도 불필요하게 늘어나기 때문에 결합 조건을 정확하게 설정해야함.
- 레프트 조인:
- 라이트 조인:
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()
|
005.필요한 데이터 칼럼을 만들자
1
2
3
4
| join_data["price"] = join_data["quantity"] * join_data["item_price"]
# 곱셈은 행마다 계산이 실행
join_data[["quantity", "item_price", "price"]].head()
# price를 열을 그냥 병합하기에는 NULL이 생길수도 있으니 이렇게 계산하자!
|
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
| join_data.isnull().sum()
join_data.describe()
|
❗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
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()
|
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에서 출력하고 싶은 칼럼이 여러 개 있을 경우, 리스트형으로 지정.
|
1
2
3
4
| pd.pivot_table(join_data, index = "item_name", columns = "payment_month", values = ["price", "quantity"], aggfunc="sum")
# pivot_table은 행과 칼럼을 지정할 수 있음
# values에는 집계하고 싶은 칼럼
# aggfunc에는 집계 방법을 지정
|
010.상품별 매출 추이를 가시화해 보자
1
2
| graph_data = pd.pivot_table(join_data, index="payment_month", columns="item_name", values="price", aggfunc="sum")
graph_data.head()
|
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()
# 범례 표시
|