当前位置: 首页 > news >正文

【python分析实战】成本:揭示电商平台月度开支与成本结构占比 - 过于详细 【收藏】

重点关注本文思路,用python分析,方便大家实验复现,代码每次都用全量的,其他工具自行选择。

全文3000字,阅读10min,操作1小时

企业案例实战欢迎关注专栏 每日更新:https://blog.csdn.net/cciehl/category_12615648.html

背景

一家电商公司希望分析其过去一年的各项成本,包括材料、劳动力、市场营销、固定成本和杂项支出。目标是了解成本结构,识别成本控制和优化的机会。

实施步骤

首先,收集并整理全年各月份的成本数据。

使用Python的数据分析和可视化库(如Pandas和Matplotlib)进行分析或者其他工具

对生成的图表进行深入分析,提取关键洞察。

成本数据

每个月提供了五种成本类型(材料、劳动力、市场营销、固定成本和杂项支出)的具体数字和对应的用量,并计算了每个月的总成本

import pandas as pd
import numpy as np
# 设置随机数种子以确保数据的一致性
np.random.seed(42)
​
# 创建模拟的月份数据
months = ['January', 'February', 'March', 'April', 'May', 'June','July', 'August', 'September', 'October', 'November', 'December']
​
# 创建不同成本类型的模拟数据,包括总成本和用量
data = {'Month': months,'Material Cost ($)': np.random.randint(10000, 30000, size=12),'Material Quantity': np.random.randint(100, 300, size=12),'Labor Cost ($)': np.random.randint(8000, 25000, size=12),'Labor Hours': np.random.randint(200, 500, size=12),'Marketing Cost ($)': np.random.randint(5000, 15000, size=12),'Marketing Campaigns': np.random.randint(1, 5, size=12),'Fixed Cost ($)': np.random.randint(4000, 8000, size=12),'Fixed Assets': np.random.randint(10, 20, size=12)
}
# 转换为DataFrame
cost_df = pd.DataFrame(data)
pd.set_option('expand_frame_repr', False)
print(cost_df)

初步的分析

分析方法: 初始分析仅涉及计算每个月的总成本和成本构成,并通过简单的趋势图展示。

成本构成组成图,可以看到主要的成本应该是材料费用,但是具体占比多少其实还看不清楚,然后波动趋势的话 因为组合型柱形图没法做每个月的对比

成本构成趋势图,如果仔细看的话,可以看到材料费用的波动比较大,但是原因是什么不清楚,因为费用跟使用情况有关系

这个是一个热力图,可以看到材料和市场活动的波动会比较大,导致的总成本的波动也比较大

问题:

  • 缺乏细节:总成本的展示忽略了成本结构的复杂性,无法识别哪些成本类型对总支出的贡献最大。

  • 无法识别趋势:没有展示各成本类型随时间的变化趋势,难以分析季节性变化或特定事件对成本的影响。

  • 决策困难:缺少深入分析,管理层难以基于这些数据做出有针对性的成本控制或优化决策。

代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
​
​
np.random.seed(42)
# Creating DataFrame from provided data
cost_data = {'Month': months,'Material Cost ($)': np.random.randint(10000, 30000, size=12),'Labor Cost ($)': np.random.randint(8000, 25000, size=12),'Marketing Cost ($)': np.random.randint(5000, 15000, size=12),'Fixed Cost ($)': np.random.randint(4000, 8000, size=12),
}
cost_df = pd.DataFrame(cost_data)
​
​
cost_df['Total Cost'] = cost_df['Material Cost ($)']+cost_df['Labor Cost ($)']+cost_df['Marketing Cost ($)']+cost_df['Fixed Cost ($)']
plt.figure(figsize=(12, 6))
plt.plot(cost_df.index, cost_df['Total Cost'], marker='o')
plt.title('Monthly Total Cost - Unclear Visualization')
plt.ylabel('Cost ($)')
plt.xlabel('Month')
plt.xticks()
plt.tight_layout()
plt.show()
# Set 'Month' as index
cost_df.set_index('Month', inplace=True)
​
# 1. Stacked Bar Chart for Monthly Costs
cost_df.plot(kind='bar', stacked=True, figsize=(10, 6))
plt.title('Stacked Bar Chart of Monthly Costs')
plt.ylabel('Amount ($)')
plt.xticks(rotation=45)
plt.legend(title='Cost Type')
plt.tight_layout()
plt.show()
​
# 2. Trend Line Chart for Each Cost Type
plt.figure(figsize=(12, 6))
for column in cost_df.columns:plt.plot(cost_df.index, cost_df[column], marker='o', label=column)
plt.title('Trend Lines for Each Cost Type')
plt.xticks(rotation=45)
plt.ylabel('Amount ($)')
plt.legend()
plt.tight_layout()
plt.show()
​
# 3. Heatmap for Monthly Costs
# Creating a new DataFrame suitable for heatmap
heatmap_data = cost_df.T  # Transpose to get cost types as rows and months as columns
plt.figure(figsize=(12, 6))
sns.heatmap(heatmap_data, cmap="YlGnBu", annot=True, fmt="d")
plt.title('Heatmap of Monthly Costs')
plt.xlabel('Month')
plt.ylabel('Cost Type')
plt.tight_layout()
plt.show()

