O2O优惠券线下使用情况数据分析(Python)
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表示完全负相关
可以得出:消费人数和距离与折扣率呈负相关。距离越小,折扣越小(也就是优惠多),人数越多
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



















所有评论(0)