负目标的百分比

时间:2013-07-05 21:46:18

标签: percentage

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

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

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

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

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

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

  • 在第二类中,预计本期间将减少5个销售额,但结果显示当前期间实际销售额为50个。如果我们同意每个5的金额是100%,答案应该是+ 1100%。

  • 编辑:与上述相同,第三类的答案应为-133%

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

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

4 个答案:

答案 0 :(得分:1)

当涉及负数时,你应该总是知道你在寻找什么。

示例1:

如果您使用绝对值,您应该同意目标= 10 实际= -5 50%。然而,看待它的'纯'数学方法是 -50%

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

示例2:

当两者都是负数时,目标= -10 实际= -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,actual = -100 - > 结果= -300%

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

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

    因此对于target = -50,但实际= 100 - > 结果= 300%

我认为这涵盖了您的选择并满足您的需求。

修改

从我的观点来看,解决问题的一个好方法是查看绝对值(而不是差异值):

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

现在这个:

  

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

就是这样:

  

target = 90 actual = 105 =>整体表现为105/90,或(105/90)-1高于预期。

答案 1 :(得分:0)

如果您想将实际“-50”/目标“50”视为100%已满足,则应使用公式中的absolute value功能。

| ((actual / target) * 100) |

如何在代码中使用它取决于语言。在JavaScript中,您的公式将是这样的:

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

如果您不希望自己的得分如何发挥作用,请提供一个示例,说明当targetactual为否定时应该得分。

答案 2 :(得分: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);
}

您可以在this jsFiddle中的浏览器中自行运行。

答案 3 :(得分:0)

这是R的解决方案 假设您的数据是目标和实际列的样本:

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