1. A 题 通讯产品销售和盈利能力分析 简介
一、背景
进入本世纪以来,我国通讯产品得到了飞速发展,其技术先进,价格便宜,
深受世界各国和地区尤其是非洲国家的欢迎。某通讯公司在非洲的多个国家深耕多年,产品与服务遍布整个非洲大陆。为了更好地了解公司的销售情况,采用产品的销售额和利润数据,对其盈利能力进行分析和预测,给决策人员提供分析报告,以便为非洲各国提供更好的产品销售策略和服务。
二、目标
- 统计产品在当地的销售数据,预测未来的销售情况。
- 设计可视化数字大屏,展示产品的销售情况,分析产品的盈利能力。
三、任务
请根据附件中提供的数据(其中,金额计量单位:万元;合同数计量单位:
个),自行选择分析工具完成以下任务,并撰写报告。如使用“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 分析数字大屏的指标数据和图表,撰写公司产品的销售情况和盈
利能力的分析报告。
四、关于竞赛成果提交的说明
- 登录方式
- 请使用队长的账号登录数睿思网站(www.tipdm.org),进入第四届技能赛页面。为保证成功提交,请使用谷歌浏览器无痕模式。
作品提交
报告以 PDF 格式提交,文件名为“report.pdf”,要求逻辑清晰、条理分
明,内容包括每个任务的完成思路、操作步骤、必要的中间过程、任务的结果及分析。
针对任务 1,报告中应包含但不限于如下要点:
(1) 任务 1.1 需要展示 2020 年年度销售额前 3 名的国家及其年增长率。
(2) 任务 1.2 需要展示各地区有关服务分类利润数据。
(3) 任务 1.3 需要展示销售经理成交合同数前 3 名的数据。
(4) 任务 1.4 需要给出明确的预测模型,并展示地区、国家、服务分类
销售额预测值最大的 1 条数据。
附件提交
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%,则结合该特征的重要性进行综合判断。如果字段重要性较低,则考虑直接删除,如果字段重要性较高,则进行插值法或者采用数据均值进行填补。
导入依赖,并设置中文显示:
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:
salesData = pd.read_excel("./非洲通讯产品销售数据.xlsx",engine='openpyxl', sheet_name = "SalesData") salesData
输出为:
导入非洲通讯产品销售数据.xlsx数据并查看SalespersonData:
salespersonData = pd.read_excel("./非洲通讯产品销售数据.xlsx",engine='openpyxl', sheet_name = "SalespersonData") salespersonData
输出为:
查看SalesData有无缺失值和重复值:
# 对第一张表进行处理 salesData.info() # 无缺失值
输出为:
<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
查看有无重复值
salesData.duplicated().sum()
输出为:
0
查看salespersonData有无缺失值和重复值:
salespersonData.info()
输出为:
<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
查看重复值
salespersonData.duplicated().sum()
输出为:
0
发现表salesData和salespersonData无重复值
1.1.2 统计各年度各国销售额数据&计算同比增长率
因为统计的是各年度的销售额数据,所有需要对“日期”列进行拆分,取出年份:
# 先对日期列进行处理 year = salesData.loc[:, "日期"].astype("str").str.split("-", expand = True)[0] year
输出为:
备注:上面代码中对时间数据进行处理,用时间类型会更好一些,所以转变成字符串的方式未必最佳
year_data = salesData.loc[:, ["国家", "地区", "服务分类", "销售额", "利润"]] year_data["年份"] = year year_data
输出为:
按照不同年份求各地区的销售额
# 按照不同年份求各地区的销售额 year_area_sale = year_data.groupby(["年份", "地区"])["销售额"].sum() year_area_sale.to_csv("./year_area_sale.csv") year_area_sale
输出为:
通过groupby函数对[“年份”, “国家"]进行分组,对”销售额“进行求和
year_cou_sale = year_data.groupby(["年份", "国家"])["销售额"].sum() year_cou_sale.to_csv("./year_cou_sale.csv") year_cou_sale
输出为:
计算出各年度各国销售额数据的同比增长率
同比增长率 = ( 今年销售额 − 去年销售额 ) / 去年销售额 同比增长率=(今年销售额-去年销售额)/去年销售额
同比增长率=(今年销售额−去年销售额)/去年销售额
# 各年度各国的销售额的同比增长率 task1 = pd.read_csv("./year_cou_sale.csv") task1
输出为:
计算同比增长率
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
# 展示2020年年度销售额前3名的国家及其年增长率 temp.loc[:, ["国家", "2020销售额", "2019-2020销售额同比增长率"]].sort_values("2020销售额", ascending = False).h
输出为:
1.1.4 统计各年度各国利润数据&计算同比增长率
通过groupby函数对[“年份”, “国家"]进行分组,对”利润“进行求和
year_cou_pro = year_data.groupby(["年份", "国家"])["利润"].sum() year_cou_pro.to_csv("./year_cou_pro.csv") year_cou_pro
输出为:
task2 = pd.read_csv("./year_cou_pro.csv") task2
输出为:
计算出各年度各国利润数据的同比增长率
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函数对[“年份”, “服务分类"]进行分组,对”销售额“进行求和
year_sor_sale = year_data.groupby(["年份", "服务分类"])["销售额"].sum() year_sor_sale.to_csv("./year_sor_sale.csv") year_sor_sale
输出为:
task3 = pd.read_csv("./year_sor_sale.csv") task3
输出为:
计算出各年度各服务分类销售额数据的同比增长率
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函数对[“年份”, “服务分类"]进行分组,对”利润“进行求和
year_sor_pro = year_data.groupby(["年份", "服务分类"])["利润"].sum() year_sor_pro.to_csv("./year_sor_pro.csv") year_sor_pro
输出为:
加载数据:
task4 = pd.read_csv("./year_sor_pro.csv") task4
输出为: