在做时间序列分析时,经常会用到差分的分析方法,但之前都没有细想,今天对相关的内容做个梳理。
差分的概念
(1) 差分
差分是统计学里一个常用的概念,应该是源自更为基础的学科——数学,里的数列概念。
数列(sequence of number):
是以正整数集(或它的有限子集)为定义域的函数,是一列有序的数
所以我们通常所接触的时间序列,本质就是一个数列,只不过多了一个时间列,显式的告诉你这列数发生变化的时间点位。
差分(difference methods):
1. 统计学中的差分,就是指离散函数的后一项减去前一项的差
2. 数学中的差分,是一种微分方程数值方法,通过有限差分来近似导数,从而寻求微分方程的近似解。
(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数列的二阶差分。
欢迎关注微信公众号“数据分析师手记”,一起成长进步!