Python隨機(jī)森林、線性回歸對(duì)COVID-19疫情、匯率數(shù)據(jù)預(yù)測(cè)死亡率、病例數(shù)、失業(yè)率影響可
全文鏈接:https://tecdat.cn/?p=33536
原文出處:拓端數(shù)據(jù)部落公眾號(hào)
自2019年12月以來(lái),傳染性冠狀病毒疾病2019(COVID-19)迅速席卷全球,并在短短幾個(gè)月內(nèi)達(dá)到了大流行狀態(tài)。迄今為止,全球已報(bào)告了超過(guò)6800萬(wàn)例病例。為了應(yīng)對(duì)這一大流行病,實(shí)施了公共衛(wèi)生政策,通過(guò)實(shí)施“居家令”政策來(lái)減緩COVID-19的傳播。
因此,為了檢查全球范圍內(nèi)采取的限制措施對(duì)人員流動(dòng)性的有效性,我們幫助客戶研究死亡人數(shù)與時(shí)間的關(guān)系。
問(wèn)題陳述:
該項(xiàng)目的目標(biāo)是分析各國(guó)政府采取的各種限制措施對(duì)人員流動(dòng)性的影響,以控制COVID-19病例和由此導(dǎo)致的死亡人數(shù)對(duì)經(jīng)濟(jì)和失業(yè)率的影響。我們使用匯率數(shù)據(jù)來(lái)查看這些限制措施對(duì)經(jīng)濟(jì)的影響,并在此期間檢查失業(yè)率的變化。我開(kāi)發(fā)了一個(gè)模型來(lái)預(yù)測(cè)由于病例增加而導(dǎo)致的COVID-19相關(guān)死亡人數(shù)。

使用 read csv 讀取數(shù)據(jù),然后使用數(shù)據(jù)可視化探索數(shù)據(jù)
#columns in the datadf.columns

數(shù)據(jù)信息
-數(shù)據(jù)集中的分類變量:dateRep、countriesAndTerritories、geoId、countryterritoryCode、continentExp -數(shù)據(jù)集中的無(wú)限變量:日、月、年、病例數(shù)、死亡數(shù)、popData2019、Cumulative_number_for_14_days_of_COVID-19_cases_per_100000
#info about the datadf.info()

數(shù)據(jù)集中有 49572 個(gè)觀測(cè)值和 12 個(gè)特征值
df.shape
Out[7]:
(49572, 12)
In?[8]:
#屬性/特征之間的相關(guān)性 df.corr()

#數(shù)據(jù)集說(shuō)明 df.describe()

每天的 14 天累計(jì)病例數(shù)、病例數(shù)和死亡數(shù)。
-2783 14 天累計(jì)病例數(shù)不為零的天數(shù) -報(bào)告的 14 天累計(jì)病例數(shù)為零的天數(shù)。 -報(bào)告的 14 天累計(jì)死亡人數(shù)為零的天數(shù)。
# 數(shù)據(jù)清洗-檢查是否存在空值df.isnull()# 這些似乎是數(shù)據(jù)集中的真實(shí)讀數(shù),因此將其從數(shù)據(jù)集中刪除可能會(huì)改變分析結(jié)果。所以保持原樣。print(df["Cumulative_number_for_14_days_of_COVID-19_cases_per_100000"].isnull().value_counts()) # 2783天中沒(méi)有累積14天病例為零

#可視化import seaborn as sns
In?[107]:
df.columns

# 該函數(shù)接受特征/列名作為輸入。# 繪制特征在天數(shù)和月份上的計(jì)數(shù)情況。def plots_days_mnths(x): ? ? ? ?plt.figure(figsize = (30,20)) ? ?feature = ['day','month']
病例數(shù)的日分析和月分析
從病例圖中我們可以看出,報(bào)告病例從 1 月份開(kāi)始迅速增加,到 2020 年 7 月至 9 月達(dá)到最高峰。
而各月每天的報(bào)告病例數(shù)大致相等。
plots_days

最初幾個(gè)月報(bào)告的死亡病例有所增加,但從圖中可以看出,自 7 月份以來(lái)已得到控制。 每月各天的報(bào)告死亡病例數(shù)大體相當(dāng),但略有不同。
plots_days_m

import numpy as np
截至 2010 年 10 月,全世界報(bào)告的病例總數(shù)約為 39400032 例。
df['cases'].sum()

