Kaggle---Instacart Market Basket Analysis(根据数据预测复购)

今天完成本周的kaaggle 项目,通过该项目,可以学习到pandas 在数据分析中的基本应用,非常有用

具体代码如下

# coding: utf-8

# ##背景介绍
# 
# 目的就是找出该款软件app的用户可能会再次购买她买过的哪些产品

# 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]:


#读入数据
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 的含义是什么,因为开头背景就介绍,每一个人的数据可能出现多次,4-100个订单   order_num
type(orders_df['eval_set'].value_counts())#series
eval_set_info=orders_df['eval_set'].value_counts()
##下面进行可视化
plt.figure(figsize=(10,5))
plt.bar(eval_set_info.index,eval_set_info.values,color='grey',alpha=0.8)
"""
主要的参数有
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 的个数
def unique_counts(x):
#     return len((x))  发现每一个永辉会有多条记录
    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)
"""
圆括号是要进行聚类的列名 
中括号是要进行计算的列名
后续传入参数可以用apply 所有的行参与运算,这里每一个x 都是以 eval_set 为 一组 
也可以用agg 这个可以指定列
"""
user_eval_counts

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


# In[56]:


###现在我们来验证一下关于 每一个消费者订单数量-----order_num的最大值,注意 一个用户会出现多次
order_num_info=orders_df.groupby("user_id")["order_number"].agg(np.max).reset_index()
"""
不加reset_index 就会发现是以 user_id 为索引的series
加了后,index以0,1,2,...为索引的dataframe 
"""
order_num_info_data=order_num_info.order_number.value_counts()#这样做就是看了一下大多数人出现订单最大值是多少
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()

#发现每个人一次订单最多的不小于4个


# In[67]:


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

##接下来研究一下星期数
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']##发现周日下单人数最多
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']##发现周日下单人数最多
sns.barplot(order_dow_info.index,order_dow_info.user_num,color=color[4])
plt.show()


# In[76]:


"""
当然我们也可以 
结合相应的星期和小时 
来看一下哪天哪段时间 
订单量最多
"""
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")
"""
类似于数据透视表
第一个参数类似于excel 里面的行
第二个参数类似于excel 里面的列
第三个是值
"""
order_num_day_hour_pivot#瞧,跟excel 里面的数据透视表一样
"""
数据透视表一个
最重要的应用就是做出一个热力图
"""
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 参数传入 dataframe 数据类型

"""
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]:


#可以提发现,一个订单包含多个商品,add_to_cart_order 最大值为订单中商品的数量
recordered s是表征 某个商品复购的次数
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##发现只有0,1,0表示复购过,1表示没有

##接下来看一下复购产品占总产品的概率 
reorder_rate=order_reorder_info.loc[1,"product_id"]/order_reorder_info.product_id.sum()
reorder_rate



同样检查一下训练结合

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##发现只有0,1,0表示复购过,1表示没有

##接下来看一下复购产品占总产品的概率 
reorder_rate=order_reorder_info.loc[1,"product_id"]/order_reorder_info.product_id.sum()
reorder_rate


# In[8]:


##接下来看一下有购买和没有购买的订单数量占比
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]##有复购订单的占比
ground_df[ground_df["reordered"]==0].shape[0]/ground_df.shape[0]##m没有复购的占比
##发现复购的占比接近9成


# In[ ]:


order_products_train_df
#下面看一下训练集中,每个订单中产品的数量分布
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()#统计某一列中某一个数出现的次数
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#该表存储的是产品的相关细节,比如名字,制作方法的备注(department_id),辅料(aisle_id)
products_df.head(10)
aisles_df.head(10)
departments_df.head(10)


# In[3]:


#下面将上述的信息进行关联 注意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]:


#接下来看一下哪些产品比较受欢迎,根据出现的频次
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)
#发现提及最多的是 香蕉


# In[11]:


#看一下 aisele 的辅料的构造
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 的区别
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()


# In[16]:


#看一下,每一个department 出现复购的次数
grouped_df = order_products_prior_df.groupby(["department"])["reordered"].aggregate("mean").reset_index()
grouped_df#含有某个成分的订单被复购的概率
plt.figure(figsize=(12,6))
sns.pointplot(grouped_df["department"],grouped_df["reordered"],alpha=0.5,color=color[2])


# In[ ]:


#看一下购买的件数和复购之间的联系
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()

相应的kaggle 链接:[https://www.kaggle.com/sudalairajkumar/simple-exploration-notebook-instacart]

你可能感兴趣的:(Kaggle---Instacart Market Basket Analysis(根据数据预测复购))