目标用户偏好指数Target Group Index分析

TGI指数,全称Target Group Index,可以反映目标群体在特定研究范围内强势或者弱势。

TGI指数计算公式 = 目标群体中具有某一特征的群体所占比例 / 总体中具有相同特征的群体所占比例 * 标准数100

示例

假设我们要研究A公司脱发TGI指数:

某一特征,就是我们想要分析的某种行为或者状态,这里是脱发(或者说受脱发困扰) 总体,是我们研究的所有对象,即A公司所有人 目标群体,是总体中我们感兴趣的一个分组,假设我们关注的分组是数据部,那目标群体就是数据部

于是乎,公式中分子“目标群体中具有某一特征的群体所占比例”可以理解为“数据部脱发人数占数据部的比例”,假设数据部有15个人,有9个人受脱发困扰,那数据部脱发人数占比就是9/15,等于60%。

而分母“总体中具有相同特征的群体所占比例”,等同于“全公司受脱发困扰人数占公司总人数的比例”,假设公司一共500人,有120人受脱发困扰,那这个比例是24%。

所以,数据部脱发TGI指数,可以用60% / 24% * 100 = 250,其他部门脱发TGI指数计算逻辑是一样的,用本部门脱发人数占比 / 公司脱发人数占比 * 100即可。

开发环境:jupyter Notebook, python 3.6

一:数据概览

import pandas as pd
import numpy as np
import os os.chdir('F:\\50mat') df = pd.read_excel('TGI指数案例数据.xlsx.xlsx')
df.head()

打印结果

品牌名称	买家昵称	付款日期	订单状态	实付金额	邮费	省份	城市	购买数量
0 一只阿木木 做快淘饭 2019-04-18 00:03:00 交易成功 22.32 0 北京 北京市 1
1 一只阿木木 作自有世祟 2019-02-17 00:03:51 交易成功 87.00 0 上海 上海市 1
2 一只阿木木 作雪白室 2019-04-18 00:01:43 交易成功 97.66 0 福建省 福州市 2
3 一只阿木木 作美女购物主 2019-01-11 23:35:01 交易成功 37.23 0 河南省 安阳市 3
4 一只阿木木 作美女购物主 2019-02-18 14:16:03 交易成功 29.50 0 河南省 安阳市 2

观察数据的类型和缺失情况:

df.info()

打印结果

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 57664 entries, 0 to 57663
Data columns (total 9 columns):
品牌名称 57664 non-null object
买家昵称 57664 non-null object
付款日期 57664 non-null datetime64[ns]
订单状态 57664 non-null object
实付金额 57664 non-null float64
邮费 57664 non-null int64
省份 57664 non-null object
城市 57664 non-null object
购买数量 57664 non-null int64
dtypes: datetime64[ns](1), float64(1), int64(2), object(5)
memory usage: 2.9+ MB

二:数据清洗

def if_high(x):
if x > 50:
return '高客单'
else:
return '低客单' gp_user = df.groupby('买家昵称')['实付金额'].mean().reset_index()
gp_user['客单类型'] = gp_user['实付金额'].apply(if_high)
gp_user.head(10)

打印结果

买家昵称	实付金额	客单类型
0 .blue_ram 49.450 低客单
1 .blue_ram1 491.450 高客单
2 .christiny 22.000 低客单
3 .willn1 34.570 低客单
4 .托托m 37.475 低客单
5 0000妮 13.500 低客单
6 0009797王 94.500 高客单
7 000xyx0 99.250 高客单
8 000米粒儿米粒0 24.500 低客单
9 00556旭79618 23.860 低客单

匹配城市,合并数据

# 去重
df_dup = df.loc[df.duplicated('买家昵称') == False,:] #合并
df_merge = pd.merge(gp_user, df_dup, left_on = '买家昵称', right_on = '买家昵称', how = 'left')
df_merge.head()

高客单用户指数计算

# 高客单 TG 指数计算
df_merge = df_merge[['买家昵称', '客单类型', '省份', '城市']]

result = pd.pivot_table(df_merge, index = ['省份', '城市'], columns = '客单类型', aggfunc = 'count')
result.head()

打印结果

		买家昵称
客单类型 低客单 高客单
省份 城市
上海 上海市 2818.0 2375.0
云南省 临沧市 3.0 2.0
丽江市 1.0 3.0
保山市 6.0 2.0
大理白族自治州 9.0 8.0

三:构建用户指数

result['买家昵称']['高客单'].reset_index().head()

打印结果

省份	城市	高客单
0 上海 上海市 2375.0
1 云南省 临沧市 2.0
2 云南省 丽江市 3.0
3 云南省 保山市 2.0
4 云南省 大理白族自治州 8.0

用户合并

