#sdsc6012

English / 中文

时间序列基础理论

时间序列定义与性质

时间序列是按时间顺序排列的随机变量序列,记为 {Xt:tT}\{X_t: t \in T\},其中 TT 为时间索引集。在实际应用中,TT 通常为离散集合(如 T={0,1,2,}T = \{0, 1, 2, \ldots\})。

核心概念:时间序列分析旨在揭示序列内部的动态依赖关系,并基于历史数据建立预测模型。

示例数据表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import pandas as pd

data = {
'Date': ['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05',
'2023-01-06', '2023-01-07', '2023-01-08', '2023-01-09', '2023-01-10'],
'Temperature': [22.5, 24.1, 23.8, 21.2, 20.5, 19.8, 22.3, 23.7, 24.5, 25.2],
'Humidity': [65, 62, 68, 72, 75, 78, 70, 66, 63, 60],
'Sales': [150, 168, 142, 135, 158, 172, 165, 148, 156, 162],
'Stock_Price': [105.2, 106.8, 104.5, 103.1, 107.3, 109.6, 108.2, 106.7, 107.9, 110.4]
}

df = pd.DataFrame(data)
df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)

说明:时间序列数据包含时间戳和多个观测变量,适合进行多变量时序分析。

平稳性:严格定义与分类

严平稳过程(Strictly Stationary Process)

一个时间序列 {Xt}\{X_t\} 称为严平稳的,如果对其任意有限维分布函数和任意时间偏移 kk,满足:

FXt1,Xt2,,Xtn(x1,x2,,xn)=FXt1+k,Xt2+k,,Xtn+k(x1,x2,,xn)F_{X_{t_1}, X_{t_2}, \ldots, X_{t_n}}(x_1, x_2, \ldots, x_n) = F_{X_{t_1+k}, X_{t_2+k}, \ldots, X_{t_n+k}}(x_1, x_2, \ldots, x_n)

其中 FF 为联合分布函数,nn 为任意正整数。

弱平稳过程(Weakly Stationary Process)

实际应用中更多使用弱平稳性概念,要求满足以下三个条件:

  1. 均值函数为常数

    E[Xt]=μ对所有 t 成立\mathbb{E}[X_t] = \mu \quad \text{对所有 } t \text{ 成立}

  2. 方差函数为常数

    Var(Xt)=σ2对所有 t 成立\text{Var}(X_t) = \sigma^2 \quad \text{对所有 } t \text{ 成立}

  3. 自协方差函数仅依赖于时间差

    Cov(Xt,Xs)=γ(ts)对所有 t,s 成立\text{Cov}(X_t, X_s) = \gamma(|t-s|) \quad \text{对所有 } t, s \text{ 成立}

重要说明:严平稳性蕴含弱平稳性,但反之不成立,除非过程服从多元正态分布。

平稳性检验方法论

图形化检验方法

时序图分析

通过绘制时间序列图并添加均值线,直观判断是否存在:

  • 趋势成分(Trend)

  • 季节性(Seasonality)

  • 异方差性(Heteroscedasticity)

1
2
3
4
5
6
7
8
9
10
11
12
13
import matplotlib.pyplot as plt

fig, axes = plt.subplots(2, 2, figsize=(12, 8))
variables = ['Temperature', 'Humidity', 'Sales', 'Stock_Price']

for i, var in enumerate(variables):
row, col = i // 2, i % 2
axes[row, col].plot(df.index, df[var], marker='o', linewidth=2)
axes[row, col].axhline(y=df[var].mean(), color='r', linestyle='--',
label=f'Mean ({df[var].mean():.1f})')
axes[row, col].set_title(f'{var} - Stationarity Analysis')
axes[row, col].legend()
axes[row, col].grid(alpha=0.3)

自相关函数图

绘制样本自相关函数(SACF)图,平稳序列的 SACF 应快速衰减至零附近。

统计检验:增强迪基-富勒检验

检验原理

ADF检验通过估计以下回归模型进行:

ΔXt=α+βt+γXt1+i=1pϕiΔXti+εt\Delta X_t = \alpha + \beta t + \gamma X_{t-1} + \sum_{i=1}^{p} \phi_i \Delta X_{t-i} + \varepsilon_t

其中 ΔXt=XtXt1\Delta X_t = X_t - X_{t-1} 为一阶差分算子。

