洗发水销售数据集的性质分析
数据加载与初步观察
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.stattools import adfuller
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
# 加载数据
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/shampoo.csv"
data = pd.read_csv(url, header=0, parse_dates=[0], index_col=0,)
print(data.head())
数据可视化
plt.figure(figsize=(10, 4))
plt.plot(data, marker='o', linestyle='-', color='b')
plt.title("Shampoo Sales Time Series")
plt.xlabel("Month")
plt.ylabel("Sales")
plt.grid(True)
plt.show()
# 2. 诊断原始数据
plt.figure(figsize=(12, 6))
plt.plot(data)
plt.title('原始数据(有明显趋势)')
# ADF检验
adf_result_original = adfuller(data)
print(f'原始数据的ADF检验结果:')
print(f' ADF Statistic: {adf_result_original[0]}')
print(f' p-value: {adf_result_original[1]}') # p-value会非常大,说明是非平稳的
# 3. 进行一阶差分治疗
data_diff = data.diff().dropna() # .diff()进行差分, .dropna()移除第一个NaN值
plt.plot(data_diff)
plt.title('一阶差分后的数据')
plt.tight_layout()
plt.show()
# 4. 诊断“治疗后”的数据
adf_result_diff = adfuller(data_diff)
print(f'一阶差分后数据的ADF检验结果:')
print(f' ADF Statistic: {adf_result_diff[0]}')
print(f' p-value: {adf_result_diff[1]}') # p-value会变得非常小,说明数据变平稳了
# 3. 进行季节性差分(周期s=12)
seasonal_data_diff = data.diff(periods=12).dropna()
plt.subplot(212)
plt.plot(seasonal_data_diff)
plt.title('季节性差分后 (s=12) 的数据')
plt.tight_layout()
plt.show()
# 4. 检查差分后的平稳性
# 注意:原始数据因为有趋势,肯定不平稳。季节性差分通常也能消除一部分趋势。
adf_result_original = adfuller(data)
print(f'原始季节性数据的p-value: {adf_result_original[1]}')
adf_result_seasonal_diff = adfuller(seasonal_data_diff)
print(f'季节性差分后数据的p-value: {adf_result_seasonal_diff[1]}')
趋势成分:销售额的长期增长趋势明显。
季节性成分:存在轻微的周期性波动(如每年某些月份的销售高峰)。
残差:噪声较小,说明数据规律性较强。