# 高客单与低客单用户合并
tgi = pd.merge(result['买家昵称']['高客单'].reset_index(), result['买家昵称']['低客单'].reset_index(),
left_on = ['省份', '城市'], right_on = ['省份', '城市'], how = 'inner')
tgi['总人数'] = tgi['高客单'] + tgi['低客单']
tgi['高客单占比'] = tgi['高客单'] / tgi['总人数']
tgi.head()

打印结果

省份	城市	高客单	低客单	总人数	高客单占比
0 上海 上海市 2375.0 2818.0 5193.0 0.457346
1 云南省 临沧市 2.0 3.0 5.0 0.400000
2 云南省 丽江市 3.0 1.0 4.0 0.750000
3 云南省 保山市 2.0 6.0 8.0 0.250000
4 云南省 大理白族自治州 8.0 9.0 17.0 0.470588

去除空值

total_percentage = tgi['高客单'].sum() / tgi['总人数'].sum()
total_percentage

打印结果

0.41537333024476875

四:目标用户指数计算

# tgi 指数计算, 并排序

tgi['高客单tgi指数'] = tgi['高客单占比'] / total_percentage * 100
tgi = tgi.sort_values('高客单tgi指数', ascending = False)
tgi.head(10)

打印结果

省份	城市	高客单	低客单	总人数	高客单占比	高客单tgi指数
149 新疆维吾尔自治区 哈密市 4.0 1.0 5.0 0.800000 192.597825
152 新疆维吾尔自治区 巴音郭楞蒙古自治州 10.0 3.0 13.0 0.769231 185.190216
2 云南省 丽江市 3.0 1.0 4.0 0.750000 180.560461
277 甘肃省 白银市 3.0 1.0 4.0 0.750000 180.560461
34 吉林省 辽源市 2.0 1.0 3.0 0.666667 160.498188
44 四川省 广安市 6.0 3.0 9.0 0.666667 160.498188
136 广西壮族自治区 河池市 4.0 2.0 6.0 0.666667 160.498188
25 内蒙古自治区 锡林郭勒盟 2.0 1.0 3.0 0.666667 160.498188
343 黑龙江省 鹤岗市 2.0 1.0 3.0 0.666667 160.498188
97 山西省 临汾市 9.0 5.0 14.0 0.642857 154.766109
# 保留总人数大于平均值的城市

tgi.loc[tgi['总人数'] > tgi['总人数'].mean(), :].head(10)

打印结果

省份	城市	高客单	低客单	总人数	高客单占比	高客单tgi指数
287 福建省 福州市 145.0 135.0 280.0 0.517857 124.672699
124 广东省 珠海市 49.0 52.0 101.0 0.485149 116.798186
27 北京 北京市 1203.0 1298.0 2501.0 0.481008 115.801271
283 福建省 厦门市 105.0 118.0 223.0 0.470852 113.356343
111 广东省 佛山市 118.0 135.0 253.0 0.466403 112.285293
173 江西省 南昌市 63.0 73.0 136.0 0.463235 111.522638
46 四川省 成都市 287.0 334.0 621.0 0.462158 111.263236
0 上海 上海市 2375.0 2818.0 5193.0 0.457346 110.104909
164 江苏省 无锡市 135.0 162.0 297.0 0.454545 109.430582
120 广东省 深圳市 438.0 528.0 966.0 0.453416 109.158705
你从结果中发现了什么呢?

七:数据分析模型

# 目标用户偏好指数Target Group Index分析

import pandas as pd
import numpy as np
import os os.chdir('F:\\50mat') def get_rfm(name):
# 一:数据概览
df = pd.read_excel('TGI指数案例数据.xlsx') gp_user = df.groupby('买家昵称')['实付金额'].mean().reset_index()
gp_user['客单类型'] = gp_user['实付金额'].apply(if_high) # 二:数据清洗
df_dup = df.loc[df.duplicated('买家昵称') == False,:]
#合并
df_merge = pd.merge(gp_user, df_dup, left_on = '买家昵称', right_on = '买家昵称', how = 'left') # 三:构建用户指数
# 高客单 TG 计算
df_merge = df_merge[['买家昵称', '客单类型', '省份', '城市']]
result = pd.pivot_table(df_merge, index = ['省份', '城市'], columns = '客单类型', aggfunc = 'count') # 高客单与低客单用户合并
tgi = pd.merge(result['买家昵称']['高客单'].reset_index(), result['买家昵称']['低客单'].reset_index(),
left_on = ['省份', '城市'], right_on = ['省份', '城市'], how = 'inner') # 构建分子
tgi['总人数'] = tgi['高客单'] + tgi['低客单']
tgi['高客单占比'] = tgi['高客单'] / tgi['总人数']
# 高客单和低客单都有空值,应删除
tgi = tgi.dropna() # 构建分母
total_percentage = tgi['高客单'].sum() / tgi['总人数'].sum() # 四:TGI 指数计算, 并排序
tgi['高客单TGI指数'] = tgi['高客单占比'] / total_percentage * 100
tgi = tgi.sort_values('高客单tgi指数', ascending = False) # 保留总人数大于平均值的城市
result_tgi = tgi.loc[tgi['总人数'] > tgi['总人数'].mean(), :]
return result_tgi def if_high(x):
if x > 50:
return '高客单'
else:
return '低客单' res = get_rfm(name = 'TGI指数案例数据.xlsx')
res