假设设定

  • 原假设 H0:γ=0H_0: \gamma = 0 (序列非平稳)

  • 备择假设 H1:γ<0H_1: \gamma < 0 (序列平稳)

判断准则

若检验统计量值小于临界值(或 p 值小于显著性水平如 0.05),则拒绝原假设,认为序列平稳。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from statsmodels.tsa.stattools import adfuller

print("Augmented Dickey-Fuller Test Results:")
print("=" * 50)

for var in variables:
result = adfuller(df[var])
print(f"{var}:")
print(f" ADF Statistic: {result[0]:.4f}")
print(f" p-value: {result[1]:.4f}")

if result[1] < 0.05:
print(" -> Series is likely STATIONARY (reject null hypothesis)")
else:
print(" -> Series is likely NON-STATIONARY (cannot reject null hypothesis)")
print("-" * 30)

注意:ADF检验对滞后阶数 pp 的选择敏感,通常采用 AIC 或 BIC 准则确定最优滞后阶数。

高斯白噪声过程:理想平稳序列

高斯白噪声 {εt}\{\varepsilon_t\} 是时间分析中的基础过程,定义为满足:

  1. E[εt]=0\mathbb{E}[\varepsilon_t] = 0 (零均值)

  2. Var(εt)=σ2\text{Var}(\varepsilon_t) = \sigma^2 (常数方差)

  3. Cov(εt,εs)=0\text{Cov}(\varepsilon_t, \varepsilon_s) = 0tst \neq s (无自相关)

数学表达εtIID N(0,σ2)\varepsilon_t \sim \text{IID } \mathcal{N}(0, \sigma^2),其中 IID 表示独立同分布。

数学定义

XtN(0,1)for all tX_t \sim \mathcal{N}(0, 1) \quad \text{for all } t

性质

  • 均值E[Xt]=0\mathbb{E}[X_t] = 0

  • 方差Var(Xt)=1\text{Var}(X_t) = 1

  • 自协方差函数

    γ(k)={1if k=00if k0\gamma(k) = \begin{cases} 1 & \text{if } k = 0 \\ 0 & \text{if } k \neq 0 \end{cases}

生成与验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import numpy as np

生成高斯白噪声
np.random.seed(42)
n_points = 500
white_noise = np.random.normal(0, 1, n_points)

统计性质验证
print(f"Overall Mean: {white_noise.mean():.4f}")
print(f"Overall Standard Deviation: {white_noise.std():.4f}")
print(f"Variance: {white_noise.var():.4f}")

自相关检验
from statsmodels.tsa.stattools import acf
autocorr = acf(white_noise, nlags=10)
print("\nAutocorrelation (lags 1-5):")
for i in range(1, 6):
print(f" Lag {i}: {autocorr[i]:.4f}")

自协方差与自相关函数

自协方差函数(Autocovariance Function)

对于弱平稳过程,自协方差函数定义为:

γ(k)=Cov(Xt,Xt+k)=E[(Xtμ)(Xt+kμ)]\gamma(k) = \text{Cov}(X_t, X_{t+k}) = \mathbb{E}[(X_t - \mu)(X_{t+k} - \mu)]

其中 kk 为滞后阶数。

自相关函数(Autocorrelation Function)

标准化自协方差函数得到自相关函数:

ρ(k)=γ(k)γ(0)=γ(k)σ2\rho(k) = \frac{\gamma(k)}{\gamma(0)} = \frac{\gamma(k)}{\sigma^2}

自相关函数满足:ρ(0)=1\rho(0) = 1ρ(k)=ρ(k)\rho(k) = \rho(-k),且 ρ(k)1|\rho(k)| \leq 1

白噪声的自协方差

对于白噪声过程:

γ(k)={σ2=1if k=00if k0\gamma(k) = \begin{cases} \sigma^2 = 1 & \text{if } k = 0 \\ 0 & \text{if } k \neq 0 \end{cases}

说明:白噪声在任意非零滞后处无自相关,是典型的平稳过程。

非平稳序列的平稳化方法

差分运算(Differencing)

一阶差分

Xt=XtXt1\nabla X_t = X_t - X_{t-1}

二阶差分

2Xt=(Xt)=(XtXt1)(Xt1Xt2)=Xt2Xt1+Xt2\nabla^2 X_t = \nabla(\nabla X_t) = (X_t - X_{t-1}) - (X_{t-1} - X_{t-2}) = X_t - 2X_{t-1} + X_{t-2}

季节性差分

对于周期为 ss 的季节性序列:

sXt=XtXts\nabla_s X_t = X_t - X_{t-s}

应用原则:差分的阶数通常不超过 2,过度差分会导致方差增大和模型解释性降低。

差分法实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 一阶差分
df['Temperature_Diff'] = df['Temperature'].diff()

可视化差分结果
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8))

