这是一份用户消费行为数据,用来分析用户消费情况及品牌情况,可视化消费变化趋势。
数据中中文字符为UTF-8编码,字段分隔符为 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1、进行用户消费趋势分析(按月)(6分)
按照月份分别对消费金额(price)进行求和,对消费人数(user_id)进行计数运算,对运算的进行双折线图画图操作,要求,消费金额与消费人数 进行不同的坐标展示。
每月的消费总金额,每月的消费人数 (1分)
消费金额 单位换算为 万元(1分)
两个折线不同的坐标(1分)
中文显示 (1分)
结果截图:
从图中可以得出的结论描述:(2分)
由上面双折线图可知:消费人数与消费金额呈现正相关,其中消费人数和消费金额在8月份和10月份出现了双峰值,特别是8月份达到一年消费顶峰,消费人数为81974人次,消费金额达到2550万元。主要是电子产品在暑假期间和国庆节假电子产品消费需求旺盛。
代码:
def month_analysis():
data_month = data.groupby('montha')
data_month_amount = data_month['price'].sum()/10000
data_month_user = data_month['user_id'].count()
amount_user = pd.merge(data_month_amount, data_month_user, left_index=True, right_index=True)
# print(amount_user)
fig, ax1 = plt.subplots()
ax1.plot(amount_user.iloc[:, 0], c='b', label="消费金额(万元)")
plt.legend(loc=2)
# 创建第二个坐标轴
ax2 = ax1.twinx()
ax2.plot(amount_user.iloc[:, 1], c='r', label="消费人数")
plt.legend(loc=1)
plt.title('每月的消费金额/消费人数折线图')
fig.autofmt_xdate(rotation=35)
fig.text(0.5, 0.05, "月份", fontsize=12)
plt.show()
2.1
、用户消费次数、消费金额散点图 4分
按照用户id(user_id)分别对消费金额(price)进行求和,对消费次数(event_type)进行计数运算,并对用户消费金额和消费次数进行 散点图画图操作,消费次数作为X轴,消费金额做Y轴。
其中对 price求和后显示为 消费金额
对event_type计数后的显示为 消费次数要求:
1)X轴是消费次数,Y轴是消费金额(1分)
2)画出散点图(1分)
3)中文显示(1分)
结果截图:
从图中可以得出的结论描述:(1分) 消费次数与消费金额呈现正相关,随着消费次数的增长,消费用户明显减少。
代码截图:
def user_consumption_analysis1():
group_user = data.groupby(['user_id'])
plt.scatter(group_user.size(), group_user.sum()['price'], c='blue')
plt.xlabel('消费次数')
plt.ylabel('消费金额(元)')
plt.title('用户消费金额和消费次数的散点图')
plt.show()
2.2、统计总的用户数,用户累计消费金额占比 5分
按照用户id(user_id)分别对消费金额(price)进行求和,并对用户消费金额按照有小到大排序,然后进行累计占比分析。并与折线趋势图进行绘制图形单独统计出 统计总的用户,一个user_id是一个用户(不要求绘制在图形上)。要求:累计占比公式为(累计sum)/总的sum
1)统计总的用户,一个user_id是一个用户(不要求绘制在图形上)(1分)。
2)X轴是人数,Y轴是消费金额累计占比(1分)
3)画出折线图(1分)
结果截图:
统计总的用户数 截图
总的用户数:89919
2) 可视化截图:
得出的分析结论描述: (2分)
按照用户消费金额进行升序排列,并进行累计求和,可以发现:50%的用户约贡献了10%的消费额度,而排名前10000的用户约贡献了60%的消费额
代码:
def user_consumption_analysis2():
user_count = data.groupby(['user_id']).size().count()
print("总的用户数:%s" % user_count)
group_user = data.groupby(['user_id'])
user_cumsum = group_user.sum().sort_values('price').cumsum() / group_user.sum().sort_values('price').sum()
print(user_cumsum)
user_cumsum.reset_index().head()
plt.plot(range(0, 89919), user_cumsum['price'], color='blue')
plt.xlabel('消费人数')
plt.ylabel('消费金额累计占比(%)')
plt.title('消费人数与消费金额累计占比折线图')
plt.show()
完整代码:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
@author:zsw
@file:data_analysis.py
@time:2021/10/13
@function:2021安徽省大数据与人工智能应用竞赛网络赛赛题第四部分:可视化
"""
import pandas as pd
from matplotlib import rcParams
import warnings
import matplotlib.pyplot as plt # matplotlib.use('agg')必须在本句执行前运行
# matplotlib.use("Agg") # 输出时不显示绘图
rcParams['font.family'] = 'simhei' # 可以让图像中显示中文(黑体),无需引用
rcParams['axes.unicode_minus'] = False # 解决负数坐标显示问题
warnings.filterwarnings('ignore')
data = pd.read_table("./data/kz.txt", sep='@@', encoding='utf-8')
# print(data.head()) # 数据洞察:打印前五列数据
# print(data.info()) # 检查数据是否有空值,经检查结果没有空值
# print(data.mode())
# print(data['price'].describe()) # 查看价格的描述
"""
从用户购买的金额来看,每个用户平均贡献的金额为251,而最大值达到了12083,证明用户的购买金额也是服从长尾分布的,
符合二八原则,即20%的用户贡献了80%的交易额。
"""
def month_analysis():
data_month = data.groupby('montha')
data_month_amount = data_month['price'].sum()/10000
data_month_user = data_month['user_id'].count()
amount_user = pd.merge(data_month_amount, data_month_user, left_index=True, right_index=True)
# print(amount_user)
fig, ax1 = plt.subplots()
ax1.plot(amount_user.iloc[:, 0], c='b', label="消费金额(万元)")
plt.legend(loc=2)
# 创建第二个坐标轴
ax2 = ax1.twinx()
ax2.plot(amount_user.iloc[:, 1], c='r', label="消费人数")
plt.legend(loc=1)
plt.title('每月的消费金额/消费人数折线图')
fig.autofmt_xdate(rotation=35)
fig.text(0.5, 0.05, "月份", fontsize=12)
plt.show()
"""
由上面双折线图可知:消费人数与消费金额呈现正相关,其中消费人数和消费金额在8月份和10月份出现了双峰值,
特别是8月份达到一年消费顶峰,消费人数为81974人次,消费金额达到2550万元。主要是电子产品在暑假期间和国庆节假电子产品消费需求旺盛。
"""
def user_consumption_analysis1():
group_user = data.groupby(['user_id'])
plt.scatter(group_user.size(), group_user.sum()['price'], c='blue')
plt.xlabel('消费次数')
plt.ylabel('消费金额(元)')
plt.title('用户消费金额和消费次数的散点图')
plt.show()
"""
消费次数与消费金额呈现正相关,随着消费次数的增长,消费用户明显减少。
"""
def user_consumption_analysis2():
user_count = data.groupby(['user_id']).size().count()
print("总的用户数:%s" % user_count)
group_user = data.groupby(['user_id'])
user_cumsum = group_user.sum().sort_values('price').cumsum() / group_user.sum().sort_values('price').sum()
print(user_cumsum)
user_cumsum.reset_index().head()
plt.plot(range(0, 89919), user_cumsum['price'], color='blue')
plt.xlabel('消费人数')
plt.ylabel('消费金额累计占比(%)')
plt.title('消费人数与消费金额累计占比折线图')
plt.show()
"""
按照用户消费金额进行升序排列,并进行累计求和,可以发现:50%的用户约贡献了10%的消费额度,而排名前10000的用户约贡献了60%的消费额
"""
def update_user_consumption_analysis2():
user_count = data.groupby(['user_id']).size().count()
print("总的用户数:%s" % user_count)
group_user = data.groupby(['user_id'])
price_sum = group_user.sum()['price'].reset_index(name='value')
price_sum = price_sum.sort_values(['value'], ascending=True)
price_sum['rate'] = price_sum['value'] / price_sum['value'].sum() * 100
# print(price_sum)
data_group = get_cutdata(price_sum)
plt.plot(data_group['count'], data_group['normal'])
plt.xlabel('消费人数')
plt.ylabel('消费金额累计占比(%)')
plt.title('消费人数与消费金额累计占比折线图')
plt.show()
def get_cutdata(price_sum):
amount_rate = price_sum['rate'].values.tolist()
# print(amount_rate)
sample = pd.DataFrame({'normal': amount_rate})
bins = [0.00, 0.02, 0.04, 0.06, 0.08, 0.10]
labels = ['0.02以下', '0.02-0.04', '0.04-0.06', '0.06-0.08', '0.08-0.10']
data = (pd.cut(sample.normal, bins=bins, labels=labels, duplicates="drop")).to_frame()
data_group = data.groupby(['normal']).size().reset_index(name='count')
print(data_group)
return data_group
if __name__ == '__main__':
# 每月的消费金额/消费人数折线图
month_analysis()
# 用户消费金额和消费次数的散点图绘制
user_consumption_analysis1()
# 人数与消费金额累计占比折线图绘制
user_consumption_analysis2()
# 第二种理解,重新绘制人数与消费金额累计占比折线图绘制(这种理解是错误的,费时费力)
update_user_consumption_analysis2()