百货商场用户画像描绘与价值分析附录

🌟欢迎来到 我的博客 —— 探索技术的无限可能!


🌟博客的简介(文章目录)

文章:百货商场用户画像描绘与价值分析
附录:百货商场用户画像描绘与价值分析附录

内容概述

本项目内容主要是基于Python的“百货商场用户画像描述与价值分析”,里面有详细的数据预处理、数据可视化和数据建模等步骤。同时,针对传统RFM模型进行了改进,构造了LRFMP模型来分析客户价值,挖掘客户价值的八个字段,并通过WordCloud形式展现了出来,可以对会员用户进行精准画像。

数据说明

数据集分为两部分,.xlsx结尾的是会员信息表,.csv结尾的是销售流水表。其中,会员信息表共有将近19万条记录,销售流水表共有接近189万条记录。

两个表包含了如会员卡号,消费产生时间,性别,出生时间,商品编码,销售数量,商品售价,消费金额,商品名称,此次消费的会员积分,收银机号,单据号,柜组编码,柜组名称,等级时间等 15 个特征。

  • L(入会程度):3个月以下为新用户,4-12个月为中等用户,13个月以上为老用户
  • R(最近购买的时间)
  • F(消费频次):次数20次以上的为高频消费,6-19次为中频消费,5次以下为低频消费
  • M(消费金额):10万以上为高等消费,1万-10万为中等消费,1万以下为低等消费
  • P(消费积分):10万以上为高等积分用户,1万-10万为中等积分用户,1万以下为低等积分用户

实现目标

本项目主要围绕着“百货商店会员用户画像描绘与价值分析”内容进行,结合目前百货商场的数据情况,可以实现以下目标:

  1. 借助百货商场会员用户数据,对会员用户进行分群。
  2. 对不同的会员用户类别进行特征分析,比较不同类别会员用户的会员用户价值。
  3. 对不同价值的会员用户类别提供个性化服务,制定相应的营销策略。

技术点

  • 数据预处理(Pandas):包括去重去缺失值、异常值处理、变量重编码和时间序列数据处理方式等;
  • 数据可视化(Matplotlib):饼图、柱状图、折线图、雷达图和复合图等绘制方式等;
  • 特征创造和数据建模:从海量连续数据中创造出性别、消费偏好、入会程度、最近购买的时间、消费频次、消费金额、消费积分等类别数据,建模部分主要通过标准化和归一化数据来对比KMeans聚类的轮廓系数结果。

代码运行说明

注意:运行此文件后会生成一些中间数据集以及相关图片

附录

import matplotlib
import warnings
import re
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
from sklearn.preprocessing import StandardScaler, MinMaxScaler

%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
matplotlib.rcParams.update({
   'font.size' : 16})
plt.style.use('ggplot')
warnings.filterwarnings('ignore')

1.项目背景
1.1 项目背景与挖掘目标

# 查看会员信息表
df_cum = pd.read_excel('./cumcm2018c1.xlsx')
df_cum
# 查看销售流水表
df_sale = pd.read_csv('./cumcm2018c2.csv', encoding = 'utf8')
df_sale

2 数据探索与预处理
2.1 结合业务对数据进行探索并进行预处理

print('会员信息表一共有{}行记录,{}列字段'.format(df_cum.shape[0], df_cum.shape[1]))
print('数据缺失的情况为:\n{}'.format(df_cum.isnull().mean()))
print('会员卡号(不重复)有{}条记录'.format(len(df_cum['会员卡号'].unique())))
# 会员信息表去重
df_cum.drop_duplicates(subset = '会员卡号', inplace = True)
print('会员卡号(去重)有{}条记录'.format(len(df_cum['会员卡号'].unique())))

# 去除登记时间的缺失值,不能直接dropna,因为我们需要保留一定的数据集进行后续的LRFM建模操作
df_cum.dropna(subset = ['登记时间'], inplace = True)
print('df_cum(去重和去缺失)有{}条记录'.format(df_cum.shape[0]))
# 性别上缺失的比例较少,所以下面采用众数填充的方法
df_cum['性别'].fillna(df_cum['性别'].mode().values[0], inplace = True)
df_cum.info()
# 检验是否在“登记时间”这一字段上是否存在异常值,若存在异常值,则无法进行基础的运算操作,下面操作能正常执行,说明不存在异常值
df = df_cum['登记时间'] + pd.Timedelta(days = 1)
df
# 查看处理后数据缺失值情况
df_cum.isnull().mean()
L = pd.DataFrame(df_cum.loc[df_cum['出生日期'].notnull(), ['出生日期', '性别']])
L['年龄'] = L['出生日期'].astype(str).apply(lambda x: x[:3] + '0')
L.drop('出生日期', axis = 1, inplace = True)
L['年龄'].value_counts()
# 出生日期这列值出现较多的异常值,以一个正常人寿命为100年算起,我们假定会员年龄范围在1920-2020之间,将超过该范围的值当作异常值进行剔除
L['年龄'] = L['年龄'].astype(int)
condition = "年龄 >= 1920 and 年龄 <= 2020"
L = L.query(condition)
L.index = range(L.shape[0])
L['年龄'].value_counts()
# 用于与销售流水表进行合并的数据只取['会员卡号', '性别', '登记时间']这三列,将出生日期这列意义不大的进行删除(这列信息最有可能出错),并重置索引
df_cum.drop('出生日期', axis = 1, inplace = True)
df_cum.index = range(df_cum.shape[0])
print('数据清洗之后共有{}行记录,{}列字段,字段分别为{}'.format(df_cum.shape[0], df_cum.shape[1], df_cum.columns.tolist()))
df_cum
df_sale.columns
df_sale.info()
# 销售数量全部大于0
print('销售数量大于0的记录有:{}\t 全部记录有:{}\t 两者是否相等:{}'.format(len(df_sale['销售数量'] > 0), 
                                                     df_sale.shape[0], len(df_sale['销售数量'] > 0) == df_sale.shape[0]))

# 销售金额也全部大于0,说明两者不会对后者特征创造时产生影响
print('销售金额大于0的记录有:{}\t 全部记录有:{}\t 两者是否相等:{}'.format(len(df_sale['消费金额'] > 0), 
                                                     df_sale.shape[0], len(df_sale['消费金额'] > 0) == df_sale.shape[0]))
# 查看是否存在缺失值
df_sale.isnull().mean()
df_sale_clearn = df_sale.dropna(subset = ['会员卡号'])
df_sale_clearn.isnull().mean()
df_sale_clearn.drop(['收银机号', '柜组编码', '柜组名称'], axis = 1, inplace = True)
# 重置索引
df_sale_clearn.index = range(df_sale_clearn.shape[0])

type(df_sale_clearn) == type(df_cum)

2.2 将会员信息表和销售流水表关联与合并

# 重新查看一下各个数据集的长度
print(f'会员信息表中的记录为{
     len(df_cum)}\t销售流水表中的记录为{
     len(df_sale_clearn)}')
# 按照会员卡号将两张表里的信息进行合并,使用左连接合并,获得一个既包含会员信息,又包含非会员信息的数据
df = pd.merge(df_sale_clearn, df_cum, on = '会员卡号', how = 'left')
df
# 这里再次查看“消费金额”>0,“积分”>0,“销售数量”>0
index1 = df['消费金额'] > 0
index2 = df['此次消费的会员积分'] > 0
index3 = df['销售数量'] > 0
df1 = df.loc[index1 & index2 & index3, :]
df1.index = range(df1.shape[0])
df1.shape
# 创造一个特征字段,判断是否为会员,1表示为会员,0表示不为会员
df1['会员'] = 1
df1.loc[df1['性别'].isnull(), '会员'] = 0
df1.head()

3 统计分析
3.1 分析会员的年龄构成、男女比例等基本信息

# 处理男女比例这一列,女表示0,男表示1
L['性别'] = L['性别'].apply(lambda x: '男' if x == 1 else '女')

sex_sort = L['性别'].value_counts()
sex_sort
# 可以将年龄划分为老年(1920-1950)、中年(1960-1990)、青年(1990-2010),再重新绘制一个饼图,
L['年龄段'] = '中年'
L.loc[L['年龄'] <= 1950, '年龄段'] = '老年'
L.loc[L['年龄'] >= 1990, '年龄段'] = '青年'
res = L['年龄段'
  • 26
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZShiJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值