2022数据分析: 电商天猫维生素类药品销售分析

前言

这篇数据分析记述了一次关于天猫维生素类的药品(2020-2021)销售数据的分析。

image

有些不足的地方,希望大家斧正。

题目

随着国家政策的逐步开放,越来越多的药品可以在网络上购买,医药电商平台蒸蒸日上,受新冠疫情的影响,线下药店购买困难,更让医药电商进入了更多消费者的视野,各大药企也纷纷加大力度布局医药电商领域。但电商模式与线下零售有所不同,如何更好的经营医药电商成为药企急需解决的问题。本题采集了天猫维生素类的药品,请针对维生素药品进行数据的清洗、分析与挖掘,并回答下列问题。

  1. 对店铺进行分析,一共包含多少家店铺,各店铺的销售额占比如何?给出销售额占比最高的店铺,并分析该店铺的销售情况。
  2. 对所有药品进行分析,一共包含多少个药品,各药品的销售额占比如何?给出销售额占比最高的 10 个药品,并绘制这 10 个药品每月销售额曲线图。
  3. 对所有药品品牌进行分析,一共包含多少个品牌,各品牌的销售额占比如何?给出销售额占比最高的 10 个品牌,并分析这 10 个品牌销售较好的原因?
  4. 预测天猫维生素类药品未来三个月的销售总额并绘制拟合曲线,评估模型性能和误差。
  5. 一家药企计划将新的维生素品牌进行网络销售,聘请你当企业的顾问,请你设计一份不超过两页纸的电商经营策略。

摘 要

随着国家政策的逐步开放,越来越多的药品可以在网络上购买, 医药电商平台蒸蒸日上,受新冠疫情的影响,线下药店购买困难,更让医药电商进入了更多消费者的视野,各大药企也纷纷加大力度布局医药电商领域。

我们对维生素售卖的药店,维生素药品,维生素药品品牌进行了分析。

对于空值数据采用众数填充,信息的提取用到了正则表达式,药品名称的获取用到了北大中文医药分词的模形并适配自己的词典进行提取。模形预测使用了时间序列的自相关模型并做了基于时间序列残差的模型评估。

基于分析得到的信息给出了销售建议。

关键词

众数填充 销售分析 畅销药品 北大中文医药分词 时间序列自相关模型 平稳性 残差

1 店铺分析

1.1 店铺数量

通过对数据shop_name栏的统计。

代码1 读取商店名

import pandas as pd
import matplotlib.pyplot as plt
import re
from matplotlib.pyplot import style
import statsmodels.api as sm
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from statsmodels.tsa.stattools import adfuller as ADF
from scipy import stats
#qq图
from statsmodels.graphics.api import qqplot
# 加载北大分词包
import pkuseg

data = pd.read_excel('./data.xlsx')

print(data.head())

# 统计商店数量
shop = data['shop_name'].value_counts()
print(shop.head())
print(shop.tail())
print(shop.size)
print(shop.index)

发现共有26家店铺。分别是:

阿里健康大药房, 天猫国际进口超市, 康爱多大药房旗舰店, 天猫超市, ChemistWarehouse海外旗舰店, 焦作国控大药房旗舰店, 阿里健康大药房海外店, nyc美林健康海外专营店, thejamy保健海外专营店, 百康保健品专营店, 康恩贝官方旗舰店, hihealth海外专营店, 宜度海外专营店, 天猫国际妙颜社, NRC营养优选海外专营店, 苏宁易购官方旗舰店, nrfs湖畔海外专营店, 进口/国产保健品精品店, 康寿营养品店,百秀大药房旗舰店, LuckyVitamin海外旗舰店, skyshop海外专营店, 搬运健康馆, 美加精品,SASA美国直邮, 同堂保健品专营店。

1.2 店铺销售额占比

1.2.1 数据预处理

由于数据中并没有销售额一栏,需要我们自行计算。

采用:销售额 = 折扣 * 售价 * 销售数量 得到一行数据的销售额。

但是数据的折扣栏存在2884个空值。为了充分利用数据,所以我们使用折扣的众数(95折)进行填充。之后为数据新增一列销售额sales。

代码2 数据处理

# 空值数量
data['discount'].isnull().sum()

