本文章为一篇总结文,记录了自己参加”2020年华为财务精英挑战赛“的一些个人感想。
前一阵子我在刷Leetcode时,突然有一位本科学财经的同学微信我,邀请我组队参加这个比赛,原因是她们之中没有会”计算机“的同学。在了解了相关情况后,我发现这个比赛可能会涉及到数据分析,需要用到Python一类的编程语言,于是我就答应了。虽然自己专业方向不是数据分析,但我想,参加这个比赛或多或少可以增长自己的见识,锻炼自己的能力吧。
上周,也就是4月18日,赛题放出来了。因为华为的保密协议,它的案例不能被公开,因此我就晦涩地叙述下有关数据分析那一块的工作吧。
题目列出了各地区往年至2019年的2G,3G,4G以及整体的市场规模,让参赛人员自行推测出2020年四个季度的各地区5G市场规模和整体市场规模(不借助额外数据)。
我一看这题,只能通过”时间“因变量去推算市场规模,顿时就想起了线性回归。但在输出了各地区市场规模的折线图后,我发现规模与时间不呈线性关系。经历了一番面向百度与Google的搜索后,我发现”时间序列分析法“似乎很切合这道题,于是采用了旗下的ARIMA模型,原因是它可以在已有的和时间有关的数据序列的基础上构建其数据模型并预测其未来的数据。
整个建模与预测过程感觉像是在本科参加数学建模大赛一样,在极短时间内学习全新的知识,并运用它完成案例分析。这个过程中我走了不少弯路,尤其是关于差分那块内容。想使用ARIMA模型,必须满足的前提条件是数据平稳。所谓平稳,就是随着时间变化,数据本身不会呈现明显的上升或下降趋势,而官方给出的数据基本都是总体呈上升趋势。因此,为了平稳化,需要对数据进行差分。那么问题来了,是应该把差分后的数据带入模型,还是直接套用差分前的呢?直觉告诉我是用差分后的,但出于谨慎,我在网上又搜索了许久,看到许多人都是把差分后的数据带入模型训练,在预测后把结果恢复成原来的序列即可。于是我照着做了一遍,发现是能预测出结果,但我却没办法把数据恢复回去,网上所谓的”恢复“方法在我这儿就没用了。
我在这里卡了两天左右,无论是百度、Google还是Stack Overflow,硬是没找到有效的解决办法。最后上Youtube搜索视频教程时,发现另一群人是直接带入的原数据进行训练,差分的过程仅仅是为了确认ARIMA所需的参数之一d(difference)。顿时我就蒙了,难道同一个模型使用方法还不统一吗?照着Youtube的教程,我顺利完成了对模型的预测,但由于在考虑ARIMA模型的参数选值时我采用了暴力循环,是通过随机组合的p,d,q来求一个叫做‘’BIC‘的值,并比较出最小的BIC值对应的p,q来确认的参数,所以最终训练出的模型并不是完美的。并且,模型训练好之后还需要进行校验,判断该模型是否符合预测的标准,这一块我也是照猫画虎,不懂得背后的原理是什么,所以最终预测的数据或许存在着相当程度的误差。
后来我发现,在Python中有不同的包在实现ARIMA模型。一个叫做:
import statsmodels.tsa.arima.model.ARIMAResults
另一个叫做:
import statsmodels.tsa.arima_model.ARIMAResults
它们的区别就是一个是点,一个是下划线……但就是因为这个点和下划线,导致了两个包的使用以及参数接收与输出类型、方式完全不同,使得我混淆了ARIMA模型的运用方法。不过,虽然知道了不同的包使用方法不同,但就其具体的区别,以及两种方法的优劣,还是需要自行阅读官方文档才行。但我读了一会,发现还是自己因为不了解ARIMA背后的运作机制,以及其数学原理,导致许多参数的意义还是不明白,一个一个地搜索参数背后的原理解释似乎太过于低效。并且,目前来看,网上针对基于Python的ARIMA教程与答疑比较少,尤其是对一些异常的处理问题,Stack Overflow也没太多我认为有用的解答,似乎大家现在不太关心Python版本的ARIMA模型了。
直到我刚刚写完上一段,准备去查阅一些资料的时候,我发现CSDN里有人跟我推荐了一个更好并且更受欢迎的开源框架”prophet“。我稍微查了一下,这个框架不仅比ARIMA的效果更快更好,而且相关资料也更为全面,甚至还有一步一步带你上手的教程……顿时我就觉得自己之前的努力似乎没多大效果了,比赛也在今天截止,也来不及重新学习新模型并预测数据了。自己到头来还是犯了一个错误,没能预先搜索并比对不同模型的学习成本,看到一个用途比较符合的模型就直接开整了,盲目不堪。
另外,一个人的能力总是有限的。因为数据分析的模型部分都是我一个人在搞,没有外援,所以目前我解决问题的途径只是上网检索与提问。因为没有专业相关的大佬可以交流(其他组员都是学财务的),所以效率较低,一个很简单的问题都能折腾自己好几天。到头来,自己学到的东西也很有限。这个比赛的结果虽然可能不会多么出彩,但它让我坚信了一点:一定要广结良缘,融入优秀的人所在的圈子,这样自己才能在最短时间内获得最大程度的提升, 信息不对称的问题也能最大程度得到解决。 凡事都自己单干,就以我现在的实力来看,多半会导致事倍功半。
那应该如何融入优秀的人所在的圈子呢?对于我而言有三点:一是想办法改变自己现在所处的环境。自己自从疫情爆发以来一直都待在家,长期处于舒适区肯定会对人造成影响,因此需要及时改变自己所处的环境,比如寻找实习,毕竟氛围对于我来讲真的很重要。不过,目前自己所投的简历仍旧没人捞,或许是自己的简历不够格,得多找内推,随机应变吧;二是夯实基础,系统学习一些自己平时一直都在用但却没怎么关注原理的知识,把自己的地基打牢,这样在解决问题时就会相对减少无脑百度/Google的情况;三是多读书,增加自己的见识。这里的读书并不只针对技术书籍,其他领域也要多涉及,增加自己的认知广度。
当我一个人的时候,我总是会因为自己不成熟的想法,不自觉地走歪了路。但当我作为一个团队成员处在一个优秀的环境时,我会不断激发自己,尽可能让自己对团队做出更多贡献,做一个有价值的人。在这其中,我也许能完成我一个人很难完成的任务,学到我一个人很难接触的知识,达到我一个人很难触及的高度吧。
希望我能早日融入到优秀的人所在的圈子,不再一个人绕圈圈。