네이버 블로그로 이전했습니다.
https://blog.naver.com/moongda0404/222729441707
*본 글은 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를 얻어보겠습니다.
'데이터 분석 기초 > 분석 기법' 카테고리의 다른 글
[Python Data Analysis 분석 6] 데이터 분석 - 파이썬 선형 회귀분석(1/2) (6) | 2020.06.16 |
---|---|
[Python Data Analysis 분석 5] 데이터 분석 - 파이썬 연관관계 분석(음식 메뉴) (4) | 2020.06.11 |
[Python Data Analysis 분석 4] 데이터 분석 - 파이썬 상관관계 분석(타이타닉) (1) | 2020.06.09 |
[Python Data Analysis 분석 3] 데이터 분석 - 식당 데이터 분석해보기(3/3) (2) | 2020.06.08 |
[Python Data Analysis 분석 2] 데이터 분석 - 식당 데이터 분석해보기(2/3) (3) | 2020.06.07 |
댓글