# 空值处理 用众数填充
discount_mode = data['discount'].mode()
data['discount'].fillna(discount_mode[0], inplace=True)
data['discount'].isnull().sum()

# 将 9折等转化为 float 0.90
data['discount'] = data['discount'].apply(
lambda x: float(re.findall('[0-9\.]+', x)[0])/10 if len(re.findall('[0-9\.]+', x))!=0 else None)

# 处理过后的空值数量 == 0
data['discount'].isnull().sum()

# 创建销售额数据列
data['sales'] = data['price'] * data['sold'] * data['discount']
data['sales'].head()

经过分析发现天猫维生素品类,26家商店,两年的销售总额达到了1498551953元,即14.98亿元。

1.2.2 销售额占比柱状图

对数据以药店名称shop_name进行聚类,并对销售额sales进行逐项加和,求出每个商店两年内的销售总额,并绘制柱状图。

代码3销售额占比以及柱状图

# 获取总的销售额
all_sales = data['sales'].sum()
# 对数据进行商店名称聚类
shop_group = data.groupby('shop_name')
# 以药店为组,进行销售额汇总
shop_sales = shop_group['sales'].agg('sum')
# 以药店销售额降序排列26个药店
shop_sales.sort_values(ascending=False)
# 获取销售额占比
shop_sales_percent = (shop_sales / all_sales).sort_values(ascending=False)

plt.figure(figsize=(8, 5))
plt.rcParams['font.sans-serif'] = 'Simhei'
plt.bar(range(len(shop_sales_percent[:10])), shop_sales_percent[:10])
plt.xticks(range(len(shop_sales_percent[:10])), shop_sales_percent[:10].index, rotation=45, ha='right')
plt.title('销售额占比最多的10家商店')
plt.gcf().subplots_adjust(bottom = 0.3)
plt.grid()
plt.show()

plt.rcParams['font.sans-serif'] = 'Simhei'
plt.bar(range(len(shop_sales_percent[-10:])), shop_sales_percent[-10:])
plt.xticks(range(len(shop_sales_percent[-10:])), shop_sales_percent[-10:].index, rotation=45, ha='right')
plt.title('销售额占比最少的10家商店')
plt.gcf().subplots_adjust(bottom = 0.3)
plt.grid()
plt.show()

image

图1

image
图2

其中阿里健康大药房的销售总额以674820879元,即6.74亿,占比45.03%,位列第一。

天猫国际进口超市的销售总额以355597052元,即3.55亿,占比23.73%,位列第二。

天猫超市的销售总额以114308114元,即1.14亿,占比7.63%,位列第三。

后十家的药店销售总额加起来为7362907元,即736万元,十家的总占比为0.49%。

经过分析得知电商天猫维生素类药品销量最好的是阿里系的药店,其他药店的销售份额占比非常小。

1.3 阿里健康大药房

由上述分析可得,阿里健康大药房的销售占比最高。所以对于16958条阿里健康大药房的数据进行销售分析。

1.3.1 年度分析

阿里健康大药房2020年有5998条数据,2021年有10960条数据。

经过分析发现,阿里健康大药房2021年销售总额同比增长119.23%。增长幅度较大。

代码4 阿里健康大药房年度分析

# 阿里健康大药房
Ali = shop_group.get_group('阿里健康大药房').copy()

# 年度分析对比
Ali_year = Ali.groupby(data.date_time.dt.year)
Ali_year_sum = Ali_year['sales'].sum()

plt.rcParams['font.sans-serif'] = 'Simhei'
plt.bar(range(len(Ali_year_sum)), Ali_year_sum)
plt.xticks(range(len(Ali_year_sum)), Ali_year_sum.index, rotation=45, ha='right')
plt.title('阿里健康大药房年度销售总额')
plt.grid()
plt.show()

growth_rate = (Ali_year_sum[2021] - Ali_year_sum[2020]) / Ali_year_sum[2020]*100

image

图3

1.3.2 季度分析

通过季度分析发现,第四季度购买次数最多,第一季度购买次数最少.

代码4 阿里健康大药房季度分析

# 季度分析对比
Ali_qua = Ali.groupby(data.date_time.dt.quarter)
Ali_qua_sum = Ali_qua['sales'].sum()

