泰迪杯A题通讯产品销售和盈利能力分析一等奖作品

2022-11-12 17:26:55 浏览数 (1)

泰迪杯A题通讯产品销售和盈利能力分析一等奖作品

  • 1. A 题 通讯产品销售和盈利能力分析
    • 一、背景
    • 二、目标
    • 三、
      • 任务 1 数据分析与预测
      • 任务 2 可视化展示和撰写分析报告
    • 四、关于竞赛成果提交的说明
  • 2. 一等奖作品分享
    • 摘要
    • 目录
    • 正文
      • 任务一:数据分析与预测
        • 1.1.1 缺失值重复值处理和说明
        • 1.1.2 统计各年度各国销售额数据&计算同比增长率
        • 1.1.3显示2020年度销售额Top3的国家及其年增长率
        • 1.1.4 统计各年度各国利润数据&计算同比增长率
        • 1.1.5统计各年度各服务分类销售额数据&计算同比增长率
        • 1.1.6统计各年度各服务分类利润数据&计算同比增长率
        • 1.2.1统计各地区,国家有关服务分类销售额和利润数据
        • 1.2.2展示各地区有关服务分类利润数据
        • 1.3.1统计各个销售经理的成交合同数和成交率
        • 1.3.2展示销售经理成交合同数Top3的数据
        • 1.4.1对数据进行预处理及编码, 给出明确的预测模型
        • 1.4.2预测2021年第一季度各个地区,国家,服务分类的销售额和利润
        • 1.4.3展示地区,国家,服务分类销售额预测的最大值
      • 任务2:可视化展示及分析
        • 2.1.1绘制非洲各国产品销售地图
        • 2.1.2绘制非洲各国产品销售额和利润数据图表
        • 2.2.1绘制各服务分类的销售额和利润的年增长率
        • 2.2.2绘制各服务分类的销售额和利润的季度增长率
        • 2.3绘制2021年第一季度各服务分类的销售额和利润预测值的图标
        • 2.4绘制销售经理销售合同数Top5
        • 2.5绘制国家销售额后10名
        • 2.6.1设计数字大屏
        • 2.6.1分析公司产品销售情况和盈利能力,并给出指导建议

感谢商丘师范学院的高老师,韩老师,陈老师等提供的比赛作品数据

1. A 题 通讯产品销售和盈利能力分析 简介

一、背景

进入本世纪以来,我国通讯产品得到了飞速发展,其技术先进,价格便宜, 深受世界各国和地区尤其是非洲国家的欢迎。某通讯公司在非洲的多个国家深耕多年,产品与服务遍布整个非洲大陆。为了更好地了解公司的销售情况,采用产品的销售额和利润数据,对其盈利能力进行分析和预测,给决策人员提供分析报告,以便为非洲各国提供更好的产品销售策略和服务。

二、目标

  1. 统计产品在当地的销售数据,预测未来的销售情况。
  2. 设计可视化数字大屏,展示产品的销售情况,分析产品的盈利能力。

三、任务

请根据附件中提供的数据(其中,金额计量单位:万元;合同数计量单位: 个),自行选择分析工具完成以下任务,并撰写报告。如使用“TipDM-BI 数据分析和可视化平台”实现,使用方式详见附录。

任务 1 数据分析与预测

根据附件“非洲通讯产品销售数据”中的数据,分别实现以下任务: 任务 1.1 统计各个年度/季度中,地区、国家、服务分类的销售额和利润数 据,并计算各国、各服务分类销售额和利润的同比增长率。 任务 1.2 统计各地区、国家有关服务分类销售额和利润数据。 任务 1.3 统计各个销售经理的成交合同数和成交率。 任务 1.4 分别预测各个地区、国家、服务分类 2021 年第一季度销售额和利 润。

任务 2 可视化展示和撰写分析报告

对各地区、国家、服务分类的产品销售额和利润等数据,以及销售经理的业绩数据,进行同比、类比、相关性等分析或预测,发现趋势。根据分析和预测结果,设计一个数字大屏,根据目标,合理布局,展示能够代表产品销售情况和盈利能力的数据指标和可视化图表等。 在下面任务不同的维度分析中,必要时,可以设置选择框,使用联动的方式,根据选择框,查看和展示该选择框范围的数据和可视化图表。例如,设立国家选择框,选项包括“全部”和国家名称,可以查看全部或某个国家的指标数据和可视化图表。其他类推。

数字化大屏至少包括以下任务: 任务 2.1 绘制非洲各国产品的销售地图,并能够查看该国的销售额和利润。 根据销售额的降序排列,绘制非洲各国产品销售额和利润数据的图表。 任务 2.2 根据地区、国家等维度,绘制各服务分类的销售额和利润的年增 长率及各季度同比增长率的图表。 任务 2.3 根据地区、国家等维度,绘制 2021 年第一季度各服务分类的销售 额和利润预测值的图表。 任务 2.4 绘制销售经理的销售合同数前 5 名排行榜。 任务 2.5 绘制销售额后 10 名的国家排行榜。 任务 2.6 分析数字大屏的指标数据和图表,撰写公司产品的销售情况和盈 利能力的分析报告。

四、关于竞赛成果提交的说明

  1. 登录方式 请使用队长的账号登录数睿思网站(www.tipdm.org),进入第四届技能赛页面。为保证成功提交,请使用谷歌浏览器无痕模式。
  2. 作品提交 报告以 PDF 格式提交,文件名为“report.pdf”,要求逻辑清晰、条理分 明,内容包括每个任务的完成思路、操作步骤、必要的中间过程、任务的结果及分析。 针对任务 1,报告中应包含但不限于如下要点: (1) 任务 1.1 需要展示 2020 年年度销售额前 3 名的国家及其年增长率。 (2) 任务 1.2 需要展示各地区有关服务分类利润数据。 (3) 任务 1.3 需要展示销售经理成交合同数前 3 名的数据。 (4) 任务 1.4 需要给出明确的预测模型,并展示地区、国家、服务分类 销售额预测值最大的 1 条数据。
  3. 附件提交 3.1 将任务 1、2 所编写的源程序文件,分别用“task1”、“task2”命名,保存在“program”文件夹中;如使用 TipDM-BI 数据分析和可视化平台实现,将使用平台创建的自助仪表盘截图保存到“program”文件夹中。 3.2 将任务 1、2 所产生的结果文件,分别保存到“result1”,“result2”文件夹,然后存放到“result”文件夹中。 3.3 将程序文件夹“program”、结果文件夹“result”以及报告的 word版本打包成“appendix.zip”,作为附件提交。

2. 一等奖作品分享

摘要

进入本世纪以来,我国通讯产品得到了飞速发展,其技术先进,价格便宜,深受世界各国和地区尤其是非洲国家的欢迎。某通讯公司在非洲的多个国家深耕多年,产品与服务遍布整个非洲大陆。为了更好地了解公司的销售情况,采用产品的销售额和利润数据,对其盈利能力进行分析和预测,给决策人员提供分析报告,以便为非洲各国提供更好的产品销售策略和服务。

针对任务一,首先对所给数据集进行缺失值、异常值、重复值等 方面的处理。其次通过python中的loc和groupby等函数,对表SalesData进行处理,获取产品在当地的销售数据,分析统计出各年度各国销售额和利润的同比增长率,以及各年度各服务分类的销售额和利润的同比增长列率,利用groupby函数对“地区”,“国家”,“服务分类”进行分组,统计出销售额和利润数据。针对表SalespersonData,首先计算出每个经理的总合同数,再通过各个经理的成交合同数求出各个经理的成交率。根据2017-2020年第一季度的各个地区,国家,服务分类的销售额和利润数据,给出明确的预测模型,预测出2021年第一季度销售额和利润数据。

