도전 데이터 소스
GitHub - wikibook/pyda100: 《파이썬 데이터 분석 실무 테크닉 100》
https://github.com/wikibook/pyda100
널부러져 있는 데이터로
상품별 매출추이를 분석해 봅시다!
이런 것이 과연 가능할지 도전해 보도록 하겠습니다.
일단, 널부러진 데이터가
customer_master.csv
item_master.csv
transaction_1.csv
transaction_2.csv
transaction_detail_1.csv
transaction_detail_2.csv
이런 식으로 있던데, 당연한 이야기이겠지만, 이 데이터가 도대체 무엇인지부터 잘 봐야 하겠습니다.
널부러져 있는 데이터로 데이터의 윤곽을 알아보자
일단 가장 궁금한 건 item_master입니다. 도대체 어떤 물건을 파는 것일까요?
import pandas as pd
import requests
import io
from IPython.display import display
url = "https://raw.githubusercontent.com/wikibook/pyda100/master/1%EC%9E%A5/item_master.csv"
download = requests.get(url).content
df_raw_item_master = pd.read_csv(io.StringIO(download.decode('utf-8')))
display (df_raw_item_master.head())
item_id | item_name | item_price | |
---|---|---|---|
0 | S001 | PC-A | 50000 |
1 | S002 | PC-B | 85000 |
2 | S003 | PC-C | 120000 |
3 | S004 | PC-D | 180000 |
4 | S005 | PC-E | 210000 |
아, 파는 item이 몇개 되진 않는구요. PC를 파나봅니다. 그런데, 뭔지 모르겠지만 가격이 그렇게 비싼편은 아니군요. PC에 관련된 소모품을 파는 곳인지도 모르곘습니다. 그러면 고객에 관련된 데이터는 어떤 것들이 모아져 있는지 한번 보고 싶네요.
url = "https://raw.githubusercontent.com/wikibook/pyda100/master/1%EC%9E%A5/customer_master.csv"
download = requests.get(url).content
df_raw_customer_master = pd.read_csv(io.StringIO(download.decode('utf-8')))
display (df_raw_customer_master.head())
customer_id | customer_name | registration_date | gender | age | birth | pref | ||
---|---|---|---|---|---|---|---|---|
0 | IK152942 | 김서준 | 2019-01-01 0:25 | hirata_yuujirou@example.com | M | 29 | 1990-06-10 | 대전광역시 |
1 | TS808488 | 김예준 | 2019-01-01 1:13 | tamura_shiori@example.com | F | 33 | 1986-05-20 | 인천광역시 |
2 | AS834628 | 김도윤 | 2019-01-01 2:00 | hisano_yuki@example.com | F | 63 | 1956-01-02 | 광주광역시 |
3 | AS345469 | 김시우 | 2019-01-01 4:48 | tsuruoka_kaoru@example.com | M | 74 | 1945-03-25 | 인천광역시 |
4 | GD892565 | 김주원 | 2019-01-01 4:54 | oouchi_takashi@example.com | M | 54 | 1965-08-05 | 울산광역시 |
오, customer가 ID로 구분되고 이름, 등록일, 이메일, 성별, 나이, 생일, 지역 데이터를 가지고 있군요? 이런 고급데이터가 있을 수가.. 사실 이런 고급데이터는 어디에서 구하기 힘든데, 어쨌거나 엄청나게 자세한 내용까지 파악되어 있습니다.
그렇다면, 장부를 한번 봐야곘네요. transaction이 두개로 나뉘어 있는데 두개 모두 열어보죠.
url = "https://raw.githubusercontent.com/wikibook/pyda100/master/1%EC%9E%A5/transaction_1.csv"
download = requests.get(url).content
df_raw_transaction_1 = pd.read_csv(io.StringIO(download.decode('utf-8')))
display (df_raw_transaction_1.head())
url = "https://raw.githubusercontent.com/wikibook/pyda100/master/1%EC%9E%A5/transaction_2.csv"
download = requests.get(url).content
df_raw_transaction_2 = pd.read_csv(io.StringIO(download.decode('utf-8')))
display (df_raw_transaction_2.head())
transaction_id | price | payment_date | customer_id | |
---|---|---|---|---|
0 | T0000000113 | 210000 | 2019-02-01 01:36:57 | PL563502 |
1 | T0000000114 | 50000 | 2019-02-01 01:37:23 | HD678019 |
2 | T0000000115 | 120000 | 2019-02-01 02:34:19 | HD298120 |
3 | T0000000116 | 210000 | 2019-02-01 02:47:23 | IK452215 |
4 | T0000000117 | 170000 | 2019-02-01 04:33:46 | PL542865 |
transaction_id | price | payment_date | customer_id | |
---|---|---|---|---|
0 | T0000005113 | 295000 | 2019-06-15 07:20:27 | TS169261 |
1 | T0000005114 | 50000 | 2019-06-15 07:35:47 | HI599892 |
2 | T0000005115 | 85000 | 2019-06-15 07:56:36 | HI421757 |
3 | T0000005116 | 50000 | 2019-06-15 08:40:55 | OA386378 |
4 | T0000005117 | 120000 | 2019-06-15 08:44:23 | TS506913 |
Transaction을 보니까, 거래ID, 가격, 거래일, 누가 로 나뉘어져 있군요.
일단 궁금한 것이 price가 표시하는 것이 total price 인가? 확인을 해 보고 싶어졌습니다.
df_raw_transaction_1['price'].unique()
array([210000, 50000, 120000, 170000, 180000, 85000, 150000, 100000, 295000, 205000, 480000, 240000, 200000, 220000, 255000, 265000, 390000, 360000, 420000, 440000, 380000, 570000, 280000, 320000, 230000, 235000, 270000, 750000, 135000, 260000, 345000, 630000, 330000, 185000, 310000, 350000, 290000, 300000, 355000, 325000, 460000, 675000, 465000, 470000, 410000, 340000, 445000])
이렇게 보니 transaction 자체에는 전체 거래만 나와 있고, 무엇을 거래했는지가 없군요.
그렇다면 detail에 있지 않겠습니꽈? 한번 확인해 보시죠.
url = "https://raw.githubusercontent.com/wikibook/pyda100/master/1%EC%9E%A5/transaction_detail_1.csv"
download = requests.get(url).content
df_raw_transaction_detail_1 = pd.read_csv(io.StringIO(download.decode('utf-8')))
display (df_raw_transaction_detail_1.head())
url = "https://raw.githubusercontent.com/wikibook/pyda100/master/1%EC%9E%A5/transaction_detail_2.csv"
download = requests.get(url).content
df_raw_transaction_detail_2 = pd.read_csv(io.StringIO(download.decode('utf-8')))
display (df_raw_transaction_detail_2.head())
detail_id | transaction_id | item_id | quantity | |
---|---|---|---|---|
0 | 0 | T0000000113 | S005 | 1 |
1 | 1 | T0000000114 | S001 | 1 |
2 | 2 | T0000000115 | S003 | 1 |
3 | 3 | T0000000116 | S005 | 1 |
4 | 4 | T0000000117 | S002 | 2 |
detail_id | transaction_id | item_id | quantity | |
---|---|---|---|---|
0 | 5000 | T0000004870 | S002 | 3 |
1 | 5001 | T0000004871 | S003 | 1 |
2 | 5002 | T0000004872 | S001 | 2 |
3 | 5003 | T0000004873 | S004 | 1 |
4 | 5004 | T0000004874 | S003 | 2 |
오, 다행이라고 할까요. 각 Transaction에 관련하여 ID를 이용하여 detail transaction을 모아두었네요. 정말 멋진 사장님인 것 같습니다. 데이터가 잘 맞아들어갈 거라 믿고요. 자, 그러면 일단 transaction과 transaction_detail을 각각 묶어두는 일을 먼저 해 보겠습니다.
df_transaction = pd.concat([df_raw_transaction_1, df_raw_transaction_2])
df_transaction_detail = pd.concat([df_raw_transaction_detail_1, df_raw_transaction_detail_2])
display(df_transaction.head())
display(df_transaction_detail.head())
transaction_id | price | payment_date | customer_id | |
---|---|---|---|---|
0 | T0000000113 | 210000 | 2019-02-01 01:36:57 | PL563502 |
1 | T0000000114 | 50000 | 2019-02-01 01:37:23 | HD678019 |
2 | T0000000115 | 120000 | 2019-02-01 02:34:19 | HD298120 |
3 | T0000000116 | 210000 | 2019-02-01 02:47:23 | IK452215 |
4 | T0000000117 | 170000 | 2019-02-01 04:33:46 | PL542865 |
detail_id | transaction_id | item_id | quantity | |
---|---|---|---|---|
0 | 0 | T0000000113 | S005 | 1 |
1 | 1 | T0000000114 | S001 | 1 |
2 | 2 | T0000000115 | S003 | 1 |
3 | 3 | T0000000116 | S005 | 1 |
4 | 4 | T0000000117 | S002 | 2 |
대충, 깔꼬마니 4개의 데이터로 만들어 두었으니까, 이걸로 뭔가 할 수 있지 않을까 합니다.
df_raw_customer_master
df_raw_item_master
df_transaction (합침)
df_transaction_detail (합침)
가만히 생각해보니, 좋은 생각인지는 모르겠지만, transaction도 한데 모으고, 거기에 custermer하고 item까지 넣으면! 전체 데이터가 될테니 좀 더 깔끔하게 분석할 수 있지 않을까 합니다.
df_transaction_combined = pd.merge(df_transaction_detail, df_transaction, on="transaction_id", how="left")
df_transaction_combined.head()
detail_id | transaction_id | item_id | quantity | price | payment_date | customer_id | |
---|---|---|---|---|---|---|---|
0 | 0 | T0000000113 | S005 | 1 | 210000 | 2019-02-01 01:36:57 | PL563502 |
1 | 1 | T0000000114 | S001 | 1 | 50000 | 2019-02-01 01:37:23 | HD678019 |
2 | 2 | T0000000115 | S003 | 1 | 120000 | 2019-02-01 02:34:19 | HD298120 |
3 | 3 | T0000000116 | S005 | 1 | 210000 | 2019-02-01 02:47:23 | IK452215 |
4 | 4 | T0000000117 | S002 | 2 | 170000 | 2019-02-01 04:33:46 | PL542865 |
df_transaction_plus_customer = pd.merge(df_transaction_combined, df_raw_customer_master, on="customer_id", how="left")
display(df_transaction_plus_customer.head())
df_transaction_master = pd.merge(df_transaction_plus_customer, df_raw_item_master, on="item_id", how="left")
df_transaction_master
detail_id | transaction_id | item_id | quantity | price | payment_date | customer_id | customer_name | registration_date | gender | age | birth | pref | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | T0000000113 | S005 | 1 | 210000 | 2019-02-01 01:36:57 | PL563502 | 김태경 | 2019-01-07 14:34 | imoto_yoshimasa@example.com | M | 30 | 1989-07-15 | 대전광역시 |
1 | 1 | T0000000114 | S001 | 1 | 50000 | 2019-02-01 01:37:23 | HD678019 | 김영웅 | 2019-01-27 18:00 | mifune_rokurou@example.com | M | 73 | 1945-11-29 | 서울특별시 |
2 | 2 | T0000000115 | S003 | 1 | 120000 | 2019-02-01 02:34:19 | HD298120 | 김강현 | 2019-01-11 8:16 | yamane_kogan@example.com | M | 42 | 1977-05-17 | 광주광역시 |
3 | 3 | T0000000116 | S005 | 1 | 210000 | 2019-02-01 02:47:23 | IK452215 | 김주한 | 2019-01-10 5:07 | ikeda_natsumi@example.com | F | 47 | 1972-03-17 | 인천광역시 |
4 | 4 | T0000000117 | S002 | 2 | 170000 | 2019-02-01 04:33:46 | PL542865 | 김영빈 | 2019-01-25 6:46 | kurita_kenichi@example.com | M | 74 | 1944-12-17 | 광주광역시 |
detail_id | transaction_id | item_id | quantity | price | payment_date | customer_id | customer_name | registration_date | gender | age | birth | pref | item_name | item_price | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | T0000000113 | S005 | 1 | 210000 | 2019-02-01 01:36:57 | PL563502 | 김태경 | 2019-01-07 14:34 | imoto_yoshimasa@example.com | M | 30 | 1989-07-15 | 대전광역시 | PC-E | 210000 |
1 | 1 | T0000000114 | S001 | 1 | 50000 | 2019-02-01 01:37:23 | HD678019 | 김영웅 | 2019-01-27 18:00 | mifune_rokurou@example.com | M | 73 | 1945-11-29 | 서울특별시 | PC-A | 50000 |
2 | 2 | T0000000115 | S003 | 1 | 120000 | 2019-02-01 02:34:19 | HD298120 | 김강현 | 2019-01-11 8:16 | yamane_kogan@example.com | M | 42 | 1977-05-17 | 광주광역시 | PC-C | 120000 |
3 | 3 | T0000000116 | S005 | 1 | 210000 | 2019-02-01 02:47:23 | IK452215 | 김주한 | 2019-01-10 5:07 | ikeda_natsumi@example.com | F | 47 | 1972-03-17 | 인천광역시 | PC-E | 210000 |
4 | 4 | T0000000117 | S002 | 2 | 170000 | 2019-02-01 04:33:46 | PL542865 | 김영빈 | 2019-01-25 6:46 | kurita_kenichi@example.com | M | 74 | 1944-12-17 | 광주광역시 | PC-B | 85000 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
7139 | 7139 | T0000006894 | S004 | 1 | 180000 | 2019-07-31 21:20:44 | HI400734 | 김윤성 | 2019-01-04 13:24 | shishido_akira@example.com | M | 64 | 1955-01-13 | 대구광역시 | PC-D | 180000 |
7140 | 7140 | T0000006895 | S002 | 1 | 85000 | 2019-07-31 21:52:48 | AS339451 | 김무경 | 2019-02-11 19:34 | aihara_miki@example.com | F | 74 | 1945-02-03 | 대구광역시 | PC-B | 85000 |
7141 | 7141 | T0000006896 | S001 | 2 | 100000 | 2019-07-31 23:35:25 | OA027325 | 박준석 | 2019-04-17 9:23 | matsuda_saki@example.com | F | 40 | 1979-05-25 | 서울특별시 | PC-A | 50000 |
7142 | 7142 | T0000006897 | S002 | 1 | 85000 | 2019-07-31 23:39:35 | TS624738 | 이가빈 | 2019-02-20 18:15 | shinndou_masatoshi@example.com | M | 56 | 1963-02-21 | 인천광역시 | PC-B | 85000 |
7143 | 7143 | T0000006898 | S002 | 1 | 85000 | 2019-07-31 23:41:38 | AS834214 | 이승채 | 2019-04-07 3:20 | tahara_yuuko@example.com | F | 74 | 1944-12-18 | 대전광역시 | PC-B | 85000 |
7144 rows × 16 columns
어쨌든 이런 식으로 길고 거대한 전체 데이터를 합친 master 데이터를 만들어 냈는데, 뭐 어쨌든 이것만 있으면 뭐든 할 수 있지 않을까요?
월별 거래 현황을 분석해 보자
*** 이제부터는 transaction_master Dataframe만 있으면 만사 OK입니다. 다른 테이블은 잊어요~ ***
일단은 제일 먼저 하고 싶은건 매출 추이 인데 말입죠. 얼마나 잘 사업을 하고 있는지 확인하고 싶습니다. 그러면 월별로 보는 것이 좋겠지요? 그렇디면 payment_date를 월로 자르는 것이 좋겠습니다.
쉽게 하기 위해서 일단 payment_date를 날짜 형태로 바꿔주시죠.
df_transaction_master['payment_date'] = pd.to_datetime(df_transaction_master['payment_date'])
print(df_transaction_master.info())
df_transaction_master.head(2)
Int64Index: 7144 entries, 0 to 7143 Data columns (total 16 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 detail_id 7144 non-null int64 1 transaction_id 7144 non-null object 2 item_id 7144 non-null object 3 quantity 7144 non-null int64 4 price 7144 non-null int64 5 payment_date 7144 non-null datetime64[ns] 6 customer_id 7144 non-null object 7 customer_name 7144 non-null object 8 registration_date 7144 non-null object 9 email 7144 non-null object 10 gender 7144 non-null object 11 age 7144 non-null int64 12 birth 7144 non-null object 13 pref 7144 non-null object 14 item_name 7144 non-null object 15 item_price 7144 non-null int64 dtypes: datetime64[ns](1), int64(5), object(10) memory usage: 948.8+ KB None
detail_id | transaction_id | item_id | quantity | price | payment_date | customer_id | customer_name | registration_date | gender | age | birth | pref | item_name | item_price | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | T0000000113 | S005 | 1 | 210000 | 2019-02-01 01:36:57 | PL563502 | 김태경 | 2019-01-07 14:34 | imoto_yoshimasa@example.com | M | 30 | 1989-07-15 | 대전광역시 | PC-E | 210000 |
1 | 1 | T0000000114 | S001 | 1 | 50000 | 2019-02-01 01:37:23 | HD678019 | 김영웅 | 2019-01-27 18:00 | mifune_rokurou@example.com | M | 73 | 1945-11-29 | 서울특별시 | PC-A | 50000 |
자, payment_date를 datetime형식으로 바꿨습니다. 후후 이렇게 바꾸고 나면 꽤나 편리하게 날짜/시간을 관리할 수 있으니까 꼭 알아두면 좋겠습니다. 자, 그러면 payment_month, year를 뽑아내시죠. 같은 결과인데 방법이 여러가지 있어서 2가지를 모두 해 보겠습니다. 후후.
df_transaction_master['payment_month'] = df_transaction_master['payment_date'].dt.month
df_transaction_master['payment_year'] = pd.DatetimeIndex(df_transaction_master['payment_date']).year
df_transaction_master.head()
detail_id | transaction_id | item_id | quantity | price | payment_date | customer_id | customer_name | registration_date | gender | age | birth | pref | item_name | item_price | payment_month | payment_year | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | T0000000113 | S005 | 1 | 210000 | 2019-02-01 01:36:57 | PL563502 | 김태경 | 2019-01-07 14:34 | imoto_yoshimasa@example.com | M | 30 | 1989-07-15 | 대전광역시 | PC-E | 210000 | 2 | 2019 |
1 | 1 | T0000000114 | S001 | 1 | 50000 | 2019-02-01 01:37:23 | HD678019 | 김영웅 | 2019-01-27 18:00 | mifune_rokurou@example.com | M | 73 | 1945-11-29 | 서울특별시 | PC-A | 50000 | 2 | 2019 |
2 | 2 | T0000000115 | S003 | 1 | 120000 | 2019-02-01 02:34:19 | HD298120 | 김강현 | 2019-01-11 8:16 | yamane_kogan@example.com | M | 42 | 1977-05-17 | 광주광역시 | PC-C | 120000 | 2 | 2019 |
3 | 3 | T0000000116 | S005 | 1 | 210000 | 2019-02-01 02:47:23 | IK452215 | 김주한 | 2019-01-10 5:07 | ikeda_natsumi@example.com | F | 47 | 1972-03-17 | 인천광역시 | PC-E | 210000 | 2 | 2019 |
4 | 4 | T0000000117 | S002 | 2 | 170000 | 2019-02-01 04:33:46 | PL542865 | 김영빈 | 2019-01-25 6:46 | kurita_kenichi@example.com | M | 74 | 1944-12-17 | 광주광역시 | PC-B | 85000 | 2 | 2019 |
엣헴 이렇게 해 놓고보니 month와 year 컬럼이 너무 뒤로가 있어서 보기 어렵네요. column 순서를 바꿔보겠습니다. 꺄륵. 아주 간단한데요 그냥 이름을 다시 넣어주면 됩니다.
cols = list(df_transaction_master.columns)
cols
['detail_id', 'transaction_id', 'item_id', 'quantity', 'price', 'payment_date', 'customer_id', 'customer_name', 'registration_date', 'email', 'gender', 'age', 'birth', 'pref', 'item_name', 'item_price', 'payment_month', 'payment_year']
df_transaction_master = df_transaction_master[['detail_id', 'transaction_id', 'item_id', 'quantity', 'price', 'payment_year', 'payment_month', 'payment_date', 'customer_id', 'customer_name', 'registration_date', 'email', 'gender', 'age', 'birth', 'pref', 'item_name', 'item_price']]
df_transaction_master.head(2)
detail_id | transaction_id | item_id | quantity | price | payment_year | payment_month | payment_date | customer_id | customer_name | registration_date | gender | age | birth | pref | item_name | item_price | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | T0000000113 | S005 | 1 | 210000 | 2019 | 2 | 2019-02-01 01:36:57 | PL563502 | 김태경 | 2019-01-07 14:34 | imoto_yoshimasa@example.com | M | 30 | 1989-07-15 | 대전광역시 | PC-E | 210000 |
1 | 1 | T0000000114 | S001 | 1 | 50000 | 2019 | 2 | 2019-02-01 01:37:23 | HD678019 | 김영웅 | 2019-01-27 18:00 | mifune_rokurou@example.com | M | 73 | 1945-11-29 | 서울특별시 | PC-A | 50000 |
헤헷 앞으로 빼냈습니다. 자, 그럼 일단 몇년도 데이터가 있는지 함 봅시다.
df_transaction_master['payment_year'].value_counts()
2019 7144 Name: payment_year, dtype: int64
오, 이렇게 보니까, 2019년 데이터만 있나봅니다. 그럼 월별로는 어떻게 있는지 보시죠.
df_transaction_master['payment_month'].value_counts()
7 1243 6 1202 4 1184 3 1181 5 1170 2 1164 Name: payment_month, dtype: int64
이걸 보니까 2~7월 사이의 거래 데이터였었군요. 음음. 그러면 조금 더 간단한 이야기가 되었네요. 월별로 집계를 하면 되겠습니다. 후후. 이럴 때 집계 어떤 걸 쓴다고 했죠? 그렇습니다. 이럴 때 쓰는 것이 groupby 입니다. month로 그룹핑한 다음에 price만을 합계내면 되겠네요!
df_revenue_month = pd.DataFrame(df_transaction_master.groupby(by=['payment_month'])['price'].sum())
df_revenue_month
price | |
---|---|
payment_month | |
2 | 179190000 |
3 | 175375000 |
4 | 176720000 |
5 | 171385000 |
6 | 183395000 |
7 | 188685000 |
오, 이렇게 해서 월별 거래 데이터를 뽑았는데 말이죠. 이렇게만 보면 추이가 잘 안보이니까, 그래프로 한번 그려볼까 합니다. pandas dataframe이면 엄청 간단해요.
df_revenue_month.plot(figsize=(10,4), grid=True)
어떄요 간단하죠? 어떄요? 전반적으로 5월에 성적이 안좋았는데, 점점 더 거래가 다시 많아지는 형태입니다. 사업을 잘한다는 의미겠죠? - 라고 믿습니다. 계절성이 있는건가..? - 그러면 한가지를 더 분석해 보자면, 각 월에 대하여 각 item은 어떤 식인지 들여다 보는 것도 좋겠군요.
df_revenue_detail = pd.DataFrame(df_transaction_master.groupby(by=["payment_month", "item_name"])['price'].sum())
df_revenue_detail.head()
price | ||
---|---|---|
payment_month | item_name | |
2 | PC-A | 29270000 |
PC-B | 27785000 | |
PC-C | 22905000 | |
PC-D | 35010000 | |
PC-E | 64220000 |
그룹화하긴 했는데, 이걸 x를 각 월로, y를 price인데 각각 따로 다루려니까, item_name을 컬럼쪽으로 올려야 다루기 편할 것 같으니말이죠! unstack()을 해서 다뤄보는 게 좋겠습니다.
df_revenue_detail.unstack()
price | |||||
---|---|---|---|---|---|
item_name | PC-A | PC-B | PC-C | PC-D | PC-E |
payment_month | |||||
2 | 29270000 | 27785000 | 22905000 | 35010000 | 64220000 |
3 | 30440000 | 28540000 | 20275000 | 27205000 | 68915000 |
4 | 31600000 | 26850000 | 23665000 | 26045000 | 68560000 |
5 | 29575000 | 28660000 | 21885000 | 27485000 | 63780000 |
6 | 30650000 | 28020000 | 24865000 | 32550000 | 67310000 |
7 | 30225000 | 31350000 | 21715000 | 28170000 | 77225000 |
아휴, 이제 뭔가 다룰 수 있겠는걸요. 그러면, columns이름과 index이름을 가져와서 이걸 legend로 넣고 DataFrame을 직접 plot해 봅시다~! 이거 이거 재밌겠네요. 라고 했지만 multiindex는 늘 머리가 좀 아프긴 합니다.
idx = df_revenue_detail.unstack().columns.names[1]
print(idx)
cols = [col[1] for col in df_revenue_detail.unstack().columns]
print(cols)
item_name ['PC-A', 'PC-B', 'PC-C', 'PC-D', 'PC-E']
import matplotlib.pyplot as plt
ax = df_revenue_detail.unstack().plot(kind='line', figsize=(10,4), grid=True)#, stacked=True)
ax.set_xlabel(idx)
ax.set_ylabel("price")
ax.ticklabel_format(style="plain") # ax.get_yaxis().get_major_formatter().set_scientific(False)
plt.legend(cols)
plt.show()
야 이거보니까, PC-E가 대부분의 매출을 차지하고 있군요. PC-E의 매출이 떨어지면, 전체가 떨어지는 형국이니, PC-E를 잘 팔아야 하겠네요. 효자상품이로군요.
기억할 만한 교훈은 매출 추이를 분석하면서, 세부 item매출도 분석을 할 수 있습니다. 그러기 위해서 column을 datetime형식으로 바꾸고, 그것을 이용하여 여러가지 groupby를 했습니다. 호호. 이거 기간별 집계할 때 엄청 편리한 방법이니 기억하면 좋겠습니다.
이 실습은 굉장히 데이터 분석에 대한 혜안을 주는 GitHub - wikibook/pyda100: 《파이썬 데이터 분석 실무 테크닉 100》 https://github.com/wikibook/pyda100 의 공개 데이터를 활용해서 데이터 실습을 나름대로 하였습니다.
댓글