1. 程式人生 > 實用技巧 >【Python資料分析】新冠肺炎資料--分析一

【Python資料分析】新冠肺炎資料--分析一

2、疫情資料分析

1 #匯入pandas等模組
2 import pandas as pd
3 import matplotlib.pyplot as plt
4 import seaborn as sns
5 from datetime import datetime
1 #將matplotlib的預設字型改為仿宋,以在圖形中顯示中文。
2 plt.rcParams['font.sans-serif']=['fangsong']
3 #在多語種情形下正確顯示負號
4 plt.rcParams['axes.unicode_minus']=False
5 #解決matplotlib丟擲的max_open_warning
6 plt.rcParams.update({'figure.max_open_warning': 0})
1 #載入資料時將第0列日期解析為datetime物件,並設定為行索引。
2 covid_cases_cumsum=pd.read_csv(r'C:\Users\92342\Desktop\python\Python資料分析學習之路\1、疫情資料\covid_cases_cumsum.csv',\
3                                parse_dates=[0],index_col=[0])
4 print(covid_cases_cumsum.info())
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 276 entries, 2020-01-16 to 2020-10-17
Data columns (total 32 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   全國      272 non-null    float64
 1   北京      269 non-null    float64
 2   天津      271 non-null    float64
 
3 河北 270 non-null float64 4 山西 270 non-null float64 5 內蒙古 269 non-null float64 6 遼寧 270 non-null float64 7 吉林 269 non-null float64 8 黑龍江 270 non-null float64 9 上海 273 non-null float64 10 江蘇 270 non-null float64 11 浙江 269 non-null float64 12 安徽 270 non-null float64 13 福建 270 non-null float64 14 江西 271 non-null float64 15 山東 268 non-null float64 16 河南 269 non-null float64 17 湖北 276 non-null float64 18 湖南 271 non-null float64 19 廣東 273 non-null float64 20 廣西 270 non-null float64 21 海南 270 non-null float64 22 重慶 270 non-null float64 23 四川 270 non-null float64 24 貴州 270 non-null float64 25 雲南 271 non-null float64 26 西藏 262 non-null float64 27 陝西 269 non-null float64 28 甘肅 269 non-null float64 29 青海 267 non-null float64 30 寧夏 270 non-null float64 31 新疆 273 non-null float64 dtypes: float64(32) memory usage: 71.2 KB None

問題1:全國、湖北、其他地區確診病例的發展趨勢是怎麼樣的?

1 #使用seaborn.lineplot()繪製全國確診病例累計值的走勢圖
2 fig,ax=plt.subplots()
3 ax=sns.lineplot(data=covid_cases_cumsum['全國'])
4 plt.show()

1 #前面繪製的圖形沒有標題、軸標籤、橫座標過密,現重新繪製
2 fig,ax=plt.subplots()
3 ax=sns.lineplot(data=covid_cases_cumsum['全國'])
4 ax.set_title('新冠肺炎確診病例累計值:全國')
5 ax.set_ylabel('確診病例')
6 fig.tight_layout()
7 plt.show()

1 #繪製湖北的趨勢圖
2 fig,ax=plt.subplots()
3 ax=sns.lineplot(data=covid_cases_cumsum['湖北'])
4 ax.set_title('新冠肺炎確診病例累計值:湖北')
5 ax.set_ylabel('確診病例')
6 fig.tight_layout()
7 plt.show()

1 #接下來使用迴圈語句,生成所有省份的走勢圖並儲存至本地。
2 for area in list(covid_cases_cumsum.columns):
3     fig,ax=plt.subplots()
4     ax=sns.lineplot(data=covid_cases_cumsum[f'{area}'])
5     ax.set_title(f'新冠肺炎確診病例累計值:{area}')
6     ax.set_ylabel('確診病例')
7     fig.tight_layout()
8     plt.savefig(f'C:\\Users\\92342\\Desktop\\python\\Python資料分析學習之路\\1、疫情資料\\新冠肺炎確診病例累計值走勢圖\\{area}.png')
9     plt.clf()

<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>

從確診病例走勢圖可以看出,各地疫情確診病例走勢有如下幾種:

1、自疫情爆發至2020年3月初,確診病例呈急劇增長態勢,自此之後緩慢增長。該種走勢包括全國、第2、3項以外的地區。

2、疫情爆發一度被控制,但仍存在階段性爆發。該種走勢包括北京、上海、甘肅、黑龍江、吉林、遼寧、內蒙古、山西、新疆。

3、基本未受疫情影響的地區為西藏。

問題2:各地疫情爆發先後順序

1 print(covid_cases_cumsum.head())

               全國  北京  天津  河北  山西  內蒙古  遼寧  吉林  黑龍江   上海  ...  重慶  四川  貴州  雲南  \
2020-01-16    NaN NaN NaN NaN NaN  NaN NaN NaN  NaN  NaN  ... NaN NaN NaN NaN   
2020-01-17    NaN NaN NaN NaN NaN  NaN NaN NaN  NaN  NaN  ... NaN NaN NaN NaN   
2020-01-18    NaN NaN NaN NaN NaN  NaN NaN NaN  NaN  NaN  ... NaN NaN NaN NaN   
2020-01-19    NaN NaN NaN NaN NaN  NaN NaN NaN  NaN  0.0  ... NaN NaN NaN NaN   
2020-01-20  291.0 NaN NaN NaN NaN  NaN NaN NaN  NaN  2.0  ... NaN NaN NaN NaN   

            西藏  陝西  甘肅  青海  寧夏   新疆  
2020-01-16 NaN NaN NaN NaN NaN  NaN  
2020-01-17 NaN NaN NaN NaN NaN  NaN  
2020-01-18 NaN NaN NaN NaN NaN  NaN  
2020-01-19 NaN NaN NaN NaN NaN  0.0  
2020-01-20 NaN NaN NaN NaN NaN  0.0  

[5 rows x 32 columns]

1 #可以發現,資料是按照日期順序排列的,各地的第一個非NaN值即為當地疫情爆發首日。
2 #使用pd.Series.first_valid_index方法獲取各地的爆發首日
3 outbreak_day=covid_cases_cumsum.apply(pd.Series.first_valid_index)
4 print(outbreak_day)

全國    2020-01-20
北京    2020-01-23
天津    2020-01-21
河北    2020-01-22
山西    2020-01-22
內蒙古   2020-01-23
遼寧    2020-01-22
吉林    2020-01-23
黑龍江   2020-01-22
上海    2020-01-19
江蘇    2020-01-22
浙江    2020-01-23
安徽    2020-01-22
福建    2020-01-22
江西    2020-01-21
山東    2020-01-24
河南    2020-01-23
湖北    2020-01-16
湖南    2020-01-21
廣東    2020-01-19
廣西    2020-01-22
海南    2020-01-22
重慶    2020-01-22
四川    2020-01-22
貴州    2020-01-22
雲南    2020-01-21
西藏    2020-01-30
陝西    2020-01-23
甘肅    2020-01-23
青海    2020-01-25
寧夏    2020-01-22
新疆    2020-01-19
dtype: datetime64[ns]
<class 'pandas.core.series.Series'>

1 #outbreak_day是pd.Series資料,使用min方法找出Series中的最早日期
2 earliest_day=outbreak_day.min()
3 print(earliest_day)

2020-01-16 00:00:00

1 #用每個outbreak_day減去這個最小值,得到各地區爆發首日距離最早日期的偏移天數
2 shift_day=(outbreak_day-earliest_day)
3 shift_day_sorted=shift_day.sort_values()
4 print(shift_day_sorted)

湖北     0 days
新疆     3 days
廣東     3 days
上海     3 days
全國     4 days
湖南     5 days
天津     5 days
雲南     5 days
江西     5 days
河北     6 days
江蘇     6 days
安徽     6 days
福建     6 days
重慶     6 days
寧夏     6 days
遼寧     6 days
山西     6 days
貴州     6 days
廣西     6 days
海南     6 days
黑龍江    6 days
四川     6 days
陝西     7 days
甘肅     7 days
內蒙古    7 days
河南     7 days
浙江     7 days
吉林     7 days
北京     7 days
山東     8 days
青海     9 days
西藏    14 days
dtype: timedelta64[ns]

可以看出,湖北是疫情首次爆發地,3日內傳播到了新疆、廣東、上海三地,

5日內傳播到了湖南、天津、雲南、江西,10日內傳播至西藏之外的所有內地省份。