데이터 분석/이것이 데이터 분석이다 with python

1. 데이터에서 인사이트 발견하기

이니니 2022. 7. 27. 17:25
본 내용은 도서 '이것이 데이터분석이다 With Python'의 내용을 참고했습니다.
https://github.com/yoonkt200/python-data-analysis

 

탐색적 데이터 분석의 과정

탐색적 데이터 분석은, 데이터의 정보를 파악하며 문제 해결에 필요한 힌트를 분석하는 과정이다. 그 과정은 다음과 같다.

  1. 데이터의 출처와 주제에 대해 이해한다.
  2. 데이터의 크기를 알아본다.
  3. 데이터의 구성 요소를 살펴본다.
  4. 데이터의 속성을 탐색한다.
  5. 데이터 간의 상관 관계를 탐색한다.
  6. 탐색한 데이터를 시각화 한다.

 

 

1.2 멕시코풍 프랜차이즈 chipotle의 주문 데이터 분석하기

 

chipotle 데이터셋의 기초 정보 출력하기
import pandas as pd

# read_csv 함수로 데이터를 Dataframe 형태로 불러옵니다.
file_path = '../data/chipotle.tsv'
chipo = pd.read_csv(file_path, sep = '\t')

print(chipo.shape)
print("------------------------------------")
print(chipo.info())

 

위의 결과로, order_id, quantity는 수치형 데이터임을 알 수 있고, item_name, choice_description, item_price는 범주형 데이터임을 알 수 있다.

 

chipotle 데이터셋의 행과 열, 데이터 확인하기
chipo.head(10)

 

데이터 셋 의미는 다음과 같다.

  • order_id : 주문 번호
  • quantity : 아이템의 주문 수량
  • item_name : 주문한 아이템의 이름
  • choice_description : 주문한 아이템의 상세 선택 옵션
  • item_price : 주문 아이템의 가격 정보

 

print(chipo.columns)
print("------------------------------------")
print(chipo.index)

 

describe() 함수로 기초 통계량 출력하기 - 수치형 데이터
# order_id는 숫자의 의미를 가지지 않기 때문에 str으로 변환합니다.
chipo['order_id'] = chipo['order_id'].astype(str) 

# chipo dataframe에서 수치형 피처들의 요약 통계량을 확인합니다.
print(chipo.describe())

 

unique() 함수로 기초 통계량 출력하기 - 범주형 데이터
# order_id의 개수를 출력합니다.
print(len(chipo['order_id'].unique())) 

# item_name의 개수를 출력합니다.
print(len(chipo['item_name'].unique()))

 

가장 많이 주문한 아이템 top 10 출력하기
# 가장 많이 주문한 item : top 10을 출력합니다.
item_count = chipo['item_name'].value_counts()[:10]
for idx, (val, cnt) in enumerate(item_count.iteritems(), 1):
    print("Top", idx, ":", val, cnt)

 

아이템별 주문 개수와 총량 계산하기
# item당 주문 개수를 출력합니다.
order_count = chipo.groupby('item_name')['order_id'].count()
order_count[:10] # item당 주문 개수를 출력합니다.

 

# item당 주문 총량을 출력합니다.
item_quantity = chipo.groupby('item_name')['quantity'].sum()
item_quantity[:10] # item당 주문 총량을 출력합니다.

 

시각화로 분석 결과 살펴보기
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt

item_name_list = item_quantity.index.tolist()
x_pos = np.arange(len(item_name_list))
order_cnt = item_quantity.values.tolist()
 
plt.bar(x_pos, order_cnt, align='center')
plt.ylabel('ordered_item_count')
plt.title('Distribution of all orderd item')
 
plt.show()

 

item_price는 범주형 데이터이기 때문에, 수치형 특징을 탐색하는데 쓰일 수 없었다. 하지만, 이는 가격이라는 수치를 보여주고 있는 데이터이기 때문에 수치형 데이터로 바꾸어주어서 분석해주어야 할 것이다.

 

item_price 피처 살펴보기
print(chipo.info())
print('-------------')
chipo['item_price'].head()

 

apply()와 lambda를 이용해 데이터 전처리하기
# column 단위 데이터에 apply 함수로 전처리를 적용합니다.
chipo['item_price'] = chipo['item_price'].apply(lambda x: float(x[1:]))
chipo.describe()

 

apply() 함수는 시리즈 단위의 연산을 처리하는 기능을 수행하며, sum()이나 mean()과 같이 연산이 정의된 함수를 파라미터로 받는다. 위의 식은 $ 기호를 제거하고 전처리를 한 결과이다.

 

주문당 평균 계산금액 출력하기
# 주문당 평균 계산금액을 출력합니다.
chipo.groupby('order_id')['item_price'].sum().mean()

 

한 주문에 10달러 이상 지불한 주문 번호(id) 출력하기
# 한 주문에 10달러 이상 사용한 id를 출력합니다.
chipo_orderid_group = chipo.groupby('order_id').sum()
results = chipo_orderid_group[chipo_orderid_group.item_price >= 10]

print(results[:10])
print(results.index.values)

 

각 아이템의 가격 구하기
# 각 아이템의 가격을 계산합니다.
chipo_one_item = chipo[chipo.quantity == 1]
price_per_item = chipo_one_item.groupby('item_name').min()
price_per_item.sort_values(by = "item_price", ascending = False)[:10]

 

# 아이템 가격 분포 그래프를 출력합니다.
item_name_list = price_per_item.index.tolist()
x_pos = np.arange(len(item_name_list))
item_price = price_per_item['item_price'].tolist()
 
plt.bar(x_pos, item_price, align='center')
plt.ylabel('item price($)')
plt.title('Distribution of item price')
 
plt.show()

 

# 아이템 가격 히스토그램을 출력합니다.
plt.hist(item_price)
plt.ylabel('counts')
plt.title('Histogram of item price')

plt.show()

 

가장 비싼 주문에서 아이템이 총 몇 개 팔렸는지 구하기
# 가장 비싼 주문에서 item이 총 몇개 팔렸는지를 계산합니다.
chipo.groupby('order_id').sum().sort_values(by='item_price', ascending=False)[:5]

 

'Veggie Salad Bowl'이 몇 번 주문되었는지 구하기
# “Veggie Salad Bowl”이 몇 번 주문되었는지를 계산합니다.
chipo_salad = chipo[chipo['item_name'] == "Veggie Salad Bowl"]

# 한 주문 내에서 중복 집계된 item_name을 제거합니다.
chipo_salad = chipo_salad.drop_duplicates(['item_name', 'order_id'])

print(len(chipo_salad))
chipo_salad.head(5)

 

'Chicken Bowl'을 2개 이상 주문한 주문 횟수 구하기
# “Chicken Bowl”을 2개 이상 주문한 주문 횟수를 구합니다.
chipo_chicken = chipo[chipo['item_name'] == "Chicken Bowl"]
chipo_chicken_result = chipo_chicken[chipo_chicken['quantity'] >= 2]
print(chipo_chicken_result.shape[0])

 

# “Chicken Bowl”을 2개 이상 주문한 고객들의 "Chicken Bowl" 메뉴의 총 주문 수량을 구합니다.
chipo_chicken = chipo[chipo['item_name'] == "Chicken Bowl"]
chipo_chicken_ordersum = chipo_chicken.groupby('order_id').sum()['quantity']
chipo_chicken_result = chipo_chicken_ordersum[chipo_chicken_ordersum >= 2]

print(len(chipo_chicken_result))
chipo_chicken_result.head(5)