原始序列
ax1.plot(df.index, df['Temperature'], marker='o', color='red', linewidth=2)
ax1.set_title('Original Temperature Series')
ax1.set_ylabel('Temperature (°C)')
ax1.grid(alpha=0.3)

差分序列
ax2.plot(df.index[1:], df['Temperature_Diff'][1:], marker='s', color='blue', linewidth=2)
ax2.axhline(y=0, color='black', linestyle='-', alpha=0.3)
ax2.set_title('First Difference Series (ΔTemperature = Temperature_t - Temperature_{t-1})')
ax2.set_ylabel('Temperature Difference (°C)')
ax2.grid(alpha=0.3)

plt.tight_layout()
plt.show()

差分统计信息
diff_stats = f"Mean: {df['Temperature_Diff'].mean():.2f}°C\n"
diff_stats += f"Std Dev: {df['Temperature_Diff'].std():.2f}°C\n"
diff_stats += f"Min: {df['Temperature_Diff'].min():.2f}°C\n"
diff_stats += f"Max: {df['Temperature_Diff'].max():.2f}°C"

差分计算示例

1
2
3
4
5
6
print("Temperature Difference Calculation:")
print("=" * 40)
for i in range(1, len(df)):
date_str = df.index[i].strftime('%Y-%m-%d')
temp_diff = df['Temperature'].iloc[i] - df['Temperature'].iloc[i-1]
print(f"Δ({date_str}) = {df['Temperature'].iloc[i]:.1f} - {df['Temperature'].iloc[i-1]:.1f} = {temp_diff:.1f}°C")

变换法(Transformation)

对数变换

Yt=log(Xt)Y_t = \log(X_t)

适用于处理指数增长趋势和方差随时间增长的情况。

Box-Cox 变换

