멕시코풍 프랜차이즈 chipotle의 주문데이터를 분석해 보겠습니다아.
그러면, 당연하게도 데이터를 읽어들이면서 시작해 보겠습니다.
import pandas as pd
import requests
import io
from IPython.display import display
pd.set_option('mode.chained_assignment', None) # <==== SettingWithCopyWarning 경고를 끈다
url = "https://raw.githubusercontent.com/yoonkt200/python-data-analysis/master/data/chipotle.tsv"
file_name = "chipotle.tsv"
with open(file_name, "wb") as dfile :
response = requests.get(url)
dfile.write(response.content)
!head "./chipotle.tsv" -n 5
==> ./chipotle.tsv <== order_id quantity item_name choice_description item_price 1 1 Chips and Fresh Tomato Salsa NULL $2.39 1 1 Izze [Clementine] $3.39 1 1 Nantucket Nectar [Apple] $3.39 1 1 Chips and Tomatillo-Green Chili Salsa NULL $2.39 2 2 Chicken Bowl [Tomatillo-Red Chili Salsa (Hot), [Black Beans, Rice, Cheese, Sour Cream]] $16.98 3 1 Chicken Bowl [Fresh Tomato Salsa (Mild), [Rice, Cheese, Sour Cream, Guacamole, Lettuce]] $10.98 3 1 Side of Chips NULL $1.69 4 1 Steak Burrito [Tomatillo Red Chili Salsa, [Fajita Vegetables, Black Beans, Pinto Beans, Cheese, Sour Cream, Guacamole, Lettuce]] $11.75 4 1 Steak Soft Tacos [Tomatillo Green Chili Salsa, [Pinto Beans, Cheese, Sour Cream, Lettuce]] $9.25 head: -n: No such file or directory head: 5: No such file or directory
아.. 이거 곧바로 읽어들일 수 있는거겠죠. 일단, pandas의 dataframe으로 읽어보겠습니다. 가만히 보니까 sep가 tab인 것 같군요!
import pandas as pd
df_raw = pd.read_csv(file_name, sep="\t")
df_raw.head()
order_id | quantity | item_name | choice_description | item_price | |
---|---|---|---|---|---|
0 | 1 | 1 | Chips and Fresh Tomato Salsa | NaN | $2.39 |
1 | 1 | 1 | Izze | [Clementine] | $3.39 |
2 | 1 | 1 | Nantucket Nectar | [Apple] | $3.39 |
3 | 1 | 1 | Chips and Tomatillo-Green Chili Salsa | NaN | $2.39 |
4 | 2 | 2 | Chicken Bowl | [Tomatillo-Red Chili Salsa (Hot), [Black Beans... | $16.98 |
어찌 어찌 읽었습니다. 휴~ 자, columns을 좀 보면
order_id : 주문 ID겠죠
quantity : 주문 개수겠죠
item_name : 주문 품목이겠네요.
choice_description : 이거는 뭔가 주문할 때 설명한 내용인가 보네요
item_price : 이거는 item price로 되어 있는데, 가만히 보면 order_id가 여러개씩 있는것 보니까, item별로 계속 추가한 내용인가 보군요. 호.
이제부터 궁금한 것들이 있을텐데, 하나하나 알아가 보죠.
가장 많이 주문한 아이템 Top10은?
가장 많이 주문한 아이템을 찾기 위해서는 item_name이 몇개씩 있는지 보면 알겠군요. 그러면 item_name을 각각 몇개씩 있는지 한번 봅시다.
df_data = df_raw.copy()
df_data['item_name'].value_counts()[0:10]
Chicken Bowl 726 Chicken Burrito 553 Chips and Guacamole 479 Steak Burrito 368 Canned Soft Drink 301 Steak Bowl 211 Chips 211 Bottled Water 162 Chicken Soft Tacos 115 Chicken Salad Bowl 110 Name: item_name, dtype: int64
오, 간단하게 볼 수 있겠습니다. 1위부터~10위까지 이런 메뉴들이 잘 나가는군요?
아이템별 주문 총량
이게 궁금할 수도 있겠는데, 이렇게 이야기 하면 곧바로 아이템별 group을 만들어서 보면 되겠습니다.
df_data.groupby(['item_name'])['quantity'].sum().nlargest(10)
item_name Chicken Bowl 761 Chicken Burrito 591 Chips and Guacamole 506 Steak Burrito 386 Canned Soft Drink 351 Chips 230 Steak Bowl 221 Bottled Water 211 Chips and Fresh Tomato Salsa 130 Canned Soda 126 Name: quantity, dtype: int64
이렇게 보면 사실 Top10은 groupby로 본 것이 맞겠군요? 그냥 value_counts한 것은 quantity가 고려되지 않았으니까요. 지금 결과가 확실하게 Top10입니다. 하하.
주문당 평균 계산금액은 얼마일까?
이것도 꽤나 중요한 지표이긴 하죠. 무엇을 운영하든 주문당 매출만 따질 수 있으면 몇 주문이면 BEP에 갈 수 있는지 등을 알 수 있으니까요.
df_data.groupby('order_id')['item_price'].sum().mean() 이렇게 구하고 싶은데, 보니까, item_price가 string이군요. 이래서는 합과 평균을 구할 수가 없는데! 그러면 조금 손을 봐야 하겠습니다.
df_data.info()
RangeIndex: 4622 entries, 0 to 4621 Data columns (total 5 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 order_id 4622 non-null int64 1 quantity 4622 non-null int64 2 item_name 4622 non-null object 3 choice_description 3376 non-null object 4 item_price 4622 non-null object dtypes: int64(2), object(3) memory usage: 180.7+ KB
df_data['item_price'] = df_data['item_price'].apply(lambda row: float(row.replace("$", "")))
df_data.info()
RangeIndex: 4622 entries, 0 to 4621 Data columns (total 5 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 order_id 4622 non-null int64 1 quantity 4622 non-null int64 2 item_name 4622 non-null object 3 choice_description 3376 non-null object 4 item_price 4622 non-null float64 dtypes: float64(1), int64(2), object(2) memory usage: 180.7+ KB
헤헤. item_price를 float형으로 바꾸었습니다. 그러면, 이제 각 order에 대하여 주문액이 얼마인지 group으로 알아내고, 전체 mean을 구해볼까요?
df_data.groupby('order_id')['item_price'].sum().mean()
18.811428571428568
오, 주문당 18.8달러정도의 주문이 이루어지는군요. 괜찮네요? 후후.
더 뭔가 알아보고 싶지만, 일단 더 알고 싶은 것이 지금은 없네요.
조금 아쉬운 것이 Timestamp가 같이 있거나, 고객 ID가 같이 있었다면, 날짜 별로, 시간 별로, 고객별로 분석해 볼텐데 말이죠.
매출 데이터에는 이런 것들이 꼭 포함되도록 데이터를 쌓는 것이 중요하다는 사실을 다시 한번 실감합니다.
대단한 분석을 기대했다면, 미안합니다. 이 정도가 이 데이터에서 알고 싶은 것의 전부라서요. 뭐 그런 날도 있는 것 아니겠습니꽈?
이 분석은 이것이 데이터 분석이다. (https://github.com/yoonkt200/python-data-analysis) 이 원출처입니다만, 나름대로의 분석으로 재구성하였습니다.
댓글