第1关:单变量特征分布
任务描述
本关任务:通过数据可视化探索单变量的分布情况。
相关知识
为了完成本关任务,你需要掌握: 1.使用 python 的 matplotlib 和 seaborn 包画饼图和密度图; 2.单变量的分析方法。
import warnings
warnings.filterwarnings("ignore")
import pandas as pd
import os
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import seaborn as sns
sns.set_style('darkgrid')
myfont=fm.FontProperties(fname=r'./data/simhei.ttf')
def explore_user(User_data):
fig = plt.figure(figsize=(27, 9))
vars=['sex','age','user_lv_cd']
vars_name=['用户性别分布','用户年龄分布','用户等级分布']
for i in range(3):
plt.subplot(1, 3, i+1)
plt.pie(User_data[vars[i]].value_counts(), labels=User_data[vars[i]].value_counts().index, autopct='%.1f%%',textprops={'fontproperties':myfont,'fontsize':9})
plt.title(vars_name[i],fontproperties=myfont,fontsize=12)
plt.show()
plt.savefig('./task1/task1_user.png')
plt.close(fig)
def explore_comment(comment):
fig=plt.figure(figsize=(8,6))
plt.pie(comment['comment_num'].value_counts(), labels=comment['comment_num'].value_counts().index, autopct='%.1f%%',textprops={'fontproperties':myfont,'fontsize':9})
plt.title('商品评论分布',fontproperties=myfont,fontsize=12)
plt.show()
plt.show()
plt.savefig('./task1/task1_comment.png')
plt.close(fig)
def explore_action(action_data):
figure = plt.figure(figsize=(27, 9))
action_do=['浏览','加入购物车','购物车删除','下单','关注','点击']
for i in range(1, 7, 1):
plt.subplot(2, 3, i)
sns.distplot(action_data[action_data['type'] == i].groupby('user_id')['sku_id'].count())
plt.title('%s分布' %action_do[i-1],fontproperties=myfont,fontsize=12)
plt.xlabel('客户%s的次数' %action_do[i-1],fontproperties=myfont,fontsize=9)
plt.show()
plt.savefig('./task1/task1_action.png')
第2关:用户的购买意向与时间之间的关系
任务描述
本关任务:探索客户购买意象和时间之间的关系。
相关知识
为了完成本关任务,你需要掌握: 1.利用 python 的 matplotlib 画条形图和折线图; 2.分析双变量之间的关系。
#coding:utf8
import warnings
warnings.filterwarnings("ignore")
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('darkgrid')
import matplotlib.font_manager as fm
myfont=fm.FontProperties(fname=r'./data/simhei.ttf')
def push_week(new_data):
new_data=new_data[new_data['type']==4].copy()
new_data['weekdays'] = pd.to_datetime(new_data['time']).apply(pd.datetime.weekday) + 1
week_days = new_data.groupby('weekdays')['user_id'].count()
fig=plt.figure(figsize=(8,6))
bar_width = 0.33
plt.bar(week_days.index , week_days, bar_width, label='下单的次数')
plt.xlabel('时间',fontproperties=myfont,fontsize=9)
plt.ylabel('数量',fontproperties=myfont,fontsize=9)
plt.title('一周内每天的下单情况',fontproperties=myfont,fontsize=12)
plt.xticks(week_days.index, ('周一', '周二', '周三', '周四', '周五', '周六', '周日'),fontproperties=myfont,fontsize=9)
plt.ylim(0,300)
plt.legend(prop=myfont)
plt.savefig('./task2/task2_week.png')
plt.close(fig)
def push_date(new_data):
new_data = new_data[(new_data['type'] == 4) & (pd.to_datetime(new_data['time']) < pd.to_datetime('2016-03-01'))].copy() #选出2016年数据
new_data['days'] = [x.day for x in pd.to_datetime(new_data['time'])] #选出天数
renew=new_data.groupby('days')['sku_id'].count()
fig = plt.figure(figsize=(8, 6))
plt.plot(renew.index,renew,label='购买次数')
plt.xlabel('天数',fontproperties=myfont,fontsize=9)
plt.ylabel('次数',fontproperties=myfont,fontsize=9)
plt.title('购买量和月内日期的关系',fontproperties=myfont,fontsize=12)
plt.legend(prop=myfont)
plt.savefig('./task2/task2_date.png')
#plt.close(fig)
第3关:用户的购买意向与年龄、性别和用户等级之间的关系
任务描述
本关任务:探索用户的购买意向与年龄、性别和用户等级之间的关系。
相关知识
在本关主要使用条形图来探索双变量之间的关系。
#coding:utf8
import pandas as pd
import os
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('darkgrid')
import matplotlib.font_manager as fm
myfont=fm.FontProperties(fname=r'./data/simhei.ttf')
def show_data(User,Action):
fig = plt.figure(figsize=(18,6))
Action = Action[Action['type'] == 4].copy()
Action['mark']='购买'
User = pd.merge(User, Action[['user_id','mark']], how='left', on='user_id')
User['mark']=User['mark'].fillna('未购买')
User['sex'] = User['sex'].replace({-1: '未知', 0: '男', 1: '女'})
vars =['age','sex','user_lv_cd']
title=['年龄','性别','用户等级']
for var in range(3):
ax=plt.subplot(1, 3, var + 1)
result_id = pd.pivot_table(User, values='user_id', index=vars[var], columns='mark', aggfunc='count')
bar_width = 0.25
opacity = 0.4
index=pd.Series(range(result_id.shape[0]))
plt.bar(index-bar_width/2,result_id['未购买'],bar_width,alpha=opacity, color='c', label='未购买')
plt.bar(index+bar_width/2,result_id['购买'],bar_width, alpha=opacity, color='m', label='购买')
plt.xticks(index,result_id.index,fontproperties=myfont,fontsize=9)
plt.legend(prop=myfont)
plt.title('用户意愿与%s之间的关系' %title[var],fontproperties=myfont,fontsize=9)
plt.xlabel(title[var],fontproperties=myfont,fontsize=9)
plt.ylabel('用户数量',fontproperties=myfont,fontsize=9)
plt.savefig('./task3/task3.png')
第4关:用户的购买意向与差评的关系
任务描述
本关任务:探索用户的购买意向与商品评论之间的关系。
#coding:utf8
import warnings
warnings.filterwarnings("ignore")
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('darkgrid')
import matplotlib.font_manager as fm
myfont=fm.FontProperties(fname=r'./data/simhei.ttf')
def show_data(comment,action):
action['mark']='购买' data=pd.merge(comment,action[['sku_id','mark']],how='left',on='sku_id').fillna('未购买')
result_id=pd.pivot_table(data,values='dt',index='comment_num',columns='mark',aggfunc='count').fillna(0)
fig = plt.figure(figsize=(8,6))
ax=plt.subplot(1,1,1)
bar_width = 0.25
opacity = 0.4
index=pd.Series(range(result_id.shape[0]))
a1=ax.bar(index,result_id['未购买'],bar_width,alpha=opacity, color='c', label='未购买产品数')
plt.title('产品评价数与购买的关系',fontproperties=myfont,fontsize=12)
plt.xlabel('评论数',fontproperties=myfont,fontsize=9)
plt.ylabel('商品数量',fontproperties=myfont,fontsize=9)
ax1=ax.twinx()
a2=ax1.plot(index,result_id['购买'],label='购买的产品数')
plt.ylabel('商品数量',fontproperties=myfont,fontsize=9)
lns = a1 if type(a1)==list else [a1] + a2 if type(a2)==list else [a2]
labs = [l.get_label() for l in lns]
ax.legend(lns, labs, prop=myfont)
plt.savefig('./task4/task4.png')