Yt={Xtλ1λif λ0log(Xt)if λ=0Y_t = \begin{cases} \frac{X_t^\lambda - 1}{\lambda} & \text{if } \lambda \neq 0 \\ \log(X_t) & \text{if } \lambda = 0 \end{cases}

通过参数 λ\lambda 的优化,同时处理非平稳性和方差非齐性。

数据预处理理论框架

数据质量维度体系

根据数据质量管理理论,数据质量可通过以下多维指标评估:

  1. 准确性(Accuracy):数据与其描述的真实实体之间的一致性程度

  2. 完整性(Completeness):所需数据是否被完整记录,可用缺失率衡量:

    缺失率=缺失值数量总数据量×100%\text{缺失率} = \frac{\text{缺失值数量}}{\text{总数据量}} \times 100\%

  3. 一致性(Consistency):数据在不同地方是否保持一致表示

  4. 时效性(Timeliness):数据更新频率与当前时间的接近程度

  5. 可信性(Believability):数据源和数据值的可信程度

  6. 可解释性(Interpretability):数据是否易于理解和使用

缺失数据处理机制分类

缺失机制类型

  • 完全随机缺失(MCAR):缺失与观测值和未观测值均无关

  • 随机缺失(MAR):缺失仅与观测值有关,与未观测值无关

  • 非随机缺失(MNAR):缺失与未观测值有关

处理方法选择准则

缺失机制 推荐处理方法
MCAR 直接删除、均值插补
MAR 回归插补、多重插补
MNAR 模型法、选择模型

缺失值处理实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 检测缺失值
print("Missing Values Analysis:")
print("=" * 30)
print(df.isnull().sum())

处理方法
1. 删除缺失值
df_drop = df.dropna()

2. 填充缺失值
df_fill_mean = df.fillna(df.mean()) 均值填充
df_fill_forward = df.fillna(method='ffill') 前向填充

3. 插值法
df_interpolate = df.interpolate()

噪声数据处理的理论基础

噪声统计模型

假设观测数据 YtY_t 由真实信号 f(t)f(t) 和噪声 εt\varepsilon_t 组成:

Yt=f(t)+εtY_t = f(t) + \varepsilon_t

其中 εtN(0,σ2)\varepsilon_t \sim \mathcal{N}(0, \sigma^2)

平滑技术数学原理

移动平均法

f^(t)=12k+1i=kkYt+i\hat{f}(t) = \frac{1}{2k+1} \sum_{i=-k}^{k} Y_{t+i}

指数平滑法

f^(t)=αYt+(1α)f^(t1)\hat{f}(t) = \alpha Y_t + (1-\alpha)\hat{f}(t-1)

其中 α(0,1)\alpha \in (0,1) 为平滑参数。

噪声数据处理实现

1
2
3
4
5
6
7
8
9
10
11
12
13
 分箱平滑
def binning_smooth(data, bin_size=3, method='mean'):
smoothed = []
for i in range(0, len(data), bin_size):
bin_data = data[i:i+bin_size]
if method == 'mean':
smoothed.extend([bin_data.mean()] * len(bin_data))
elif method == 'median':
smoothed.extend([bin_data.median()] * len(bin_data))
return smoothed

应用分箱平滑
df['Temperature_Smooth'] = binning_smooth(df['Temperature'].values)

数据集成与相关性分析

统计相关性理论

Pearson相关系数

总体相关系数:

ρX,Y=Cov(X,Y)σXσY=E[(XμX)(YμY)]σXσY\rho_{X,Y} = \frac{\text{Cov}(X,Y)}{\sigma_X \sigma_Y} = \frac{\mathbb{E}[(X-\mu_X)(Y-\mu_Y)]}{\sigma_X \sigma_Y}

样本相关系数:

rxy=i=1n(xixˉ)(yiyˉ)i=1n(xixˉ)2i=1n(yiyˉ)2r_{xy} = \frac{\sum_{i=1}^n (x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum_{i=1}^n (x_i - \bar{x})^2} \sqrt{\sum_{i=1}^n (y_i - \bar{y})^2}}

相关性检验

检验统计量:

t=rn21r2t(n2)t = \frac{r\sqrt{n-2}}{\sqrt{1-r^2}} \sim t(n-2)

其中 H0:ρ=0H_0: \rho = 0H1:ρ0H_1: \rho \neq 0

相关系数计算实现

1
2
3
4
5
6
7
8
9
10
11
12
 Pearson相关系数
corr_matrix = df.corr()
print("Correlation Matrix:")
print("=" * 30)
print(corr_matrix)

可视化相关矩阵
import seaborn as sns
plt.figure(figsize=(10, 8))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', center=0)
plt.title('Feature Correlation Matrix')
plt.show()

卡方检验与列联表分析

对于两个分类变量的独立性检验:

期望频数计算

Eij=(rowi total)×(columnj total)grand totalE_{ij} = \frac{(row_i \text{ total}) \times (column_j \text{ total})}{\text{grand total}}

卡方统计量

χ2=i=1rj=1c(OijEij)2Eijχ2((r1)(c1))\chi^2 = \sum_{i=1}^r \sum_{j=1}^c \frac{(O_{ij} - E_{ij})^2}{E_{ij}} \sim \chi^2((r-1)(c-1))

应用注意:当期望频数小于5的单元格比例超过20%时,需使用Fisher精确检验。

特征工程与维度约简

主成分分析(PCA)数学基础

问题 formulation

给定中心化数据矩阵 XXn×pn \times p),寻找投影方向 ww 使得投影后方差最大:

maxwwTΣws.t.wTw=1\max_{w} w^T \Sigma w \quad \text{s.t.} \quad w^T w = 1

其中 Σ=1nXTX\Sigma = \frac{1}{n} X^T X 为样本协方差矩阵。

特征分解解法

Σvi=λivi,i=1,2,,p\Sigma v_i = \lambda_i v_i, \quad i=1,2,\ldots,p

其中 λ1λ2λp0\lambda_1 \geq \lambda_2 \geq \cdots \geq \lambda_p \geq 0 为特征值,viv_i 为对应特征向量。

方差解释比例

kk 个主成分的方差解释比例为:

λki=1pλi\frac{\lambda_k}{\sum_{i=1}^p \lambda_i}

特征选择理论

过滤法(Filter Methods)

基于统计量(如相关系数、卡方统计量、互信息)评估特征重要性。

包裹法(Wrapper Methods)

