在做时间序列分析时,经常会用到差分的分析方法,但之前都没有细想,今天对相关的内容做个梳理。
##差分的概念
(1) 差分
差分是统计学里一个常用的概念,应该是源自更为基础的学科——数学,里的数列概念。
数列(sequence of number):
是以正整数集(或它的有限子集)为定义域的函数,是一列有序的数
所以我们通常所接触的时间序列,本质就是一个数列,只不过多了一个时间列,显式的告诉你这列数发生变化的时间点位。
差分(difference methods):
- 统计学中的差分,就是指离散函数的后一项减去前一项的差
- 数学中的差分,是一种微分方程数值方法,通过有限差分来近似导数,从而寻求微分方程的近似解。
(2) 一阶差分
一阶差分就是用原数列的后一项减去前一项得到的一组差数列。
(3) 二阶差分
二阶差分既是对远数列进行的第二次差分操作,也等于在一阶差分的基础上再做一次差分。
以下为手动计算一阶差分、二阶差分的数值。
| 原来数列项 | 一阶差分项 | 二阶差分项 |
|---|---|---|
| 166668.2 | ||
| 138248.7 | -28419.5 | |
| 140172.9 | 1924.2 | 30343.7 |
| 122368.2 | -17804.7 | -19728.9 |
| 163803.4 | 41435.2 | 59239.9 |
| 124775 | -39028.4 | -80463.6 |
| 131981.7 | 7206.7 | 46235.1 |
| 112752.6 | -19229.1 | -26435.8 |
| 162106 | 49353.4 | 68582.5 |
| 125792.2 | -36313.8 | -85667.2 |
##差分的意义
特地举了个特殊的例子来说明,会看的比较清晰。
test = pd.Series([1,2,3,4,5,6,7,8,9,10])
test.plot()
上面这组数据一眼望去就是个等差数列,数列的d=1,n=10,即一共有10个数,差是1。刚才是用数学语言描述了这组数据。从数据分析的角度看,也不用那么专业,这就是一组线性相关的数据y=ax+b,并且这里a>0,数据是递增变化的。
####一阶差分
test_diff1 = diff(a=test,n=1)
plot(test_diff1)
#或者可以调用Series对象的内置方法
test_diff1 = test.diff(1)
test_diff1.plot()
一阶差分的结果解释了数据变化幅度,这个幅度既是数值,某种程度上也是一种比率。根据下图可知,原数列的值变化的幅度值均为1。
####二阶差分
二阶差分的值均为0,这以为这什么?二阶差分是一阶差分再求一次差分得到的,这表明一阶差分值不再发生变化,用一个线性函数即可以描述原始数据,并且残差是0。当然这只是一个特例,一般情况下做了二阶差分并不会直接为0,而是有可能近似趋近0。
test_diff2 = diff(a=test,n=2)
plot(test_diff2)
##diff()方法使用注意点
series的diff()方法
这个方法默认参数是period=1,可以用来计算一阶差分。但要注意的是diff(2)不是用来计算二阶差分的,而是周期为2的差分。以上面的test为例:
| test数据项 | diff(1) | diff(2) |
|---|---|---|
| 1 | NaN | NaN |
| 2 | 1 | NaN |
| 3 | 1 | NaN |
| 4 | 1 | 2 |
| 5 | 1 | 2 |
| 6 | 1 | 2 |
| 7 | 1 | 2 |
| 8 | 1 | 2 |
| 9 | 1 | 2 |
| 10 | 1 | 2 |
pandas的diff()方法
这个方法才是用来计算高阶差分的,这里a是指数列,n是差分的次数。diff(a=test,n=2)可用来计算test数列的二阶差分。
👏👏👏再看看我们以前的文章😃😃😃
🌺 Excel中数据分析工具库-相关系数篇
🌺 干货,手把手教会你做相关性分析
🌺 5年数据分析路,小结。
🌺 用户细分及画像分析
🌺 K-近邻算法及实践
欢迎关注,微信公众号“数据分析师之家”
扫描二维码 关注我们
💁提供职业规划、简历指导、面试辅导服务哦
QQ交流群:254674155