Kaggle---Instacart Market Basket Analysis(根據(jù)數(shù)據(jù)預(yù)測復(fù)購)

今天完成本周的kaaggle 項目,通過該項目,可以學(xué)習(xí)到pandas 在數(shù)據(jù)分析中的基本應(yīng)用,非常有用

具體代碼如下

# coding: utf-8

# ##背景介紹
# 
# 目的就是找出該款軟件app的用戶可能會再次購買她買過的哪些產(chǎn)品

# In[1]:


import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 
import seaborn as sns
color=sns.color_palette()


# In[2]:


#讀入數(shù)據(jù)
aisles_df=pd.read_csv('aisles.csv')
departments_df=pd.read_csv('departments.csv')
order_products_prior_df=pd.read_csv('order_products__prior.csv')
order_products_train_df=pd.read_csv('order_products__train.csv')
orders_df=pd.read_csv('orders.csv')
products_df=pd.read_csv('products.csv')
sample_submission_df=pd.read_csv('sample_submission.csv')


# In[24]:


## orders_df 的含義是什么,因為開頭背景就介紹,每一個人的數(shù)據(jù)可能出現(xiàn)多次,4-100個訂單   order_num
type(orders_df['eval_set'].value_counts())#series
eval_set_info=orders_df['eval_set'].value_counts()
##下面進(jìn)行可視化
plt.figure(figsize=(10,5))
plt.bar(eval_set_info.index,eval_set_info.values,color='grey',alpha=0.8)
"""
主要的參數(shù)有
color bar的顏色
edgecolor 邊線bash線的顏色
height bar 的 高度 
width  bar 的 寬度 

"""
plt.xlabel('the kinds of eval_set')
plt.ylabel('the valuesof eval_set')
plt.show()


# In[37]:


###看一下來自這三個不同類型文件中 userr_id 的個數(shù)
def unique_counts(x):
#     return len((x))  發(fā)現(xiàn)每一個永輝會有多條記錄
    return len(np.unique(x))

user_eval_counts=orders_df.groupby('eval_set')["user_id"].apply(lambda x: unique_counts(x))
# user_eval_counts=orders_df.groupby('eval_set')["user_id"].agg(unique_counts)
"""
圓括號是要進(jìn)行聚類的列名 
中括號是要進(jìn)行計算的列名
后續(xù)傳入?yún)?shù)可以用apply 所有的行參與運算,這里每一個x 都是以 eval_set 為 一組 
也可以用agg 這個可以指定列
"""
user_eval_counts

##從這一步的碳素可以知道, perior 中user 最多,train 中最少
#test+train=prior


# In[56]:


###現(xiàn)在我們來驗證一下關(guān)于 每一個消費者訂單數(shù)量-----order_num的最大值,注意 一個用戶會出現(xiàn)多次
order_num_info=orders_df.groupby("user_id")["order_number"].agg(np.max).reset_index()
"""
不加reset_index 就會發(fā)現(xiàn)是以 user_id 為索引的series
加了后,index以0,1,2,...為索引的dataframe 
"""
order_num_info_data=order_num_info.order_number.value_counts()#這樣做就是看了一下大多數(shù)人出現(xiàn)訂單最大值是多少
plt.figure(figsize=(20,5))
# plt.plot(order_num_info_data.index,order_num_info_data.values,alpha=0.5)
# plt.bar(order_num_info_data.index,order_num_info_data.values,color='r')
sns.barplot(order_num_info_data.index,order_num_info_data.values,color=color[2])##條形圖或者 熱力圖比較方便
plt.show()

#發(fā)現(xiàn)每個人一次訂單最多的不小于4個


# In[67]:


"""
order_dow 
是星期,1,2,3,等
"""

##接下來研究一下星期數(shù)
def week_num(x):
    return len(np.unique(x))
order_dow_info=orders_df.groupby("order_dow")["user_id"].agg(week_num).reset_index()
order_dow_info.columns=['index','user_num']##發(fā)現(xiàn)周日下單人數(shù)最多
sns.barplot(order_dow_info.index,order_dow_info.user_num,color=color[3])
plt.show()


