我有以下一组目标和实际值:
实际:"-20"/目标:"-10"
实际"50"/目标:"-5"
实际:"-10"/目标:"30"
目标值是3类中每一类的预期值,实际值是今年迄今为止的实际值。
-
关于第一类;预计年的销售额将比上一季度下降10倍。在本期结束时,结果是-20。答案可能是-100%或-200%。这些百分比都没有意义,因为完成的百分比不应该是负数。另一个使百分比不合理的原因是,在这种情况下,我看不出100%和-100%之间的区别。
-
关于第二类,预计本期销售额将减少5笔,但事实证明,本期实际销售额为50笔。如果我们同意每5个数字都是100%,那么答案应该是+1100%。
-
编辑:与上面一样,第三类的答案应该是-133%
我想看看目标实现了多少。如果实际=目标,那么答案是100%,尽管如果实际和目标都是负数,这就没有意义了。
如果我使用(实际/目标)*100负数总是错误的。我需要一个通用公式来计算正确答案。我不介意这个公式是否有很多条件定义。我该怎么做?
当涉及负金额时,您应该始终知道您要查找的是什么。
示例1:
如果您使用绝对值,您应该同意目标=10和实际=-5是并且应该是50%。然而,"纯粹"的数学方法是-50%。
对此的逻辑解释是,正如逻辑预测的那样,实际=0是0%,-5甚至更糟!由于不仅没有取得任何进展,反而出现了倒退,因此-50%是一个可以理解的结果。
示例2:
当两者都为负时,对于目标=-10和实际=-20,由于锚定点为0时,"纯"数学结果为200%-并且是正确的(当然取决于您的观点),因为您想要减少10,但得到了减少20。
注意:如果你想以不同的方式定义你想要的输出,那么我们将尝试提出一种"自定义"百分比计算方法
编辑:
你可以在你的情况下尝试什么(尽管我必须说我不同意这种方法):
-
如果目标>0而实际>0:(通常):
(actual/target)*100
-
如果目标<0和实际<0:(通常为负值):
-
如果(目标>实际)-实际情况比预期更糟:
-(actual/target)*100
-
如果(目标<实际)-实际比预期好:
(actual/target)*100
-
-
如果目标>0并且实际<0:
((actual-target)/target)*100
对应目标=50,实际=-100->结果=-300%
-
如果目标<0和实际>0:
(abs(target)+actual)/abs(target))*100
因此,对于目标=-50,但实际=100->结果=300%
我相信这涵盖了您的选择并符合您的需求。
编辑:
从我的角度来看,解决问题的一个好方法是查看绝对值(而不是微分值 假设你在A月的销售额是200,而你希望在A+1月增长10%->将你的目标设定为220,然后将实际值与之进行比较,你也可以将其与A月的实际值和总体值进行比较。一份报告将使用绝对值进行比较,这些值总是正的,并且可以更清楚地理解。 现在这个: 目标=-10%,实际+5%和上月基本值100 简单地说就是: target=90实际=105=>总体性能为105/90,或(105/90)比预期高出1。
如果要将实际"-50"/目标"50"视为100%完成,则应在公式中使用绝对值函数。
| ((actual / target) * 100) |
如何在代码中使用它取决于语言。在JavaScript中,您的公式如下:
Math.abs((actual / target) * 100)
如果这不是你想要的评分方式,请提供一个例子,说明当target
或actual
为负时的评分应该是多少。
根据您的编辑以及您想要的更多细节,下面是一些实现该公式的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中在浏览器中自己运行它。
这是R的解决方案。假设您的数据是带有"目标"one_answers"实际"列的样本:
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