-3

我有这些目标和实际情况:

实际:“-20”/目标:“-10”

实际”“50”/目标:“-5”

实际:“-10”/目标:“30”

目标值是 3 个类别中每个类别的预期值,实际值是年初至今的实际值。

  • 关于第一类;预计与上一时期相比,销售额将是-10。在当前周期结束时,结果是-20。答案可能是 -100% 或 -200%。这些百分比都没有意义,因为完成的百分比不应该是负数。使百分比不合理的另一个原因是,在这种情况下,我无法感知 100% 和 -100% 之间的差异。

  • 在第 2 类中,预计当期销售额将减少 5 次,但实际上当期销售额为 50 次。如果我们同意每个 5 的数量都是 100%,那么答案应该是 +1100%。

  • 编辑:同上,第三类的答案应该是-133%

我想看看目标完成了多少。如果实际=目标,那么答案是 100%,尽管如果实际和目标都是负数,这没有意义。

如果我使用(实际/目标)*100 负数总是错误的。我需要一个通用公式来计算正确答案。我不介意公式是否有许多条件定义。我怎样才能做到这一点?

4

4 回答 4

1

当涉及负数时,您应该始终知道您在寻找什么。

示例 1:

如果您使用绝对值,您应该同意target=10actual=-5是并且应该是50%。但是,看待它的“纯”数学方式是-50%

对此的一个合乎逻辑的解释是实际 = 0,正如逻辑预测的那样,是 0%,-5 甚至更糟!因为不仅没有取得进展,反而出现了倒退,因此 -50% 是可以理解的结果。

示例 2:

当两者都是负数时target=-10actual=-20,因为锚点是0,“纯”数学结果是200% - 并且是正确的(当然取决于你的观点)因为你想要减少10个,减少了20个。

注意:如果您想以不同的方式定义您想要的输出,请这样做,我们将尝试提出“自定义”百分比计算方法。

编辑:

你可以在你的情况下尝试什么(虽然我必须说我不同意这种方法):

  • 如果目标> 0 和实际> 0 :(通常):

    (actual/target)*100

  • 如果目标 < 0 并且实际 < 0 :(通常为负数):

    • if (target>actual) - 实际情况比预期差:

      -(actual/target)*100

    • if (target < actual) - 实际好于预期:

      (actual/target)*100

  • 如果目标> 0 和实际 < 0

    ((actual-target)/target)*100

    对应于 target=50 ,实际 = -100 ->结果 = -300%

  • 如果 target<0 和实际 > 0

    (abs(target)+actual)/abs(target))*100

    所以对于 target = -50 ,但实际 = 100 -> result = 300%

我相信这涵盖了您的选择并满足您的需求。

编辑:

从我的角度来看,解决您的问题的一个好方法是查看绝对值(而不是差分值):

假设您在 A 月的销售额为 200,并且您希望在 A+1 月增加 10% -> 将目标设置为 220,然后将实际值与它进行比较,您还可以将 A 月的实际值和总体报告进行比较用绝对值来比较,总是正的,可以更清楚地理解。

现在这个:

目标 = -10% ,实际 +5%和上个月的基值 100

就是这样:

目标 = 90 实际 =105 => 整体表现为 105/90 ,或 (105/90)-1 高于预期。

于 2013-07-05T21:53:53.707 回答
0

这是 R 的解决方案。假设您的数据是包含 Target 和 Actual 列的样本:

sample<-structure(list(Actual = c(-20L, 50L, -10L), Target = c(-10L, 
-5L, 30L)), .Names = c("Actual", "Target"), row.names = c(NA, 
-3L), class = "data.frame")

sample<-
  Actual Target
1    -20    -10
2     50     -5
3    -10     30

#first I compute the percentage deviation as ((Actual-Target)/Actual)*100
#then I will use following two conditions:
# if Actual<0 and Target>0 multiply by -1
#if Actual<0 and Target<0  and if  absolute(Actual)>absolute(Target) multiply by -1 else leave as original percent

sample$diff<-with(sample,((Actual-Target)/Actual)*100)
> sample
  Actual Target diff
1    -20    -10   50
2     50     -5  110
3    -10     30  400

sample$percent<-with(sample,ifelse((Actual<0 & Target>0),diff*(-1),ifelse((Actual<0 & Target<0),ifelse((abs(Actual)>abs(Target)),diff*-1,diff),diff)))

> sample
  Actual Target diff percent
1    -20    -10   50     -50
2     50     -5  110     110
3    -10     30  400    -400

#delete diff column 

sample$diff<-NULL 

#your final output

> sample
  Actual Target percent
1    -20    -10     -50
2     50     -5     110
3    -10     30    -400

更新:

要匹配您的答案:

sample$diff<-with(sample,((Actual-Target)/Target)*100)
sample$percent<-with(sample,ifelse((Actual<0 & Target>0),diff,ifelse((Actual<0 & Target<0),ifelse((abs(Actual)>abs(Target)),diff*(-1),diff),diff*(-1))))
> sample
  Actual Target       diff   percent
1    -20    -10   100.0000 -100.0000
2     50     -5 -1100.0000 1100.0000
3    -10     30  -133.3333 -133.3333
于 2013-07-08T16:19:10.697 回答
0

如果您想将实际“-50”/目标“50”视为 100% 完成,则应在公式中使用绝对值函数。

| ((actual / target) * 100) |

如何在代码中使用它取决于语言。在 JavaScript 中,您的公式将如下所示:

Math.abs((actual / target) * 100)

如果这不是您希望得分的工作方式,请提供一个示例,说明当targetoractual为负数时得分应该是多少。

于 2013-07-05T21:48:37.813 回答
0

根据您的编辑以及有关您想要的更多详细信息,以下是一些实现该公式的 JavaScript:

function percent_difference(target, actual) {
    if (target === 0 || actual === 0) {
        if (actual > target) {
            return 100;
        } else if (actual < target) {
            return -100;
        } else {
            return 0;
        }
    }

    var relative_to = Math.min(Math.abs(actual), Math.abs(target));
    var distance_from_target_to_actual = actual - target;
    var fraction_difference = distance_from_target_to_actual / relative_to;
    return 100 * fraction_difference;
}

我试图避免不必要if的语句以保持代码简单。

该函数通过了这些测试:

function test_percent_difference() {
    console.log("percent_difference(-10, -20)", percent_difference(-10, -20), "should be", -100);
    console.log("percent_difference(-5, 50)", percent_difference(-5, 50), "should be", 1100);
    console.log("percent_difference(30, -10)", percent_difference(30, -10), "should be", -400);
    console.log("percent_difference(15, 0)", percent_difference(15, 0), "should be", 100);
    console.log("percent_difference(0, 0)", percent_difference(0, 0), "should be", 0);
}

您可以在这个 jsFiddle的浏览器中自己运行它。

于 2013-07-08T15:25:24.800 回答