我有这些目标和实际情况:
实际:“ - 20”/目标:“ - 10”
实际“”50“/目标:” - 5“
实际:“ - 10”/目标:“30”
目标值是3个类别中每个类别的预期值,实际值是年初至今的实际值。
关于第一类;预计与上一期相比将有-10个销售额。结果是在当前时期结束时为-20。答案可能是-100%或-200%。这些百分比都没有意义,因为完成的百分比不应该是负数。使百分比不合理的另一个原因是在这种情况下我无法察觉100%和-100%之间的差异。
在第二类中,预计本期间将减少5个销售额,但结果显示当前期间实际销售额为50个。如果我们同意每个5的金额是100%,答案应该是+ 1100%。
编辑:与上述相同,第三类的答案应为-133%
我想看看有多少目标得以实现。如果actual = target,那么答案是100%,尽管如果实际和目标都是负数,这没有意义。
如果我使用(实际/目标)* 100负数总是错误的。我需要一个通用的公式来计算正确的答案。我不介意公式是否有许多条件定义。我怎样才能做到这一点?
答案 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)
如果您不希望自己的得分如何发挥作用,请提供一个示例,说明当target
或actual
为否定时应该得分。
答案 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