plt.rcParams['font.sans-serif'] = 'Simhei'
plt.bar(range(len(Ali_qua_sum)), Ali_qua_sum)
plt.xticks(range(len(Ali_qua_sum)), Ali_qua_sum.index, rotation=45, ha='right')
plt.title('阿里健康大药房季度销售总额')
plt.grid()
plt.show()

image

图4

1.3.3 月度分析

我们对阿里健康大药房的畅销商品进行了分析,其中维生素D滴剂,复合维生素片,多元维生素片,维生素AD滴剂,碳酸钙D3片为五大畅销产品。

代码5 阿里健康大药房月度分析

# 月度分析
Ali['medicine']  = Ali['parameter'].apply(find_medi)
Ali_medi = Ali.groupby('medicine')
Ali_medi_sum = Ali_medi['sales'].sum().sort_values(ascending=False)
Ali_keyMedi = Ali_medi_sum.index[:5]
print(Ali_medi_sum)
Ali_medi_sum = Ali_medi['sales'].sum().sort_values()

plt.rcParams['font.sans-serif'] = 'Simhei'
plt.barh(range(len(Ali_medi_sum[-10:])), Ali_medi_sum[-10:])
plt.yticks(range(len(Ali_medi_sum[-10:])), Ali_medi_sum[-10:].index)
plt.title('阿里健康大药房王牌药品')
plt.gcf().subplots_adjust(left = 0.2)
plt.grid()
plt.show()

Ali_month_medi = Ali.groupby(['date_time','medicine'])
num = Ali_month_medi['sales'].sum()

for i in range(5):
	num1 = num[num.index.get_level_values(1) == Ali_keyMedi[i]]
	plt.plot(range(len(num1)), num1)
plt.legend(Ali_keyMedi)
plt.xticks(range(len(num1)), num1.index.get_level_values(0).date, rotation=45, ha='right')
plt.gcf().subplots_adjust(bottom = 0.2)
plt.title('畅销产品月度销售额')
plt.show()

image

图5

通过月度销售额分析,发现所有的畅销产品都有高频波动的迹象,存在明显的季节变动,每年6-7月,12-1月为销售量会大幅增加。
image

图6

2 药品分析

2.1 数据预处理

经过对于数据的分析,药品名称在parameter里,并且有不同的形式。
药品通用名称,系列,药品名称。

对于药品名称来说,数据中并没有显式的给出,比较有说服力的是parameter中的药品通用名称,其他属性存在着许多问题,数据杂乱。

系列属性存在无关信息列如,第14550行‘特价优惠’,第14628行‘其他’。

产品名称属性广泛存在品牌名称,例如第45行‘康恩贝牌维生素C咀嚼片(香橙味)’,第14663行‘汤臣倍健?钙维生素D维生素K软胶囊’。

所以我们首先将阿里健康大药房的药品通用名称提取出来,制作成字典(72个品类的dict.txt)。接着采用北大的Python分词包pkuseg,设置自己的字典(dict.txt),进行医学分词。

利用分词包从数据的title里进行医学分词来获取药品数据,获得29085条数据。

对parameter里的药品通用名称使用正则表达式提取出来,获得数据15345条。

将两者合并获得30418条数据。

代码6 药品名称预处理

def find_medi(x):
	if type(x) is str:
		pattern = r"药品通用名:([\u4E00-\u9FD5 0-9 a-z A-Z ‘ \. /]+)"
		result = re.findall(pattern, x)
			if len(result) >= 1:
				return result[0]
			else:
				return None
	else:
		return None

def title_split(x):
	x.upper()
	result = segcut.cut(x)
	if len(result) >= 1:
		for i in result:
			if i in dict:
				return i
		return None
	else:
	return None

dict = list(Ali_medi_sum.index)
f = open("dict.txt", "w", encoding='utf-8')
for line in dict:
	f.write(line + '\n')
f.close()
segcut = pkuseg.pkuseg(model_name = "medicine", user_dict = 'dict.txt', postag = False)

data['medicine']  = data['title'].apply(title_split)
data['medicine1']  = data['parameter'].apply(find_medi)
# 以medicine1 的数据填充 medicine 的空值
data["medicine"].fillna(data["medicine1"], inplace=True)