打印结果

省份	城市	高客单	低客单	总人数	高客单占比	高客单tgi指数
287 福建省 福州市 145.0 135.0 280.0 0.517857 124.672699
124 广东省 珠海市 49.0 52.0 101.0 0.485149 116.798186
27 北京 北京市 1203.0 1298.0 2501.0 0.481008 115.801271
283 福建省 厦门市 105.0 118.0 223.0 0.470852 113.356343
111 广东省 佛山市 118.0 135.0 253.0 0.466403 112.285293
173 江西省 南昌市 63.0 73.0 136.0 0.463235 111.522638
46 四川省 成都市 287.0 334.0 621.0 0.462158 111.263236
0 上海 上海市 2375.0 2818.0 5193.0 0.457346 110.104909
164 江苏省 无锡市 135.0 162.0 297.0 0.454545 109.430582
120 广东省 深圳市 438.0 528.0 966.0 0.453416 109.158705
112 广东省 广州市 535.0 654.0 1189.0 0.449958 108.326153
216 浙江省 温州市 100.0 124.0 224.0 0.446429 107.476465
215 浙江省 杭州市 318.0 396.0 714.0 0.445378 107.223579
170 江苏省 镇江市 39.0 50.0 89.0 0.438202 105.496000
285 福建省 泉州市 57.0 77.0 134.0 0.425373 102.407426
244 湖北省 武汉市 275.0 373.0 648.0 0.424383 102.168985
267 湖南省 长沙市 108.0 149.0 257.0 0.420233 101.170064
87 山东省 济南市 80.0 111.0 191.0 0.418848 100.836558
159 江苏省 南通市 61.0 85.0 146.0 0.417808 100.586193
214 浙江省 宁波市 121.0 169.0 290.0 0.417241 100.449728
7 云南省 昆明市 71.0 100.0 171.0 0.415205 99.959398
306 辽宁省 大连市 94.0 133.0 227.0 0.414097 99.692707
212 浙江省 台州市 45.0 65.0 110.0 0.409091 98.487524
221 浙江省 金华市 51.0 74.0 125.0 0.408000 98.224891
130 广西壮族自治区 南宁市 54.0 79.0 133.0 0.406015 97.747016
158 江苏省 南京市 235.0 354.0 589.0 0.398981 96.053669
100 山西省 太原市 65.0 99.0 164.0 0.396341 95.418130
337 黑龙江省 哈尔滨市 85.0 132.0 217.0 0.391705 94.301930
113 广东省 惠州市 36.0 56.0 92.0 0.391304 94.205458
213 浙江省 嘉兴市 59.0 93.0 152.0 0.388158 93.447958
310 辽宁省 沈阳市 113.0 180.0 293.0 0.385666 92.847928
58 天津 天津市 203.0 335.0 538.0 0.377323 90.839588
161 江苏省 常州市 62.0 105.0 167.0 0.371257 89.379230
299 贵州省 贵阳市 47.0 80.0 127.0 0.370079 89.095451
168 江苏省 苏州市 183.0 312.0 495.0 0.369697 89.003540
66 安徽省 合肥市 76.0 131.0 207.0 0.367150 88.390306
328 陕西省 西安市 111.0 200.0 311.0 0.356913 85.925879
36 吉林省 长春市 49.0 89.0 138.0 0.355072 85.482730
319 重庆 重庆市 161.0 298.0 459.0 0.350763 84.445125
188 河北省 石家庄市 49.0 92.0 141.0 0.347518 83.663949
109 广东省 中山市 29.0 56.0 85.0 0.341176 82.137308
96 山东省 青岛市 90.0 174.0 264.0 0.340909 82.072937
218 浙江省 绍兴市 46.0 89.0 135.0 0.340741 82.032407
116 广东省 汕头市 31.0 60.0 91.0 0.340659 82.012810
208 河南省 郑州市 78.0 159.0 237.0 0.329114 79.233282
108 广东省 东莞市 87.0 197.0 284.0 0.306338 73.750047
92 山东省 烟台市 24.0 76.0 100.0 0.240000 57.779348

By:一只阿木木

05-07 15:47