<jupyter_start><jupyter_text>[Instacart Market Basket Analysis | Kaggle](https://www.kaggle.com/c/instacart-market-basket-analysis)인스타카트는 식료품 주문 및 배달 앱이다. 냉장고와 팬트리를 개인화된 취향에 맞춰 쉽게 채우는 것을 목표로 한다.인스타카트의 데이터과학팀은 즐거운 쇼핑겸험을 제공하는데 큰 역할을 한다. 트랜잭션 데이터를 사용하여 이용자가 다시 구매할 제품을 예측하거나 첫 구매를 시도하거나 다음 쇼핑 때 장바구니에 추가 할 제품에 대한 모델을 개발한다. 최근 인스타카트는 이 데이터를 소스로 공개하였다. 오픈 소스로 공개된 300만개의 인스타카드 주문에 대한 블로그 포스트를 참조하길 바란다.이 경진대회에서 인스타카트는 캐글커뮤니티에 고객의 주문에 대한 익명화된 데이터를 제공하여 이전에 주문했던 데이터를 바탕으로 다음 주문을 예측한다. 인스타카트는 최고의 모델을 찾는 것 뿐만 아니라 그들과 함께 성장할 머신러닝 엔지니어를 찾는다.이 대회의 수상자는 상금과 리쿠르팅 기회를 함께 얻지만 이 대회는 2017년 8월 14일에 서브미션 제출이 끝난대회다. 평가 [mean F1 score - Wikipedia](https://en.wikipedia.org/wiki/F1_score)테스트 세트의 각 order_id에 대해 해당 주문에 대한 product_ids의 공백으로 구분 된 목록을 예측해야한다. 빈 주문을 예측하려면 명시 적 'None'값을 제출해야한다. 'None'을 product_ids와 결합 할 수 있다. '없음'의 철자는 채점 척도에서 대소문자를 구분한다. 파일에는 헤더가 있고 다음과 같이 표시되어야한다.```order_id,products  17,1 2  34,None  137,1 2 3  etc.```참고 : https://www.kaggle.com/sudalairajkumar/simple-exploration-notebook-instacart<jupyter_code>import numpy as np # 수학 계산을 위해
import pandas as pd # CSV 파일을 읽어오고 데이터 처리를 위해
import matplotlib as mpl # 그래프를 그리기 위해
import matplotlib.pyplot as plt
import seaborn as sns # matplotlib을 쉽게 사용하기 위해
color = sns.color_palette()

# 노트북 안에 그래프를 그리기 위해
%matplotlib inline

# 그래프에서 격자로 숫자 범위가 눈에 잘 띄도록 ggplot 스타일을 사용
plt.style.use('ggplot')

# 그래프에서 마이너스 폰트 깨지는 문제에 대한 대처
mpl.rcParams['axes.unicode_minus'] = False

# pd.options.mode.chained_assignment = None  # default='warn'
from subprocess import check_output
print(check_output(["ls", "data"]).decode("utf8"))
order_products_train_df = pd.read_csv("data/order_products__train.csv")
order_products_prior_df = pd.read_csv("data/order_products__prior.csv")
orders_df = pd.read_csv("data/orders.csv")
products_df = pd.read_csv("data/products.csv")
aisles_df = pd.read_csv("data/aisles.csv")
departments_df = pd.read_csv("data/departments.csv")
orders_df.head()
order_products_train_df.head()
order_products_prior_df.head()
products_df.head()
aisles_df.head()
departments_df.head()
cnt_srs = orders_df.eval_set.value_counts()

plt.figure(figsize=(8,4))
sns.barplot(cnt_srs.index, cnt_srs.values, alpha=0.8, color=color[1])
plt.ylabel('Number of Occurrences', fontsize=12)
plt.xlabel('Eval set type', fontsize=12)
plt.title('각 데이터셋의 행 갯수', fontsize=15)
plt.xticks(rotation='vertical')
plt.show()
def get_unique_count(x):
    return len(np.unique(x))

cnt_srs = orders_df.groupby("eval_set")["user_id"].aggregate(get_unique_count)
cnt_srs
cnt_srs = orders_df.groupby("user_id")["order_number"].aggregate(np.max).reset_index()
cnt_srs = cnt_srs.order_number.value_counts()
cnt_srs.head()
plt.figure(figsize=(12,6))
sns.barplot(cnt_srs.index, cnt_srs.values, alpha=0.8, color=color[2])
plt.ylabel('총 주문 건', fontsize=12)
plt.xlabel('최대 주문 횟수', fontsize=12)
plt.xticks(rotation='vertical')
plt.show()<jupyter_output><empty_output><jupyter_text>요일별 주문 횟수토요일과 일요일에 주문이 가장 많고 수요일이 가장 적다.<jupyter_code>dow = ['토', '일', '월', '화', '수', '목', '금']

plt.figure(figsize=(8,4))
fig, ax = plt.subplots()
sns.countplot(x="order_dow", data=orders_df, color=color[0])
ax.set_xticklabels(dow)
plt.ylabel('주문수량', fontsize=12)
plt.xlabel('요일', fontsize=12)
plt.title("요일별 주문 수량", fontsize=15)
plt.show()
plt.figure(figsize=(12,8))
sns.countplot(x="order_hour_of_day", data=orders_df, color=color[1])
plt.ylabel('주문 량', fontsize=12)
plt.xlabel('시간', fontsize=12)
plt.xticks(rotation='vertical')
plt.title("시간대별 주문 수량", fontsize=15)
plt.show()<jupyter_output><empty_output><jupyter_text>토요일 오후와 일요일 오전에 주문량이 많다.<jupyter_code>dow = ['토', '일', '월', '화', '수', '목', '금']

grouped_df = orders_df.groupby(
    ["order_dow", "order_hour_of_day"]
)["order_number"].aggregate("count").reset_index()
grouped_df = grouped_df.pivot(
    'order_dow', 'order_hour_of_day', 'order_number')

plt.figure(figsize=(20,6))
fig, ax = plt.subplots()

sns.heatmap(grouped_df)
ax.set_yticklabels(dow)

plt.ylabel('주문 요일', fontsize=12)
plt.xlabel('주문 시간', fontsize=12)
plt.title("요일별 시간대별 주문량")
plt.show()
products_df.head()
aisles_df.head()
departments_df.head()
order_products_prior_df = pd.merge(order_products_prior_df, products_df, on='product_id', how='left')
order_products_prior_df = pd.merge(order_products_prior_df, aisles_df, on='aisle_id', how='left')
order_products_prior_df = pd.merge(order_products_prior_df, departments_df, on='department_id', how='left')
order_products_prior_df.head()
cnt_srs = order_products_prior_df['product_name'].value_counts().reset_index().head(20)
cnt_srs.columns = ['product_name', 'frequency_count']
cnt_srs
cnt_srs = order_products_prior_df['aisle'].value_counts().head(20)
plt.figure(figsize=(12,8))
sns.barplot(cnt_srs.index, cnt_srs.values, alpha=0.8, color=color[5])
plt.ylabel('Number of Occurrences', fontsize=12)
plt.xlabel('Aisle', fontsize=12)
plt.xticks(rotation='vertical')
plt.show()
plt.figure(figsize=(10,10))
temp_series = order_products_prior_df['department'].value_counts()
labels = (np.array(temp_series.index))
sizes = (np.array((temp_series / temp_series.sum())*100))
plt.pie(sizes, labels=labels, 
        autopct='%1.1f%%', startangle=200)
plt.title("Departments distribution", fontsize=15)
plt.show()
grouped_df = order_products_prior_df.groupby(
    ["department"])["reordered"].aggregate("mean").reset_index()

plt.figure(figsize=(12,8))
sns.pointplot(
    grouped_df['department'].values, 
    grouped_df['reordered'].values, 
    alpha=0.8, color=color[2])
plt.ylabel('재구매 비율', fontsize=12)
plt.xlabel('Department', fontsize=12)
plt.title("Department별 재구매 비율", fontsize=15)
plt.xticks(rotation='vertical')
plt.show()
grouped_df = order_products_prior_df.groupby(
    ["department_id", "aisle"])["reordered"].aggregate(
    "mean").reset_index()

fig, ax = plt.subplots(figsize=(12,20))
ax.scatter(grouped_df.reordered.values, grouped_df.department_id.values)
for i, txt in enumerate(grouped_df.aisle.values):
    ax.annotate(txt, (grouped_df.reordered.values[i], grouped_df.department_id.values[i]), rotation=45, ha='center', va='center', color='green')
plt.xlabel('재구매 비율')
plt.ylabel('department_id')
plt.title("각 통로별 재구매 비율", fontsize=15)
plt.show()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.15267175572519084, 'fraction_numerical': 0.019490011369173298, 'mean_word_length': 6.640198511166253, 'pattern_counts': {'":': 0, '<': 13, '<?xml version=': 0, '>': 13, 'https://': 3, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '3', 'dir': 'jupyter-structured-clean-dedup', 'id': '147866', 'license': 'MIT', 'n_tokens_mistral': 3221, 'n_tokens_neox': 3579, 'n_words': 493, 'path': 'instacart/instacart-exploring-data.ipynb', 'repo_name': 'handdola/KaggleStruggle', 'size': '6157'}