1 项目背景
随着移动设备的完善和普及,移动互联网+各行各业进入快速发展阶段,其中O2O(Online to Offline)消费最为抢眼。据不完全统计,O20行业估值上亿的初创公司至少有10家,也有数百亿的巨头。
O2O产业关联着亿万消费者,各类APP每天记录超过100亿条用户行为和位置记录,成为大数据科研与商业运营的最佳结合点之一。利用优惠券盘活老用户或吸引新顾客购物是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、折扣率、优惠券消费日期的空值个数相同,则可能出现两者都为空的情况。
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 表示完全负相关
可以得出结论,消费者数量和距离与折扣率呈负相关。距离越小,优惠越小(即优惠越大),人数越多