通过子集搜索和交叉验证选择最优特征子集,常用算法:

  • 前向选择(Forward Selection)

  • 后向消除(Backward Elimination)

  • 递归特征消除(RFE)

嵌入法(Embedded Methods)

在模型训练过程中自动进行特征选择,如:

  • Lasso 回归:L1L_1 正则化导致稀疏解

  • 决策树:基于特征重要性评分

特征工程实现

多项式特征

1
2
3
4
5
6
7
8
9
10
from sklearn.preprocessing import PolynomialFeatures

创建多项式特征
poly = PolynomialFeatures(degree=2, include_bias=False)
data_poly = poly.fit_transform(df[['Temperature', 'Humidity']])
feature_names = poly.get_feature_names_out(['Temperature', 'Humidity'])

合并特征
df_poly = pd.DataFrame(data_poly, columns=feature_names)
df_extended = pd.concat([df, df_poly], axis=1)

统计特征创建

1
2
3
4
5
6
7
8
 基于统计的新特征
df['RM_LSTAT'] = df['RM'] * df['LSTAT'] 房间数 × 低收入人群比例
df['RM_PTRATIO'] = df['RM'] / df['PTRATIO'] 房间数 ÷ 师生比
df['RM_TAX'] = df['RM'] / df['TAX'] 房间数 ÷ 房产税

计算新特征与目标变量的相关性
target_corrs = df.corr()['target'].abs().sort_values(ascending=False)
selected_features = target_corrs[target_corrs >= 0.5].index.tolist()

数据变换与规范化

规范化方法

最小-最大规范化

v=vminAmaxAminA×(new_maxAnew_minA)+new_minAv' = \frac{v - \min_A}{\max_A - \min_A} \times (\text{new\_max}_A - \text{new\_min}_A) + \text{new\_min}_A

Z-score规范化

v=vμAσAv' = \frac{v - \mu_A}{\sigma_A}

小数定标规范化

v=v10jv' = \frac{v}{10^j}

其中 jj 是使 max(v)<1\max(|v'|) < 1 的最小整数

规范化实现

1
2
3
4
5
6
7
8
9
from sklearn.preprocessing import MinMaxScaler, StandardScaler

最小-最大规范化
minmax_scaler = MinMaxScaler()
df_minmax = minmax_scaler.fit_transform(df[['Temperature', 'Humidity']])

Z-score规范化
std_scaler = StandardScaler()
df_std = std_scaler.fit_transform(df[['Temperature', 'Humidity']])

数据离散化与概念分层

离散化算法分类

无监督离散化

  • 等宽分箱:区间宽度固定

    binwidth=maxminNbin width = \frac{\max - \min}{N}

  • 等频分箱:每个区间包含近似相同数量的样本

有监督离散化

  • 基于熵的离散化(如ID3算法)

  • ChiMerge算法:基于卡方统计量的自底向上合并方法

概念层次生成方法

基于统计的方法

根据属性值的 distinct 数量自动生成层次结构,distinct 值越多的属性位于越低层次。

基于域知识的方法

由领域专家明确定义层次关系,如:

  • 地理层次:街道 < 城市 < 州 < 国家

  • 时间层次:日 < 月 < 季度 < 年

离散化实现

1
2
3
4
5
6
7
8
9
10
11
 等宽离散化
df['Temp_Binned'] = pd.cut(df['Temperature'], bins=5, labels=['Low', 'Medium-Low',
'Medium', 'Medium-High', 'High'])

等深离散化
df['Humidity_Binned'] = pd.qcut(df['Humidity'], q=4, labels=['Q1', 'Q2', 'Q3', 'Q4'])

基于聚类的离散化
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3)
df['Sales_Cluster'] = kmeans.fit_predict(df[['Sales']])

总结

时间序列分析要点

  1. 平稳性检验是时间序列分析的前提

  2. 非平稳序列可通过差分等方法转换为平稳序列

  3. 自相关分析有助于理解序列内部结构

数据预处理关键步骤

  1. 数据清洗:处理缺失值、噪声和异常值

  2. 数据集成:解决多源数据的一致性问题

  3. 数据归约:通过特征选择和数据压缩提高效率

  4. 数据变换:规范化和离散化提升模型性能

最佳实践建议

  • 始终从数据探索和可视化开始分析

  • 根据数据特性选择合适的预处理方法

  • 多次迭代优化特征工程策略

  • 验证预处理效果对最终模型的影响