본문 바로가기
데이터 분석 기초/분석 기법

[Python Data Analysis 분석 1] 데이터 분석 - 식당 데이터 분석해보기(1/3)

by 망망낭낭 2020. 6. 6.
반응형

네이버 블로그로 이전했습니다.

https://blog.naver.com/moongda0404/222729441707

 

[Python Data Analysis 분석 1] 데이터 분석 - 식당 데이터 분석해보기(1/3)

*본 글은 Python3을 이용한 데이터 분석(Data Analysis)을 위한 글입니다. 이번 글에서느 식당 데이터 c...

blog.naver.com

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

*본 글은 Python3을 이용한 데이터 분석(Data Analysis)을 위한 글입니다.

이번 글에서느 식당 데이터 csv파일을 이용해 데이터 분석을 연습해보겠습니다.

우선 chipotle.csv 파일을 다운받고 jupyter notbook 경로에 둡니다. (↑위 파일 다운)

그럼 어떤 형식으로 돼있는지 살펴봅시다.

1. 파이썬에서 파일을 불러옵니다. file_path라는 경로를 설정(실제 csv가 있는 경로)

2. pandas의 csv 호출 함수 pd.read_csv(file_path, sep = ',') ← csv는 쉼표로 구분된 엑셀 파일이라 sep를 ','로 했는데, 안 해도 데이터가 잘 나오네요

3. chipo로 데이터 확인

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

file_path = './data/chipotle.csv'

#sep = seperate, 탭으로 구분한다.
chipo = pd.read_csv(file_path)

#fild 은 dataframe으로 받는다
print(type(chipo))
chipo
 

 

데이터를 보니 [order_id], [quantity], [item_name], [choice_description], [itemp_price] 이렇게 총 5개의 속성이 있습니다.

order_id : 주문번호

quantity : 주문 개수

item_name : 음식 이름

choice_description : 선택 옵션 (소스는 무엇인지 재료는 어떤 걸 골랐는지)

item_price : 음식 가격

그럼 데이터를 이용해 몇 가지 insight를 얻어봅시다.

1. 음식 메뉴는 총 몇가지 일까?

2. 메뉴 당 가격은 얼마일까? 뭐가 제일 비싸지?

3. 어떤 음식 조합이 제일 선호될까?

1. 음식 메뉴는 총 몇 가지 일까?

메뉴는 item_name이니까, item_name의 종류를 세면 되겠습니다.

위의 csv 불러오는 부분은 놔두고 Shift+Enter를 눌러 진행해봅시다.

tmp_arr=chipo['item_name'].unique()
len(tmp_arr)
tmp_arr

unique() 함수는 sql의 distinct처럼 중복되는 데이터를 제거하는 함수입니다.

총 50개의 메뉴가 있네요

그럼 메뉴별 가격은 얼마일까요?

2. 메뉴 당 가격은 얼마일까? 뭐가 제일 비싸지?

잠깐! 사실 메뉴별 가격은 여기서 알기 힘듭니다. 같은 item_name이더라도, choice_description이 어떠냐에 따라 가격이 달라지기 때문이에요.

choice_description이 null이면 기본 메뉴일 테니 가격을 알 수도 있겠지만, null이 항상 존재한다는 보장이 없으니 평균값을 구하는 것으로 해보겠습니다.

groupby는 동일한 데이터끼리 모아주는 역할을 하는 dataframe함수입니다. sql의 groupby와 동일하네요. 자주 쓰일 것 같으니 외워둡시다.

그럼 'chipo'라는 dataframe에서 'item_name'을 기준으로 묶고, 묶은 item_price마다의 평균을 구해봅시다.

그럼 이제 Ctrl+Enter!

chipo_cost = chipo.groupby('item_name')['item_price'].mean()
chipo_cost.head()

음..에러가 발생한 이유가 뭔지 보이시나요?

맨 아래 보시면 DataError : No numeric types to aggregate라고 적혀있네요.

가만히 살펴보니..item_price의 속성이 숫자가 아니었습니다.

앞에 '$'가 붙어있어서 스트링 타입이었군요.

그럼 연산을 위해선 숫자로 바꿔야 하니, $를 제거하고 item_price를 float로 바꾸는 작업을 진행해야 합니다.

아래 문법은

'chipo'의 'item_price'를 float로 바꾸는데, 각 데이터는 0번째를 제외한 1번째부터로 적용하겠다는 의미입니다.

lambda는 파이썬이 제공하는 기능인데, 함수를 한 줄로 선언하고 쓸 수 있도록 하는 것입니다.

lambda x : float(x[1:])

def A(x) :

return float(x[1:])

위 두 문법은 동일한 기능입니다.

*(추가) 좀더 살펴보니 더 좋은 방법이 있습니다.

좌우 공백을 없애는 'strip()' 함수를 쓰면 됩니다.

여기선 'lstrip('$')'을 써서 왼쪽의 '$'를 지웠습니다.

chipo['item_price']=chipo['item_price'].str.lstrip('$')

#집계를 위해 기존 str타입을 float(실수)로 변환
chipo['item_price'].astype(float)

자 그럼 제일 앞의 '$'를 제외하고 실수로 변환하니, 다음처럼 item_price가 잘 나오네요

그럼 다시 평균을 구해봅시다.

chipo_cost=chipo.groupby('item_name')['item_price'].mean()
chipo_cost.sort_values(ascending=False)

제일 비싼 음식은 'Bowl'이고 평균적으로 14.8달러라는 걸 알 수 있습니다.

다음 글에서는 위 데이터에서 order_id / item_name / choice_description을 이용한 insight를 얻어보겠습니다.

반응형

댓글