目录
2023-c题-问题1
问题分析
问题说白了就是探究品类和销售量这两个数据他们各自内在联系 ,根据题意,我们先进行数
据预处理 ,按照以往的步骤是针对缺失值、重复值、异常值。我认为这道题应该是探究特殊
值,需要思考到情境下的特殊情况和特殊数据,再进行处理。然后就可以开始数据分析,通
过函数引入数量、均值、最值、百分位数、偏度、峰度 等描述统计量,并通过数据可视化,
如热力图、箱线图、折线图、条形图、直方图更清晰探究其关联关系。
偏度
偏度(Skewness)是用来度量随机变量概率分布的不对称性的统计量。它可以帮助我们了解++数据分布的倾斜方向和程度++。
当偏度 < 0 时,概率分布图左偏;当偏度 = 0 时,表示数据相对均匀地分布在平均值两侧,不一定是绝对的对称分布;当偏度 > 0 时,概率分布图右偏。
峰度
峰度(Kurtosis)是用来度量随机变量概率分布的陡峭程度的统计量。它可以帮助我们了解数据分布的尖峭或平坦程度。峰度的计算公式为:
峰度的取值范围为 [1, +∞)。完全服从正态分布的数据的峰度值为 3。峰度值越大,概率分布图越高尖;峰度值越小,越矮胖
箱线图
是显示一组数据分散情况资料的统计图。
读图
从图中可以看出,南山区的房价最高,南山区、宝安区、福田区等的异常值很多,说明这些地区大部分房价高于均值。
重采样、降采样、升采样
相关参数
重采样
重采样是时间序列频率转换的过程,可以理解为++调整数据的时间分辨率++ 。在Python的Pandas库中,`***``resample```***函数用于执行重采样操作。
++重采样++ 可以将高频数据聚合到低频率++(降采样)++ ,也可以将低频数据转换为高频率++(升采样)++。
降采样
降采样是指从大量数据中选择一部分代表性样本的过程。
降采样是将高频数据转换为低频数据的过程。在降采样时,需要考虑`***closed
和``label```***参数,它们分别决定了时间区间的闭合端点和聚合值的标签位置。
例如,如果想要将每天的数据聚合为每月的数据,可以使用resample('M')
方法,其中'M'
代表月度频率。
升采样
升采样是指增加数据集中样本数量的过程。
升采样是将低频数据转换为高频数据的过程。在升采样中,主要是++通过数据插值来填补缺失的值++。
例如,如果想要将每年的数据转换为每月的数据,可以使用resample('M')
方法,并配合适当的插值方法(如ffill
)来填充缺失的月份数据。
解题代码
python
# %%
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
# %%
category = pd.read_excel('2023年数学建模C\附件1.xlsx')
# %%
data= pd.read_excel('2023年数学建模C\附件2.xlsx')
# %%
category
# %%
merge_data=pd.merge(data,category,how='left',on='单品编码')
# %%
merge_data.info()
merge_data
# %%
# 删除某列中的某个值
merge_data=merge_data[merge_data['销售类型']!='退货']
# %%
merge_data.drop(['扫码销售时间'],axis=1,inplace=True)
# %%
merge_data.drop(['是否打折销售'],axis=1,inplace=True)
# %%
merge_data.drop(['销售类型'],axis=1,inplace=True)
# %%
merge_data
# %%
# 透视表
pivot_table = merge_data.pivot_table(index='销售日期', columns='分类名称', values='销量(千克)', aggfunc='sum')
pivot_table
# %%
pivot_table.describe()
# %%
# 计算偏度
pivot_table.skew()
# %%
# 计算峰度
pivot_table.kurt()
# %%
df=pivot_table.resample('3M').sum()
df
# %%
dff=df.corr()
dff
# %%
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.size'] = 12
plt.rcParams['xtick.labelsize']=12
plt.rcParams['ytick.labelsize']=12
plt.rcParams['axes.labelsize']=12
plt.rcParams['axes.titlesize']=12
# %%
plt.figure(figsize=(10, 6))
# 热力图上显示系数
sns.heatmap(dff, cmap='coolwarm', square=True, annot=True)
# sns.heatmap(dff, cmap='coolwarm', fmt=".2f", linewidths=.5, square=True, cbar_kws={"shrink": .5})
plt.title('各分类名称之间的相关系数热力图')
plt.show()
# %%
pivot_table2= merge_data.pivot_table(index='销售日期', columns='单品名称', values='销量(千克)', aggfunc='sum')
pivot_table2.describe()
# %%
pivot_table2.info()
# %%
pivot_table2
# %%
df2=pivot_table2.resample('3M').sum()
# %%
df_d=df2.describe()
df_d
# %%
# 计算峰度与偏度
s1=df2.skew()
s2=df2.kurt()
s1
d1=dict(s1)
d2=dict(s2)
# %%
df2_skew=pd.DataFrame(d1,index=['skew'],columns=s1.index)
df2_kurt=pd.DataFrame(d2,index=['kurt'],columns=s2.index)
df2_skew
# %%
# 按行合并
df_d = pd.concat([df_d, df2_skew, df2_kurt], axis=0)
df_d
# %%
# 选取前六列
dfff2 = df_d.iloc[:, :6]
# %%
# 画出折线图
dfff2.plot(kind='line', figsize=(10,8 ))
plt.title('各单品名称销量(千克)')
plt.show()
# %%
plt.figure(figsize=(10, 8))
sns.heatmap(dfff2, cmap='coolwarm', square=True, annot=True)
plt.title('各单品名称之间的相关系数热力图')
plt.show()
# %%
df_dd=pivot_table2.describe()
df_dd
# %%
label_list =df_dd.columns
# 从数据框中选择第一行数据,并使用sort_values()函数对其进行排序,使其按降序排列。
num_list1 =df_dd.iloc[0].sort_values(ascending=False)
plt.bar(label_list,num_list1)
plt.ylabel("销售数量")
plt.xticks(label_list)
plt.xlabel("单品名称")
plt.title("某公司2012-2013年前6个月出货量")
plt.legend()
plt.show()
# %%
x = df_dd.iloc[0].sort_values(ascending=False) #数据集
plt.boxplot(x) #垂直显示箱线图
plt.show() #显示该图
# %%