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

今天完成本周的kaaggle 項(xiàng)目艇挨,通過該項(xiàng)目逗抑,可以學(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 的含義是什么,因?yàn)殚_頭背景就介紹荒辕,每一個(gè)人的數(shù)據(jù)可能出現(xiàn)多次总寻,4-100個(gè)訂單   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]:


###看一下來自這三個(gè)不同類型文件中 userr_id 的個(gè)數(shù)
def unique_counts(x):
#     return len((x))  發(fā)現(xiàn)每一個(gè)永輝會有多條記錄
    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)行計(jì)算的列名
后續(xù)傳入?yún)?shù)可以用apply 所有的行參與運(yùn)算器罐,這里每一個(gè)x 都是以 eval_set 為 一組 
也可以用agg 這個(gè)可以指定列
"""
user_eval_counts

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


# In[56]:


###現(xiàn)在我們來驗(yàn)證一下關(guān)于 每一個(gè)消費(fèi)者訂單數(shù)量-----order_num的最大值,注意 一個(gè)用戶會出現(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)每個(gè)人一次訂單最多的不小于4個(gè)


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


##同樣可以看一下每天下單的時(shí)間,中午成為高峰期
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)的星期和小時(shí) 
來看一下哪天哪段時(shí)間 
訂單量最多
"""
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ù)透視表
第一個(gè)參數(shù)類似于excel 里面的行
第二個(gè)參數(shù)類似于excel 里面的列
第三個(gè)是值
"""
order_num_day_hour_pivot#瞧悲幅,跟excel 里面的數(shù)據(jù)透視表一樣
"""
數(shù)據(jù)透視表一個(gè)
最重要的應(yīng)用就是做出一個(gè)熱力圖
"""
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]:


##接下來 可以看一下 兩次下單之間的時(shí)間間隔,給出兩種不同的方法
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不能同時(shí)傳入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),一個(gè)訂單包含多個(gè)商品,add_to_cart_order 最大值為訂單中商品的數(shù)量
recordered s是表征 某個(gè)商品復(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)練集中,每個(gè)訂單中產(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)計(jì)某一列中某一個(gè)數(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)#兩個(gè)參數(shù)沉衣,一個(gè)表示發(fā)呢大小郁副,一個(gè)表示每一個(gè)的標(biāo)簽
plt.title("Departments distribution", fontsize=15)
plt.show()


# In[16]:


#看一下,每一個(gè)department 出現(xiàn)復(fù)購的次數(shù)
grouped_df = order_products_prior_df.groupby(["department"])["reordered"].aggregate("mean").reset_index()
grouped_df#含有某個(gè)成分的訂單被復(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)系作者
  • 序言:七十年代末豌习,一起剝皮案震驚了整個(gè)濱河市存谎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌肥隆,老刑警劉巖既荚,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異栋艳,居然都是意外死亡恰聘,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門吸占,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晴叨,“玉大人,你說我怎么就攤上這事矾屯〖嫒铮” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵件蚕,是天一觀的道長孙技。 經(jīng)常有香客問我,道長排作,這世上最難降的妖魔是什么牵啦? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮妄痪,結(jié)果婚禮上哈雏,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好裳瘪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布履因。 她就那樣靜靜地躺著,像睡著了一般盹愚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上站故,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天皆怕,我揣著相機(jī)與錄音,去河邊找鬼西篓。 笑死愈腾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的岂津。 我是一名探鬼主播虱黄,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吮成!你這毒婦竟也來了橱乱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤粱甫,失蹤者是張志新(化名)和其女友劉穎泳叠,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茶宵,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡危纫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了乌庶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片种蝶。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖瞒大,靈堂內(nèi)的尸體忽然破棺而出螃征,到底是詐尸還是另有隱情,我是刑警寧澤糠赦,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布会傲,位于F島的核電站,受9級特大地震影響拙泽,放射性物質(zhì)發(fā)生泄漏淌山。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一顾瞻、第九天 我趴在偏房一處隱蔽的房頂上張望泼疑。 院中可真熱鬧,春花似錦荷荤、人聲如沸退渗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽会油。三九已至个粱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間翻翩,已是汗流浹背都许。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嫂冻,地道東北人胶征。 一個(gè)月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像桨仿,于是被迫代替她去往敵國和親睛低。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容