EDAプロジェクト:Instart Market
12269 ワード
Instacart Market Data Analysis
最初のEDAプロジェクトはInstart Marketを選択しました.食品配送アプリInstacartより前の注文情報から予測して購入するのが狙いです.では、データを見てみましょう.
1.データの読み込み
1)ベースライブラリを追加します.import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
!pip install squarify # treemap으로 표현하기 위해 squarify 설치
import squarify # pip install squarify
2)colabにはデータをロードする方法がいくつかあるが,Kaggleダウンロードをバインドする方法が用いられている.!pip install kaggle --upgrade
3)Kaggleログイン→Account→APIで、「CreateNewAPI Token」をクリックしてJSONファイルをダウンロードし、ここで確認できます.import os
os.environ['KAGGLE_USERNAME'] = '본인의 kaggle id'
os.environ['KAGGLE_KEY'] = '본인의 kaggle key'
!kaggle -h # 연동이 잘 되었는지 확인한다.
4)Instacartのデータをダウンロードします.どのプロジェクトでも、Kaggleでは、プロジェクトのデータタブに次のリンクがあります.!kaggle competitions download -c instacart-market-basket-analysis
5) '.「zip」形式で圧縮します.!unzip '*.zip'
2.データの表示
1)ファイル名で直接データをロードすると、データは表示されますが、データは表示されません.データをロードするときは「pd」を使用する必要があります.read csv」を使用します.departments = pd.read_csv('departments.csv') # ★이렇게 csv를 불러와야 오류가 없음
departments.head()
2)各データをロードして確認した後、下図として表示することができます.まず製品情報、注文情報に分けます.その後、受注情報は、再購入情報と受注詳細に分けられます.
2-1. データセットの区別
1)orderテーブルのeval set列はprior,train,testに分けられる.各データセットがどのように分割されているかを決定します.cnt_set = orders.eval_set.value_counts() # order 데이터는 prior, train, test으로 구분되어있음
sns.barplot(cnt_set.index, cnt_set.values)
print(cnt_set)
2)eval setでは、user idは同じ人によってグループ化され、各データセットのユーザ名数を求める.def get_unique_count(x):
return len(np.unique(x))
cnt_srs = orders.groupby("eval_set")["user_id"].aggregate(get_unique_count)
cnt_srs
2-2. 受注情報分析(orders data)と可視化
1)注文量に応じて人数を探す.# 주문량별로 몇명이 분포하는지 확인하기 위해 user id별로 묶음
cnt_set = orders.groupby('user_id').order_number.aggregate(max).reset_index()
# 주문량별로 카운트
cnt_set = cnt_set.order_number.value_counts()
plt.figure(figsize=(12,8))
sns.barplot(cnt_set.index,cnt_set.values)
plt.ylabel('Number of Occurrences', fontsize=12)
plt.xlabel('Maximum order number', fontsize=12)
plt.xticks(rotation='vertical')
plt.show()
各ユーザの再購入回数は4回から100回まで異なる.特に100回購入する人が多く、これは100回以上を全部100回に修正したようです.
2)週ごとの購入を確認する.order dow列を使用します.sns.countplot(data = orders, x='order_dow')
plt.xlabel('Day of week')
0:土曜日~6:金曜日だそうです.週末の土曜日、日曜日にもっと買います.
3)時間帯で購入することを確認する.sns.countplot(data = orders, x='order_hour_of_day')
plt.xlabel('Hour of day')
4)毎週、毎時間の購入を確認する.# 요일, 시간별로 묶는다.
grouped = orders.groupby(['order_dow', 'order_hour_of_day']).order_number.aggregate('count')
# povot된 index를 colom으로 사용하기 위해 index를 빼내온다.
grouped = grouped.reset_index()
# 요일을 row로, 시간을 column으로 나타내기 위해 povit사용
grouped = grouped.pivot('order_dow', 'order_hour_of_day', 'order_number')
grouped
以下に示すように、曜日をインデックスとし、時間をカラムとするテーブルを取得できます.
これをheatmapの形で可視化します.週末の昼間の購入が最も活発であることがわかりますsns.heatmap(grouped, center = 30000) # 중간값을 기준으로 파란색, 빨간색으로 표현.
5)再購入時期を確認する.大きい角度から見ると0~7,30日目には再購入しやすいです.また、14日、21日、28日にもジャンプ現象が発生する.sns.countplot(data = orders, x='days_since_prior_order')
2-3. 再購入比率
1)再購入割合を確認する.平均59%程度が再購入です.
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
!pip install squarify # treemap으로 표현하기 위해 squarify 설치
import squarify # pip install squarify
!pip install kaggle --upgrade
import os
os.environ['KAGGLE_USERNAME'] = '본인의 kaggle id'
os.environ['KAGGLE_KEY'] = '본인의 kaggle key'
!kaggle -h # 연동이 잘 되었는지 확인한다.
!kaggle competitions download -c instacart-market-basket-analysis
!unzip '*.zip'
departments = pd.read_csv('departments.csv') # ★이렇게 csv를 불러와야 오류가 없음
departments.head()
cnt_set = orders.eval_set.value_counts() # order 데이터는 prior, train, test으로 구분되어있음
sns.barplot(cnt_set.index, cnt_set.values)
print(cnt_set)
def get_unique_count(x):
return len(np.unique(x))
cnt_srs = orders.groupby("eval_set")["user_id"].aggregate(get_unique_count)
cnt_srs
# 주문량별로 몇명이 분포하는지 확인하기 위해 user id별로 묶음
cnt_set = orders.groupby('user_id').order_number.aggregate(max).reset_index()
# 주문량별로 카운트
cnt_set = cnt_set.order_number.value_counts()
plt.figure(figsize=(12,8))
sns.barplot(cnt_set.index,cnt_set.values)
plt.ylabel('Number of Occurrences', fontsize=12)
plt.xlabel('Maximum order number', fontsize=12)
plt.xticks(rotation='vertical')
plt.show()
sns.countplot(data = orders, x='order_dow')
plt.xlabel('Day of week')
sns.countplot(data = orders, x='order_hour_of_day')
plt.xlabel('Hour of day')
# 요일, 시간별로 묶는다.
grouped = orders.groupby(['order_dow', 'order_hour_of_day']).order_number.aggregate('count')
# povot된 index를 colom으로 사용하기 위해 index를 빼내온다.
grouped = grouped.reset_index()
# 요일을 row로, 시간을 column으로 나타내기 위해 povit사용
grouped = grouped.pivot('order_dow', 'order_hour_of_day', 'order_number')
grouped
sns.heatmap(grouped, center = 30000) # 중간값을 기준으로 파란색, 빨간색으로 표현.
sns.countplot(data = orders, x='days_since_prior_order')
order_products.reordered.sum() / order_products.shape[00]
> 0.5896974667922161
order_products_train.reordered.sum() / order_products_train.shape[0]
> 0.5985944127509629
2)再購入できない製品の割合を確認する.priori setは12%,train setは6%であった.grouped = order_products.groupby('order_id')['reordered'].aggregate('sum').reset_index()
reorder_yes = len(grouped[grouped.reordered >= 1].index)
reorder_no = len(grouped[grouped.reordered == 0].index) # null값 들어간거도 있어서 sum으로 하면 비율이 다르게 나옴
reorder_sum = len(grouped[grouped.reordered >= 0].index)
print('re-ordered =', reorder_yes / reorder_sum)
print('no-re-order =', reorder_no / reorder_sum)
> re-ordered = 0.8791514068669565
> no-re-order = 0.12084859313304347
grouped = order_products_train.groupby('order_id')['reordered'].aggregate('sum').reset_index()
reorder_yes = len(grouped[grouped.reordered >= 1].index)
reorder_no = len(grouped[grouped.reordered == 0].index)
reorder_sum = len(grouped[grouped.reordered >= 0].index)
print('re-ordered =', reorder_yes / reorder_sum)
print('no-re-order =', reorder_no / reorder_sum)
> re-ordered = 0.9344404728334185
> no-re-order = 0.06555952716658156
3.以前の購入データの分析(prer data)
3-1. merge
1)製品情報を確認するため、「製品」、「通路」、「部門」の3つのデータを「order product」を基準として組み合わせる.
order_product_merge = pd.merge(order_products, products, on='product_id', how='left')
order_product_merge = pd.merge(order_product_merge, aisles, on='aisle_id', how='left')
order_product_merge = pd.merge(order_product_merge, departments, on='department_id', how='left')
order_product_merge
2)製品購入回数別
cnt_set = order_product_merge.product_name.value_counts().reset_index().head(20)
cnt_set.columns = ['product_name', 'frequency_count']
cnt_set.head()
ほとんどは果物、有機製品です.3)チャネル別購入回数
cnt_set_aisle_20 = order_product_merge.aisle.value_counts().head(20)
plt.figure(figsize=(12, 8))
sns.barplot(cnt_set_aisle_20.index, cnt_set_aisle_20.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()
3)部門別購買比率
plt.figure(figsize=(8, 8))
temp_series = order_product_merge.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()
4)買い戻し回数が最も多い製品
for_treemap_product_20 = order_product_merge.groupby('product_name').reordered.aggregate('sum').reset_index()
for_treemap_product_20 = for_treemap_product_20.sort_values('reordered', ascending=0).head(20)
fig, ax = plt.subplots(1, figsize = (8, 8))
squarify.plot(label=for_treemap_product_20['product_name'], sizes=for_treemap_product_20['reordered'])
「Banna」が大きな割合を占めています.for_treemap_department = order_product_merge.groupby('department').reordered.aggregate('sum').reset_index()
fig, ax = plt.subplots(1, figsize = (8, 8))
squarify.plot(label=for_treemap_department['department'], sizes=for_treemap_department['reordered'], alpha=0.8)
plt.axis('off')
plt.show()
「product,dayyengs」製品が大きな割合を占めていることがわかります.for_treemap_fin = order_product_merge.groupby(['department', 'aisle']).aggregate('sum').reordered.reset_index(drop=False)
for_treemap_fin.sort_values('reordered', ascending=0).head(10)
4.学習データ分析(train data)
4-1. merge
1)「order product train」による「order」データのマージ
order_product_train_merge = pd.merge(order_products_train, orders, on='order_id', how='left')
# 요일별 재구매 비율
order_product_train_merge_week = order_product_train_merge.groupby(['order_dow']).reordered.aggregate('mean').reset_index()
# 시간별 재구매 비율
order_product_train_merge_hour = order_product_train_merge.groupby(['order_hour_of_day']).reordered.aggregate('mean').reset_index()
sns.barplot(data = order_product_train_merge_week, x='order_dow', y = 'reordered')
plt.xlabel('Day of week')
plt.ylabel('Reorder ratio')
plt.ylim(0.55, 0.66) # 그래프의 y축 범위를 설정해준다.
plt.show()
sns.barplot(data = order_product_train_merge_hour, x='order_hour_of_day', y = 'reordered')
plt.xlabel('Hour of day')
plt.ylabel('Reorder ratio')
plt.ylim(0.55, 0.66)
plt.show()
# 소수점 2째자리까지만 표시
pd.options.display.float_format = '{:.2f}'.format
# 요일, 시간별로 groupby로 묶는다
order_product_train_merge_map = order_product_train_merge.groupby(['order_dow', 'order_hour_of_day']).reordered.aggregate('mean')
order_product_train_merge_map = order_product_train_merge_map.reset_index()
order_product_train_merge_map = order_product_train_merge_map.pivot('order_dow', 'order_hour_of_day', 'reordered')
order_product_train_merge_map
週末の朝時間、水曜日の朝時間から、買い戻しの割合が高いことがわかります.5.結論
こうしてインスタのデータを分析しました広告によく使用される可能性のある買い戻しが発生しやすい特定の環境について理解しました.また、再購入率の高い製品を大量に販売したり、再購入率の低い製品を大きな割引率で売上高を上げたりすることができます.
(本課題は以下の前期データ分析資料を参考にした.)
1. Simple Exploration Notebook - Instacart
https://www.kaggle.com/sudalairajkumar/simple-exploration-notebook-instacart/comments
2. Exploratory Analysis - Instacart
https://www.kaggle.com/philippsp/exploratory-analysis-instacart
Reference
この問題について(EDAプロジェクト:Instart Market), 我々は、より多くの情報をここで見つけました https://velog.io/@explorer/EDA프로젝트-Instacart-Marketテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol