今日课程内容
-
内容回顾
-
作业讲解
-
Tableua的参数
- 动态参考线
- 图表数据切换
- 日期切换
- 图表切换
-
电商的数据分析案例
- 筛选月份较佳数据
- 客单价
- 客户行为分析-RFM
今日内容详细
内容回顾
1.Tableua的基本操作
a.链接数据源
b.文件栏的使用(左边)
c.中间: 标识 (颜色、大小、标签、详细信息、工具提示)
筛选框的使用
d.基本图形展示
条形图
e.地图分析
地理角色
地图层
中国领土不可分割
2.Tableua的构建图形
a.表格
修改标签文本为指定列名
多个数据的展示:度量名称、度量值
b.条形图
c.折线图
d.饼图
e.空心饼图
f.树状图
g.热图
h.直方图-(数据桶)
i.靶心图
j.气泡图
k.文字云
l.盒须图
...
3.Tableua的计算
聚合函数
if...else
case...when
ifnull
字符串
日期
作业讲解
1.利用contains函数,筛选出包含'白'的名字
2.计算出生的天数
定义新的字段:出生日期
3.计算城市发货的天数
DATEDIFF 计算发货日期与订单日期之间的差值
4.给定时间,计算所在季度的天数
step1.获得该日期所在的季度(DATETRUNC)
step2.用下一季度的时间,减去这个季度的时间(DATEDIFF)
Tableua的参数
1、动态参考线
step1:创建参数,作为参考线的值(浮点)
step2:将参考线与参数结合
step3:颜色分层
2、图表数据切换
step1:字符串-列表类型
step2:
划分成指定的数据
1 利润
2 销售额
3 数量
...
step3:
设置
3、日期数据切换
将日期以年、月、日的形式进行筛选
step1:创建年、月、日
step2:创建参数:
1 年
2 月
3 日
step3:设置为精确日期
4、图表切换
step1:创建参数
1 地图分析
2 产品分析
3 地区分析
step2:
通过筛选器,进行操作
电商数据案例
'''
数据的来源:
某英国的kaggle电商公司的数据,主要产品是零售批发
数据的字段
InvoiceNo: 订单号
StockCode: 商品编号
Description: 商品描述
Quantity: 数量
InvoiceDate 日期
UnitPrice 单价
CustomerID 客户id
Country 国家
分析的需求?
1.购买商品数前十的国家是?
2.交易额前十的国家是?
3.哪些月份销量较佳?
4.客单价多少?
5.用户消费行为分析
'''
'''
数据分析的基本步骤
1、加载数据
2、观察数据
3、数据处理:数据清洗
4、建模(完成KPI)
5、可视化
6、总结报告
'''
import matplotlib.pyplot as plt
import pandas as pd
plt.rcParams['font.sans-serif'] = ['FangSong']
print('----------------step1:加载数据----------------')
df = pd.read_csv('data.csv', dtype=object)
print('----------------step2:观察数据----------------')
print('列名:\n', df.columns)
print()
print('数据类型:\n',df.dtypes)
print()
print('形状:\n',df.shape)
print()
print('索引:\n', df.index)
print()
print('非空统计-计数:\n', df.count())
print()
# 一般无效,数据的类型没有做转换,所以一般先对数据进行清洗
# print('描述性统计:\n', df.describe())
# print()
print('前5条数据:\n', df.head())
print()
print('数据的基本信息:\n',df.info())
'''
通过数据观察,初步了解以下问题
问题:
1、数据类型有问题
2、数据存在缺失值
3、数据有异常(有负数的数据,退货数据,不需要去分析)
4、缺少金额一列
'''
print('----------------step3:数据处理-数据清洗----------------')
'''
一般在做数据分析前,需要对数据进行处理操作,保证数据的准确性
数据清洗主要包括:
1、缺失值处理
2、异常值处理
3、重复值处理
4、子集的选择
5、类型的转换
6、重命名
7、数据排序
8、字段统一化
'''
'''
1、缺失值处理
'''
df.dropna(inplace=True)
'''
2、类型转换
'''
df['Quantity'] = df['Quantity'].astype(float)
df['UnitPrice'] = df['UnitPrice'].astype(float)
df['InvoiceDate'] = pd.to_datetime(df['InvoiceDate'])
'''
3、异常值处理:去除负数的数据
'''
df = df[ df['Quantity']>=0 ]
print(df.describe())
'''
4、重命名:不需要
df.rename(columns={旧名:新名...})
'''
'''
5、排序
'''
df.sort_values(by='InvoiceDate', inplace=True, ignore_index=True)
'''
6、子集的选择
'''
df['money'] = df['Quantity']*df['UnitPrice']
print(df.head())
'''
7、字段统一化
usa USA 是同一个国家,但是不进行同一化处理,会影响结果
USA
USA
apply(处理函数)
处理函数:去除前后空格,全部转换成大写
'''
df['Country'] = df['Country'].str.upper()
df['Country'] = df['Country'].str.strip()
print(df['Country'])
# 先拷贝元数据
kpi_df = df.copy()
# print('----------------step4:建模,完成KPI----------------')
# plt.figure('kaggle电商数据分析', figsize=(6.4*1.5,4.8*1.5))
# # 封装代码
# def kpi(column, i, kpi_title):
# # kpi1:购买商品数前十的国家是?
# kpi1_data = kpi_df.groupby(by='Country')[[column]].sum()
# kpi1_data.sort_values(by=column, ascending=False,inplace=True)
# top_ten_quantity = kpi1_data[:10]
# print(top_ten_quantity)
# plt.subplot(2,2,i)
# plt.title(kpi_title)
# if i in [1,3]:
# plt.xlabel('国家', fontsize=10)
# plt.ylabel('数量', fontsize=10)
# plt.xticks(rotation=90)
# plt.bar(top_ten_quantity.index, top_ten_quantity[column])
# else:
# plt.xlabel('数量', fontsize=10)
# plt.ylabel('国家', fontsize=10)
# plt.barh(top_ten_quantity.index, top_ten_quantity[column])
#
# kpi('Quantity',1,'购买商品数前十的国家是?')
# kpi('Quantity',2,'购买商品数前十的国家是?')
# kpi('money', 3, '交易额前十的国家是?')
# kpi('money', 4, '交易额前十的国家是?')
# plt.show()
# # kpi2:交易额前十的国家是?
# # kpi3:哪些月份销量较佳?
# print('==============================3.哪些月份销量较佳?==================================')
# kpi3_data = kpi_df.groupby(by=df['InvoiceDate'].dt.month)[['Quantity']].sum()
# kpi3_data.sort_values(by='Quantity', ascending=False,inplace=True)
# print(kpi3_data)
#
# # 4.客单价多少?
# # 计算出总的客户
# # 计算出总的金额
# print('==============================4.客单价多少?==================================')
# new_df = kpi_df.drop_duplicates('CustomerID')
# total_ct = new_df['CustomerID'].count()
# print('总的客户量:',total_ct)
# total_money = kpi_df['money'].sum()
# print('总的金额:', total_money)
# print('KPI4 客单价:',(total_money/total_ct))
print('==============================5.用户消费行为分析==================================')
# RFM模型
'''
R:最近一次消费日期
'''
import datetime
print('============================R==========================')
R_DATA = kpi_df.groupby(by='CustomerID')[['InvoiceDate']].max()
R_DATA['天数'] = datetime.datetime.today()- R_DATA['InvoiceDate']
# step1:计算组距
max_time = R_DATA['天数'].max()
min_time = R_DATA['天数'].min()
R_ZJ = (max_time-min_time)/5
team1 = (min_time, min_time+R_ZJ)
team2 = (min_time+R_ZJ ,min_time+2*R_ZJ)
team3 = (min_time+2*R_ZJ, min_time+3*R_ZJ)
team4 = (min_time+3*R_ZJ, min_time+4*R_ZJ)
team5 = (min_time+4*R_ZJ, max_time)
R_DATA.loc[(R_DATA['天数']>=team1[0]) & (R_DATA['天数']<team1[1]), 'R'] = 5
R_DATA.loc[(R_DATA['天数']>=team2[0]) & (R_DATA['天数']<team2[1]), 'R'] = 4
R_DATA.loc[(R_DATA['天数']>=team3[0]) & (R_DATA['天数']<team3[1]), 'R'] = 3
R_DATA.loc[(R_DATA['天数']>=team4[0]) & (R_DATA['天数']<team4[1]), 'R'] = 2
R_DATA.loc[(R_DATA['天数']>=team5[0]) & (R_DATA['天数']<=team5[1]), 'R'] = 1
R_DATA['R_S'] = R_DATA['R'].mean()
R_DATA.loc[R_DATA['R']>=R_DATA['R_S'],'R价值评估'] = '高'
R_DATA.loc[R_DATA['R']<R_DATA['R_S'],'R价值评估'] = '低'
R_DATA['客户'] = R_DATA.index
'''
F:消费频率
'''
print('============================F==========================')
F_DATA = kpi_df.groupby(by='CustomerID')[['CustomerID']].count()
max_ci = F_DATA['CustomerID'].max()
min_ci = F_DATA['CustomerID'].min()
F_ZJ = (max_ci-min_ci)/5
team1 = (min_ci, min_ci+F_ZJ)
team2 = (min_ci+F_ZJ ,min_ci+2*F_ZJ)
team3 = (min_ci+2*F_ZJ, min_ci+3*F_ZJ)
team4 = (min_ci+3*F_ZJ, min_ci+4*F_ZJ)
team5 = (min_ci+4*F_ZJ, max_ci)
F_DATA.loc[(F_DATA['CustomerID']>=team1[0]) & (F_DATA['CustomerID']<team1[1]),'F'] = 1
F_DATA.loc[(F_DATA['CustomerID']>=team2[0]) & (F_DATA['CustomerID']<team2[1]),'F'] = 2
F_DATA.loc[(F_DATA['CustomerID']>=team3[0]) & (F_DATA['CustomerID']<team3[1]),'F'] = 3
F_DATA.loc[(F_DATA['CustomerID']>=team4[0]) & (F_DATA['CustomerID']<team4[1]),'F'] = 4
F_DATA.loc[(F_DATA['CustomerID']>=team5[0]) & (F_DATA['CustomerID']<=team5[1]),'F'] = 5
F_DATA['F_S'] = F_DATA['F'].mean()
F_DATA.loc[F_DATA['F']>=F_DATA['F_S'],'F价值评估'] = '高'
F_DATA.loc[F_DATA['F']<F_DATA['F_S'],'F价值评估'] = '低'
F_DATA['客户'] = F_DATA.index
'''
M:消费金额
'''
print('============================M==========================')
M_DATA = kpi_df.groupby(by='CustomerID')[['money']].sum()
max_money = M_DATA['money'].max()
min_money = M_DATA['money'].min()
M_ZJ = (max_money-min_money)/5
team1 = (min_money, min_money+M_ZJ)
team2 = (min_money+M_ZJ ,min_money+2*M_ZJ)
team3 = (min_money+2*M_ZJ, min_money+3*M_ZJ)
team4 = (min_money+3*M_ZJ, min_money+4*M_ZJ)
team5 = (min_money+4*M_ZJ, max_money)
M_DATA.loc[(M_DATA['money']>=team1[0]) & (M_DATA['money']<team1[1]),'M'] = 1
M_DATA.loc[(M_DATA['money']>=team2[0]) & (M_DATA['money']<team2[1]),'M'] = 2
M_DATA.loc[(M_DATA['money']>=team3[0]) & (M_DATA['money']<team3[1]),'M'] = 3
M_DATA.loc[(M_DATA['money']>=team4[0]) & (M_DATA['money']<team4[1]),'M'] = 4
M_DATA.loc[(M_DATA['money']>=team5[0]) & (M_DATA['money']<=team5[1]),'M'] = 5
M_DATA['M_S'] = M_DATA['M'].mean()
M_DATA.loc[M_DATA['M']>=M_DATA['M_S'],'M价值评估'] = '高'
M_DATA.loc[M_DATA['M']<M_DATA['M_S'],'M价值评估'] = '低'
M_DATA['客户'] = M_DATA.index
rf_data = pd.merge(R_DATA,F_DATA)
RFM = pd.merge(rf_data, M_DATA)
NB_CUS = RFM[(RFM['R价值评估'] == "高") & (RFM['F价值评估'] == "高") & (RFM['M价值评估'] == "高")]
print('高价值客户')
print(NB_CUS)