目錄
2023-c題-問題1
問題分析?
偏度
峰度
箱線圖?
讀圖
重采樣、降采樣、升采樣
重采樣
降采樣
升采樣
解題代碼
2023-c題-問題1
問題分析?
問題說白了就是探究品類和銷售量這兩個數據他們各自內在聯系,根據題意,我們先進行數
據預處理,按照以往的步驟是針對缺失值、重復值、異常值。我認為這道題應該是探究特殊
值,需要思考到情境下的特殊情況和特殊數據,再進行處理。然后就可以開始數據分析,通
過函數引入數量、均值、最值、百分位數、偏度、峰度等描述統計量,并通過數據可視化,
如熱力圖、箱線圖、折線圖、條形圖、直方圖更清晰探究其關聯關系。?
偏度
偏度(Skewness)是用來度量隨機變量概率分布的不對稱性的統計量。它可以幫助我們了解數據分布的傾斜方向和程度。
當偏度 < 0 時,概率分布圖左偏;當偏度 = 0 時,表示數據相對均勻地分布在平均值兩側,不一定是絕對的對稱分布;當偏度 > 0 時,概率分布圖右偏。
峰度
峰度(Kurtosis)是用來度量隨機變量概率分布的陡峭程度的統計量。它可以幫助我們了解數據分布的尖峭或平坦程度。峰度的計算公式為:
峰度的取值范圍為 [1, +∞)。完全服從正態分布的數據的峰度值為 3。峰度值越大,概率分布圖越高尖;峰度值越小,越矮胖
箱線圖?
是顯示一組數據分散情況資料的統計圖。
讀圖
?從圖中可以看出,南山區的房價最高,南山區、寶安區、福田區等的異常值很多,說明這些地區大部分房價高于均值。
重采樣、降采樣、升采樣
相關參數?
重采樣
重采樣是時間序列頻率轉換的過程,可以理解為調整數據的時間分辨率。在Python的Pandas庫中,`resample`
函數用于執行重采樣操作。
重采樣可以將高頻數據聚合到低頻率(降采樣),也可以將低頻數據轉換為高頻率(升采樣)。
降采樣
降采樣是指從大量數據中選擇一部分代表性樣本的過程。
降采樣是將高頻數據轉換為低頻數據的過程。在降采樣時,需要考慮`closed
和label`
參數,它們分別決定了時間區間的閉合端點和聚合值的標簽位置。
例如,如果想要將每天的數據聚合為每月的數據,可以使用resample('M')
方法,其中'M'
代表月度頻率。
升采樣
升采樣是指增加數據集中樣本數量的過程。
升采樣是將低頻數據轉換為高頻數據的過程。在升采樣中,主要是通過數據插值來填補缺失的值。
例如,如果想要將每年的數據轉換為每月的數據,可以使用resample('M')
方法,并配合適當的插值方法(如ffill
)來填充缺失的月份數據。
解題代碼
# %%
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'] = Falseplt.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() #顯示該圖# %%
?