plt.ylabel('Counts', fontsize =14)plt.title("Histogram of cases ", fontsize = 16)
Out[114]:
[0, 100000, 0, 100]

在大多數(shù)情況下,每天報(bào)告的死亡人數(shù)在 500 人及以下。 在大多數(shù)天數(shù)中,約有 50%的天數(shù)每天報(bào)告的新病例超過(guò) 40000 例。 全世界平均每天報(bào)告的死亡人數(shù)約為 795 人,平均每天報(bào)告的死亡人數(shù)為 23 人。
df[['deaths', 'cases']].mean(axis = 0, skipna = True)

截至 2010 年 10 月,全世界報(bào)告的死亡總?cè)藬?shù)約為 1105353 人
df['deaths'].sum()

plt.xlabel('deaths', fontsize = 14)plt.ylabel('Counts', fontsize =14)


# 將日期列轉(zhuǎn)換為日期時(shí)間格式,以便繪制圖表。date = pd.to_datetime(df['dateRep']) plt.figure(figsize =(15,10))


用回歸法直觀顯示病例和死亡人數(shù)及其分布情況
-從圖中可以看出,隨著病例數(shù)的增加,死亡人數(shù)也在增加。 -顯示出這兩個(gè)特征之間的正線性關(guān)系。
#用回歸法直觀顯示病例和死亡人數(shù)及其分布情況sns.jointplot(x='cases' , y='deaths' , data=df, kind='reg')

按年分析失業(yè)率
導(dǎo)入失業(yè)數(shù)據(jù)并將其轉(zhuǎn)換為數(shù)據(jù)框架 刪除列名 "1960 "至 "1990 "之間的所有列,因?yàn)樗鼈兪强樟?,?shù)據(jù)中沒(méi)有各縣報(bào)告的這些年份的數(shù)據(jù),還刪除了 "指標(biāo)名稱 "和 "指標(biāo)代碼 "這兩列,因?yàn)榉治霾恍枰鼈儭?/p>
# ?unemp = unemp.drop(unemp.loc[:, 'Indicator Name':'1990'].columns, axis = 1)
In?[590]:
unemp.head(5)

查看 1991 年至 2020 年各國(guó)的基本統(tǒng)計(jì)數(shù)據(jù)摘要
unemp.describe()

