1 项目背景

随着移动设备的完善和普及,移动互联网+各行各业进入了高速发展阶段,这其中以O2O(Online to Offline)消费最为吸引眼球。据不完全统计,O20行业估值上亿的创业公司至少有10家,也不乏百亿巨头的身影。

O2O行业关联数亿消费者,各类APP每天记录了超过百亿条用户行为和位置记录,因而成为大数据科研和商业化运营的最佳结合点之一。以优惠券盘活老用户或吸引新客户进店消费是O2O的一种重要营销方式。然而随机投放的优惠券对多数用户造成无意义的干扰。对商家而言,滥发的优惠券可能降低品牌声誉,同时难以估算营销成本。个性化投放是提高优惠券核销率的重要技术,它可以让具有一定偏好的消费者得到真正的实惠,同时赋予商家更强的营销能力。

2 分析目标

1.分析店面客流量是否火爆的影响因素

2.分析顾客的消费习惯

3.分析投放的优惠券的使用情况

3 数据介绍

4 数据分析

4.1 加载数据

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 #正常显示负号

# parse_dates参数表示将列转换为日期格式
offline = pd.read_csv('ccf_offline_stage1_train.csv',parse_dates=['Date_received','Date'])
offline.info()

offline.head(10)

4.2 数据预处理

4.2.1 查看空值情况

通过查看空值情况发现,优惠券id、折扣率以及优惠券消费日期的空值数一样,则可能存在同时为NULL的情况。

4.2.2 把“Discount_rate”这一列的数据格式进行调整 

将数据表中的满减形式转换成折扣率的形式。

#将NaN转换成null方便函数的逻辑判断
offline['Discount_rate'] = offline['Discount_rate'].fillna('null')
# 折扣率转换函数
def discount_rate_func(s):
    if ':'in s:
        split = s.split(':')
        discount_rate = (int(split[0]) - int(split[1])) / int(split[0])
        return round(discount_rate,2)
    elif s == 'null':
        return np.NaN
    else:
        return float(s)

offline['Discount_rate'] = offline['Discount_rate'].map(discount_rate_func)
offline.head(10)

4.2.3 空值关系的分析

Coupon_id表示的是优惠券id,如果它为null,则表示没有这个优惠券,那么Discount_rate和Date_received列的数据没有意义。与上边的猜测三者同时都为空的情况对应。

检查三者为空或者不为空是否一一对应。

由上边的检查结果得知:当优惠券没有的时候,后边两个字段也同时失去意义。

注意:此时的空值不可以随便删除,因为存在没有优惠券仍然消费的情况。也就是说空值也有其对应的意义。

5 具体分析

5.1 使用优惠券消费情况分析

存在以下四种情况:

cpon_no_consume = offline[(offline['Date'].isnull() & offline['Coupon_id'].notnull())]
no_cpon_no_consume = offline[(offline['Date'].isnull() & offline['Coupon_id'].isnull())]
no_cpon_consume = offline[(offline['Date'].notnull() & offline['Coupon_id'].isnull())]
cpon_consume = offline[(offline['Date'].notnull() & offline['Coupon_id'].notnull())]

绘制饼图占比:

# 将数据合在一起
consume_status = {'cpon_no_consume':len(cpon_no_consume),'no_cpon_consume':len(no_cpon_consume),'cpon_consume':len(cpon_consume)}
consume_status = pd.Series(consume_status)
# fig画布,ax表示坐标
fig,ax = plt.subplots(1,1,figsize=(8,10))
# 
consume_status.plot.pie(ax=ax,
                        autopct='%1.1f%%',
                        shadow=True,
                        explode=[0.02,0.02,0.02],    #分饼间隔
                        textprops={'fontsize':15,'color':'blue'},    #文本属性
                        wedgeprops={'linewidth':1,'edgecolor':'black'},
                        labels=['有券未消费\n({})'.format(len(cpon_no_consume)),
                                '无券消费\n({})'.format(len(no_cpon_consume)),
                                '有券消费\n({})'.format(len(cpon_consume)),]      #添加注释
                       )
ax.set_ylabel('') #去除左边的ylabel 默认为None
ax.set_title('消费占比情况')        # 标题设置
plt.legend(labels=['有券未消费','无券消费','有券消费'])  # 图例设置

由此可以得出一些简单的结论。(略)

5.2 在有券消费人群中,距离和折扣率分析

平均距离为0表示距离小于500米。

可以得出有券消费顾客距离商家小于500米的商家有大约1431个。

由此得到折扣力度的相关信息。

5.3 持券到店消费人数最多的商家

持券消费人数在500以上的商家,连接顾客到店平均距离和平均折扣力度:

5.4 到店消费人数与平均距离和折扣力度的相关系数

corr(),用来计算DataFrame中列与列之间的相关性(皮尔逊相关系数),取值[-1,1]之间。

1表示完全正相关,-1表示完全负相关

可以得出:消费人数和距离与折扣率呈负相关。距离越小,折扣越小(也就是优惠多),人数越多

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