跳转至

数据分析

因为题目的描述非常模糊,所以拿到数据后的第一件事就是搞清楚数据的规模、结构以及基本的特征。为此,我编写了class ReadAndVisualization来负责数据的读入、简单的分析以及可视化。

数据规模

首先查看的是数据规模,一共是393087行,568列。其中第1列是ID,也就是说有效数据一共是567列。前559列为X,后8列为Y,我们的目标就是通过给出的X去预测Y。

因为每一行都有一个独立的ID,猜测每一行都是一个产品,而每一列就是该产品的某个特征。但到底是什么特征从数据中并无法看出。

            ID        X0        X1  ...        Y5        Y6        Y7
0            0 -0.050137 -0.207596  ... -2.096015 -1.844365 -1.248071
1            1  0.026262  0.141363  ... -1.537078 -1.011953 -0.510574
2            2  0.000000  0.152237  ...  0.059886  0.832413  0.581488
3            3  0.000000  0.000000  ...  0.139734  0.571264  0.283652
4            4 -0.091918 -0.171267  ...  0.838406  0.571264  0.694949
...        ...       ...       ...  ...       ...       ...       ...
393082  393082  0.000000 -0.432673  ... -0.359317 -0.195862 -0.156009
393083  393083  0.000000  0.000000  ... -0.099810 -0.097931 -0.156009
393084  393084 -0.105049 -0.434963  ...  0.119772  0.048965 -0.014183
393085  393085  0.000000  0.000000  ...  0.119772  0.032644  0.000000
393086  393086  0.000000  0.000000  ... -0.099810 -0.179540 -0.099278

[393087 rows x 568 columns]

波动规律

因为我们并不知道每一列的具体经济学含义,它们之间可能有时序数据,也可能是同一时间截面的不同指标。为了对它们有一个大概的认识,我选择了一些行作折线图(上:第5行折线图,下:0~500行折线图叠加),有如下发现:

  • 似乎存在一定的周期。以第5行为例,每隔一定距离就会出现一个连续4个点组成的“平台”,其他行也可以观察到类似的规律;

  • 所有数据几乎都在0~2的范围内波动,列之间的数据没有数量级的差异。

根据上面两点观察,我们可以初步判断:该数据为面板数据,且很可能已经经过标准化

标准化?

是否zscore标准化?

为了进一步验证上面的猜想,我首先检查了是否每一列都经过了zscore标准化。在经过代码筛选和人工排查后,我发现每一列的均值都在0附近,方差在0.26、0.27附近,并且近似符合正态分布。可以认为几乎每一列都单独经过zscore标准化(但不知出于什么原因,方差并非传统的1,而是落在0.27左右)。

标准化异常

值得注意的是,有少部分列的0值异常多,可以观察到KDE图像在0处存在一个明显的尖角,看上去并非正态分布(而且就集中在我们需要预测的0~7列),但因为均值和方差仍然落在接受范围内,所以逃过了代码的检查。这部分数据需要在之后的处理中引起额外关注。

还有极少数分布比较奇怪的列,分布显得有些离散,可能是对哑变量也进行了zscore标准化导致的。这个特点在以X162为代表的列上尤其明显(显然这是一个哑变量)。

还有一些类也有类似的情况,但不是那么严格:

绘制散点图,隐约可见几条水平线,我猜测会出现这样的情况是因为此类特征的构造中含有哑变量。

我们可以考虑找出所有潜在的哑变量,将其还原出来。当然,这是否真的能够提升模型预测的准确度还有待考证。

0值异常列

经检查,给出0值显著异常的列如下:

  列 X0  : 0值比例 = 0.5510 | 正态分布预期 = 0.4983
  列 X99 : 0值比例 = 0.7410 | 正态分布预期 = 0.4996
  列 X111: 0值比例 = 0.5840 | 正态分布预期 = 0.4984
  列 X112: 0值比例 = 0.5657 | 正态分布预期 = 0.4993
  列 X162: 0值比例 = 0.5804 | 正态分布预期 = 0.5019
  列 X163: 0值比例 = 0.5642 | 正态分布预期 = 0.4987
  列 X164: 0值比例 = 0.5804 | 正态分布预期 = 0.5000
  列 X165: 0值比例 = 0.5804 | 正态分布预期 = 0.4999
  列 X329: 0值比例 = 0.6672 | 正态分布预期 = 0.4983

我对其进行逐列检查,发现一些奇怪的分布(在上一部分中已经给出展示),在之后的处理中需要额外注意。

哑变量检查

检查是否存在额外的哑变量列没被发现,结果如下:

  列 X63 : 唯一值 = [ 0.3343117  -0.3343117   0]
  列 X64 : 唯一值 = [-0.32739846  0.32739846  0]
  列 X162: 唯一值 = [-0.40831295  0.40831295  0]
  列 X163: 唯一值 = [-0.40065199  0.40065199  0]
  列 X277: 唯一值 = [-0.30811813  0.30811813  0]
  列 X278: 唯一值 = [-0.30246908  0.30246908  0]
  列 X392: 唯一值 = [-0.35911794  0.35911794  0]
  列 X393: 唯一值 = [-0.35259936  0.35259936  0]
  列 X507: 唯一值 = [-0.33303743  0.33303743  0]
  列 X508: 唯一值 = [-0.32585566  0.32585566  0]

这个结果是不出意外的,和后面发现的周期规律也相吻合。

时间序列性

检查潜在的时间序列

我检查了平均相关系数高于0.8的相关序列。显然,相关序列的出现存在周期性规律,并且和上面的单行折线图所反映的规律相对应。

  ...
  组 7 : ['X83',  'X84',  'X85',  'X86',  'X87',  'X88',  'X89',  'X90',  'X91',  'X92',  'X93',  'X94',  'X95',  'X96',  'X97',  'X98' ] | 平均相关性: 0.9847
  ...
  组 14: ['X182', 'X183', 'X184', 'X185', 'X186', 'X187', 'X188', 'X189', 'X190', 'X191', 'X192', 'X193', 'X194', 'X195', 'X196', 'X197'] | 平均相关性: 0.9836
  ...
  组 24: ['X297', 'X298', 'X299', 'X300', 'X301', 'X302', 'X303', 'X304', 'X305', 'X306', 'X307', 'X308', 'X309', 'X310', 'X311', 'X312'] | 平均相关性: 0.9854
  ...
  组 35: ['X412', 'X413', 'X414', 'X415', 'X416', 'X417', 'X418', 'X419', 'X420', 'X421', 'X422', 'X423', 'X424', 'X425', 'X426', 'X427'] | 平均相关性: 0.9845
  ...
  组 46: ['X527', 'X528', 'X529', 'X530', 'X531', 'X532', 'X533', 'X534', 'X535', 'X536', 'X537', 'X538', 'X539', 'X540', 'X541', 'X542'] | 平均相关性: 0.9847
  ...

相关矩阵

绘制相关矩阵,更容易注意到数据的规律,依此构建合适的特征并选择相应的模型。

因为数据规模较大,所以相关矩阵的计算可能较为缓慢。有三种解决方法:

  1. 慢慢等,跑一遍完整的计算也就7分钟的样子,也不算消耗太长时间
  2. 抽样计算(比如每隔100行选择一行数据)
  3. 并行加速(注意内存管理,否则可能导致系统崩溃)

下面是我画出的相关性矩阵(点此查看大图

至此,这组面板数据的特点已经非常明显了。虽然我们还是无从得知数据的经济学含义,但图中的相关性和周期性已经足够我们构建相应的特征了。