繪制 1991 年至 2020 年各國(guó)就業(yè)率曲線的函數(shù)
def plot_unemp_region(country): ? ?for c in country: ? ? ? ?plt.plot(unemp.loc[c][1:],label = c) ?
失業(yè)率與國(guó)家總失業(yè)率對(duì)比
從 2015 年開(kāi)始,愛(ài)爾蘭在控制失業(yè)率方面做得更好,因此在 2020 年持續(xù)低迷的大流行病期間,愛(ài)爾蘭在處理失業(yè)率方面做得更好。 但從 2019 年開(kāi)始,愛(ài)爾蘭的失業(yè)率仍有上升趨勢(shì),應(yīng)注意避免進(jìn)一步的損害。
plot_unemp_regio
不同國(guó)家和地區(qū)的失業(yè)率
在大流行病期間,愛(ài)爾蘭在處理失業(yè)率方面似乎總體上介于歐盟和美國(guó)之間,印度在此期間與愛(ài)爾蘭緊隨其后。 數(shù)據(jù)顯示,在過(guò)去一年中,美國(guó)的失業(yè)率在這些國(guó)家中最低。
plot_unemp_region(country)
? ? ? ? ? ? ? ? ?skiprows = [0], index_col = "Date")
In?[588]:
cur.head()
顯示歐元相對(duì)于其他主要貨幣波動(dòng)的功能
輸入要與歐元匯率進(jìn)行比較的貨幣列表 繪制 2020 年 1 月至 2020 年 10 月期間單個(gè)貨幣相對(duì)于歐元的波動(dòng)圖 從圖中可以看出,在過(guò)去幾個(gè)月中,歐元相對(duì)于美元、日元、人民幣等主要貨幣的匯率走低,這表明由于為控制病毒傳播而實(shí)施的封鎖和限制行動(dòng)的法律,企業(yè)和組織無(wú)法正常運(yùn)作。 歐元估值受中國(guó)貨幣人民幣的影響最大,受印度貨幣盧比的影響最小。
def plot_currency_rate(currency): ? ? ? ?plt.figure(figsize = (30,20)) ? ?for c in list(enumerate(currency)): ? ? ? ?plt.subplot(3, 2,c[0]+1) ? ? ? ?plt.plot(cur.loc[:][c[1]],label = c[1]) ? ? ? ?
In?[303]:
plot_currency_rate(currency)
for c in currency: ? ? ? ? ? ? ? ? ? ?plt.plot(cur.loc[:][c],label = c) ? ? ? ? ? ? ? ? ? ?plt.ylabel("Euro", fontsize = 12)
基于每日病例預(yù)測(cè)死亡的模型開(kāi)發(fā)
sns.barplot(data=df, x= 'cases' , y = 'deaths' , estimator=np.std)
從下面代碼中的相關(guān)矩陣圖中,我可以看到死亡和病例之間的相關(guān)性高達(dá) 0.736,而其他變量之間的相關(guān)性很弱。
df.corr()
sns.heatmap(df.corr())
sns.heatmap(df.corr(),annot=True , cmap='YlGnBu')
sns.pairplot(df)
通過(guò)可視化觀察數(shù)據(jù)分布,可以清楚地看出病例數(shù)的增加導(dǎo)致死亡人數(shù)的增加。因此,為了根據(jù)全國(guó)每天的病例數(shù)預(yù)測(cè)死亡人數(shù),我們使用了線性回歸法來(lái)完成這一過(guò)程,結(jié)果如下。
這段代碼用于將數(shù)組或矩陣隨機(jī)分割成訓(xùn)練集和測(cè)試集。
python
# 用于將數(shù)組或矩陣隨機(jī)分割成訓(xùn)練集和測(cè)試集from sklearn.model_selection import train_test_split
自變量為 cases,因變量為 deaths,分別賦值給 X 和 y。
python
X, y = df[['cases']], df['deaths']
X 是包含 "cases" 條目的數(shù)據(jù)框(DataFrame)的一列,y 是包含目標(biāo)/響應(yīng)變量 "deaths" 的序列(Series)。
python
X.head(5)
數(shù)據(jù)被劃分為測(cè)試集和訓(xùn)練集,使用 train_test_split() 函數(shù),以 80:20 的比例進(jìn)行劃分。
train_test_split() 函數(shù)中的 test_size 參數(shù)設(shè)為 0.2,表示將 20% 的數(shù)據(jù)作為測(cè)試集。
python
# 訓(xùn)練集和測(cè)試集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
在 [565] 處:
python
# 定義一個(gè)線性回歸模型from sklearn import linear_model# 使用訓(xùn)練集訓(xùn)練模型regr.fit(X_train, y_train)
回歸系數(shù)
回歸系數(shù)是未知總體參數(shù)的估計(jì)值,表示預(yù)測(cè)變量(cases)與響應(yīng)變量(deaths)之間的關(guān)系。
beta0 的回歸系數(shù)為 0.0196,這意味著平均而言,當(dāng)沒(méi)有報(bào)告病例時(shí),死亡人數(shù)為 0.0196。
截距系數(shù)為 6.759,說(shuō)明每天病例增加一個(gè)單位時(shí),死亡人數(shù)增加 6.759。例如,每增加 100 個(gè)新病例,死亡人數(shù)每天增加 7.5。
對(duì)測(cè)試數(shù)據(jù)進(jìn)行線性模型預(yù)測(cè)死亡人數(shù)
#基于測(cè)試數(shù)據(jù)進(jìn)行預(yù)測(cè)y_pre
結(jié)果:
# 每天對(duì)應(yīng)病例數(shù)量的實(shí)際死亡人數(shù)y_test.head(10)
結(jié)果:
df.head()
結(jié)果:
計(jì)算評(píng)估指標(biāo)需要重新調(diào)整 X 的形狀:
# 重新調(diào)整 X 的形狀以計(jì)算指標(biāo)X.values.reshape
結(jié)果:
<function ndarray.reshape>
計(jì)算均值絕對(duì)誤差(MAE):
from sklearn.metrics import mean_squared_error,r2_score , mean_absolute_error
平均絕對(duì)誤差(MAE)
平均絕對(duì)誤差(MAE)是用于回歸模型的另一種損失函數(shù)。
MAE 是目標(biāo)變量和預(yù)測(cè)變量之間的絕對(duì)差的總和。
我們有實(shí)際值 y_test 和預(yù)測(cè)值 y_pre,可以觀察到它們之間的差異。
#MAEmean_absolute_error(y_test , y_pre)
結(jié)果:
18.3128
R-Squared
R-squared 是衡量數(shù)據(jù)與擬合的回歸線之間接近程度的統(tǒng)計(jì)指標(biāo)。
提供了關(guān)于預(yù)測(cè)變量“cases”在我們的模型中如何解釋響應(yīng)變量“death”的程度的指示。
我的模型使用預(yù)測(cè)變量“cases”能夠解釋響應(yīng)變量“death”的變異程度為61%。
#R方分?jǐn)?shù)r2_score(y_test , y_pre)
結(jié)果:
0.6156843
散點(diǎn)圖展示了線性回歸線以及數(shù)據(jù)圍繞該線分布的情況。
plt.scatter(X_test, y_test , color= 'blue' , linewidths=1)