# In[69]:


##同樣可以看一下每天下單的時間,中午成為高峰期
def hour_num(x):
    return len(np.unique(x))
order_dow_info=orders_df.groupby("order_hour_of_day")["user_id"].agg(week_num).reset_index()
order_dow_info.columns=['index','user_num']##發(fā)現(xiàn)周日下單人數(shù)最多
sns.barplot(order_dow_info.index,order_dow_info.user_num,color=color[4])
plt.show()


# In[76]:


"""
當(dāng)然我們也可以 
結(jié)合相應(yīng)的星期和小時 
來看一下哪天哪段時間 
訂單量最多
"""
order_num_day_hour=orders_df.groupby(["order_dow","order_hour_of_day"])["order_number"].count().reset_index()#不管order_num 等于多少都算一次
order_num_day_hour
order_num_day_hour_pivot=order_num_day_hour.pivot("order_dow","order_hour_of_day","order_number")
"""
類似于數(shù)據(jù)透視表
第一個參數(shù)類似于excel 里面的行
第二個參數(shù)類似于excel 里面的列
第三個是值
"""
order_num_day_hour_pivot#瞧,跟excel 里面的數(shù)據(jù)透視表一樣
"""
數(shù)據(jù)透視表一個
最重要的應(yīng)用就是做出一個熱力圖
"""
plt.figure(figsize=(12,6))
sns.heatmap(order_num_day_hour_pivot)
plt.title("Frequency of Day of week Vs Hour of day")
plt.show()


# In[90]:


##接下來 可以看一下 兩次下單之間的時間間隔,給出兩種不同的方法
plt.figure(figsize=(12,6))
order_interview=orders_df["days_since_prior_order"].value_counts().reset_index()
order_interview.columns=["inter_days","counts"]
sns.barplot(order_interview.inter_days,order_interview.counts,color=color[4])
plt.show()

#方法2
plt.figure(figsize=(12,8))
sns.countplot(x="days_since_prior_order", data=orders_df, color=color[3])
"""
countplot 不像barplot 
b不能同時傳入x和y,
而是限定x,或者y,再 
用data 參數(shù)傳入 dataframe 數(shù)據(jù)類型

"""
plt.ylabel('Count', fontsize=12)
plt.xlabel('Days since prior order', fontsize=12)
plt.xticks(rotation='vertical')
plt.title("Frequency distribution by days since prior order", fontsize=15)
plt.show()


# In[91]:


order_products_prior_df.head(10)


# In[111]:


#可以提發(fā)現(xiàn),一個訂單包含多個商品,add_to_cart_order 最大值為訂單中商品的數(shù)量
recordered s是表征 某個商品復(fù)購的次數(shù)
def products_prior(x):
    return len(np.unique(x))


order_reorder_info=order_products_prior_df.groupby("reordered")["product_id"].agg(products_prior).reset_index()
order_reorder_info##發(fā)現(xiàn)只有0,1,0表示復(fù)購過,1表示沒有

##接下來看一下復(fù)購產(chǎn)品占總產(chǎn)品的概率 
reorder_rate=order_reorder_info.loc[1,"product_id"]/order_reorder_info.product_id.sum()
reorder_rate



同樣檢查一下訓(xùn)練結(jié)合

def products_train(x):
    return len(np.unique(x))


order_reorder_info=order_products_train_df.groupby("reordered")["product_id"].agg(products_train).reset_index()
order_reorder_info##發(fā)現(xiàn)只有0,1,0表示復(fù)購過,1表示沒有

##接下來看一下復(fù)購產(chǎn)品占總產(chǎn)品的概率 
reorder_rate=order_reorder_info.loc[1,"product_id"]/order_reorder_info.product_id.sum()
reorder_rate


# In[8]:


##接下來看一下有購買和沒有購買的訂單數(shù)量占比
order_products_prior_df
ground_df=order_products_prior_df.groupby("order_id")["reordered"].agg(sum).reset_index()
ground_df[ground_df["reordered"]>0].shape[0]/ground_df.shape[0]##有復(fù)購訂單的占比
ground_df[ground_df["reordered"]==0].shape[0]/ground_df.shape[0]##m沒有復(fù)購的占比
##發(fā)現(xiàn)復(fù)購的占比接近9成


# In[ ]:


order_products_train_df
#下面看一下訓(xùn)練集中,每個訂單中產(chǎn)品的數(shù)量分布
order_products_num=order_products_train_df.groupby("order_id")["add_to_cart_order"].agg(max).reset_index()
order_products_num
order_products_num.add_to_cart_order.value_counts().reset_index()#統(tǒng)計某一列中某一個數(shù)出現(xiàn)的次數(shù)
order_products_num.columns=["max_products_num","ord_cnt"]
order_products_num
plt.figure(figsize=(12,8))
sns.barplot(order_products_num["max_products_num"],order_products_num["ord_cnt"],alpha=0.5)
plt.show()


# In[7]:


products_df#該表存儲的是產(chǎn)品的相關(guān)細(xì)節(jié),比如名字,制作方法的備注(department_id),輔料(aisle_id)
products_df.head(10)
aisles_df.head(10)
departments_df.head(10)


# In[3]:


#下面將上述的信息進(jìn)行關(guān)聯(lián) 注意merge的使用方法

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()


# In[10]:


#接下來看一下哪些產(chǎn)品比較受歡迎,根據(jù)出現(xiàn)的頻次
products_num_info=order_products_prior_df.product_name.value_counts().reset_index()
products_num_info.colimns=["products","refer_num"]
products_num_info.head(10)
#發(fā)現(xiàn)提及最多的是 香蕉


# In[11]:


#看一下 aisele 的輔料的構(gòu)造
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()


# In[12]:


#看一下departments 的區(qū)別
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)#兩個參數(shù),一個表示發(fā)呢大小,一個表示每一個的標(biāo)簽
plt.title("Departments distribution", fontsize=15)
plt.show()


# In[16]:


#看一下,每一個department 出現(xiàn)復(fù)購的次數(shù)
grouped_df = order_products_prior_df.groupby(["department"])["reordered"].aggregate("mean").reset_index()
grouped_df#含有某個成分的訂單被復(fù)購的概率
plt.figure(figsize=(12,6))
sns.pointplot(grouped_df["department"],grouped_df["reordered"],alpha=0.5,color=color[2])


# In[ ]:


#看一下購買的件數(shù)和復(fù)購之間的聯(lián)系
order_products_prior_df["add_to_cart_order_mod"]=order_products_prior_df["add_to_cart_order"].copy()
order_products_prior_df["add_to_cart_order_mod"].max()#145
order_products_prior_df["add_to_cart_order_mod"].loc[order_products_prior_df["add_to_cart_order_mod"]>70] = 70
order_products_prior_df["add_to_cart_order_mod"].max()
grouped_df=order_products_prior_df.groupby("add_to_cart_order_mod")["reordered"].agg("mean").reset_index()
grouped_df
plt.figure(figsize=(12,6))
sns.barplot(order_products_prior_df["add_to_cart_order_mod"],order_products_prior_df["reordered"],alpha=0.5,color=color[2])
plt.show()


# In[ ]:


grouped_df = order_products_train_df.groupby(["order_dow", "order_hour_of_day"])["reordered"].aggregate("mean").reset_index()
grouped_df = grouped_df.pivot('order_dow', 'order_hour_of_day', 'reordered')

plt.figure(figsize=(12,6))
sns.heatmap(grouped_df)
plt.title("Reorder ratio of Day of week Vs Hour of day")
plt.show()

相應(yīng)的kaggle 鏈接:[https://www.kaggle.com/sudalairajkumar/simple-exploration-notebook-instacart]

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容