针对任务二,首先对各个地区,国家,服务分类的产品销售额和利润等数据,以及销售经理的业绩数据进行同比,类比,相关性等分析或预测,发现趋势。绘制不同维度的图表,设计数字大屏,分析公司产品销售情况和盈利能力,并给出指导建议。

目录

正文

任务一:数据分析与预测

1.1.1 缺失值重复值处理和说明

针对数据缺失情况,本次分析将会采用以下的处理方式:针对数据为空值的情况,如果该特征数据缺失情况低于 10%,则结合该特征的重要性进行综合判断。如果字段重要性较低,则考虑直接删除,如果字段重要性较高,则进行插值法或者采用数据均值进行填补。 导入依赖,并设置中文显示:

代码语言:javascript复制
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib

%matplotlib inline
font = {
    'family':'SimHei',
    'weight':'bold',
    'size':12
}
matplotlib.rc("font", **font)
matplotlib.rcParams['axes.unicode_minus']=False

导入非洲通讯产品销售数据.xlsx数据并查看SalesData:

代码语言:javascript复制
salesData = pd.read_excel("./非洲通讯产品销售数据.xlsx",engine='openpyxl', sheet_name = "SalesData")
salesData

输出为:

导入非洲通讯产品销售数据.xlsx数据并查看SalespersonData:

代码语言:javascript复制
salespersonData = pd.read_excel("./非洲通讯产品销售数据.xlsx",engine='openpyxl', sheet_name = "SalespersonData")
salespersonData

输出为:

查看SalesData有无缺失值和重复值:

代码语言:javascript复制
# 对第一张表进行处理
salesData.info() # 无缺失值

输出为:

代码语言:javascript复制
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1056 entries, 0 to 1055
Data columns (total 7 columns):
 #   Column  Non-Null Count  Dtype         
---  ------  --------------  -----         
 0   日期      1056 non-null   datetime64[ns]
 1   国家      1056 non-null   object        
 2   城市      1056 non-null   object        
 3   地区      1056 non-null   object        
 4   服务分类    1056 non-null   object        
 5   销售额     1056 non-null   float64       
 6   利润      1056 non-null   float64       
dtypes: datetime64[ns](1), float64(2), object(4)
memory usage: 57.9  KB

查看有无重复值

代码语言:javascript复制
salesData.duplicated().sum()

输出为:

代码语言:javascript复制
0

查看salespersonData有无缺失值和重复值:

代码语言:javascript复制
salespersonData.info()

输出为:

代码语言:javascript复制
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 160 entries, 0 to 159
Data columns (total 7 columns):
 #   Column                  Non-Null Count  Dtype         
---  ------                  --------------  -----         
 0   日期                      160 non-null    datetime64[ns]
 1   销售经理                    160 non-null    object        
 2   地区                      160 non-null    object        
 3   销售合同                    160 non-null    int64         
 4   成交率                     160 non-null    float64       
 5   Unnamed: 5              0 non-null      float64       
 6   备注:本表格中“销售合同”为“已成交合同”。  0 non-null      float64       
dtypes: datetime64[ns](1), float64(3), int64(1), object(2)
memory usage: 8.9  KB

查看重复值

代码语言:javascript复制
salespersonData.duplicated().sum()

输出为:

代码语言:javascript复制
0

发现表salesData和salespersonData无重复值

1.1.2 统计各年度各国销售额数据&计算同比增长率

因为统计的是各年度的销售额数据,所有需要对“日期”列进行拆分,取出年份:

代码语言:javascript复制
# 先对日期列进行处理
year = salesData.loc[:, "日期"].astype("str").str.split("-", expand = True)[0]
year

输出为:

备注:上面代码中对时间数据进行处理,用时间类型会更好一些,所以转变成字符串的方式未必最佳

代码语言:javascript复制
year_data = salesData.loc[:, ["国家", "地区", "服务分类", "销售额", "利润"]]
year_data["年份"] = year
year_data

输出为:

按照不同年份求各地区的销售额