g
輸出[579]:
0.615
輸入[580]:
# 構(gòu)建隨機(jī)森林模型。
輸入[581]:
from sklearn.ensemble import ExtraTreesRegressor, RandomForestRegressor
輸入[582]:
rfr.fit(X_train, y_train)

Y_pred = rfr.predict(X_test)
輸入[584]:
rfr.score(X_test, y_test)
輸出[584]:
0.39
輸入[585]:
plt.scatter(X_test, Y_pred, color='red')plt.plot(X_test, y_pre, color='blue', linewidth=0.5)

結(jié)論
通過(guò)探索性數(shù)據(jù)分析,發(fā)現(xiàn)每天新冠病例增加時(shí),報(bào)告的死亡人數(shù)也會(huì)有所上升。通過(guò)將病例作為預(yù)測(cè)因子、每天的死亡人數(shù)作為目標(biāo)變量的兩個(gè)回歸模型的結(jié)果,線性模型在預(yù)測(cè)每天的死亡人數(shù)方面更準(zhǔn)確,與每天報(bào)告的病例數(shù)相關(guān)。
通過(guò)對(duì)包含失業(yè)率和歐元匯率數(shù)據(jù)的數(shù)據(jù)集進(jìn)行數(shù)據(jù)可視化分析,還能夠探索各國(guó)為限制病毒傳播而引入的限制措施對(duì)歐洲主要經(jīng)濟(jì)體和失業(yè)率產(chǎn)生的影響。
歐元兌美元、英鎊、人民幣等主要貨幣的匯率在過(guò)去幾個(gè)月中看到了下降,這表明封鎖措施對(duì)企業(yè)和國(guó)家經(jīng)濟(jì)的影響。對(duì)失業(yè)率的影響也在失業(yè)率數(shù)據(jù)中清晰可見(jiàn),愛(ài)爾蘭的失業(yè)率相對(duì)于其他國(guó)家來(lái)說(shuō)處理得更好,但在過(guò)去幾個(gè)月中失業(yè)率明顯上升。
參考資料
https://www.sciencedirect.com/science/article/abs/pii/S0048969720323998

最受歡迎的見(jiàn)解
1.在python中使用lstm和pytorch進(jìn)行時(shí)間序列預(yù)測(cè)
2.python中利用長(zhǎng)短期記憶模型lstm進(jìn)行時(shí)間序列預(yù)測(cè)分析
3.Python用RNN循環(huán)神經(jīng)網(wǎng)絡(luò):LSTM長(zhǎng)期記憶、GRU門循環(huán)單元、回歸和ARIMA對(duì)COVID-19新冠疫情新增人數(shù)時(shí)間序列
4.Python TensorFlow循環(huán)神經(jīng)網(wǎng)絡(luò)RNN-LSTM神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)股票市場(chǎng)價(jià)格時(shí)間序列和MSE評(píng)估準(zhǔn)確性
5.r語(yǔ)言copulas和金融時(shí)間序列案例
6.R 語(yǔ)言用RNN循環(huán)神經(jīng)網(wǎng)絡(luò) 、LSTM長(zhǎng)短期記憶網(wǎng)絡(luò)實(shí)現(xiàn)時(shí)間序列長(zhǎng)期利率預(yù)測(cè)
7.Matlab創(chuàng)建向量自回歸(VAR)模型分析消費(fèi)者價(jià)格指數(shù) (CPI) 和失業(yè)率時(shí)間序列
8.r語(yǔ)言k-shape時(shí)間序列聚類方法對(duì)股票價(jià)格時(shí)間序列聚類
9.R語(yǔ)言結(jié)合新冠疫情COVID-19股票價(jià)格預(yù)測(cè):ARIMA,KNN和神經(jīng)網(wǎng)絡(luò)時(shí)間序列分析