基于当前统计数据的分布预测的准确实时更新解决方案

时间:2013-02-23 00:25:02

标签: excel vba excel-vba excel-formula prediction

作为我当前项目的一部分,我需要为以下内容找到一个非常好的Excel解决方案:人们获得经验的在线游戏(类似于SO代表)并尽快进入下一级别获得(再次,这非常像SO特权)。当然这需要每个人不同的时间:一些人在第一周获得足够的exp,其他人需要5周才能通过这个级别。统计数据如下:

Week from join: Week 1  Week 2  Week 3  Week 4  Week 5
Level up:       5%      15%     40%     30%     10%

也就是说,如果在本周我们有一些人加入游戏,5周后所有人都会进入下一个级别(有些人会放弃并离开,但为了简单起见,我不会在条件清单。)

至于每场比赛,现有球员的数量都很重要。为了让游戏保持流行和令人兴奋,每个级别的玩家应该有明确的最小数量。显然,这个价值在不断变化:新人来了,而其他人则进入了一个新的水平。然而 - 那就是行动的开始! - 这个当前玩家的最小值不是恒定的,并且可能会因许多因素而变得谨慎。简单来说,这意味着在未来的10-15周内,每周应该实现一组预测的最小玩家数量(这是基于收集的统计数据,但对于给定的任务,这是一个已知设置)。

到目前为止,图片看起来很像:

Sample 1

虽然在最左边的列中有很多人每周加入游戏,但每周下面的一行粗体数字是在本周内传递到下一个级别的人数< /强>

拥有大量的新人,每周总得分水平的计算是微不足道的。相反的情况并非如此简单(好吧,至少对我来说) - 这就是问题:如何预测每周所需的新人数(最左边一栏) - 获得所需在接下来的几周内将会传递到下一级别的人数(底部的粗体行)?

到目前为止,我仍然无法找到适当且准确的解决方案2周。我尝试了所有可能的选择 - 复杂和放大数组公式为Solver addin,但没有运气:我总是有比方程更多的未知数。但是,我非常确定这不是一项不可能完成的任务:对于某些解决方案,Solver可以提供非常接近所需数字的数字,但不能提供所有期望值。

一些假设和(或许)重要条件:

  1. 虽然不应该是一个问题,但实际的每周分发%%%数字按需更新,通过数据库查询和进一步的Excel处理。
  2. 到目前为止,DB中可用的实际新人值当然被认为是等式的已知值。显然它们不能改变,例如如果事实上有一个星期less than desired人加入了游戏,这将影响未来几周的计算预测,以实现整体效果。
  3. 在某段时间内实际传递到下一级的玩家总数应保持不变:例如如果我们想要在每年冬季的一周开始,1月1日至少有100人加入游戏,这将给我们整整8周的时间,因此总共有800名游戏玩家。然而,在1月份的情况下,我们每周实际上有80名新球员 - 这意味着2月份的努力工作。为了确定性,检查站&#34; 小计每10周计算一次。在任何情况下,任何低值都必须在接下来的几周内得到补偿。
  4. 反过来也是如此:如果我们在给定的一周内有比预期更多的新人 - 我们可能会在下周吸引更少的玩家来满足下一个小计目标。
  5. 玩家的流量是无限的 - 仅为了清晰和更好的理解而给出图片样本。可以根据需要在将来计算所需的值 - 预测模式是可重复的。如果这对解决方案很重要 - 让它从当前开始 10周。
  6. 纯配方溶液是优选的 - 甚至非常复杂。但是,VBA仍然是一个可以接受的选择。在任何情况下,计算值的准确实时/按需更新绝对优于简单但半手动或近似解决方案。
  7. 至于我在这里的每一个问题 - 我都不会要求ready to play解决方案,但非常感谢正确的指导或宝贵的建议。我故意不把它发布到https://stats.stackexchange.com/ - 它更像是编程问题,因为理论显然很简单......或者说太简单了,所以我不会看到非常明显的解决方案。

    请随时通过评论请求任何其他详细信息或解释:虽然我尽量清楚简单,但对我来说不重要的某些方面对于准确的解决方案可能至关重要。

    示例文件(包含上面的示例):https://www.dropbox.com/s/q3bnagyet86i34r/StatPrognosis01.xlsx

1 个答案:

答案 0 :(得分:1)

不需要VBA或复杂的数组公式 - 只需要一些转换为公式的简单数学:

主要思想是,您可以通过“反转”计算来确定每周的数量。逻辑如下:(注意:基于屏幕截图的单元格引用,即黄色5%将是B2):

  • 如果一周的“加入者”的5%达到下一级别,第1周(整体)应该有10个人,10/5%= 200人需要在第一周加入。
    > 作为公式,这意味着:B5:=B12,A5:=B5/B2
  • 从那里你可以计算第一周的加入者如何分配(即没有更改第5行的其余部分)
  • 在第2周,您希望35个人成为下一个级别。从前一步开始​​,您就知道从第1周开始,您就有30人达到该水平。因此,5人必须来自第2周的加入者。当它们再次产生该波的5%时,总波浪必须是5/5%= 100
    在公式中:C6:=C12-C5,A6:=C6/B2
  • ...

现在,您可以使用一些INDEX函数对此进行概括,而不是为每周创建单独的公式。为此,我将您的示例扩展为周数作为标题列和行:

enter image description here

要计算每个“每周木匠波”的数量,即范围C5:O17,请使用以下公式:

=IF($A5>C$4+N("Nobody from this wave joined yet:"),0,
    IF(C$4=$A5+N("The first week for the new wave:"),
        IF($A5=1+N("Very first wave must be expected number in this week:"),C18,
        N("All other weeks, this must be expected number minus 
          'levelups' from former weeks:")+(C$18-SUM(C4:C$5))
    ),
    N("For any later week after the joining, apply weekly uplevel ratio
       to total number of joiners:")+INDEX($C$2:$O$2,C$4-$A5+1)*$B5)
)

和每周所需的连接数,即范围B5:B17:

=INDEX($C5:$O5,$A5)/$C$2

这是更新的solution file