计算趋势是上升、下降还是稳定的。

7

我正在编写一个VBScript,用于发送包含客户活动的每周邮件。以下是一些示例数据:

a       b       c       d       e      f        g
2,780   2,667   2,785   1,031   646    2,340    2,410

由于这是电子邮件,我不需要带有趋势线的图表。我只需要一个简单的函数,返回“上升”、“下降”或“稳定”(尽管我怀疑它永远不会完全稳定)。

我对数学一窍不通,所以我甚至不知道从哪里开始。我查看了一些关于Python或Excel的其他问题,但相似度不够高,或者我没有足够的知识将其应用到VBS。

我的目标是实现以下简单的函数:

a       b       c       d       e      f        g        trend
2,780   2,667   2,785   1,031   646    2,340    2,410

如果有一些增量、百分比或其他测量值可以显示,那将非常有帮助。我还可能想要忽略异常值。例如上面的646。我们的一些客户周末不开放。


也许你需要计算最佳拟合直线的斜率。如果斜率为正,则向上,如果为负则向下。如果斜率为零,则稳定。 - S L
那我该怎么做呢? - user736893
这个公式中找到Beta的值。对于此处使用字母'a','b','c'表示的变量'x',您需要为其分配数字。如果您以等间隔方式获取这些数据,则将自然数0 1 2 3等分配给它们。 - S L
1
那个链接对我来说看起来就像希腊语一样。 - user736893
是的,这些值已经在一个数组中了,上面的字母只是为了方便阅读。 - user736893
1
不难,我会写出如何做的答案...你只需要计算它的平均值,加起来变量等等。 - S L
3个回答

19

首先,您的数据被列在

a       b       c       d       e      f        g      
2,780   2,667   2,785   1,031   646    2,340    2,410    
为了得到趋势线,您需要为变量 a, b, c, ... 分配数值。

要分配数值,您需要更多关于数据如何采集的信息。假设您在1月1日采集数据 a,您可以将其分配任何值,例如 01。然后您在十天后采集了数据 b,那么您可以将值分配为 1011。然后您在三十天后采集了数据 c,那么您可以将值分配为 3031a, b, c, ... 的数值必须与采集数据的时间间隔成比例,以得到更准确的趋势线数值。

如果这些数据是以固定间隔采集的(这很可能是您的情况),例如每7天一次,那么您可以按照固定间隔分配数值 a, b, c, ... ~ 1, 2, 3, ... 起始点完全由您选择,选择使其非常容易的东西即可。在最终计算中不重要。
然后您需要计算线性回归的斜率,您可以从此 URL中找到,然后使用以下表格计算 b 的值。

enter image description here

  1. 在第一列中,从第2行到第8行,我放置了 a,b,c,... 的值,我将其标记为 1,2,3,...

  2. 在第二列中,我有我的数据。

  3. 在第三列中,我将第一列中的每个单元格乘以相应单元格中的第二列数值。

  4. 在第四列中,我平方了第一列中的每个单元格。

  5. 在第10行中,我加总了上述各列的数值。

  6. 最后使用第10行的数值。

        total_number_of_data*C[10] - A[10]*B[10]
  b =  -------------------------------------------
        total_number_of_data*D[10]-square_of(A[10])

b的符号决定了你要寻找什么。如果是正数,那么它向上,如果是负数,那么它向下,如果是零,则稳定。


这几乎有意义。你能把数字代入方程式并以此方式展示给我吗?我想那样我就会明白了。(我目前对“total_number_of_data”感到困惑) - user736893
哦,那应该是7吧?b等于-139.5吗? - user736893
((754734) - (2814660)) / ((7*140) - (28^2)) 这样对吗? - user736893
2
@ScottBeeson total_number_of_data=7,在此查看它 https://www.wolframalpha.com/input/?i=linear+fit+2780%2C++2667%2C++2785%2C+1031%2C+646%2C+2340%2C+2410&dataset=&equal=Submit 是的,它必须是-139.393。 - S L

3

这非常有帮助!下面是在Python中的函数实现:

def trend_value(nums: list):
    summed_nums = sum(nums)
    multiplied_data = 0
    summed_index = 0 
    squared_index = 0

    for index, num in enumerate(nums):
        index += 1
        multiplied_data += index * num
        summed_index += index
        squared_index += index**2

    numerator = (len(nums) * multiplied_data) - (summed_nums * summed_index)
    denominator = (len(nums) * squared_index) - summed_index**2
    if denominator != 0:
        return numerator/denominator
    else:
        return 0

val = trend_value([2781, 2667, 2785, 1031, 646, 2340, 2410])
print(val)  # -139.5

0

在Python中:

def get_trend(numbers):
rows = []
total_numbers = len(numbers)
currentValueNumber = 1
n = 0
while n < len(numbers):
    rows.append({'row': currentValueNumber, 'number': numbers[n]})
    currentValueNumber += 1
    n += 1
sumLines = 0
sumNumbers = 0
sumMix = 0
squareOfs = 0
for k in rows:
    sumLines += k['row']
    sumNumbers += k['number']
    sumMix += k['row']*k['number']
    squareOfs += k['row'] ** 2
a = (total_numbers * sumMix) - (sumLines * sumNumbers)
b = (total_numbers * squareOfs) - (sumLines ** 2)
c = a/b
return c

trendValue = get_trend([2781,2667,2785,1031,646,2340,2410])
print(trendValue) # output:  -139.5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接