改进后的分析

为了克服这些限制,我们需要采用更合理的数据可视化方法,首先是查看各项占比,组合柱形图如果不展示各项占比,这个图的会变得很难解读,所以从图中可以看出材料费用的占比在30%-50%左右,还有就是劳动力成本,这两个成本需要重点分析。


代码

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
​
np.random.seed(42)  # 确保结果可复现
months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
​
# 使用提供的数据创建DataFrame
cost_data = {'Month': months,'Material Cost ($)': np.random.randint(10000, 30000, size=12),'Labor Cost ($)': np.random.randint(8000, 25000, size=12),'Marketing Cost ($)': np.random.randint(5000, 15000, size=12),'Fixed Cost ($)': np.random.randint(4000, 8000, size=12),
}
cost_df = pd.DataFrame(cost_data)
​
# 计算每个月总成本
cost_df['Total Cost ($)'] = cost_df.drop('Month', axis=1).sum(axis=1)
​
# 计算各成本项占总成本的比例
for column in cost_df.columns[1:-1]:  # 排除'Month'和'Total Cost ($)'cost_df[f'{column} Percentage'] = (cost_df[column] / cost_df['Total Cost ($)']) * 100
​
# 绘制各成本项的柱状图
cost_df.set_index('Month').iloc[:, :4].plot(kind='bar', stacked=True, figsize=(14, 7))
plt.title('Monthly Costs with Percentages')
plt.ylabel('Cost ($)')
​
# 添加占比标签
for i, month in enumerate(cost_df['Month']):total_cost = cost_df.loc[i, 'Total Cost ($)']cumulative_height = 0for column in cost_df.columns[1:5]:  # 选择四个成本列cost = cost_df.loc[i, column]percentage = (cost / total_cost) * 100label_y_position = cumulative_height + cost / 2  # 计算标签的y位置plt.text(i, label_y_position, f'{percentage:.1f}%', ha='center', color='white', fontsize=9)cumulative_height += cost
​
plt.xticks(rotation=45)
plt.legend(title='Cost Type')
plt.tight_layout()
plt.show()
 

接着需要去掉用量的影响,因为成本金额大不一定有问题,可能是量也比较大,我们构建一个单位成本的指标,单位成本是指对应成本总额除以相应的量度(如材料成本除以材料量,劳动力成本除以工时等。

这里是单位材料成本和单位劳动力成本,可以看到在3月、10月的单位材料成本大涨,经过分析发现这两个月进入了一批新的材料比以往的采购价都更贵。发现单位工时成本在2月和12月上涨比较多,是因为这两个月招聘了高技术的人才,之后下降是由于上线了平台系统提高了整体的工作效率。

单位成本代码

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
​
# 设置随机数种子以确保数据的一致性
np.random.seed(42)
​
# 创建模拟的月份和成本数据
months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
data = {'Month': months,'Material Cost ($)': np.random.randint(10000, 30000, size=12),'Material Quantity': np.random.randint(100, 300, size=12),'Labor Cost ($)': np.random.randint(8000, 25000, size=12),'Labor Hours': np.random.randint(200, 500, size=12),
}
cost_df = pd.DataFrame(data)
cost_df['Unit Material Cost ($)'] = cost_df['Material Cost ($)'] / cost_df['Material Quantity']
cost_df['Unit Labor Cost ($)'] = cost_df['Labor Cost ($)'] / cost_df['Labor Hours']
​
# 绘制没有网格线和边框的折线图
plt.figure(figsize=(10, 6))
​
plt.plot(cost_df['Month'], cost_df['Unit Material Cost ($)'], label='Unit Material Cost ($)')
plt.plot(cost_df['Month'], cost_df['Unit Labor Cost ($)'], label='Unit Labor Cost ($)')
​
plt.title('Monthly Unit Cost Analysis')
plt.xlabel('Month')
plt.ylabel('Unit Cost ($)')
plt.legend()
​
# 移除边框
plt.gca().spines['top'].set_visible(False)
plt.gca().spines['right'].set_visible(False)
plt.gca().spines['bottom'].set_visible(False)
plt.gca().spines['left'].set_visible(False)
​
# 移除网格线
plt.grid(False)
​
plt.show()

总结

除了要在展示的时候能更清晰的从图中看出具体的数值外,我们在分析成本的时候需要去掉用量的因素的影响,单位成本是一个常见的分析指标

相关文章:

【python分析实战】成本:揭示电商平台月度开支与成本结构占比 - 过于详细 【收藏】

重点关注本文思路,用python分析,方便大家实验复现,代码每次都用全量的,其他工具自行选择。 全文3000字,阅读10min,操作1小时 企业案例实战欢迎关注专栏 每日更新:https://blog.csdn.net/cciehl/…...

新网站收录时间是多久,新建网站多久被百度收录

对于新建的网站而言,被搜索引擎收录是非常重要的一步,它标志着网站的正式上线和对外开放。然而,新网站被搜索引擎收录需要一定的时间,而且时间长短受多种因素影响。本文将探讨新网站收录需要多长时间,以及新建网站多久…...

通过Caliper进行压力测试程序,且汇总压力测试问题解决

环境要求 第一步. 配置基本环境 部署Caliper的计算机需要有外网权限;操作系统版本需要满足以下要求:Ubuntu >= 16.04、CentOS >= 7或MacOS >= 10.14;部署Caliper的计算机需要安装有以下软件:python 2.7、make、g++(gcc-c++)、gcc及git。第二步. 安装NodeJS # …...

LabVIEW比例流量阀自动测试系统

LabVIEW比例流量阀自动测试系统 开发了一套基于LabVIEW编程和PLC控制的比例流量阀自动测试系统。通过引入改进的FCMAC算法至测试回路的压力控制系统,有效提升了压力控制效果,展现了系统的设计理念和实现方法。 项目背景: 比例流量阀在液压…...

安卓U3D逆向从Assembly-CSharp到il2cpp

随着unity技术的发展及厂商对于脚本源码的保护,很大一部分U3D应用的scripting backend已经由mono转为了il2cpp,本文从unity简单应用的制作讲起,介绍U3D应用脚本的Assembly-CSharp.dll的逆向及il2cpp.so的逆向分析。 目录如下: 0…...

计算机网络——30SDN控制平面

SDN控制平面 SDN架构 数据平面交换机 快速、简单,商业化交换设备采用硬件实现通用转发功能流表被控制器计算和安装基于南向API,SDN控制器访问基于流的交换机 定义了哪些可以被控制哪些不能 也定义了和控制器的协议 SDN控制器(网络OS&#…...

Obsidian插件-高亮块(Admonition)

在插件市场里面搜索Admonition并安装插件,就可以使用高亮块了。 添加高亮块 用法稍微有一些不同。按照下面的格式,输入Markdown就可以创建一个高亮块。 内容内容内容输入*ad-*会出现相应的类型可以选择...

jHipster 之 webflux-前端用EventSource处理sse变成了批量处理而非实时处理

现象: const eventSource new EventSource(API_URL5);eventSource.onmessage streamEvent > {console.log(a message is come in--------->);const content streamEvent.data;console.log(Received content: content);};前端用EventSource 处理webflux的…...

原型链-(前端面试 2024 版)

来讲一讲原型链 原型链只存在于函数之中 四个规则 1、引用类型,都具有对象特性,即可自由扩展属性。 2、引用类型,都有一个隐式原型 __proto__ 属性,属性值是一个普通的对象。 3、引用类型,隐式原型 __proto__ 的属…...

网络套接字补充——UDP网络编程

五、UDP网络编程 ​ 1.对于服务器使用智能指针维护生命周期;2.创建UDP套接字;3.绑定端口号,包括设置服务器端口号和IP地址,端口号一般是2字节使用uint16_t,而IP地址用户习惯使用点分十进制格式所以传入的是string类型…...

自动化测试 —— Pytest fixture及conftest详解

前言 fixture是在测试函数运行前后,由pytest执行的外壳函数。fixture中的代码可以定制,满足多变的测试需求,包括定义传入测试中的数据集、配置测试前系统的初始状态、为批量测试提供数据源等等。fixture是pytest的精髓所在,类似u…...

Scala第十四章节(隐式转换、隐式参数以及获取列表元素平均值的案例)

章节目标 掌握隐式转换相关内容掌握隐式参数相关内容掌握获取列表元素平均值的案例 1.隐式转换和隐式参数介绍 隐式转换和隐式参数是Scala中非常有特色的功能,也是Java等其他编程语言没有的功能。我们可以很方便地利用 隐式转换来丰富现有类的功能。在后续编写Ak…...

VsCode的json文件不允许注释的解决办法

右下角找到注释点进去 输入Files: Associations搜索出此项 改为项为*.json值为jsonc保存即可 然后会发现VsCode的json文件就允许注释了...

利用图像识别进行疾病诊断

利用图像识别进行疾病诊断是人工智能和机器学习技术在医疗领域的一个重要应用。图像识别技术可以通过分析医学影像(如X光片、CT扫描、MRI、超声波图像等)来辅助医生诊断疾病。以下是图像识别在疾病诊断中的关键步骤和挑战: 数据收集与预处理…...

大数据学习-2024/3/28-excel文件的读写操作

借助第三方模块:inxlrd,xlwt pip 第三方模块包管理工具 –> winr --> cmd --> 打开操作系统 –> python --> 查看默认的解释器版本 --> exit() –> pip list --> 查看第三方模块的列表 pip36 list --> 查看3.6版本安装的第三方模块列表 –> pip[…...

k8s 如何获取加入节点命名

当k8s集群初始化成功的时候&#xff0c;就会出现 加入节点 的命令如下&#xff1a; 但是如果忘记了就需要找回这条命令了。 kubeadm join 的命令格式如下&#xff1a;kubeadm join --token <token> --discovery-token-ca-cert-hash sha256:<hash>--token 令牌--…...

黑群晖基于docker配置frp内网穿透

前言 我的黑群晖需要设置一下内网穿透来外地访问&#xff0c;虽然zerotier的p2p组网已经很不错了&#xff0c;但是这个毕竟有一定的局限性&#xff0c;比如我是ios的国区id就下载不了zerotier的app&#xff0c;组网不了 1.下载镜像 选择第一个镜像 2.映射文件 配置frpc.ini&a…...

多线程基础:线程通信内容补充

多线程基础&#xff1a;线程通信内容补充 文章目录 多线程基础&#xff1a;线程通信内容补充前言一、wait(), notify(), notifyAll()二、join()三、Lock 和 Condition四、并发集合和原子变量1、并发集合2、原子变量 总结 前言 前文内容中讲了线程通信的内容&#xff0c;但是不…...

使用Jenkins打包时执行失败,但手动执行没有问题如ERR_ELECTRON_BUILDER_CANNOT_EXECUTE

具体错误信息如&#xff1a; Error output: Plugin not found, cannot call UAC::_ Error in macro _UAC_MakeLL_Cmp on macroline 2 Error in macro _UAC_IsInnerInstance on macroline 1 Error in macro _If on macroline 9 Error in macro FUNCTION_INSTALL_MODE_PAGE_FUNC…...

OpenCV图像滤波、边缘检测

OpenCV图像滤波 一、引言 在数字图像处理中&#xff0c;滤波是一种重要的技术&#xff0c;用于消除图像中的噪声、改善图像质量或提取特定信息。OpenCV&#xff08;开源计算机视觉库&#xff09;提供了丰富的滤波函数&#xff0c;可以方便地对图像进行各种滤波操作。本文将介…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解

进来是需要留言的&#xff0c;先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码&#xff0c;输入的<>当成字符串处理回显到页面中&#xff0c;看来只是把用户输…...

边缘计算网关提升水产养殖尾水处理的远程运维效率

一、项目背景 随着水产养殖行业的快速发展&#xff0c;养殖尾水的处理成为了一个亟待解决的环保问题。传统的尾水处理方式不仅效率低下&#xff0c;而且难以实现精准监控和管理。为了提升尾水处理的效果和效率&#xff0c;同时降低人力成本&#xff0c;某大型水产养殖企业决定…...

路由基础-路由表

本篇将会向读者介绍路由的基本概念。 前言 在一个典型的数据通信网络中&#xff0c;往往存在多个不同的IP网段&#xff0c;数据在不同的IP网段之间交互是需要借助三层设备的&#xff0c;这些设备具备路由能力&#xff0c;能够实现数据的跨网段转发。 路由是数据通信网络中最基…...

Appium下载安装配置保姆教程(图文详解)

目录 一、Appium软件介绍 1.特点 2.工作原理 3.应用场景 二、环境准备 安装 Node.js 安装 Appium 安装 JDK 安装 Android SDK 安装Python及依赖包 三、安装教程 1.Node.js安装 1.1.下载Node 1.2.安装程序 1.3.配置npm仓储和缓存 1.4. 配置环境 1.5.测试Node.j…...

在Spring Boot中集成RabbitMQ的完整指南

前言 在现代微服务架构中&#xff0c;消息队列&#xff08;Message Queue&#xff09;是实现异步通信、解耦系统组件的重要工具。RabbitMQ 是一个流行的消息中间件&#xff0c;支持多种消息协议&#xff0c;具有高可靠性和可扩展性。 本博客将详细介绍如何在 Spring Boot 项目…...