2021年安徽省大数据与人工智能应用竞赛大数据(网络赛)-本科组赛题第四部分可视化

第四部分:可视化(15分)

这是一份用户消费行为数据,用来分析用户消费情况及品牌情况,可视化消费变化趋势。

数据中中文字符为UTF-8编码,字段分隔符为 @@

列名

说明

montha

购买月份

user_id

用户ID

event_type

行为类别

product_id

产品编号

category_id

产品的类别id

category_code

产品的类别分类法

brand_name

品牌

price

产品价格(单位:元)

1、进行用户消费趋势分析(按月)(6分)

按照月份分别对消费金额(price)进行求和,对消费人数(user_id)进行计数运算,对运算的进行双折线图画图操作,要求,消费金额与消费人数 进行不同的坐标展示。

  1. 每月的消费总金额,每月的消费人数  (1分)
  2. 消费金额 单位换算为 万元(1分)
  3. 两个折线不同的坐标(1分)
  4. 中文显示 (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、用户个体消费分析(9分)

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分)

结果截图:
  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()

2021年安徽省大数据与人工智能应用竞赛人工智能(网络赛)-本科组赛题 

猜你喜欢

转载自blog.csdn.net/weixin_40547993/article/details/120841820