首页 > 编程语言 >abby:python 阿里口碑商家流量分析

abby:python 阿里口碑商家流量分析

时间:2022-12-07 18:23:25浏览次数:44  
标签:... 10 python df 美食 口碑 2016 ID abby

In [1]:

import warnings
warnings.filterwarnings('ignore')
import pandas as  pd
import numpy  as np
import matplotlib.pyplot as plt 

plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
 

数据导入和清洗部分

 

image.png

 

商家数据shop_info.txt 的处理

In [16]:
# 导入商家数据 shop_info.txt。添加列名
columns=['商家ID','城市','所在位置编号','人均消费','评分','评论数','门店等级','一级分类','二级分类','三级分类']
df_shop = pd.read_table('./datasets/alibaba_dataset/shop_info.txt',sep=',',names=columns)
In [17]:
# 对数据的框架做初步检查: head(),shape(),info()等
df_shop.head()
Out[17]:
  商家ID 城市 所在位置编号 人均消费 评分 评论数 门店等级 一级分类 二级分类 三级分类
0 1 湖州 885 8 4.0 12.0 2 美食 休闲茶饮 饮品/甜点
1 2 哈尔滨 64 19 NaN NaN 1 超市便利店 超市 NaN
2 3 南昌 774 5 3.0 2.0 0 美食 休闲茶饮 奶茶
3 4 天津 380 18 NaN NaN 1 超市便利店 超市 NaN
4 5 杭州 263 2 2.0 2.0 0 美食 休闲食品 生鲜水果
In [19]:
df_shop.shape
Out[19]:
(2000, 10)
In [20]:
df_shop.info()
 
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2000 entries, 0 to 1999
Data columns (total 10 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   商家ID    2000 non-null   int64  
 1   城市      2000 non-null   object 
 2   所在位置编号  2000 non-null   int64  
 3   人均消费    2000 non-null   int64  
 4   评分      1709 non-null   float64
 5   评论数     1709 non-null   float64
 6   门店等级    2000 non-null   int64  
 7   一级分类    2000 non-null   object 
 8   二级分类    2000 non-null   object 
 9   三级分类    1415 non-null   object 
dtypes: float64(2), int64(4), object(4)
memory usage: 156.4+ KB
 
缺失值
In [18]:
#  检查哪些列有缺失值,有多少
df_shop.isnull().sum()
Out[18]:
商家ID        0
城市          0
所在位置编号      0
人均消费        0
评分        291
评论数       291
门店等级        0
一级分类        0
二级分类        0
三级分类      585
dtype: int64
In [9]:
# 统计缺失值的占比
for col in df_shop.columns:
    null_count = df_shop[col].isnull().sum()
    if null_count > 0:
        p = null_count / df_shop.shape[0] * 100
        print(col,'列存在空值的占比为:',p)
 
评分 列存在空值的占比为: 14.549999999999999
评论数 列存在空值的占比为: 14.549999999999999
三级分类名称 列存在空值的占比为: 29.25
In [31]:
# 填充 三级分类,用二级分类名称
df_shop['三级分类'] = df_shop['三级分类'].fillna(df_shop['二级分类'])
In [37]:
#  填充 评论数和评分. 检查 评分 和 评论数 的平均值是否有意义
df_shop.describe()
Out[37]:
  商家ID 所在位置编号 人均消费 评分 评论数 门店等级
count 2000.000000 2000.000000 2000.000000 1709.000000 1709.000000 2000.000000
mean 1000.500000 583.083000 10.479000 2.677004 3.130486 0.814500
std 577.494589 335.763357 5.762479 1.024211 3.499072 0.855836
min 1.000000 1.000000 1.000000 0.000000 0.000000 0.000000
25% 500.750000 287.750000 5.000000 2.000000 1.000000 0.000000
50% 1000.500000 577.500000 10.000000 3.000000 2.000000 1.000000
75% 1500.250000 877.250000 15.000000 3.000000 4.000000 2.000000
max 2000.000000 1159.000000 20.000000 4.000000 20.000000 2.000000
In [38]:
# 标准差(std) / 平均值(mean),如果小于 0.5,说明平均值有代表意义
1.02/2.67, 3.5/3.13
Out[38]:
(0.38202247191011235, 1.1182108626198084)
In [43]:
# 填充评分.用均值
df_shop['评分'] = df_shop['评分'].fillna(df_shop['评分'].mean())
In [48]:
df_shop['评论数'].value_counts()
Out[48]:
0.0     363
1.0     333
2.0     269
3.0     201
4.0     126
5.0      98
6.0      84
7.0      59
9.0      41
8.0      39
10.0     22
11.0     18
13.0     11
20.0     10
12.0      9
14.0      9
18.0      6
15.0      5
17.0      4
19.0      2
Name: 评论数, dtype: int64
In [49]:
# 填充评论数,用众数
df_shop['评论数'] = df_shop['评论数'].fillna(0)
In [50]:
df_shop.isnull().sum()
Out[50]:
商家ID      0
城市        0
所在位置编号    0
人均消费      0
评分        0
评论数       0
门店等级      0
一级分类      0
二级分类      0
三级分类      0
dtype: int64
 
重复值
In [54]:
df_shop.duplicated().sum()
Out[54]:
0
In [80]:
# 把清洗后的数据导出
df_shop.to_csv('./datasets/new_alibaba/df_shop.csv',index=False) #加index = False,消除Unnamed: 0
In [68]:
#  保存H5 文件
df_shop.to_hdf('./datasets/new_alibaba/df_shop_h5',key='df_shop')
In [ ]:
 
 

user_view 用户浏览数据的处理

In [59]:
#导入用户浏览数据
columns=['用户ID','商家ID','浏览时间']
df_view =  pd.read_table('./datasets/alibaba_dataset/user_view.txt',sep=',',names=columns)
In [61]:
df_view.info(null_counts=True)
 
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5556715 entries, 0 to 5556714
Data columns (total 3 columns):
 #   Column  Non-Null Count    Dtype 
---  ------  --------------    ----- 
 0   用户ID    5556715 non-null  int64 
 1   商家ID    5556715 non-null  int64 
 2   浏览时间    5556715 non-null  object
dtypes: int64(2), object(1)
memory usage: 127.2+ MB
In [62]:
# 重复值
df_view.duplicated().sum()
Out[62]:
757364
In [63]:
# 删除重复值
df_view.drop_duplicates(inplace=True)
In [65]:
# 数据类型转换:把浏览时间 字段类型由 object 改为 时间类型
df_view['浏览时间'] = pd.to_datetime(df_view['浏览时间'])
In [66]:
df_view.info()
 
<class 'pandas.core.frame.DataFrame'>
Int64Index: 4799351 entries, 0 to 5556714
Data columns (total 3 columns):
 #   Column  Dtype         
---  ------  -----         
 0   用户ID    int64         
 1   商家ID    int64         
 2   浏览时间    datetime64[ns]
dtypes: datetime64[ns](1), int64(2)
memory usage: 146.5 MB
In [81]:
# 把清洗后的数据导出
df_view.to_csv('./datasets/new_alibaba/df_view.csv',index=False) #加index = False,消除Unnamed: 0
In [69]:
#  保存H5 文件
df_view.to_hdf('./datasets/new_alibaba/df_view_h5',key='df_view')
 

用户支付数据 user_pay 的处理

In [70]:
#导入用户支付数据
columns=['用户ID','商家ID','支付时间']
df_pay = pd.read_table('./datasets/alibaba_dataset/user_pay.txt',sep=',',names=columns)
In [71]:
df_pay.shape
Out[71]:
(69674110, 3)
In [72]:
df_pay.info()
 
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 69674110 entries, 0 to 69674109
Data columns (total 3 columns):
 #   Column  Dtype 
---  ------  ----- 
 0   用户ID    int64 
 1   商家ID    int64 
 2   支付时间    object
dtypes: int64(2), object(1)
memory usage: 1.6+ GB
In [73]:
# 重复值
df_pay.duplicated().sum()
Out[73]:
2517084
In [75]:
# 删除重复值
df_pay.drop_duplicates(inplace=True)
In [76]:
# 数据类型转换:把支付时间 字段类型由 object 改为 时间类型
df_pay['支付时间'] = pd.to_datetime(df_pay['支付时间'])
In [77]:
df_pay.info()
 
<class 'pandas.core.frame.DataFrame'>
Int64Index: 67157026 entries, 0 to 69674108
Data columns (total 3 columns):
 #   Column  Dtype         
---  ------  -----         
 0   用户ID    int64         
 1   商家ID    int64         
 2   支付时间    datetime64[ns]
dtypes: datetime64[ns](1), int64(2)
memory usage: 2.0 GB
In [79]:
# 把清洗后的数据导出
df_pay.to_csv('./datasets/new_alibaba/df_pay.csv',index=False) #加index = False,消除Unnamed: 0
In [78]:
#  保存H5 文件
df_pay.to_hdf('./datasets/new_alibaba/df_pay_h5',key='df_pay')
 

数据分析部分

 

1、以城市为单位,统计每个城市总体消费金额 (饼状图)

In [84]:
#  总体消费额 = 人均  *  消费人数
#  先计算user_pay表中 消费人数
df1 = df_pay.groupby('商家ID').agg({'用户ID':'nunique'}).rename(columns={'用户ID':'消费人数'})
In [86]:
# 合并 df_shop 与 df1,根据商家ID
df_shop_pay = pd.merge(df_shop,df1,on='商家ID')
df_shop_pay
Out[86]:
  商家ID 城市 所在位置编号 人均消费 评分 评论数 门店等级 一级分类 二级分类 三级分类 消费人数
0 1 湖州 885 8 4.000000 12.0 2 美食 休闲茶饮 饮品/甜点 29838
1 2 哈尔滨 64 19 2.677004 0.0 1 超市便利店 超市 超市 12863
2 3 南昌 774 5 3.000000 2.0 0 美食 休闲茶饮 奶茶 7234
3 4 天津 380 18 2.677004 0.0 1 超市便利店 超市 超市 5145
4 5 杭州 263 2 2.000000 2.0 0 美食 休闲食品 生鲜水果 8558
... ... ... ... ... ... ... ... ... ... ... ...
1995 1996 南宁 248 6 3.000000 1.0 0 美食 快餐 中式快餐 3820
1996 1997 上海 924 10 1.000000 2.0 0 美食 快餐 中式快餐 8544
1997 1998 南通 1090 1 2.000000 2.0 0 美食 小吃 面点 4616
1998 1999 成都 1134 19 2.677004 0.0 1 超市便利店 超市 超市 31795
1999 2000 杭州 378 7 3.000000 2.0 0 美食 小吃 面点 10162

2000 rows × 11 columns

In [87]:
# 计算每个商家的总消费额
df_shop_pay['总消费额'] = df_shop_pay['人均消费'] * df_shop_pay['消费人数']
df_shop_pay
Out[87]:
  商家ID 城市 所在位置编号 人均消费 评分 评论数 门店等级 一级分类 二级分类 三级分类 消费人数 总消费额
0 1 湖州 885 8 4.000000 12.0 2 美食 休闲茶饮 饮品/甜点 29838 238704
1 2 哈尔滨 64 19 2.677004 0.0 1 超市便利店 超市 超市 12863 244397
2 3 南昌 774 5 3.000000 2.0 0 美食 休闲茶饮 奶茶 7234 36170
3 4 天津 380 18 2.677004 0.0 1 超市便利店 超市 超市 5145 92610
4 5 杭州 263 2 2.000000 2.0 0 美食 休闲食品 生鲜水果 8558 17116
... ... ... ... ... ... ... ... ... ... ... ... ...
1995 1996 南宁 248 6 3.000000 1.0 0 美食 快餐 中式快餐 3820 22920
1996 1997 上海 924 10 1.000000 2.0 0 美食 快餐 中式快餐 8544 85440
1997 1998 南通 1090 1 2.000000 2.0 0 美食 小吃 面点 4616 4616
1998 1999 成都 1134 19 2.677004 0.0 1 超市便利店 超市 超市 31795 604105
1999 2000 杭州 378 7 3.000000 2.0 0 美食 小吃 面点 10162 71134

2000 rows × 12 columns

In [88]:
# 计算每个城市的总体消费额
df_pay_sum = df_shop_pay.groupby('城市')['总消费额'].sum().sort_values(ascending=False).to_frame().reset_index()
df_pay_sum
Out[88]:
  城市 总消费额
0 上海 50699615
1 杭州 43664682
2 北京 22541013
3 南京 21259202
4 广州 19358633
... ... ...
117 龙岩 60740
118 梧州 53544
119 张家口 47139
120 淮北 23675
121 廊坊 20808

122 rows × 2 columns

In [89]:
# 把top10以外的城市,换成:其它城市
df_pay_sum.iloc[10:122]['城市'] = '其它城市'
df_pay_sum
Out[89]:
  城市 总消费额
0 上海 50699615
1 杭州 43664682
2 北京 22541013
3 南京 21259202
4 广州 19358633
... ... ...
117 其它城市 60740
118 其它城市 53544
119 其它城市 47139
120 其它城市 23675
121 其它城市 20808

122 rows × 2 columns

In [90]:
# 准备数据,画饼图
df_pie = df_pay_sum.groupby('城市')['总消费额'].sum().sort_values(ascending = False).to_frame().reset_index()
df_pie
Out[90]:
  城市 总消费额
0 其它城市 109483445
1 上海 50699615
2 杭州 43664682
3 北京 22541013
4 南京 21259202
5 广州 19358633
6 武汉 18225215
7 苏州 16031142
8 深圳 11645203
9 宁波 8509201
10 温州 6875104
In [91]:
# 同时显示占比和数值
def make_autopct(x):
    def my_autopct(pct):
        total = sum(x)
        val = int(round(pct*total/100.0))
        return '{p:.2f}% \n{v:d}'.format(p=pct,v=val)
    return my_autopct

plt.figure(figsize=(15,8))

# 画饼图:每个城市的总消费额
plt.pie(x = df_pie['总消费额'],
        labels=df_pie['城市'], #为饼图添加标签说明
        labeldistance=1.05, #labels与圆圈边界的距离,默认为1.1
        autopct=make_autopct(df_pie['总消费额']),
        pctdistance=0.8,#百分比与圆心的距离,默认是0.6
        startangle=180, #倾斜角度
        counterclock=False, #顺时针
        textprops={
            'fontsize':14,
            'fontfamily':'FangSong'
        })
plt.title(label='每个城市总体消费金额(单位:元)',fontsize=18)
plt.axis('equal')#保证是一个圆形

plt.savefig('./datasets/new_alibaba/1_每个城市总体消费金额.png')
plt.show()
   

2. 以天为单位,统计所有商家交易发生次数和被用户浏览次数 (曲线图)

In [93]:
df_view.head(2)
Out[93]:
  用户ID 商家ID 浏览时间
0 13201967 1197 2016-10-21 18:00:00
1 19461365 1197 2016-06-28 23:00:00
In [94]:
df_pay.head(2)
Out[94]:
  用户ID 商家ID 支付时间
0 22127870 1862 2015-12-25 17:00:00
1 3434231 1862 2016-10-05 11:00:00
In [100]:
# 新增一列 浏览日期,以天为单位
df_view['浏览日期'] = df_view['浏览时间'].astype('datetime64[D]')
In [101]:
# 新增一列 支付日期,以天为单位
df_pay['支付日期'] = df_pay['支付时间'].astype('datetime64[D]')
In [107]:
# 统计浏览次数,按天
view_num = df_view[['浏览日期','浏览时间']].groupby('浏览日期').agg('count').rename(columns={'浏览时间':'浏览次数'})
view_num
Out[107]:
  浏览次数
浏览日期  
2016-06-22 35730
2016-06-23 55170
2016-06-24 62860
2016-06-25 98234
2016-06-26 44285
... ...
2016-10-27 28401
2016-10-28 27500
2016-10-29 31976
2016-10-30 30709
2016-10-31 27055

130 rows × 1 columns

In [108]:
# 统计支付次数,按天
pay_num = df_pay[['支付日期','支付时间']].groupby('支付日期').agg('count').rename(columns={'支付时间':'支付次数'})
pay_num
Out[108]:
  支付次数
支付日期  
2015-06-26 63
2015-06-27 100
2015-06-28 126
2015-06-29 462
2015-06-30 577
... ...
2016-10-27 268715
2016-10-28 290495
2016-10-29 308201
2016-10-30 305081
2016-10-31 261771

493 rows × 1 columns

In [109]:
# 合并浏览和支付,根据日期
df_pay_view = pd.merge(left=view_num,right=pay_num,left_on=view_num.index,right_on=pay_num.index,how='outer')
df_pay_view
Out[109]:
  key_0 浏览次数 支付次数
0 2016-06-22 35730.0 208712
1 2016-06-23 55170.0 222973
2 2016-06-24 62860.0 237014
3 2016-06-25 98234.0 263007
4 2016-06-26 44285.0 235750
... ... ... ...
488 2016-06-19 NaN 211245
489 2016-06-20 NaN 194630
490 2016-06-21 NaN 205581
491 2016-07-22 NaN 248860
492 2016-07-25 NaN 234366

493 rows × 3 columns

In [116]:
# 画折线图
plt.figure(figsize=(10,8))

plt.plot(df_pay_view['key_0'],
       df_pay_view['支付次数'],
        color='r')

plt.plot(df_pay_view['key_0'],
       df_pay_view['浏览次数'],
        color='b')

plt.title('所有商家交易数和浏览数(以天为单位)',fontsize=20)
plt.xlabel('日期')
plt.legend(['交易数','浏览数'])
plt.savefig('./datasets/new_alibaba/2_所有商家交易数和浏览数(以天为单位).png')
plt.show()
   

3. 统计最受欢迎的前 10 类商品(按照二级分类统计),并输出他们的人均消费(选择合适图表对其可视化,类似排行榜)

In [121]:
df_score = df_shop.groupby('二级分类').agg({'评分':'mean','人均消费':'mean'}).sort_values(by ='评分',ascending=False)
In [123]:
df_score = df_score.iloc[0:10]
In [127]:
df_score
Out[127]:
  评分 人均消费
二级分类    
本地购物 4.000000 20.000000
休闲茶饮 3.316384 6.401130
烘焙糕点 3.032787 9.737705
汤/粥/煲/砂锅/炖菜 3.000000 8.000000
美容美发 3.000000 20.000000
网吧网咖 3.000000 13.000000
便利店 2.954919 3.932039
超市 2.807244 15.806452
休闲食品 2.793333 8.680000
火锅 2.787879 16.242424
In [126]:
# 画图
plt.figure(figsize=(15,7))

plt.barh(df_score.sort_values(by='评分').index,
       width=df_score['人均消费'],
        height=0.4,
        label='人均消费',
       edgecolor='black')

plt.barh(
        df_score.index,
       width=df_score['评分'],
        height=0.15,
       label='评分',
       edgecolor='black')

plt.legend(loc=1,fontsize=14)
plt.ylabel('商品的二级分类',fontsize=18)
plt.xlabel('评分和人均消费',fontsize=18)
plt.title('最受欢迎top10商品人均消费',fontsize=25)

plt.savefig('./datasets/new_alibaba/3_最受欢迎top10商品人均消费.png')
plt.show()
   

4. 平均日交易额最大的前 10 个商家,并输出他们各自的交易额,并选择合适的图表对结果进行可视化

In [ ]:
#  平均日交易额 = 人均消费 * 人数(去重)  /  天数
# 这里的天数,怎么算? 是有交易记录的天数 还是按交易周期算?
In [128]:
# 1、先计算商家的去重用户数和天数
df_users_days = df_pay.groupby('商家ID').agg({'用户ID':'nunique','支付日期':'nunique'}).rename(columns={'用户ID':'用户数','支付日期':'天数'})
df_users_days
In [131]:
#  和商家信息合并
df1 = pd.merge(df_users_days,df_shop,left_on=df_users_days.index,right_on=df_shop['商家ID'],how='outer')
df1
Out[131]:
  key_0 用户数 天数 商家ID 城市 所在位置编号 人均消费 评分 评论数 门店等级 一级分类 二级分类 三级分类
0 1 29838 387 1 湖州 885 8 4.000000 12.0 2 美食 休闲茶饮 饮品/甜点
1 2 12863 329 2 哈尔滨 64 19 2.677004 0.0 1 超市便利店 超市 超市
2 3 7234 136 3 南昌 774 5 3.000000 2.0 0 美食 休闲茶饮 奶茶
3 4 5145 105 4 天津 380 18 2.677004 0.0 1 超市便利店 超市 超市
4 5 8558 202 5 杭州 263 2 2.000000 2.0 0 美食 休闲食品 生鲜水果
... ... ... ... ... ... ... ... ... ... ... ... ... ...
1995 1996 3820 104 1996 南宁 248 6 3.000000 1.0 0 美食 快餐 中式快餐
1996 1997 8544 330 1997 上海 924 10 1.000000 2.0 0 美食 快餐 中式快餐
1997 1998 4616 266 1998 南通 1090 1 2.000000 2.0 0 美食 小吃 面点
1998 1999 31795 331 1999 成都 1134 19 2.677004 0.0 1 超市便利店 超市 超市
1999 2000 10162 175 2000 杭州 378 7 3.000000 2.0 0 美食 小吃 面点

2000 rows × 13 columns

In [134]:
# 计算平均日交易额
df1['平均日交易额'] = (df1['用户数'] * df1['人均消费']) /df1['天数']
df1
Out[134]:
  key_0 用户数 天数 商家ID 城市 所在位置编号 人均消费 评分 评论数 门店等级 一级分类 二级分类 三级分类 平均日交易额
0 1 29838 387 1 湖州 885 8 4.000000 12.0 2 美食 休闲茶饮 饮品/甜点 616.806202
1 2 12863 329 2 哈尔滨 64 19 2.677004 0.0 1 超市便利店 超市 超市 742.848024
2 3 7234 136 3 南昌 774 5 3.000000 2.0 0 美食 休闲茶饮 奶茶 265.955882
3 4 5145 105 4 天津 380 18 2.677004 0.0 1 超市便利店 超市 超市 882.000000
4 5 8558 202 5 杭州 263 2 2.000000 2.0 0 美食 休闲食品 生鲜水果 84.732673
... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
1995 1996 3820 104 1996 南宁 248 6 3.000000 1.0 0 美食 快餐 中式快餐 220.384615
1996 1997 8544 330 1997 上海 924 10 1.000000 2.0 0 美食 快餐 中式快餐 258.909091
1997 1998 4616 266 1998 南通 1090 1 2.000000 2.0 0 美食 小吃 面点 17.353383
1998 1999 31795 331 1999 成都 1134 19 2.677004 0.0 1 超市便利店 超市 超市 1825.090634
1999 2000 10162 175 2000 杭州 378 7 3.000000 2.0 0 美食 小吃 面点 406.480000

2000 rows × 14 columns

In [141]:
# 按照日交易额排序,并且取出前10个
df2 = df1[['商家ID','平均日交易额']].sort_values(by='平均日交易额',ascending = False).iloc[0:10]
df2
Out[141]:
  商家ID 平均日交易额
1628 1629 12289.292308
1927 1928 9903.918367
516 517 9443.319149
57 58 6340.408719
1345 1346 5506.428571
1900 1901 4357.135417
1820 1821 4070.501538
727 728 4017.666667
1984 1985 4010.524691
1534 1535 3993.099698
In [143]:
# 重置DF 的索引,作为条形图的 x 
df = df2.reset_index()
df
Out[143]:
  index 商家ID 平均日交易额
0 1628 1629 12289.292308
1 1927 1928 9903.918367
2 516 517 9443.319149
3 57 58 6340.408719
4 1345 1346 5506.428571
5 1900 1901 4357.135417
6 1820 1821 4070.501538
7 727 728 4017.666667
8 1984 1985 4010.524691
9 1534 1535 3993.099698
In [145]:
# 画图
plt.figure(figsize=(15,7))

x = df.index
height = df['平均日交易额']
plt.bar(x,
       height=height,
        width=0.4,
       edgecolor='black',
        label='平均日交易额'
       )
plt.legend(loc=1,fontsize=14)

# 修改x轴的值
plt.xticks(x,df['商家ID'])

plt.ylabel('平均日交易额',fontsize=18)
plt.xlabel('商家ID',fontsize=18)
plt.title('平均日交易额top10商家',fontsize=25)

# 在指定的位置,显示值
for i,j in zip(x,height):
    plt.text(i,j+150,'%d'%j,horizontalalignment='center')

plt.savefig('./datasets/new_alibaba/4_平均日交易额最大的前10商家.png')
plt.show()
   

5. 输出北京、上海、广州和深圳四个城市最受欢迎的 5 家奶茶商店和中式快餐编号(最受欢迎是指以下得分最高:0.7 ✖(平均评分/5) + 0.3 ✖ (平均消费金额/最高消费金额),注:最高消费金额和平均消费金额是从所有消费记录统计出来的)

In [147]:
#  4个城市的奶茶店
df1 = df_shop[(df_shop['城市'].isin(['北京', '上海','广州','深圳'])) & (df_shop['三级分类']== '奶茶')]
df1
Out[147]:
  商家ID 城市 所在位置编号 人均消费 评分 评论数 门店等级 一级分类 二级分类 三级分类
134 135 上海 828 7 4.0 4.0 0 美食 休闲茶饮 奶茶
143 144 上海 1054 5 4.0 2.0 0 美食 休闲茶饮 奶茶
193 194 上海 1032 5 3.0 1.0 0 美食 休闲茶饮 奶茶
214 215 北京 77 4 3.0 7.0 0 美食 休闲茶饮 奶茶
243 244 广州 44 2 3.0 2.0 0 美食 休闲茶饮 奶茶
389 390 北京 534 4 3.0 3.0 0 美食 休闲茶饮 奶茶
662 663 上海 709 4 3.0 3.0 2 美食 休闲茶饮 奶茶
751 752 深圳 991 15 4.0 2.0 0 美食 休闲茶饮 奶茶
758 759 上海 882 5 4.0 2.0 0 美食 休闲茶饮 奶茶
795 796 广州 36 9 3.0 2.0 0 美食 休闲茶饮 奶茶
799 800 上海 545 6 4.0 5.0 0 美食 休闲茶饮 奶茶
909 910 上海 1032 6 4.0 6.0 0 美食 休闲茶饮 奶茶
912 913 广州 552 8 3.0 3.0 0 美食 休闲茶饮 奶茶
1055 1056 上海 709 4 3.0 4.0 2 美食 休闲茶饮 奶茶
1181 1182 深圳 531 8 3.0 2.0 0 美食 休闲茶饮 奶茶
1192 1193 上海 642 7 4.0 1.0 0 美食 休闲茶饮 奶茶
1202 1203 上海 153 5 3.0 4.0 2 美食 休闲茶饮 奶茶
1240 1241 上海 1054 6 4.0 2.0 0 美食 休闲茶饮 奶茶
1588 1589 上海 1003 6 4.0 3.0 0 美食 休闲茶饮 奶茶
1618 1619 上海 501 6 3.0 4.0 0 美食 休闲茶饮 奶茶
1696 1697 上海 921 5 3.0 3.0 0 美食 休闲茶饮 奶茶
1704 1705 上海 545 4 4.0 2.0 0 美食 休闲茶饮 奶茶
1827 1828 广州 392 5 3.0 3.0 0 美食 休闲茶饮 奶茶
1859 1860 上海 697 5 3.0 3.0 2 美食 休闲茶饮 奶茶
1886 1887 上海 694 5 3.0 5.0 2 美食 休闲茶饮 奶茶
1970 1971 上海 642 6 4.0 4.0 0 美食 休闲茶饮 奶茶
1973 1974 上海 1127 6 4.0 3.0 0 美食 休闲茶饮 奶茶
In [148]:
# 4个城市 得分最高的5家奶茶店
df1['最终得分'] = 0.7 * (df1['评分'] / 5) + 0.3 * (df1['人均消费'] / max(df1['人均消费']))
df11 = df1.sort_values(by = '最终得分',ascending = False).iloc[0:5]
df11
Out[148]:
  商家ID 城市 所在位置编号 人均消费 评分 评论数 门店等级 一级分类 二级分类 三级分类 最终得分
751 752 深圳 991 15 4.0 2.0 0 美食 休闲茶饮 奶茶 0.86
134 135 上海 828 7 4.0 4.0 0 美食 休闲茶饮 奶茶 0.70
1192 1193 上海 642 7 4.0 1.0 0 美食 休闲茶饮 奶茶 0.70
799 800 上海 545 6 4.0 5.0 0 美食 休闲茶饮 奶茶 0.68
1970 1971 上海 642 6 4.0 4.0 0 美食 休闲茶饮 奶茶 0.68
In [150]:
#  4个城市的快餐店
df2 = df_shop[(df_shop['城市'].isin(['北京', '上海','广州','深圳'])) & (df_shop['三级分类']== '中式快餐')]
df2
Out[150]:
  商家ID 城市 所在位置编号 人均消费 评分 评论数 门店等级 一级分类 二级分类 三级分类
13 14 深圳 862 7 1.0 4.0 2 美食 快餐 中式快餐
50 51 北京 659 12 2.0 3.0 2 美食 快餐 中式快餐
77 78 上海 699 8 1.0 1.0 0 美食 快餐 中式快餐
78 79 上海 1033 15 2.0 3.0 1 美食 快餐 中式快餐
92 93 深圳 813 5 0.0 1.0 0 美食 快餐 中式快餐
... ... ... ... ... ... ... ... ... ... ...
1888 1889 北京 916 5 3.0 0.0 0 美食 快餐 中式快餐
1914 1915 北京 322 10 3.0 3.0 0 美食 快餐 中式快餐
1929 1930 上海 993 7 2.0 2.0 2 美食 快餐 中式快餐
1930 1931 深圳 1109 4 0.0 4.0 0 美食 快餐 中式快餐
1996 1997 上海 924 10 1.0 2.0 0 美食 快餐 中式快餐

104 rows × 10 columns

In [151]:
# 4个城市 得分最高的5家快餐店
df2['最终得分'] = 0.7 * (df2['评分'] / 5) + 0.3 * (df2['人均消费'] / max(df2['人均消费']))
df22 = df2.sort_values(by = '最终得分',ascending = False).iloc[0:5]
df22
Out[151]:
  商家ID 城市 所在位置编号 人均消费 评分 评论数 门店等级 一级分类 二级分类 三级分类 最终得分
1370 1371 北京 916 17 4.0 3.0 1 美食 快餐 中式快餐 0.815
872 873 上海 358 11 4.0 1.0 0 美食 快餐 中式快餐 0.725
1532 1533 北京 319 18 3.0 10.0 2 美食 快餐 中式快餐 0.690
823 824 上海 1065 18 3.0 1.0 0 美食 快餐 中式快餐 0.690
894 895 上海 924 16 3.0 1.0 0 美食 快餐 中式快餐 0.660
In [187]:
# 输出
pd.merge(df11[['商家ID','三级分类','城市','最终得分']],(df22[['商家ID','三级分类','城市','最终得分']]),how='outer')
Out[187]:
  商家ID 三级分类 城市 最终得分
0 752 奶茶 深圳 0.860
1 135 奶茶 上海 0.700
2 1193 奶茶 上海 0.700
3 800 奶茶 上海 0.680
4 1971 奶茶 上海 0.680
5 1371 中式快餐 北京 0.815
6 873 中式快餐 上海 0.725
7 1533 中式快餐 北京 0.690
8 824 中式快餐 上海 0.690
9 895 中式快餐 上海 0.660
 

6. 留存分析

(对于平均日交易额最 大的前 3 个 商家,对他们进行漏斗分析,以浏览行为作为分析目标,输出 2016.10.01~2016.10.31 共 31 天的留存率,输出为类似以下矩阵(注意表中数 值不一定准确,仅用作示例说明), 请选择合适的图表进行可视化:(注:第 0 天留存率表示当天活跃的用户比例 (一定 是 100%,比如有 1000 人浏 览),第 1 天留存率表示第 0 天活跃的用户在第一天 也活跃的比例(比如前面 1000 人中第 1 天也活跃的用户有 820 人,则留存率为 82%),第 2 天留存率表示第 0 天活跃的用户在第 2 天也活跃的比例(比如前面 1000 人中第 2 天也活跃的用户有 600 人,则留存率为 60%),以此类推….)

 

image.png

In [ ]:
# 前面第4题已经有了平均日交易额最大的前10个商家,直接用即可。
# 1929、1928、517
In [158]:
# 取出商家id= 1629,1928,517,2016年10月的浏览数据
df_view_top3 = df_view[(df_view['商家ID'].isin([1629,1928,517])) & (df_view['浏览日期'].dt.month == 10) & (df_view['浏览日期'].dt.year == 2016)]
df_view_top3
Out[158]:
  用户ID 商家ID 浏览时间 浏览日期
2275032 10071392 517 2016-10-22 21:00:00 2016-10-22
2275043 9541932 517 2016-10-18 21:00:00 2016-10-18
2275050 8584386 517 2016-10-13 12:00:00 2016-10-13
2275059 19453077 517 2016-10-21 10:00:00 2016-10-21
2275061 19926664 517 2016-10-29 20:00:00 2016-10-29
... ... ... ... ...
3610317 22565138 1629 2016-10-10 22:00:00 2016-10-10
3610324 12194265 1629 2016-10-20 14:00:00 2016-10-20
3610331 376707 1629 2016-10-06 19:00:00 2016-10-06
3610341 21686088 1629 2016-10-02 20:00:00 2016-10-02
3610357 17863648 1629 2016-10-23 23:00:00 2016-10-23

5356 rows × 4 columns

In [160]:
# 把 浏览时间(日) 变成 index
df_view_top3.set_index('浏览日期',inplace=True)
In [184]:
# 按照日期 索引进行排序,并且取出用户ID
df = df_view_top3.sort_index()[['用户ID']]
df
Out[184]:
  用户ID
浏览日期  
2016-10-01 17832138
2016-10-01 7999628
2016-10-01 15779039
2016-10-01 3837194
2016-10-01 2253587
... ...
2016-10-31 20293092
2016-10-31 21985171
2016-10-31 4683583
2016-10-31 11180310
2016-10-31 11070560

5356 rows × 1 columns

In [185]:
# 用来存放结果
result_df = pd.DataFrame(index = df.index.unique(),columns=df.index.unique())
result_df

for i in result_df.index:
    base_user = df.loc[i,]['用户ID'].nunique()
    for j in result_df.columns:
        if j == i:
            result_df.loc[i,j] = base_user
        elif j>=i:
            current_users = pd.merge(df.loc[i,][['用户ID']],df.loc[j,][['用户ID']])
            current_user_num =  current_users['用户ID'].count()
            result_df.loc[i,j] = current_user_num
        else:
            result_df.loc[i,j] = '' 
In [186]:
result_df.index.name=None
result_df
Out[186]:
浏览日期 2016-10-01 2016-10-02 2016-10-03 2016-10-04 2016-10-05 2016-10-06 2016-10-07 2016-10-08 2016-10-09 2016-10-10 ... 2016-10-22 2016-10-23 2016-10-24 2016-10-25 2016-10-26 2016-10-27 2016-10-28 2016-10-29 2016-10-30 2016-10-31
2016-10-01 291 2 1 3 0 1 0 1 0 4 ... 0 2 1 1 0 5 0 0 0 0
2016-10-02   226 1 2 1 1 2 0 0 0 ... 0 0 0 2 0 0 0 1 0 0
2016-10-03     174 3 0 1 0 1 1 0 ... 0 1 0 0 0 0 0 0 0 0
2016-10-04       180 2 0 0 1 1 0 ... 1 1 0 0 0 0 0 0 0 0
2016-10-05         173 0 2 0 1 0 ... 0 0 0 0 0 0 0 0 0 0
2016-10-06           188 3 0 3 0 ... 0 2 0 0 0 0 0 0 0 0
2016-10-07             252 2 2 2 ... 1 1 1 0 0 0 0 0 0 0
2016-10-08               212 5 0 ... 0 2 1 0 0 0 0 1 0 0
2016-10-09                 212 2 ... 1 2 0 0 0 0 0 0 0 0
2016-10-10                   195 ... 0 0 0 0 0 2 1 0 2 0
2016-10-11                     ... 0 0 0 0 1 0 0 0 0 1
2016-10-12                     ... 0 1 2 0 0 2 0 0 0 1
2016-10-13                     ... 0 3 0 0 0 0 0 0 0 1
2016-10-14                     ... 2 1 0 0 3 1 4 0 0 0
2016-10-15                     ... 3 2 2 0 0 0 0 1 2 0
2016-10-16                     ... 1 3 0 0 0 0 3 2 0 0
2016-10-17                     ... 3 1 0 1 0 1 0 0 2 0
2016-10-18                     ... 0 0 0 0 1 4 0 0 0 0
2016-10-19                     ... 2 1 2 1 0 0 0 0 0 1
2016-10-20                     ... 1 1 1 1 1 0 1 1 0 0
2016-10-21                     ... 0 1 0 0 0 1 1 1 0 0
2016-10-22                     ... 210 3 1 1 2 1 2 1 2 0
2016-10-23                     ...   166 1 0 1 2 1 1 2 0
2016-10-24                     ...     96 2 1 0 0 3 0 0
2016-10-25                     ...       97 0 0 0 1 0 0
2016-10-26                     ...         98 4 1 0 0 0
2016-10-27                     ...           131 1 3 0 0
2016-10-28                     ...             178 0 0 0
2016-10-29                     ...               166 1 2
2016-10-30                     ...                 159 2
2016-10-31                     ...                   135

31 rows × 31 columns

In [179]:
 
 

7. 找到被浏览次数最多的 50 个商家,并输出他们的城市以及人均消费,并选择合适的图表对结果进行可视化

In [165]:
# 浏览次数top 50的商家ID
view_num = df_view.groupby('商家ID')['浏览时间'].count().to_frame().sort_values(by='浏览时间',ascending=False)
view_num= view_num.iloc[0:50,].index.to_frame()
view_num
Out[165]:
  商家ID
商家ID  
1911 1911
1677 1677
1539 1539
1670 1670
799 799
44 44
1823 1823
885 885
1322 1322
195 195
852 852
647 647
887 887
675 675
431 431
1108 1108
1629 1629
1935 1935
1883 1883
1692 1692
1992 1992
1202 1202
1017 1017
451 451
58 58
1221 1221
1362 1362
347 347
522 522
1142 1142
187 187
577 577
425 425
570 570
364 364
671 671
737 737
283 283
891 891
844 844
155 155
1478 1478
298 298
1311 1311
1553 1553
1646 1646
30 30
408 408
256 256
1821 1821
In [166]:
# 连接
df_7 = pd.merge(view_num,df_shop,left_on = view_num.index,right_on = df_shop['商家ID'],how='left')
df_7
Out[166]:
  key_0 商家ID_x 商家ID_y 城市 所在位置编号 人均消费 评分 评论数 门店等级 一级分类 二级分类 三级分类
0 1911 1911 1911 天津 625 20 4.000000 8.0 2 美食 火锅 川味/重庆火锅
1 1677 1677 1677 济南 23 20 4.000000 7.0 2 美食 火锅 川味/重庆火锅
2 1539 1539 1539 宁波 245 20 4.000000 6.0 2 美食 火锅 川味/重庆火锅
3 1670 1670 1670 南京 680 20 4.000000 10.0 2 美食 火锅 川味/重庆火锅
4 799 799 799 苏州 790 20 4.000000 6.0 2 美食 火锅 川味/重庆火锅
5 44 44 44 郑州 1088 20 4.000000 5.0 2 美食 火锅 川味/重庆火锅
6 1823 1823 1823 广州 36 20 4.000000 8.0 2 美食 火锅 川味/重庆火锅
7 885 885 885 武汉 65 20 4.000000 9.0 2 美食 火锅 川味/重庆火锅
8 1322 1322 1322 杭州 1093 20 4.000000 8.0 2 美食 火锅 川味/重庆火锅
9 195 195 195 孝感 98 19 1.000000 4.0 2 美食 其他美食 西餐
10 852 852 852 武汉 605 20 2.000000 11.0 1 美食 其他美食 西餐
11 647 647 647 达州 518 19 2.677004 0.0 1 超市便利店 超市 超市
12 887 887 887 武汉 435 20 1.000000 6.0 2 美食 其他美食 西餐
13 675 675 675 梧州 164 4 3.000000 6.0 2 美食 快餐 西式快餐
14 431 431 431 东莞 913 9 2.000000 5.0 2 美食 快餐 西式快餐
15 1108 1108 1108 南京 1126 20 4.000000 6.0 2 美食 火锅 川味/重庆火锅
16 1629 1629 1629 苏州 1147 20 3.000000 2.0 1 超市便利店 超市 超市
17 1935 1935 1935 嘉兴 393 2 3.000000 3.0 0 美食 休闲食品 生鲜水果
18 1883 1883 1883 苏州 63 20 4.000000 3.0 2 美食 火锅 川味/重庆火锅
19 1692 1692 1692 东莞 184 20 2.677004 0.0 1 超市便利店 超市 超市
20 1992 1992 1992 安康 118 19 2.677004 0.0 1 超市便利店 超市 超市
21 1202 1202 1202 江门 1016 6 2.000000 3.0 2 美食 快餐 西式快餐
22 1017 1017 1017 邢台 1077 18 2.677004 0.0 1 超市便利店 超市 超市
23 451 451 451 杭州 405 20 4.000000 6.0 2 美食 火锅 川味/重庆火锅
24 58 58 58 杭州 1093 19 3.000000 2.0 1 超市便利店 超市 超市
25 1221 1221 1221 合肥 814 5 4.000000 7.0 0 美食 休闲茶饮 奶茶
26 1362 1362 1362 长治 224 15 3.000000 6.0 2 美食 快餐 西式快餐
27 347 347 347 邯郸 604 7 3.000000 3.0 2 美食 快餐 西式快餐
28 522 522 522 深圳 991 20 2.000000 6.0 2 美食 中餐 江浙菜
29 1142 1142 1142 石家庄 703 19 3.000000 2.0 0 美食 中餐 其它地方菜
30 187 187 187 惠州 83 8 2.000000 5.0 2 美食 快餐 西式快餐
31 577 577 577 金华 437 20 2.677004 0.0 1 超市便利店 超市 超市
32 425 425 425 上海 809 19 3.000000 4.0 0 美食 中餐 西北菜
33 570 570 570 湖州 899 6 3.000000 12.0 2 美食 快餐 西式快餐
34 364 364 364 佛山 82 20 0.000000 4.0 0 美食 中餐 江浙菜
35 671 671 671 成都 446 19 4.000000 0.0 1 超市便利店 超市 超市
36 737 737 737 广州 132 9 2.000000 17.0 2 美食 快餐 西式快餐
37 283 283 283 大连 227 20 4.000000 9.0 0 美食 中餐 海鲜
38 891 891 891 杭州 264 9 3.000000 20.0 2 美食 快餐 西式快餐
39 844 844 844 武汉 653 19 2.000000 6.0 1 美食 其他美食 西餐
40 155 155 155 江门 635 7 3.000000 7.0 2 美食 快餐 西式快餐
41 1478 1478 1478 绍兴 912 1 4.000000 7.0 1 美食 休闲茶饮 奶茶
42 298 298 298 西安 1020 19 2.677004 0.0 1 超市便利店 超市 超市
43 1311 1311 1311 广州 488 20 2.000000 5.0 2 美食 其他美食 西餐
44 1553 1553 1553 南宁 793 13 3.000000 9.0 2 美食 快餐 西式快餐
45 1646 1646 1646 玉林 1089 15 2.000000 7.0 2 美食 快餐 西式快餐
46 30 30 30 中山 498 7 2.000000 2.0 2 美食 快餐 西式快餐
47 408 408 408 贵阳 666 20 2.677004 0.0 1 超市便利店 超市 超市
48 256 256 256 南宁 76 18 3.000000 0.0 1 超市便利店 超市 超市
49 1821 1821 1821 无锡 177 19 3.000000 0.0 1 超市便利店 超市 超市
In [169]:
# 输出城市和人均消费
df7 = df_7[['商家ID_x','城市','人均消费']]
df7
Out[169]:
  商家ID_x 城市 人均消费
0 1911 天津 20
1 1677 济南 20
2 1539 宁波 20
3 1670 南京 20
4 799 苏州 20
5 44 郑州 20
6 1823 广州 20
7 885 武汉 20
8 1322 杭州 20
9 195 孝感 19
10 852 武汉 20
11 647 达州 19
12 887 武汉 20
13 675 梧州 4
14 431 东莞 9
15 1108 南京 20
16 1629 苏州 20
17 1935 嘉兴 2
18 1883 苏州 20
19 1692 东莞 20
20 1992 安康 19
21 1202 江门 6
22 1017 邢台 18
23 451 杭州 20
24 58 杭州 19
25 1221 合肥 5
26 1362 长治 15
27 347 邯郸 7
28 522 深圳 20
29 1142 石家庄 19
30 187 惠州 8
31 577 金华 20
32 425 上海 19
33 570 湖州 6
34 364 佛山 20
35 671 成都 19
36 737 广州 9
37 283 大连 20
38 891 杭州 9
39 844 武汉 19
40 155 江门 7
41 1478 绍兴 1
42 298 西安 19
43 1311 广州 20
44 1553 南宁 13
45 1646 玉林 15
46 30 中山 7
47 408 贵阳 20
48 256 南宁 18
49 1821 无锡 19
In [177]:
# 导出到tableau画地图
df7.to_csv('./datasets/new_alibaba/浏览次数最多的50个商家.csv',index=False) #加index = False,消除Unnamed: 0
In [170]:
#  看人均消费
plt.plot(df['人均消费'])

plt.title('浏览次数最多的TOP50商家 人均消费')
plt.show()
  In [171]:
df7.index
Out[171]:
Int64Index([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
            17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
            34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49],
           dtype='int64')
In [176]:
# 看城市分布
 

image.png

In [178]:
df7['城市']
Out[178]:
0      天津
1      济南
2      宁波
3      南京
4      苏州
5      郑州
6      广州
7      武汉
8      杭州
9      孝感
10     武汉
11     达州
12     武汉
13     梧州
14     东莞
15     南京
16     苏州
17     嘉兴
18     苏州
19     东莞
20     安康
21     江门
22     邢台
23     杭州
24     杭州
25     合肥
26     长治
27     邯郸
28     深圳
29    石家庄
30     惠州
31     金华
32     上海
33     湖州
34     佛山
35     成都
36     广州
37     大连
38     杭州
39     武汉
40     江门
41     绍兴
42     西安
43     广州
44     南宁
45     玉林
46     中山
47     贵阳
48     南宁
49     无锡
Name: 城市, dtype: object
In [ ]:
 

标签:...,10,python,df,美食,口碑,2016,ID,abby
From: https://www.cnblogs.com/wuxiaoyan/p/16963924.html

相关文章