2.2 药品数量分析

通过对数据的药品通用名称统计,有112种药品。

代码7 药品统计

medi_group = data.groupby('medicine')
medi_group.size()

2.3 药品销售额占比

代码8 销售额占比

# 以药品为组,进行销售额汇总
medi_sales = medi_group['sales'].agg('sum')
# 以药品销售额降序排列 获得销售占比
num = medi_sales.sort_values(ascending=False)
num_rate = num / num.sum()

plt.rcParams['font.sans-serif'] = 'Simhei'
plt.bar(range(len(num_rate[:10])), num_rate[:10])
plt.xticks(range(len(num_rate[:10])), num_rate[:10].index, rotation=45, ha='right')
plt.title('销售额占比最多的10个品类')
plt.gcf().subplots_adjust(bottom = 0.2)
plt.grid()
plt.show()

image

图7

2.4 10个药品每月销售额曲线图

代码9 药品销售额曲线图

keyMedi = list(medi_sales.sort_values(ascending=False).index)[:10]

month_medi = data.groupby(['date_time','medicine'])
num = month_medi['sales'].sum()

for i in range(10):
	num1 = num[num.index.get_level_values(1) == keyMedi[i]]
	plt.plot(range(len(num1)), num1)
	
plt.show()
plt.legend(keyMedi)
plt.xticks(range(len(num1)), num1.index.get_level_values(0).date, rotation=45, ha='right')
plt.gcf().subplots_adjust(bottom = 0.2)
plt.title('前10大畅销药品月度销售总额')
plt.show()

image

图8

3 药品品牌分析

我们发现药品的品牌在Parameter里所以利用正则表达式进行提取。

3.1 数据预处理

代码10 品牌数据预处理

# 品牌分析
pattern = "品牌:([\u4E00-\u9FD5 0-9 a-z A-Z ‘ \. \+ - /]+)"

def find_brand(x):
	if type(x) is str:
		pattern = "品牌:([\u4E00-\u9FD5 0-9 a-z A-Z ‘ \. \+ - /]+)"
		result = re.findall(pattern, x);
		if len(result) > 0:
			return result[0]
		else:
			return None
	else:
		return None

data['brand'] = data['parameter'].apply(find_brand)

3.2 品牌数目

分析发现总共有512个品牌。

代码11 品牌数据预处理

# 对数据进行品牌名称聚类
brand_group = data.groupby('brand')
brand_group.size()

3.3 品牌销售额占比

代码12 品牌销售占比

# 以品牌为组,进行销售额汇总
brand_sales = brand_group['sales'].agg('sum')
# 以品牌销售额降序排列
num = brand_sales.sort_values(ascending=False)
brand_top = list(num.index)[:10]

num_rate = num / num.sum()
plt.rcParams['font.sans-serif'] = 'Simhei'
plt.bar(range(len(num_rate[:10])), num_rate[:10])
plt.xticks(range(len(num_rate[:10])), num_rate[:10].index, rotation=45, ha='right')
plt.title('销售额占比最多的10个品牌')
plt.gcf().subplots_adjust(bottom = 0.2)
plt.grid()
plt.show()

image

图9

3.4 品牌销售好的原因分析

我们对十大品牌的药品销售情况做了分析,这些品牌之所以销量好,首先是药物销售品类与10大畅销品类高度重合,其次可能是品牌自身在这些品类的营销好,消费者认可。

代码13 品牌销售主要药品分析

# 品牌销售分析
band_medicine = data.groupby(['brand','medicine'])
b_m_sum = band_medicine['sales'].sum()
num = b_m_sum
num1 = num[num.index.get_level_values(0) == brand_top[0]]

plt.rcParams['font.family'] = ['Arial Unicode MS','Microsoft YaHei','SimHei','sans-serif']
plt.rcParams['axes.unicode_minus'] = False  
plt.subplots_adjust(left=None,bottom=None,right=None,top=None,wspace=0.5,hspace=1)
for i in range(1,11):
    # 往画布上添加子图:按五行二列,添加到下标为plt_index的位置(由于这个显示不太好,很挤,所以最后用 两行两列4个 生成3次 获得了最后的图)
    plt.subplot(5, 2, i)
    # 绘图
    num1 = num[num.index.get_level_values(0) == brand_top[i-1]]
    plt.barh(range(len(num1)), num1)
    plt.yticks(range(len(num1)), num1.index.get_level_values(1))
    plt.title(brand_top[i-1] + '销售图')
# 显示画布
plt.show()

image
image
image

图10

4 预测销售总额

这里的预测我们采取时间序列的差分整合移动平均自回归模型(ARIMA)。

4.1 源数据

image

date = data.groupby('date_time')
date_sales = date['sales'].agg('sum')
plt.figure(figsize=(8,5))
plt.plot(range(24), date_sales)
plt.xticks(range(24), date_sales.index.date, rotation=45)
plt.gcf().subplots_adjust(bottom = 0.2)
plt.title('销售总量')
plt.grid()
plt.show()

image

图11

4.2 参数选择

平稳性检验
采用单位根检验,对时间序列单位根的检验就是对时间序列平稳性的检验,非平稳时间序列如果存在单位根,则一般可以通过差分的方法来消除单位根,得到平稳序列。

代码14 平稳性检验

style.use('ggplot' )
plt. rcParams['font.sans-serif'] = ['SimHei']
plt. rcParams['axes.unicode_minus'] = False

sales_train = date_sales
sales_diff1 = sales_train.diff().dropna()

for i in range(1,3):
    plt.subplot(1, 2, i)
    if(i==1):
        plt.plot(sales_train)
        plt.title("源数据")
    else:
        plt.plot(sales_diff1)
        plt.title("一阶差分")

print(u'原始序列的ADF检验结果为:',  ADF(sales_train))
print(u'一阶差分的ADF检验结果为:',  ADF(sales_diff1))

image

图12

原始序列的ADF检验结果为: (-0.25294595330495406, 0.9319092621668796, 7, 16, {'1%': -3.9240193847656246, '5%': -3.0684982031250003, '10%': -2.67389265625}, 484.53439721589336)
一阶差分的ADF检验结果为: (-9.322072363056753, 9.831298270974292e-16, 4, 18, {'1%': -3.859073285322359, '5%': -3.0420456927297668, '10%': -2.6609064197530863}, 455.9637318833934)
一阶差分单位根检验p值<0.05,原始序列p值>0.05,于是ARIMA中的参数d定为1。

相关系数:

  • 自相关系数(ACF):自相关系数度量的是同一事件在两个不同时期之间的相关程度,形象的讲就是度量自己过去的行为对自己现在的影响。
  • 偏自相关系数(PACF):计算某一个要素对另一个要素的影响或相关程度时,把其他要素的影响视为常数,即暂不考虑其他要素的影响,而单独研究那两个要素之间的相互关系的密切程度时,称为偏相关。

代码15 相关系数

acf = plot_acf(sales_diff1, lags=10)
plt.title("ACF" )
acf.show()

pacf = plot_pacf(sales_diff1, lags=10)
plt.title("PACF" )
pacf.show()

image

图13

image

图14

趋势序列 ACF 有 1 阶截尾,PACF 有 1 阶截尾尾。因此可以选 p=1, q=1。

4.3模形拟合预测

代码16 模形预测

model =  sm.tsa.arima.ARIMA(sales_train, order=(1, 1, 1))
result = model.fit()
#print (result. sumary()

pred = result.predict( '20220101','20220301' ,dynamic=True, typ='levels' )
print(pred)

plt.figure(figsize=(12,8))
plt.xticks(rotation=45)
plt.plot(pred)
plt.plot(sales_train)

image

图15

预测结果:
2022-01-01 9.497130e+07  94971300.0
2022-02-01 1.050360e+08 105036000.0
2022-03-01 1.024374e+08 102437400.0

4.4 模形评价

使用QQ图检验残差是否满足正态分布。p值在0.05附近可以看作是成正态分布。

代码17 模型评价

resid = result.resid  # 求解模型残差
plt.figure(figsize=(12, 8))
qqplot(resid, line='q', fit=True)

stats.normaltest(resid)#检验序列残差是否为正态分布

image

图16

5 电商经营策略

商品经营无外乎更便宜,更丰富,更方便,提高商品周转率。

关于销售的货品,主要以畅销的10大药品为主。
‘维生素D滴剂', '复合维生素片', '多维元素片', '维生素AD滴剂', '碳酸钙D3片', ‘维生素C咀嚼片', ‘维生素E软胶囊', ‘维生素E', ‘维生素C泡腾片', ‘维生素C片'。

药品品牌的选择以畅销品牌的主打药品(销量好)为主。
'swisse':维生素C泡腾片。
'CONBA/康恩贝':维生素C咀嚼片。
'CENTRUM/善存':善存银片,多维元素片。
'星鲨':维生素D滴剂
'elevit/爱乐维':复合维生素片。
'伊可新':维生素AD滴剂,。
'养生堂':维生素E软胶囊, 维生素C咀嚼片。
'BY-HEALTH/汤臣倍健':维生素E软胶囊, 维生素C片。
'FANCL':维生素E软胶囊。
'朗迪':碳酸钙D3片。

多样化的畅销货品销售能提高商品周转率,也能为消费者提供更丰富的选择。

鉴于销售旺季在每年6-7月,12-1月。所以应该提前一个月进行销售的预热。同时尽量用折扣给消费者一个便宜的低价,来拉动销量。

尽量完善好售后客服机制,用心服务好客户,方便客户。

6 ARIMA 讲解chatGpt

6.1 是什么

时间序列是按时间顺序排列的数据集合,ARIMA(自回归移动平均)模型是一种常用的时间序列分析模型。ARIMA模型的全称是自回归差分移动平均模型,它是由三个部分组成的,分别是自回归(AR)、差分(I)和移动平均(MA)。

ARIMA 的英文全称是 Autoregressive Integrated Moving Average。其中,“Autoregressive”表示自回归,“Integrated”表示差分,“Moving Average”表示移动平均。ARIMA模型综合了这三种方法,因此得名 Autoregressive Integrated Moving Average。

ARIMA模型的基本思想是将时间序列分解成几个部分,分别进行建模。其中:

自回归(AR)部分:表示时间序列在前期的值对后期的值产生影响,即当前值与前期的值相关;

差分(I)部分:对时间序列进行差分处理,使其变得平稳(即均值、方差等都不随时间变化而改变),然后对平稳序列进行建模;

移动平均(MA)部分:表示时间序列中当前值与其前期的误差相关。

6.2 ARIMA模型的具体建模过程如下:

  1. 检验时间序列是否平稳。若时间序列不平稳,则进行差分操作,使其变得平稳。

  2. 确定ARIMA模型的阶数p、d、q。其中,p表示自回归阶数,d表示差分阶数,q表示移动平均阶数。阶数的确定可以通过观察自相关图(ACF)和偏自相关图(PACF)来进行。

  3. 估计ARIMA模型的参数。可以通过极大似然法(MLE)或最小二乘法(OLS)等方法来估计模型的参数。

  4. 模型诊断。对模型进行诊断,检验模型的残差序列是否为白噪声。

  5. 使用模型进行预测。可以通过模型预测未来的时间序列值。

总之,ARIMA模型是一种常用的时间序列分析模型,它可以通过对时间序列进行自回归、差分、移动平均等操作,来建立相应的模型,以便对未来时间序列的走势进行预测。

6.3 时间序列需要数据平稳化的原因

ARIMA模型需要对时间序列作差分或使其平稳化的主要原因是:对于非平稳时间序列,它的均值、方差等统计性质会随着时间的变化而改变,导致模型无法准确地预测未来的时间序列值。因此,将非平稳时间序列进行差分或使其平稳化,可以使得它们的均值和方差等统计性质不随时间变化而改变,使得模型更容易捕捉到时间序列的规律。

具体来说,ARIMA模型要求时间序列是平稳的,这意味着它的均值、方差和自协方差(ACF)不随时间变化而改变。如果时间序列不平稳,我们可以通过对其进行差分操作来使其变得平稳。差分操作是指对时间序列的相邻两个观测值之间的差进行计算,得到一个新的序列。通过多次差分,可以将非平稳时间序列转化为平稳时间序列。

平稳的时间序列有很多好处,例如,它们更容易被建模,模型的参数更容易估计;模型的预测也更准确,因为它们能够保持一致的均值和方差等统计性质。因此,ARIMA模型要求时间序列是平稳的,或者能够通过差分等方法变得平稳。

