今天完成本周的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]