数据大清洗_Pandas库进阶(TGI指数分析案例)(统计分析案例)

一、TGI指数分析案例

什么是 TGI?
TGI:即 Target Group Index(目标群体指数),可反映目标群体在特定
研究范围(如地理区域、人口统计领域、媒体受众、产品消费者)内的强势或弱势。

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

例如
将某地区 15-24 岁的人作为目标群体,将去[电影网站 A]看电影作为相同特征;
若该地区 15-24 岁的人中,有 8.9%的人去过[电影网站 A]看电影,而在该地区总体人群中,
有6.6%的人去过[电影网站 A]看电影,则[电影网站 A]在 15-24岁人群中的TGI指数是134.9
(8.9%/6.6%×100),其数额越大,就表明目标群体吻合度就越强势。

水平线
TGI 指数表征不同特征用户关注问题的差异情况,其中 TGI 指数等于 100 表示平均水平
高于 100,代表该类用户对某类问题的关注程度高于整体水平。

以下为某品牌的交易订单数据,针对该数据进行 TGI 分析。
在这里插入图片描述
针对数据,可以整理出来不同的统计数据:

 (1)单个用户平均支付金额 
 (2)基于用户支付金额,判断用户是属于低客单还是高客单 
 (3)用透视表的方法来统计每个省市低客单、高客单人数
 (4)计算总人数,以及每个城市对应的高客单占比 
 (5)计算全国总体高客单人数占比 
 (6)计算每个城市高客单 TGI 指数 

代码实现:

# TGI指数:Target Group Index(目标群体指数)可反映目标群体在特定 研究范围(如地理区域、人口统计领域、媒体受众、产品消费者)内的强势或弱势。
# TGI 指数= [目标群体中具有某一特征的群体所占比例/总体中具有相同特征的群体所占 比例]*标准数 100。
# 用来查看该地区不同目标群体对于某问题的关心程度

# 只要牵扯到具体的业务---会有多个观点---合理的解释--思考方向

import pandas as pd

# 加载数据
data = pd.read_excel('./TGI指数案例数据.xlsx')
print('data:\n', data)
print('data的列索引:\n', data.columns)

# (1)单个用户平均支付金额
# 保证:该订单真实存在,且已交易成功
# 不知道存在多少种 订单状态? --查看各个订单状态的数量
print(data['订单状态'].value_counts())
# 交易成功                 27792
# 付款以后用户退款成功,交易自动关闭     1040

"""删除法"""
# # 删除 付款以后用户退款成功,交易自动关闭 这种订单
# # a、确定要删除的订单 行名称
# bool_mask = data.loc[:, '订单状态'] == '付款以后用户退款成功,交易自动关闭'
#
# # b、确定退款订单的 行名称
# index = data.loc[bool_mask, :].index
#
# # c、删除
# data.drop(labels=index, axis=0, inplace=True)


"""保留法"""
# 保留 交易成功 的订单
# a、确定哪些数据是交易成功的
bool_mask = data.loc[:, '订单状态'] == '交易成功'
# b、选中True的
data = data.loc[bool_mask, :]

print('剔除交易失败的数据之后的结果为:\n', data.shape)
print('*' * 100)


# # # 按照 买家昵称 进行分组 ---> 实付金额
# # 给数据修改 新的行索引你 ----reset_index()
print(data.groupby(by='买家昵称')['实付金额'].mean().reset_index())



# (2) 基于用户支付金额,判断该订单 是属于低客单还是高客单
#  针对于每个订单来说的:  ---每次买的东西不一样---决定了订单类别不一样
#  低客单---实付金额较少的
#  高客单---实付金额较多的

# # 均值
# mean = data.loc[:,'实付金额'].mean()
# print('mean:\n',mean)
#
# # 中位数
# median = data.loc[:,'实付金额'].median()
# print('median:\n',median)

# 用 50 作为判定条件
# 每个订单-- 如果 > 50 ---  高客单
# 每个订单-- 如果 < 50 ---  低客单

# # 占位
# data.loc[:, '客户类别'] = '高客户'
#
# # bool数组进行判断
# # 确定哪些订单的 实付金额 > 50 --->设置为 高客单
# # 确定哪些订单的 实付金额 < 50 --->设置为 低客单
# bool_mask_1 = data.loc[:, '实付金额'] >= 50
# bool_mask_2 = data.loc[:, '实付金额'] < 50
# # 修改
# data.loc[bool_mask_1, '客户类别'] = '高客户'
# data.loc[bool_mask_2, '客户类别'] = '低客户'
#
# print('data:\n',data)

# 自定义函数
def if_high(element):
    if element >= 50:
        return '高客户'
    else:
        return '低客户'


data.loc[:, '客户类别'] = data.loc[:, '实付金额'].transform(if_high)
print('data:\n', data)

# (3)用透视表的方法来统计每个省市低客单、高客单 单数
res = pd.pivot_table(data=data,
                     index=['省份', '城市'],
                     columns='客户类别',
                     values='买家昵称',  # 关心的主体,买家昵称出现的次数
                     aggfunc='count')
print('res:\n', res)
print('*' * 100)


# (4)计算该城市总单数,以及每个城市对应的高客单占比
# 将结果转化为熟悉的df
df = res.reset_index()
print('df:\n', df)

# 计算总单量 ---对应城市
# 总单量 = 低客单 + 高客单
df['all'] = df['低客户'] + df['高客户']

# 占比 ---各个城市的高客单 占该城市 总的单数的 占比
df['percent_gao'] = df['高客户'] / df['all']
print(df)
print('*' * 100)


# (5)计算全国总体高客单占比
# 高客单 总数 / 总单量

# 计算
percent_all = df['高客户'].sum() / df['all'].sum()

print('全国高客单占比为:', percent_all)

# 存在NaN --->相乘-->结果为NaN

# (6) 计算每个城市高客单 TGI 指数
# TGI指数 --->该城市高客单的占比 / 全国高客单的占比 * 标准数 100
# df['TGI_city'] = df['percent_gao'] / percent_all * 100
# print('df:\n', df)
# print('*' * 100)
# 哪个城市高客单的TGI指数高---> 该城市进行加大运营力度
# 对TGI指数进行排序 --降序
# df --->按照某列值进行排序
# sort_values 对df进行排序--默认升序排序的--ascending=True
# ascending=False --->降序
# 返回新的排序之后的df
# df指定按照某列进行排序的时候,其他的属性数据会随着该列值的上下移动而移动
# df = df.sort_values(by='TGI_city', ascending=False)
# print('df:\n', df.head(10)[['省份', '城市']])


# 会存在这样问题 可能:下单量太少、而且基本上全是 高客单----》TGI指数会非常大
# 找出TGI指数较高的城市---筛选单量
# a、总单量的平均值 --->获取哪些数据
# > 总单量的平均值 ----提高要求-->高客单的平均值
bool_mask = df['all'] > df['高客户'].mean()
# 再去筛选
df = df.loc[bool_mask, :]

df['TGI_city'] = df['percent_gao'] / percent_all * 100
print('df:\n', df)
print('*' * 100)

df = df.sort_values(by='TGI_city', ascending=False)
print('df高客户占比率较多的城市:\n', df.head(10)[['省份', '城市']])



二、连锁超市统计分析案例

近些年来,国内大型连锁超市如雨后春笋般迸发,对于各个超市来说,竞争压力不可谓
不大,为了拓展、保留客户,各种促销手段应运而生。

以下为国内某连锁超市的成交统计数
据,针对于该数据,挖掘其中价值,为该超市的促销手段提供技术支持。

在这里插入图片描述
针对于该超市数据,可以提出问题:

 (1)哪些类别的商品比较畅销?
 (2)哪些商品比较畅销? 
 (3)求不同门店的销售额占比 
 (4)哪段时间段是超市的客流高峰期? 

代码实现:

import pandas as pd

# 加载数据
order = pd.read_csv('./order.csv', encoding='ansi')
print('order:\n', order)
print('order的列索引:\n', order.columns)
print('*' * 100)

# 因为 销量必须 > 0,才认为卖出商品 ,销量 <0 --->异常的 ---干掉
# 销量 = 0 没有卖出商品---销量的研究无意义 ---干掉
# 删除掉 销量 <= 0 的数据
# a、判断哪些数据的销量 <= 0
bool_mask = order['销量'] <= 0
# b、确定要删除的数据的行名称
index = order.loc[bool_mask, :].index
# c、删除
order.drop(labels=index, axis=0, inplace=True)

print('删除销量异常的数据之后的结果为:\n', order.shape)

# (1) 哪些类别的商品比较畅销?
# 计算各类商品 销量 ---排序
# res = order.groupby(by='类别ID')['销量'].sum().reset_index().sort_values(by='销量', ascending=False)['类别ID'].head(10)
# print('res:\n', res)

# 透视表
res1 = pd.pivot_table(data=order,
                      index='类别ID',
                      values='销量',
                      aggfunc='sum'
                      ).reset_index().sort_values(by='销量', ascending=False)['类别ID'].head(10)

print('畅销商品的类别ID:\n', res1)

# (2)哪些商品比较畅销?---具体的商品
# res = order.groupby(by='商品ID')['销量'].sum().reset_index().sort_values(by='销量', ascending=False)['商品ID'].head(10)
# print('res:\n', res)

# 透视表
res2 = pd.pivot_table(data=order,
                      index='商品ID',
                      values='销量',
                      aggfunc='sum'
                      ).reset_index().sort_values(by='销量', ascending=False)['商品ID'].head(10)

print('畅销商品的ID:\n', res2)


# (3)求不同门店的销售额占比
# 单价 * 销量 ---> 商品具体的销售额
# 按照 门店编号进行分组 ---统计 商品具体的销售额 之和
# 各个门店销售额 / 各个门店销售额之和 ---各个门店的销售额占比
# a、具体商品的销售额 --列
# order.loc[:, '销售额'] = order.loc[:, '单价'] * order.loc[:, '销量']
# print('不同门店的销售额占比:\n', order)
# print('*' * 100)


# # b、按照门店编号进行分组 ---统计销售额之和
res3 = order.groupby(by='门店编号')['销售额'].sum()
print("不同门店的销售额占比\n",res3)


# # 透视表
#
# # c、占比
res_percent = res3 / res3.sum()
#
print('各个门店的占比为:\n', res_percent.apply(lambda x: format(x, '.2%')))


# (4) 哪段时间段是超市的客流高峰期?
#  给定的数据 ---一天内的 --- 时间划分  ---每个小时--认为是一个时间段

# 评价客流???--订单数量

# 查看 订单ID 这一列
# 假设---一个订单---对应一个人
# 统计的是各个时间段内 不同的订单id出现的次数 ----越多,认为客流量越大

# a、时间属性
order.loc[:, '成交时间'] = pd.to_datetime(order.loc[:, '成交时间'])
# 列表推导式
order['hour'] = [i.hour for i in order.loc[:, '成交时间']]

# b、获取不同的订单
# 去重
# ndarray里面---unique-去重
# df去重 ---drop_duplocates --进行去重
# subset 去重的列
# inplace= True --对原df产生影响
# keep='first' --默认保留第一次出现的数据
order.drop_duplicates(subset='订单ID', inplace=True)

print('按照订单id进行去重之后的结果为:\n', order)

# 按照 hour 分组,统计 订单ID 在各个小时内出现的次数
res = order.groupby(by='hour')['订单ID'].count().sort_values(ascending=False)
print('客流高峰期排序:\n', res)

# 早上8 9 10  ---晚上5 6 7 --客流高峰期

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值