关键词

基于Python实现帕累托图的示例详解

基于Python实现帕累托图的示例详解

什么是帕累托图

帕累托图(Pareto Chart)也叫帕累托分析法,是利用帕累托原理(二八法则)和梯度图的基础上绘制出的图形,又称二八图。它是管理质量控制和精益制造中的一种工具,目的是通过图形的形式使人们能够快速地了解哪些因素是最重要的。它可以在产品设计、质量改进、进度控制等方面获得广泛应用。
帕累托图通常由两个轴组成,左侧轴表示项目的数量或百分比,右侧轴表示项目的重要性或效益。条形图用来表示每个项目的数量或百分比,而累积百分比曲线则表示项目的重要性或效益。所有的项目按其重要性或效益降序排列,列出其累计百分比,最终在最左侧的轴上形成巴雷图或堆积图的效果,这就是帕累托图。

如何使用Python实现帕累托图

在Python中,可以使用Matplotlib库来实现帕累托图的绘制。下面是帕累托图绘制的详细过程:

步骤一:导入必要的库

import pandas as pd
import matplotlib.pyplot as plt

在这个示例中,我们使用了pandas和matplotlib两个库,其中pandas库用于数据的读取和处理,matplotlib库用于绘制图形。

步骤二:读取数据

在这个示例中,我们使用了一个示例数据集,该数据集包含了某公司的销售数据。

data = pd.read_excel("sales_data.xlsx")

步骤三:计算各项指标

在绘制帕累托图之前,我们需要计算各项指标,包括每个销售分类的销售额、总销售额、销售额的累计百分比和销售分类的累计百分比。下面是示例代码:

# 计算每个销售分类的销售额
data["SalesAmount"] = data["Quantity"] * data["Price"]

# 计算总销售额
total_sales = data["SalesAmount"].sum()

# 计算销售额的累计百分比和销售分类的累计百分比
data["CumulativeSalesPercent"] = data["SalesAmount"].cumsum() / total_sales
data["CumulativeCategoryPercent"] = (data.index + 1) / len(data)

步骤四:绘制帕累托图

绘制帕累托图的过程相对比较复杂,需要分别绘制条形图和累计百分比曲线,然后将这两个图形重叠在一起。下面是绘制帕累托图的示例代码:

# 绘制条形图
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()

ax1.bar(data.index, data["SalesAmount"], color="C0")
ax1.set_xlabel("Sales Category")
ax1.set_xticklabels(data["Category"], rotation=90)
ax1.set_ylabel("Sales Amount")

# 绘制累计百分比曲线
ax2.plot(data.index, data["CumulativeSalesPercent"], color="C1", marker="D", ms=7)
ax2.set_ylabel("Cumulative Sales Percent")

# 添加帕累托线
pareto_line_y = data["SalesAmount"].sum() * 0.8
pareto_line_x = data[data["SalesAmount"].cumsum() <= pareto_line_y].index.max()
ax1.axvline(pareto_line_x + 0.5, color="r", linestyle="--")
ax1.text(pareto_line_x + 0.5, pareto_line_y, "80%", ha="center")

plt.title("Pareto Chart of Sales Categories")
plt.show()

在这个示例中,我们使用了两个轴,左侧轴用于绘制条形图,右侧轴用于绘制累计百分比曲线。在添加帕累托线时,我们使用了80%阈值,并将阈值的位置设为红色虚线的形式。

示例一:基于销售数据的帕累托图

以上步骤仅为帕累托图绘制的基本过程,接下来我们将通过一个具体的示例来说明如何绘制基于销售数据的帕累托图。假设我们的数据集包含了某公司的销售数据,其中有不同的销售分类,每个分类的销售额不同。我们的目标是绘制出帕累托图,以便找出销售额最高的分类。

import pandas as pd
import matplotlib.pyplot as plt

data = pd.read_excel("sales_data.xlsx")

# 计算每个销售分类的销售额
data["SalesAmount"] = data["Quantity"] * data["Price"]

# 计算总销售额
total_sales = data["SalesAmount"].sum()

# 计算销售额的累计百分比和销售分类的累计百分比
data["CumulativeSalesPercent"] = data["SalesAmount"].cumsum() / total_sales
data["CumulativeCategoryPercent"] = (data.index + 1) / len(data)

# 绘制条形图
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()

ax1.bar(data.index, data["SalesAmount"], color="C0")
ax1.set_xlabel("Sales Category")
ax1.set_xticklabels(data["Category"], rotation=90)
ax1.set_ylabel("Sales Amount")

# 绘制累计百分比曲线
ax2.plot(data.index, data["CumulativeSalesPercent"], color="C1", marker="D", ms=7)
ax2.set_ylabel("Cumulative Sales Percent")

# 添加帕累托线
pareto_line_y = data["SalesAmount"].sum() * 0.8
pareto_line_x = data[data["SalesAmount"].cumsum() <= pareto_line_y].index.max()
ax1.axvline(pareto_line_x + 0.5, color="r", linestyle="--")
ax1.text(pareto_line_x + 0.5, pareto_line_y, "80%", ha="center")

plt.title("Pareto Chart of Sales Categories")

plt.show()

执行以上代码后,将绘制出一个包含销售额条形图和累计百分比曲线的帕累托图,我们可以根据帕累托图找出销售额最高的分类。

示例二:基于贡献度数据的帕累托图

除了销售数据外,帕累托图还可以用于绘制贡献度数据。假设我们有一个销售团队,我们想要计算每个销售员的销售额及其贡献度,以便找出贡献度最高的销售员。我们可以使用类似的方法,先计算出每个销售员的销售额和贡献度,然后绘制出帕累托图。

import pandas as pd
import matplotlib.pyplot as plt

data = pd.read_excel("sales_data.xlsx", sheet_name="SalesTeam")

# 计算每个销售员的销售额和贡献度
data["SalesAmount"] = data["Quantity"] * data["Price"]
data["SalesPercent"] = data["SalesAmount"] / data["SalesAmount"].sum()
data["CumulativeSalesPercent"] = data["SalesPercent"].cumsum()

# 绘制条形图
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()

ax1.bar(data.index, data["SalesAmount"], color="C0")
ax1.set_xlabel("Sales Team")
ax1.set_xticklabels(data["Name"], rotation=90)
ax1.set_ylabel("Sales Amount")

# 绘制累计百分比曲线
ax2.plot(data.index, data["CumulativeSalesPercent"], color="C1", marker="D", ms=7)
ax2.set_ylabel("Cumulative Sales Percent")

# 添加帕累托线
pareto_line_y = data["SalesAmount"].sum() * 0.8
pareto_line_x = data[data["SalesPercent"].cumsum() <= 0.8].index.max()
ax1.axvline(pareto_line_x + 0.5, color="r", linestyle="--")
ax1.text(pareto_line_x + 0.5, pareto_line_y, "80%", ha="center")

plt.title("Pareto Chart of Sales Team by Contribution")

plt.show()

运行以上代码后,我们将绘制出一个包含销售额条形图和累计百分比曲线的帕累托图,可以用于找出贡献度最高的销售员。

本文链接:http://task.lmcjl.com/news/14592.html

展开阅读全文