Airbnb是一个旅行房屋租赁社区,用户可通过网络或手机应用程序发布、搜索度假房屋租赁信息并完成在线预定程序,其社区平台在191个国家、65,000个城市为旅行者们提供数以百万计的独特入住选择,被时代周刊称为“住房中的EBay”。
Airbnb在做好了产品体验、房源美感、民宿共享服务之后,这款产品和背后的业务是否存在可以改进的地方?
一款产品的发展必然伴随着不断的迭代。在AARRRR模型中,第一个A(用户获取)中,提高新用户获取的数量和质量是不断监测并优化的一个工作,哪些渠道的效果更好,企业就要及时调整和增加此渠道的投入,哪些渠道的效果很差,就要及时查找原因并给出解决。
另外转化漏斗分析也是数据分析环节的重要指标,可以从宏观角度了解整个产品的业务转化情况,企业针对流失率较高的漏斗环节进行改进,可以有效促进业务发展。
针对分析的目的,提出以下三个问题:
本项目将着重从用户画像、推广渠道、转化漏斗三个方面去进行分析,并探索爱彼迎在产品和业务上还有哪些可以改进的地方。
本次项目的数据来源于Kaggle–Airbnb New User Bookings其中train_user表中为用户数据(21w * 15),sessions表中为行为数据。(104w * 6)
id:用户ID
date_account_created:帐户创建日期
date_first_booking:首次预订的日期
gender:性别
age:年龄
signup_method:注册方式
signup_flow:用户注册的页面
language:语言偏好
affiliate_channel:营销方式
affiliate_provider:营销来源,例如google,craigslist,其他
first_affiliate_tracked:在注册之前,用户与之交互的第一个营销广告是什么
signup_app:注册来源
first_device_type:注册时设备的类型
first_browser:注册时使用的浏览器名称
country_destination:目的地国家
******************** 基本信息
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 213451 entries, 0 to 213450
Data columns (total 16 columns):
id 213451 non-null object
date_account_created 213451 non-null object
timestamp_first_active 213451 non-null int64
date_first_booking 88908 non-null object
gender 213451 non-null object
age 125461 non-null float64
signup_method 213451 non-null object
signup_flow 213451 non-null int64
language 213451 non-null object
affiliate_channel 213451 non-null object
affiliate_provider 213451 non-null object
first_affiliate_tracked 207386 non-null object
signup_app 213451 non-null object
first_device_type 213451 non-null object
first_browser 213451 non-null object
country_destination 213451 non-null object
dtypes: float64(1), int64(2), object(13)
memory usage: 26.1+ MB
None
******************** 空值
id 0
date_account_created 0
timestamp_first_active 0
date_first_booking 124543
gender 0
age 87990
signup_method 0
signup_flow 0
language 0
affiliate_channel 0
affiliate_provider 0
first_affiliate_tracked 6065
signup_app 0
first_device_type 0
first_browser 0
country_destination 0
dtype: int64
******************** 重复值
False 213451
dtype: int64
user_id:与users表中的“id”列连接
action:埋点名称
action_type:操作事件的类型
action_detail:操作事件的描述
device_type:此次会话所使用的设备
******************** 基本信息
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10567737 entries, 0 to 10567736
Data columns (total 6 columns):
user_id object
action object
action_type object
action_detail object
device_type object
secs_elapsed float64
dtypes: float64(1), object(5)
memory usage: 483.8+ MB
None
******************** 空值
user_id 34496
action 79626
action_type 1126204
action_detail 1126204
device_type 0
secs_elapsed 136031
dtype: int64
******************** 重复值
False 10315201
True 252536
dtype: int64
#年龄
bin2000_10 = np.arange(0,2000,10)
df_cut_10 = pd.cut(df.age,bin2000_10).value_counts()
df_cut_10.head()
(30, 40] 44212
(20, 30] 41633
(40, 50] 18831
(50, 60] 9868
(60, 70] 4656
(10, 20] 2412
(100, 110] 1544
(70, 80] 1021
(80, 90] 228
(90, 100] 198
(0, 10] 57
(110, 120] 20
(1930, 1940] 11
(1920, 1930] 9
(1940, 1950] 6
(1950, 1960] 2
(130, 140] 1
(140, 150] 1
(560, 570] 0
(750, 760] 0
可以看到年龄出现了很多异常值,推测注册年龄是可以随意填写的,所以会出现这些异常数据。处理时仅选取10-100岁的数据。
数据可视化使用pyecharts,在此,对于常用的可视化脚本就不在贴出了,如果需要可以参考博主之前的几篇文章。
df_age = df[(df.age>10)&(df.age<100)].age.value_counts()
df_age_sort = df_age.sort_index()
df_age_sort
bar.render_notebook()
airbnb的用户主要为“中青年群体”,其中用户数量最多的是29岁~33岁,30岁之后随着年龄的增大,用户逐渐减少。
print(df.gender.value_counts())
df_sax = df[(df.gender=='FEMALE')|(df.gender=='MALE')].gender.value_counts()
-unknown- 95688
FEMALE 63041
MALE 54440
OTHER 282
Name: gender, dtype: int64
地区分布使用的是数据中的语言来进行判断的,en代表英语地区,zh为汉语地区等
'''[{'value': 0.9666, 'name': 'en'},
{'value': 0.0076, 'name': 'zh'}]'''
from pyecharts.charts import TreeMap
df.language.value_counts()
key = df.language.value_counts().index.tolist()
values = df.language.value_counts().values.tolist()
dict_language = dict(zip(key,values))
aa = []
sum_val = df.language.value_counts().sum()
for key,values in dict_language.items():
a = {"value":round(values/sum_val,4),"name":key}
aa.append(a)
def pie_rosetype():
c = (
TreeMap(init_opts=opts.InitOpts(width="1000px", height="500px"))
.add(
series_name="option",
data=aa,
# visual_min=300,
leaf_depth=1,
#标签居中为 position = "inside"
label_opts=opts.LabelOpts(position="inside"),
)
.set_global_opts(
legend_opts=opts.LegendOpts(is_show=False),
title_opts=opts.TitleOpts(
title="语种分布", subtitle="2020/06", pos_left="leafDepth"
),))
return c
pie_rosetype().render_notebook()
有超过90%的用户是英语国家,airbnb是2013年开始进入中国市场的(此数据集止于2014年),所以此时中文用户数量虽然排名第二,但是占比却非常小。
df_chn = df[(df.language=='zh')&(df.country_destination!='NDF')]
df_chn.country_destination.value_counts()
中国用户去国外预定,占比最多的是美国。其余国家占比很小,总和不到20%。
df['date_account_created'] = pd.to_datetime(df['date_account_created'], format='%Y-%m-%d')
df['month'] = df['date_account_created'].dt.strftime('%Y-%m')
df_month = df['month'].value_counts().sort_index()
airbnb的用户增长曲线健康,前期(2011年之前)平缓,2012年2月之后开始快速增长,2012年之后的增长速度很快。此产品新用户的增加存在季节性规律:每年的7~10月,产品都会迎来用户增长的高峰,推测为夏季(北半球)是旅行的旺季,而短租产品本身就是旅行消费的一种。
df_device = df[df.first_device_type!="Other/Unknown"]
df_device.first_device_type.value_counts()
此数据为2014年之前的数据,当时智能手机还没有像现在一样普及,用户的注册设备PC大于移动设备。苹果设备数量大于其他设备数量,其次是windows设备。
df["channel-provider"] = df["affiliate_channel"].str.cat(df["affiliate_provider"],sep ="-")
#把渠道和推广方式用“-”连接起来。
visit = df.groupby(["channel-provider"])["id"].count()
#访问统计
booking = df.groupby(["channel-provider"])["date_first_booking"].count()
#注册统计
rate = booking/visit
visit= visit.sort_values(ascending=False).reset_index()
booking=booking.sort_values(ascending=False).reset_index()
rate=rate.sort_values(ascending=False).reset_index()
vbr = pd.merge(visit,rate,on='channel-provider',how='left')
vbr = pd.merge(vbr,booking,on='channel-provider',how='left')
vbr.columns = ['channel-provider','visit','rate','booking']
vbr = vbr.sort_values(by='visit',ascending=False)[:10]
airbnb的整体渠道转化率表现很好,多数渠道的转化率都在30%以上。渠道注册量符合二八定律,及前7个渠道(总共有38个渠道推广)的注册量已经占据了产品总的渠道来源的90%以上。
content_google的转化率异常,明显低于转化率的均值。api_other(其他产品的API对接)渠道的转化率虽然大于30%,单数相较于其他渠道,转化率偏低。
seo_google的注册量和转化率表现都很好,sem_brand_google的注册量可转化率表现优异。
visit = df.groupby(["first_affiliate_tracked"])["id"].count()
#注册量
booking = df.groupby(["first_affiliate_tracked"])["date_first_booking"].count()
visit = visit.to_frame(name='count(visit)')
booking = booking.to_frame(name='count(booking)')
df_vb = pd.merge(visit,booking,on='first_affiliate_tracked')
df_vb['Proportion']=df_vb["count(booking)"]/df_vb["count(visit)"]
df_vb = df_vb.sort_values('count(visit)',ascending=False)
从统计到的数据来看,linked注册量位居第一。转化率方面,linked和omg两个营销内容的的转化率好,在43%以上。local ops的转化率非常低。
gp_device_browser = df.groupby(['first_device_type','first_browser'])['id'].count()
gp_device_browser=gp_device_browser.sort_values(ascending=False).reset_index()
# gp_device_browser
gp_device_browser["device_browser"] = df["first_device_type"].str.cat(df["first_browser"],sep ="_")
df_device_browser=gp_device_browser[['device_browser','id']][:11]
users_sum = df_user.groupby(["user_id"])["user_id"].count()
all_user = users_sum.count()
active_user = users_sum[users_sum>=10].count()
df_merge = pd.merge(df,df_user,left_on="id",right_on="user_id")
signup_user = df_merge.groupby(["user_id"])["user_id"].count().count()
pay_user=df_user[df_user['action_detail']=='payment_instruments'].groupby('user_id').count().shape[0]
pays_user = df_user[df_user['action_detail']=='payment_instruments'].groupby('user_id')['user_id'].count()
pays_user = pays_user[pays_user>=2].count()
注册用户到下单用户是airbnb转化漏斗中流失率最高的一个环节。活跃和复购环节表现的好,其中有60%的下单用户复购,说明airbnb的产品和服务做的非常好。下单用户中有大约13%的用户没有最终支付,需要进一步排查原因。