6.3 残差与正态分布

在统计学和时间序列分析中,残差是指观测值与其对应的模型预测值之间的差异,也可以称为误差项。在回归分析中,残差是指因变量(或响应变量)与自变量(或解释变量)之间的差异,它表示了因变量中无法通过自变量解释的部分。

在时间序列分析中,我们通常使用ARIMA等模型对时间序列进行建模,得到的模型可以用来预测未来的时间序列值。当我们用模型对时间序列进行拟合时,残差就是实际观测值与模型预测值之间的差异。残差可以用来检验模型的拟合质量,如果残差具有随机性、平稳性和白噪声特性,那么我们认为模型的拟合效果良好;反之,如果残差具有明显的非随机性、非平稳性或自相关性等特征,那么我们就需要对模型进行进一步的改进。

在实际应用中,残差还可以用来进行模型的优化、参数的估计以及模型的预测等。因此,对于时间序列分析和建模来说,残差是一个非常重要的概念。

在统计学中,残差通常被假定为服从正态分布,也就是说,如果残差服从正态分布,那么就可以认为模型的误差分布是合理的。这个假设的合理性在很多情况下都是非常重要的,因为它可以用来检验模型的拟合质量,评估模型的预测能力,以及进行假设检验和置信区间的计算等。

当模型的残差服从正态分布时,我们可以使用一些常见的统计方法来检验模型的拟合质量,例如,使用QQ图、Shapiro-Wilk测试或Kolmogorov-Smirnov测试等。这些方法可以用来检验残差是否具有正态分布的特征,如果残差的分布与正态分布的假设不符,则说明模型的误差分布可能存在问题,需要进行进一步的改进。

同时,正态分布的假设也可以用来进行模型的预测。如果我们认为残差服从正态分布,那么就可以使用正态分布的性质来计算置信区间,预测未来时间序列的取值范围等。因此,残差与正态分布之间的关系在统计学和时间序列分析中非常重要。

6.4 移动平均

移动平均是一种常见的时间序列分析方法,用于平滑时间序列数据并提取出趋势信号。它通过计算数据点的平均值来消除数据中的噪声和随机波动,从而突出时间序列的长期趋势和周期性变化。

移动平均可以分为简单移动平均和加权移动平均两种形式。简单移动平均是一种基本的平滑方法,它将数据序列中某个固定长度的时间窗口内的数据点取平均值,然后将这个平均值作为该时间窗口中心点的估计值。移动窗口的长度可以根据需要设定,通常是根据数据的采样频率和数据周期来确定的。

加权移动平均则是在简单移动平均的基础上,对窗口内的数据点进行加权处理。不同的权重可以根据数据的特性和分析目的来设定,例如,可以使用指数加权移动平均方法,将窗口内的数据点赋予不同的权重,使得新数据点的权重较大,旧数据点的权重逐渐减小,从而更好地反映数据的变化趋势。

移动平均常常被用于分析和预测金融市场和经济数据,如股票价格、汇率、商品价格等。此外,移动平均也常常被用于信号处理、图像处理等领域,用于平滑和去噪处理。

6.5 知识来源

我的这部分知识主要来自于统计学和时间序列分析的基础教材和参考资料,如《时间序列分析》(Time Series Analysis) by James D. Hamilton和《统计学》(Statistics) by David Freedman等。这些书籍都是经典的统计学和时间序列分析教材,在学术界和业界都有很高的评价和应用价值。

同时,我还参考了一些学术论文和研究报告,如Rob J Hyndman和George Athanasopoulos的《Forecasting: principles and practice》一书中关于时间序列模型的章节,以及一些其他的学术研究论文。这些参考资料都对我理解和阐述残差与正态分布之间的关系提供了很好的支持和指导。

由于我是一个人工智能语言模型,我的回答并不是从特定的引用中提取的,而是基于我的训练和知识库提供的综合性信息和推理。

相关文件:https://wwul.lanzoue.com/i2XtR0mhrmuj
Excel数据: https://wwul.lanzoue.com/izkri0mm1hpi

posted @ 2023-02-03 11:23  Dba_sys  阅读(1276)  评论(3编辑  收藏  举报