1.指标拆解
目标群体中具有某一特征的群体所占比例
TGI指数计算公式 = —————————————————————————————————— * 标准数100
总体中具有相同特征的群体所占比例
TGI计算公式中,有三个关键点需要进一步拆解:某一特征,总体,目标群体。
- 某一特征:想要分析的某种行为或者状态,比如打篮球
- 总体:是我们研究的所有对象,比如一个学校里的所有人
- 目标群体:是总体中我们感兴趣的一个分组,比如一个班
假设一个班有50个人,有20个人喜欢打篮球,那么这个比例就是40%,即“目标群体中具有某一特征的群体所占比例” = 40%。
假设一个学校有1000人,有300个人喜欢打篮球,那么这个比例就是30%,即“总体中具有相同特征的群体所占比例” = 30%。
TGI指数 = (40% / 30%) * 100 = 133
TGI指数大于100,代表着某类用户更具有相应的倾向或者偏好,数值越大则倾向和偏好越强;小于100,则说明该类用户相关倾向较弱(和平均相比);而等于100则表示在平均水平。
2.TGI实例分析
2.1 导入数据
import pandas as pd
df = pd.read_excel('TGI-data.xlsx')
df.head()
df.info()
2.2 单个客户打标
- 特征,高客单,即客户单次购买超过50元
- 目标群体,就是各个城市,这里我们可以分别计算出所有城市客户的高客单偏好
- 总体,计算所涉及到的所有客户即为总体
解题的关键在于,计算出不同城市,高客单人数及所占的比例。
第一步,我们先判断每个用户是否属于高客单的人群,所以先按用户昵称进行分组,看每位用户的平均支付金额。这里用平均,是因为有的客户多次购买,而每次下单金额也不一样,故平均之。
gp_user = df.groupby('买家昵称')['实付金额'].mean().reset_index()
gp_user.head()
接着,定义一个判断函数,如果单个用户平均支付金额大于50,就打上“高客单”的类别,否则为低客单,再用apply函数调用:
def if_high(x):
if x > 50:
return '高客单'
else:
return '低客单'
gp_user['客单类别'] = gp_user['实付金额'].apply(if_high)
gp_user.head(10)
2.3 匹配城市
单个用户的金额和客单标签已经搞定,下一步就是补充每个用户的地域字段,一句pd.merge函数就能搞定。由于源数据是未去重的,我们得先按昵称去重,不然匹配的结果会有许多重复的数据:
去重
df_dup = df.loc[df.duplicated('买家昵称') == False, :]
合并
df_merge = pd.merge(gp_user, df_dup, left_on='买家昵称', right_on='买家昵称', how='left')
df_merge.head()
2.4 高客单TGI指数计算
要计算每个城市高客单TGI指数,需要得到每个城市高客单、低客单的人数分别是多少。
先筛选出我们需要的列
df_merge = df_merge[['买家昵称', '客单类别', '省份', '城市']]
再用透视表
result = pd.pivot_table(
df_merge,
index = ['省份', '城市'],
columns = '客单类别',
aggfunc = 'count',
)
result.head()
这样得到的结果包含了层次化索引,要索引得到“高客单”列,需要先索引“买家昵称”,再索引“高客单”:
result['买家昵称']['高客单'].reset_index().head()
这样,拿到了每个省市的高客单人数,然后再拿到低客单的人数,进行横向合并:
tgi = pd.merge(
result['买家昵称']['高客单'].reset_index(),
result['买家昵称']['低客单'].reset_index(),
left_on = ['省份', '城市'],
right_on = ['省份', '城市'],
how = 'inner'
)
tgi.head()
我们再看看每个城市总人数以及高客单人数占比,来完成“目标群体中具有某一特征的群体所占比例”这个分子的计算:
tgi['总人数'] = tgi['高客单'] + tgi['低客单']
tgi['高客单占比'] = tgi['高客单'] / tgi['总人数']
tgi.head()
有些非常小众的城市,高客单或者低客单人数等于1甚至没有,而这些值尤其是空值会影响结果的计算,我们要提前检核数据:
tgi.info()
剔除掉存在空值的行
tgi = tgi.dropna()
接着统计总人数中,高客单人群的比例,来对标公式中的分母“总体中具有相同特征的群体所占比例
total_percentage = tgi['高客单'].sum() / tgi['总人数'].sum()
total_percentage
0.41528303343887557
最后一步,就是TGI指数的计算,顺便排个序
tgi['高客单TGI指数'] = tgi['高客单占比'] / total_percentage * 100
tgi = tgi.sort_values('高客单TGI指数', ascending=False)
tgi.head()
对总人数进行筛选,用总人数的平均值作为阈值,只保留总人数大于平均值的城市
tgi.loc[tgi['总人数'] > tgi['总人数'].mean(), :].head()