首页 > 解决方案 > 计算线性百分比差异

问题描述

我有两个相关的数据集,其中一个可能略低于 0。

我正在尝试计算两者之间的“线性”百分比差异。

我已经编写了一些示例代码: perc[1] 是正确的百分比方法,但是在最后两个示例情况下,双方的百分比差异不是“线性”(即 -87 与 700 相比)-我需要它们相等或在计算中具有一定的线性度,而我猜最后三种方法是线性的。我喜欢 perc[3] 因为它只是绝对差异和放大,但有点无单位。也许 [4] 或 [5] 是这个用例最准确的,使用两者的平均值作为分母?

1, 8: [12.5, -87.5, 700.0, -700, -155.55555555555557, 155.55555555555557]
8, 1: [800.0, 700.0, -87.5, 700, 155.55555555555557, -155.55555555555557]

统计不是我的强项。谁能提供为什么我应该使用 [4] 或 [5] 的原因。我知道 0,1,2 和 3 在这里可能不是正确的选择

import numpy as np
import matplotlib.pyplot as plt

def perc_calc(x,y):
    perc0=(x/y)*100 #Original one i used but is non-linear
    perc1=((x-y)/(y))*100   #Proper % method but still nonlinear
    perc2=((y-x)/x)*100    #Depends if use x or y
    perc3=(x-y)*100       #Just amplifying the real difference
    perc4=(x-y)/((x+y)/2)*100  #Difference by the mean 
    perc5=(y-x)/((x+y)/2)*100  #Opposite difference by the mean
    return [perc0,perc1,perc2,perc3,perc4,perc5]


x=np.random.uniform(-0.005, 1, size=600)
y=np.random.uniform(0.005,1,size=600)

plt.plot(perc_calc(x,y)[3])
plt.show()

plt.plot(perc_calc(x,y)[4])
plt.show()

def example(x,y):
    print(str(x)+', '+str(y)+': '+str(perc_calc(x,y)))
#Example Cases:
example(5,10)
example(-1,10)
example(1,8)
example(8,1)

标签: pythonnumpystatistics

解决方案


参考这篇Wikipedia article相对百分比通常是以下形式

|x - y| / |f(x, y)|

|x - y| 中的绝对值 如果您有参考点,则可以将其删除,从而获得负百分比。如果这对你没有意义,你应该保留它。

函数 |f(x,y)| 就是通常所说的比例因子。您可以在此处选择许多选项,这取决于应用程序。

你可以只取 f(x, y) = y,就像在 (1) 中所做的那样。这通常是在比较实验值和理论值时完成的,比如在一些实验中测量之后;或者在测量相对于过去状态的变化时。但请注意,它需要一个参考点(理论值或更改完成前的值),并且它不具有您正在寻找的“线性”属性,因为您的缩放因子在交换 x 和 y 时会发生变化(1 /2 vs 1 如果我们使用 1 和 2)。这是因为,对于 2 的值,突然变为 10 意味着增加了 400%,但从 10 变为 2 意味着减少了 80%。

所以你需要一些在交换参数时不会改变的函数 f 。这在数学上称为对称函数前面引用的文章中有很多例子。我建议使用 (|x| + |y|)/2,但试试其他的,看看更有意义。

    perc6 = abs(x-y) / ((abs(x)+abs(y)) / 2) * 100

要通过绘图进行测试,请尝试固定 y 的值,例如 10,然后绘制 x 与 的散点图perc_calc(x, 10)[6]


推荐阅读