代码语言:javascript复制
# 按照不同年份求各地区的销售额
year_area_sale = year_data.groupby(["年份", "地区"])["销售额"].sum()
year_area_sale.to_csv("./year_area_sale.csv")
year_area_sale

输出为:

通过groupby函数对[“年份”, “国家"]进行分组,对”销售额“进行求和

代码语言:javascript复制
year_cou_sale = year_data.groupby(["年份", "国家"])["销售额"].sum()
year_cou_sale.to_csv("./year_cou_sale.csv")
year_cou_sale

输出为:

计算出各年度各国销售额数据的同比增长率

同比增长率=(今年销售额-去年销售额)/去年销售额
代码语言:javascript复制
# 各年度各国的销售额的同比增长率
task1 = pd.read_csv("./year_cou_sale.csv")
task1

输出为:

计算同比增长率

代码语言:javascript复制
temp = pd.merge(task1[task1.loc[:, "年份"] == 2017], task1[task1.loc[:, "年份"] == 2018], how="inner", left_on = "国家", right_on = "国家")
temp = pd.merge(temp, task1[task1.loc[:, "年份"] == 2019] ,how="inner", left_on = "国家", right_on = "国家")
temp = pd.merge(temp, task1[task1.loc[:, "年份"] == 2020] ,how="inner", left_on = "国家", right_on = "国家")
temp.drop(["年份_x", "年份_y"], axis = 1, inplace=True)
temp.columns = ["国家", "2017销售额", "2018销售额", "2019销售额", "2020销售额"]
temp
temp["2017-2018销售额同比增长率"] = (temp["2018销售额"] - temp["2017销售额"]) / temp["2017销售额"]
temp["2018-2019销售额同比增长率"] = (temp["2019销售额"] - temp["2018销售额"]) / temp["2018销售额"]
temp["2019-2020销售额同比增长率"] = (temp["2020销售额"] - temp["2019销售额"]) / temp["2019销售额"]
temp
temp.to_csv("./各年份各国家的销售额同比增长率.csv")
temp

输出为:

共51个国家

1.1.3显示2020年度销售额Top3的国家及其年增长率

通过sort_values函数对”2020销售额“数据进行降序排序,取出Top3

代码语言:javascript复制
# 展示2020年年度销售额前3名的国家及其年增长率
temp.loc[:, ["国家", "2020销售额", "2019-2020销售额同比增长率"]].sort_values("2020销售额", ascending = False).head(3)

输出为:

1.1.4 统计各年度各国利润数据&计算同比增长率

通过groupby函数对[“年份”, “国家"]进行分组,对”利润“进行求和

代码语言:javascript复制
year_cou_pro = year_data.groupby(["年份", "国家"])["利润"].sum()
year_cou_pro.to_csv("./year_cou_pro.csv")
year_cou_pro

输出为:

代码语言:javascript复制
task2 = pd.read_csv("./year_cou_pro.csv")
task2

输出为:

计算出各年度各国利润数据的同比增长率

代码语言:javascript复制
temp2 = pd.merge(task2[task2.loc[:, "年份"] == 2017], task2[task2.loc[:, "年份"] == 2018], how="inner", left_on = "国家", right_on = "国家")
temp2 = pd.merge(temp2, task2[task2.loc[:, "年份"] == 2019] ,how="inner", left_on = "国家", right_on = "国家")
temp2 = pd.merge(temp2, task2[task2.loc[:, "年份"] == 2020] ,how="inner", left_on = "国家", right_on = "国家")
temp2.drop(["年份_x", "年份_y"], axis = 1, inplace=True)
temp2.columns = ["国家", "2017利润", "2018利润", "2019利润", "2020利润"]
# temp2
temp2["2017-2018利润同比增长率"] = (temp2["2018利润"] - temp2["2017利润"]) / temp2["2017利润"]
temp2["2018-2019利润同比增长率"] = (temp2["2019利润"] - temp2["2018利润"]) / temp2["2018利润"]
temp2["2019-2020利润同比增长率"] = (temp2["2020利润"] - temp2["2019利润"]) / temp2["2019利润"]
temp2.to_csv("./各年份各国家的利润同比增长率.csv")
temp2

输出为:

1.1.5统计各年度各服务分类销售额数据&计算同比增长率

通过groupby函数对[“年份”, “服务分类"]进行分组,对”销售额“进行求和

代码语言:javascript复制
year_sor_sale = year_data.groupby(["年份", "服务分类"])["销售额"].sum()
year_sor_sale.to_csv("./year_sor_sale.csv")
year_sor_sale

输出为:

代码语言:javascript复制
task3 = pd.read_csv("./year_sor_sale.csv")
task3

输出为:

计算出各年度各服务分类销售额数据的同比增长率

代码语言:javascript复制
temp3 = pd.merge(task3[task3.loc[:, "年份"] == 2017], task3[task3.loc[:, "年份"] == 2018], how="inner", left_on = "服务分类", right_on = "服务分类")
temp3 = pd.merge(temp3, task3[task3.loc[:, "年份"] == 2019] ,how="inner", left_on = "服务分类", right_on = "服务分类")
temp3 = pd.merge(temp3, task3[task3.loc[:, "年份"] == 2020] ,how="inner", left_on = "服务分类", right_on = "服务分类")
temp3.drop(["年份_x", "年份_y"], axis = 1, inplace=True)
temp3.columns = ["服务分类", "2017销售额", "2018销售额", "2019销售额", "2020销售额"]
temp3["2017-2018销售额同比增长率"] = (temp3["2018销售额"] - temp3["2017销售额"]) / temp3["2017销售额"]
temp3["2018-2019销售额同比增长率"] = (temp3["2019销售额"] - temp3["2018销售额"]) / temp3["2018销售额"]
temp3["2019-2020销售额同比增长率"] = (temp3["2020销售额"] - temp3["2019销售额"]) / temp3["2019销售额"]
temp3.to_csv("./各年份各服务分类的销售额同比增长率.csv")
temp3

输出为:

1.1.6统计各年度各服务分类利润数据&计算同比增长率

通过groupby函数对[“年份”, “服务分类"]进行分组,对”利润“进行求和

代码语言:javascript复制
year_sor_pro = year_data.groupby(["年份", "服务分类"])["利润"].sum()
year_sor_pro.to_csv("./year_sor_pro.csv")
year_sor_pro

输出为:

加载数据:

代码语言:javascript复制
task4 = pd.read_csv("./year_sor_pro.csv")
task4

输出为:

计算出各年度各服务分类销售额数据的同比增长率

代码语言:javascript复制
temp4 = pd.merge(task4[task4.loc[:, "年份"] == 2017], task4[task4.loc[:, "年份"] == 2018], how="inner", left_on = "服务分类", right_on = "服务分类")
temp4 = pd.merge(temp4, task4[task4.loc[:, "年份"] == 2019] ,how="inner", left_on = "服务分类", right_on = "服务分类")
temp4 = pd.merge(temp4, task4[task4.loc[:, "年份"] == 2020] ,how="inner", left_on = "服务分类", right_on = "服务分类")
temp4.drop(["年份_x", "年份_y"], axis = 1, inplace=True)
temp4.columns = ["服务分类", "2017利润", "2018利润", "2019利润", "2020利润"]
temp4["2017-2018利润同比增长率"] = (temp2["2018利润"] - temp2["2017利润"]) / temp2["2017利润"]
temp4["2018-2019利润同比增长率"] = (temp2["2019利润"] - temp2["2018利润"]) / temp2["2018利润"]
temp4["2019-2020利润同比增长率"] = (temp2["2020利润"] - temp2["2019利润"]) / temp2["2019利润"]
temp4.to_csv("./各年份各服务分类的利润同比增长率.csv")
temp4

输出为:

1.2.1统计各地区,国家有关服务分类销售额和利润数据
代码语言:javascript复制
job2 = salesData.loc[:, ["国家", "地区", "服务分类", "销售额", "利润"]]
job2

输出为:

通过groupby函数对[“地区”, “国家”, “服务分类”]进行分组,分别求出"销售额"和”利润“的总和

代码语言:javascript复制
a = job2.groupby(["地区", "国家", "服务分类"])["销售额"].sum()
a

输出为:

代码语言:javascript复制
b = job2.groupby(["地区", "国家", "服务分类"])["利润"].sum()
b

输出为:

1.2.2展示各地区有关服务分类利润数据

合并销售额和利润

代码语言:javascript复制
a = pd.DataFrame(a)
b = pd.DataFrame(b)
a["利润"] = b["利润"].values
a.to_csv("./各地区各国家有关服务分类销售额和利润数据.csv")
a

输出为:

1.3.1统计各个销售经理的成交合同数和成交率
代码语言:javascript复制
salespersonData

输出为:

通过对列”销售经理“进行分组,求出”销售合同“的总和

代码语言:javascript复制
set(salespersonData.loc[:, "销售经理"].values)

输出为:

代码语言:javascript复制
total_sus = salespersonData.groupby(["销售经理"])["销售合同"].sum()
total_sus

输出为:

因为“销售合同”为“已成交合同”。我们可以通过销售经理在某地区某日期的成就率,求出该时销售经理的总销售合同即以成交的合同和非成交的合同,再通过成交合同比上总合同数求出该经理的成交率:

代码语言:javascript复制
job3 = salespersonData.loc[:, ["销售经理", "销售合同", "成交率"]]
job3

输出为:

代码语言:javascript复制
job3["合同数"] = job3["销售合同"] / job3["成交率"]
job3["合同数"] = job3["合同数"].astype("int")
job3

输出为:

代码语言:javascript复制
total = job3.groupby(["销售经理"])["合同数"].sum()
total

输出为:

代码语言:javascript复制
man_rate = pd.concat([total, total_sus], axis = 1)
man_rate

输出为:

代码语言:javascript复制
man_rate["成交率"] = man_rate["销售合同"] / man_rate["合同数"]
man_rate

输出为:

1.3.2展示销售经理成交合同数Top3的数据

通过sort_values函数对列"销售合同"进行排序

代码语言:javascript复制
man_rate.sort_values("销售合同", ascending = False).head(3)

输出为:

代码语言:javascript复制
man_rate.to_csv("./各经理的成交率.csv")
man_rate

输出为:

1.4.1对数据进行预处理及编码, 给出明确的预测模型

对列”日期“进行处理,计算出该日期属于第几季度

代码语言:javascript复制
# 获取年份列
year = salesData.loc[:, "日期"].astype("str").str.split("-", expand = True)[0]
year

输出为:

代码语言:javascript复制
# 获取月份
month = salesData.loc[:, "日期"].astype("str").str.split("-", expand = True)[1]
month

输出为:

获得季度

代码语言:javascript复制
quarter = []
for i in list(month.values):
    q = (int(i) - 1) // 3   1
    quarter.append(q)
" ".join([str(i) for i in quarter])

输出为:

代码语言:javascript复制
year_quarter = salesData.loc[:, ["地区", "国家", "服务分类", "销售额", "利润"]]
year_quarter["年度"] = year
year_quarter["季度"] = quarter
year_quarter

输出为:

通过对[“年度”, “季度”, “地区”, “国家”, “服务分类”]进行分组,求出”销售额"和”利润“总值

代码语言:javascript复制
sale = year_quarter.groupby(["年度", "季度", "地区", "国家", "服务分类"])["销售额"].sum()
sale = pd.DataFrame(sale)
sale

输出为:

代码语言:javascript复制
profit = year_quarter.groupby(["年度", "季度", "地区", "国家", "服务分类"])["利润"].sum()
profit = pd.DataFrame(profit)
profit

输出为:

代码语言:javascript复制
# 拼接销售额与利润
sale["利润"] = profit["利润"].values
sale.to_csv("./第一题.csv")
sale

输出为:

代码语言:javascript复制
# 查看保存的数据
n1 = pd.read_csv("./第一题.csv")
n1

输出为:

获取第一季度数据

代码语言:javascript复制
forecast_data = n1[n1.loc[:, "季度"] == 1] # 拿出第一季度
forecast_data

输出为:

因为列”地区“,”国家“,”服务分类"中存在汉字,而逻辑回归只能够处理数值型数据,不能处理文字,在sklearn当中,除了专用来处理文字的算法,其他算法在fit的时候全部要求输入数组或矩阵,也不能够导入文字型数据(其实手写决策树和普斯贝叶斯可以处理文字,但是sklearn中规定必须导入数值型)。然而在现实中,许多标签和特征在数据收集完毕的时候,都不是以数字来表现的。比如说,学历的取值可以是[“小 学”,“初中”,“高中”,“大学”],付费方式可能包含[“支付宝”,“现金”,“微信”]等等。在这种情况下,为了让数据适应算法和库,我们必须将数据进行编码,即是说,将文字型数据转换为数值型。 这里我们采用preprocessing.LabelEncoder将汉字进行编码

代码语言:javascript复制
# 对列地区,国家,服务分类 进行编码
from sklearn.preprocessing import LabelEncoder
y1 = forecast_data.loc[:, "地区"] # 要输入的是标签,不是特征矩阵,所以允许一维数据
y2 = forecast_data.loc[:, "国家"]
y3 = forecast_data.loc[:, "服务分类"]

le1 = LabelEncoder() # 实例化
le1 = le1.fit(y1) # 导入数据
label1 = le1.transform(y1) # transform接口调取结果
forecast_data.loc[:,"地区"] = label1

le2 = LabelEncoder() # 实例化
le2 = le2.fit(y2) # 导入数据
label2 = le2.transform(y2) # transform接口调取结果
forecast_data.loc[:,"国家"] = label2

le3 = LabelEncoder() # 实例化
le3 = le3.fit(y3) # 导入数据
label3 = le3.transform(y3) # transform接口调取结果
forecast_data.loc[:,"服务分类"] = label3

forecast_data

输出为:

备注:这里的警告问题可以参考博客https://blog.csdn.net/weixin_42575020/article/details/98846427

代码语言:javascript复制
from sklearn.linear_model import LogisticRegression as LR # 逻辑回归
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score # 精确性分数


X1 = forecast_data.loc[:, ["年度", "地区", "国家", "服务分类", "利润"]]
X1
X2 = forecast_data.loc[:, ["年度", "地区", "国家", "服务分类", "销售额"]]
X2

输出为:

建模

正则化是用来防止模型过拟合的过程,常用的有L1正则化和L2正则化两种选项penalty:可以输入”l1“或者”l2“来指定使用哪一种正则化方式,不填写默认使用”l2“,注意:若选择”l1“正则化,参数solver仅能够使用的求解方式”liblinear“和”sage“ C:C正则化强度的倒数,必须是一个大于0的浮点数,不填写默认是1.0,即默认正则化与损失函数的比值是1:1,C越小,损失函数会越小,模型对损失函数的惩罚越重,正则化的效果越强,参数θ会逐渐被压缩得越来越小。 L1正则化和L2正则化虽然都可以控制过拟合,但它们的效果并不相同。当正则化强度逐渐增大(即C逐渐变小),参数θ 的取值会逐渐变小,但L1正则化会将参数压缩为0,L2正则化只会让参数尽量小,不会取到0。

代码语言:javascript复制
y = forecast_data.loc[:, "销售额"]
y2 = forecast_data.loc[:, "利润"]

lrl1 = LR(penalty = "l1", solver = "liblinear", C = 0.5, max_iter = 1000)
lrl2 = LR(penalty = "l1", solver = "liblinear", C = 0.5, max_iter = 1000)

# 逻辑回归的重要属性coef_, 查看某个特征所对应的参数
lrl1 = lrl1.fit(X1, y.astype("int"))
lrl2 = lrl2.fit(X2, y2.astype("int"))
1.4.2预测2021年第一季度各个地区,国家,服务分类的销售额和利润

通过模型预测2021年第一季度各个地区,国家,服务分类的销售额和利润

代码语言:javascript复制
X_test1 = X1
X_test1["年度"] = [2021 for i in range(X1.shape[0])]
X_test1

输出为:

代码语言:javascript复制
X_test2 = X2
X_test2

输出为:

查看预测结果:

代码语言:javascript复制
lrl_pro1 = lrl1.predict(X_test1)
lrl_pro1[0:5]

输出为:

代码语言:javascript复制
lrl_pro2 = lrl2.predict(X_test2)
lrl_pro2[0:5]

输出为:

代码语言:javascript复制
X_test =  X_test1.loc[:, ["年度", "地区", "国家", "服务分类"]]
X_test

输出为:

代码语言:javascript复制
X_test["预测销售额"] = lrl_pro1
X_test["预测利润"] = lrl_pro2
X_test

输出为:

代码语言:javascript复制
X_test["地区"] = le1.inverse_transform(label1)
X_test["国家"] = le2.inverse_transform(label2)
X_test["服务分类"] = le3.inverse_transform(label3)
X_test

输出为:

代码语言:javascript复制
X_test.drop_duplicates(inplace=True)
X_test.index = range(X_test.shape[0])
X_test

输出为:

1.4.3展示地区,国家,服务分类销售额预测的最大值
代码语言:javascript复制
X_test.to_csv("./2021年第一季度预测.csv")
X_test.sort_values("预测销售额", ascending = False).head(1)

输出为:

任务2:可视化展示及分析

2.1.1绘制非洲各国产品销售地图

利用Tableau绘制非洲各国产品销售地

由绘制出的非洲各国产品销售地图可知,Neiger、BurkinaFaso、Zimbia等几个国家的利润严重亏损、没有盈利能力而处于非洲中部的一些国家如Congo、Centra以及南非的Swailand等国家有高额利润。

2.1.2绘制非洲各国产品销售额和利润数据图表

其中颜色深浅表示利润,发现国家South Africa的销售额和利润都显著高于其他,而Coted’lvoire的销售额排第四,但是却处于严重的亏损状态,建议降低成本、费用,下移保本点,指定目标战略、政策规划,降低固定工资部分,加大弹性工资部分,提提升人效。

2.2.1绘制各服务分类的销售额和利润的年增长率

其中Commercial服务,三年来利润持续下降,而Public在2019-2020年度显著提升。

其中Public在2019-2020年度销售额有明显提升,与该年度的利润增长相符合

2.2.2绘制各服务分类的销售额和利润的季度增长率
2.3绘制2021年第一季度各服务分类的销售额和利润预测值的图标
2.4绘制销售经理销售合同数Top5
2.5绘制国家销售额后10名
2.6.1设计数字大屏
2.6.1分析公司产品销售情况和盈利能力,并给出指导建议

对企业来说,从事经营活动最大的目的就是赚取利润并维持企业不断地发展。因此对盈利能力的分析就显得尤为重要,要想获取利润,持续稳定的经营与发展是基础,而获取利润优势是企业持续发展的保证。从盈利的角度来看,应着重对那些低销售额高利润的地区加大产品推广,对那些高销售额负利润的地区,应调整经营思路,提高企业收益水平。 从不同地区收益情况以及年份季度分析出,对于服务类型说,Commercial类型的服务需求量逐年放缓,说明该类型的服务已达到饱和,应着重于产品的售后服务,适量减少该类型的生产量。充分利用媒体设备,将产品需求量较少的产品广播宣传,调查当地用户习惯,有针对性的改良不同类型的产品在该地区的适应性。在非洲东部地区有高销售额和高收益,其他地区应该多向该地区学习。控制成本,实现利润最大化,使企业在竞争中立于不败之地。

0 人点赞