Python大数据分析揭示新冠疫情趋势——探索病例、死亡率和康复情况

发布时间 2023-06-07 14:34:04作者: lingsan

一、选题背景

1.背景

自2020年初起,新冠病毒(COVID-19)迅速传播并导致全球大流行。该病毒最初在中国武汉市被确认,并随后迅速传播到全球各地。由于其高度传染性和致命性,许多国家不得不采取严格的措施来控制其传播。
在此期间,许多科学家和医疗专家投入了大量时间和资源来了解这种新的冠状病毒,如何预防和治疗它。研究人员在2020年至2022年期间进行了大量的研究,以了解病毒的传播方式、病毒结构、感染机制和治疗方法。
一些研究显示,COVID-19的传播途径包括空气传播、飞沫传播和接触传播。此外,研究人员还分析了COVID-19的基因组结构和变异情况,以更好地理解病毒的进化和传播。
随着研究的深入,各种治疗方法也陆续出现。例如,研究人员对药物进行试验,以确定哪些药物可以有效治疗COVID-19的症状。此外,COVID-19疫苗的研究也进展迅速,许多疫苗已被批准使用并分发给全球各地的人们。
总之,2020年至2022年是新冠疫情的关键时期,科学家和医疗专家们在这段时间内进行了大量的研究来帮助人们更好地了解这种疾病,并提供有效的治疗方法。

2.预期目标

  1. 分析数据:收集并整理新冠病例、死亡率、康复人数等数据,并使用Python编程语言进行数据分析。这包括对数据进行清洗、可视化、探索性分析和统计建模等。
  2. 疫情趋势预测:使用Python中的机器学习算法,如回归模型或时间序列模型进行预测。例如,根据历史病例数据对未来一段时间内的感染率进行预测。
  3. 可视化展示:将分析结果以图表、地图等形式以更易理解的方式呈现出来,从而更直观地展示新冠疫情的发展趋势。
  4. 实时监测:定期更新数据并自动化脚本,以实现实时监测新的数据添加到系统中。
  5. 支持政策制定:利用数据分析的结果,为公众、卫生部门和政策制定者提供信息,以帮助他们更好地了解疫情,预测病例数量和推断政策措施的效果。

二、2020-2022新冠疫情大数据分析

1.课题名称

"COVID-19疫情趋势预测与数据探索:基于Python的全球大数据分析"

2.数据获取途径

本次实验使用的数据'COVID-19.csv'来源于Tableau的全球新冠肺炎疫情追踪工具,数据来源于JHU CSSE COVID-19 Data和《纽约时报》,源数据地址: https://data.world/covid-19-data-resource-hub/covid-19-case-counts/workspace/file?filename=COVID-19+Activity.csv

三、实验数据代码与展示

1.导入数据并查看行列数和前几行

 

 2.查看每个字段的数据类型,并将‘日期’字段改成时间属性

 3.数据分析:分别得到2022年北京和纽约每日的累计确诊病例

 4.这里选取累计确诊病例和累计死亡病例了解一个地区的大致病情情况

 5.选择最新数据中中国省份累计确诊人数中间10个[12:23]

 6.中国大陆平均水平累计确诊省份比较图

 7.比对上海和浙江的2021年每日确诊数量

 

 8.各区域确诊人数情况分布图

 四、完整程序代码

  1 # 导入数据并查看行列数和前几行
  2 import pandas as pd
  3 df = pd.read_csv('COVID-19.csv',low_memory=False)
  4 print(df.shape)
  5 df
  6 
  7 data = pd.read_csv(r"COVID-19.csv")
  8 data.head()
  9 
 10 # 查看每个字段的数据类型,并将‘日期’字段改成时间属性
 11 df['日期'] = df['日期'].astype('datetime64')
 12 df.info()
 13 
 14 # 数据分析:分别得到2022年北京和纽约每日的累计确诊病例
 15 data = df[(df['省份/州']=='Beijing')&(df['日期'].array.year==2022)]
 16 data = data.sort_values(by='日期')
 17 data
 18 
 19 data2 = df[(df['省份/州']=='New York')&(df['日期'].array.year==2022)]
 20 data2 = data2.groupby('日期')['累计确诊病例'].sum()
 21 data2
 22 
 23 # 绘制时间序列图
 24 import plotly.graph_objects as go
 25 
 26 fig = go.Figure(go.Scatter(
 27     x=data['日期'],
 28     y=data['累计确诊病例'],
 29     name='Beijing',
 30     marker_color = '#f57c00',
 31 ))
 32 
 33 fig.add_trace(go.Scatter(
 34     x=data2.index,
 35     y=data2.values,
 36     name='New York',
 37     yaxis='y2',
 38     marker_color = '#00bcd4'
 39 ))
 40 
 41 fig.update_layout(
 42     title='2022年北京和纽约累计确诊病例时间序列图',
 43     yaxis_title='北京累计确诊数',
 44     yaxis2=dict(side='right',overlaying='y',title='纽约累计确诊数')
 45 )
 46 
 47 fig.show()
 48 
 49 q1 = df.loc[(df['国家']=='China') & (df['省份/州']!='Hong Kong') & (df['省份/州']!='Unknown'),:]
 50 
 51 q1 = q1.groupby(['省份/州'])['累计确诊病例'].max().reset_index()
 52 
 53 import plotly.graph_objects as go
 54 
 55 fig = go.Figure()
 56 fig.add_trace(go.Bar(x = q1['省份/州'], y = q1['累计确诊病例'],
 57                      marker=dict(color = q1['累计确诊病例'],
 58                      colorscale='Bluered_r')))
 59 
 60 fig.add_annotation(x = list(q1['累计确诊病例']).index(min(list(q1['累计确诊病例']))), text="min")
 61 fig.add_annotation(x = list(q1['累计确诊病例']).index(max(list(q1['累计确诊病例']))), text="max")
 62 fig.update_layout(
 63     title="截止2022年四月中国大陆各省份累计确诊病例",
 64     xaxis_title="省份",
 65     yaxis_title="累计确诊病例"
 66 )
 67 fig.show()
 68 
 69 import warnings
 70 warnings.simplefilter(action="ignore")
 71 
 72 import numpy as np
 73 import pandas as pd
 74 
 75 import matplotlib.pyplot as plt
 76 import seaborn as sns
 77 import squarify
 78 import plotly
 79 import plotly.io as pio
 80 import plotly.express as px
 81 import plotly.graph_objects as go
 82 from plotly.subplots import make_subplots
 83 
 84 plt.rcParams['font.sans-serif']=['SimHei']
 85 plt.rcParams['axes.unicode_minus'] = False
 86 
 87 import re
 88 
 89 data = pd.read_csv(r"COVID-19.csv")
 90 data.head()
 91 
 92 data = data.drop(data[data["每日新增确诊病例"]<0].index)
 93 data = data.drop(data[data["每日新增死亡病例"]<0].index)
 94 data = data.drop(data[data["区域"].isna()==True].index)
 95 
 96 china_data = data[data["国家"]=="China"]
 97 china_data["省份/州"].unique()
 98 
 99 #堆积柱状图
100 #中国地区
101 # 这里选取累计确诊病例和累计死亡病例了解一个地区的大致病情情况
102 from collections import defaultdict
103 province = defaultdict(list)
104 day = ["01-31","02-29","03-31","04-30","05-31","06-30","07-31","08-31","09-30","10-31","11-30","12-31"]
105 for i in china_data["省份/州"].unique().tolist():
106     da = china_data[china_data["省份/州"]==i]
107     da["日期"] = pd.to_datetime(da["日期"])
108     da.set_index("日期",inplace=True)
109     da = da.sort_index(ascending=False)
110     for j in day:
111         da_2020 = da["2020-"+j]
112 #         print(da_2020)
113         province[i].append([da_2020["累计确诊病例"].tolist()[0],da_2020["累计死亡病例"].tolist()[0]])
114 print(province)
115 
116 for i in province.keys():
117     fig,ax = plt.subplots(figsize=(8,5),dpi=200)
118     label = [str(i) for i in range(1,13)]
119     value1_before = province[i]
120     value1 = [j[0] for j in value1_before]
121     value2 = [j[1] for j in value1_before]
122     width = .4
123     ax.bar(label, value1, width, label='累计确诊',color='blue')
124     ax.bar(label, value2, width, label='累计死亡',color='red')
125     ax.set_ylabel('人数')
126     ax.set_title(f'{i}第2020年的累计确诊和累计死亡')
127     ax.legend()
128     plt.show()
129     
130 data4 = df.groupby(['省份/州'])[['累计确诊病例', '累计死亡病例']].max().reset_index()
131 
132 data4['累计确诊病例水平'] = pd.qcut(data4['累计确诊病例'], 3, labels = range(1,4))
133 
134 fig = go.Figure(go.Scatter(
135     x=data4['累计确诊病例'],
136     y=data4['累计死亡病例'],
137     mode='markers',
138     marker_color=data4['累计确诊病例'],
139     text = data4['省份/州'],
140     hoverinfo='text',
141 ))
142 
143 fig.update_layout(
144     title="2020.01-2022.04每日新增确诊病例及累计新增死亡病例散点图",
145     xaxis_title="每日新增确诊病例",
146     yaxis_title="每日新增死亡病例"
147 )
148 fig.show()
149 
150 #选择最新数据中中国省份累计确诊人数中间10个[12:23]
151 china_data = data[data["国家"]=="China"]
152 china_data = china_data.drop(columns=["地区编码"])
153 #绘制各个省份的最新累计确诊人数对比
154 china_data["日期"] = pd.to_datetime(china_data["日期"])
155 china_data.set_index("日期",inplace=True)
156 china_data = china_data.sort_index(ascending=False)
157 china_data
158 
159 late_day_china_data = china_data["2022-04-29"]
160 print(late_day_china_data.shape)
161 late_day_china_data
162 
163 value = dict(zip(late_day_china_data["省份/州"].tolist(),late_day_china_data["累计确诊病例"].tolist()))
164 after = dict(sorted(value.items(), key = lambda kv:(kv[1], kv[0]),reverse=True)[12:23])
165 after
166 
167 def max_shanqu(after):
168     '''
169     param:获取最大值的位置
170     after为字典类型
171     return explode,x,labels
172     
173     '''
174     #获取位置
175     loca = list(after.values()).index(max(after.values()))
176     labels = list(after.keys())
177     labels[loca] += "(Top Most)"
178     x = list(after.values())
179     explode = [0]*len(labels)
180     explode[loca] = 0.1
181     explode = tuple(explode)
182     return explode,labels,x
183 
184 e,l,x = max_shanqu(after)
185 e,l,x
186 
187 plt.figure(figsize=(8,8))
188 plt.pie(x=x,
189         labels=l,
190         explode = e,
191         autopct='%.2f%%',
192         #饼图中文本的属性
193         textprops={'color':'black',#文本颜色
194                    'fontsize':10,#文本大小
195                    'fontfamily':'Microsoft JhengHei',#设置微软雅黑字体               
196                   }
197         
198        )
199 plt.legend(title="10 province Pie",
200           loc="upper right",
201           fontsize=15,
202           bbox_to_anchor=(1, 0, 0.5, 1),
203           ncol=1,)#控制图例中按照两列显示,默认为一列显示
204 plt.title("中国大陆平均水平累计确诊省份比较图",fontsize=20)
205 plt.show()
206 #说明在中间省份的比例差不多,也就是说除了突发省份,大部分省份的防疫工作还不错
207 
208 #比对上海和浙江的2021年每日确诊数量
209 Sh_data = china_data[china_data["省份/州"]=="Shanghai"]["2021"]
210 ZJ_data = china_data[china_data["省份/州"]=="Zhejiang"]["2021"]
211 fig,ax = plt.subplots()
212 
213 n,bins_num,pat = ax.hist(Sh_data["每日新增确诊病例"],bins=10,alpha=0.8)
214 
215 ax.plot(bins_num[:10],n,marker = 'o',color="yellowgreen",linestyle="--")
216 plt.title("上海2021年新增确诊人数")
217 plt.xlabel("人数")
218 plt.ylabel("频率")
219 
220 
221 fig,ax = plt.subplots()
222 
223 n,bins_num,pat = ax.hist(ZJ_data["每日新增确诊病例"],bins=10,alpha=0.75)
224 
225 ax.plot(bins_num[:10],n,marker = 'o',color="yellowgreen",linestyle="--")
226 plt.title("浙江2021年新增确诊人数")
227 plt.xlabel("人数")
228 plt.ylabel("频率")
229 
230 q8 = df.loc[(df['数据来源'] == 'JHU CSSE Global Timeseries'),:]
231 q8_2 = q8.groupby(['数据来源', '区域', '国家'])['累计确诊病例'].max().reset_index()
232 q8_2 = q8_2.dropna()
233 q8_1 = q8_2.groupby(['数据来源', '区域'])['累计确诊病例'].sum().reset_index()
234 q8_1 = q8_1.dropna()
235 
236 fig = go.Figure(go.Sunburst(
237     labels = q8_1['区域'].tolist() + q8_2['国家'].tolist(),
238     parents = q8_1['数据来源'].tolist() + q8_2['区域'].tolist(),
239     values =  q8_1['累计确诊病例'].tolist() + q8_2['累计确诊病例'].tolist(),
240     branchvalues = 'total'
241 ))
242 
243 fig.update_layout(margin = dict(t=0, l=0, r=0, b=0))
244 fig.show()
245 
246 data_region = data.copy()
247 data_region["日期"] = pd.to_datetime(data_region["日期"])
248 data_region = data_region.set_index("日期")
249 data_region = data_region.sort_index(ascending=False)
250 # data_region
251 data_region_end = data_region["2022-04-29"]
252 # data_region_end
253 region = data_region_end["区域"].unique().tolist()
254 #得出区域中10个最高地区的(累计确诊病例/人口统计)进行求平均为区域的确证概率
255 before_data = {}
256 for i in region:
257     da = data_region_end[data_region_end["区域"]==i]
258     da["累计确诊率"] = da["累计确诊病例"]/da["人口统计"]
259     #在此基础上观察死亡率,这样保证了数据的一致性
260     da["累计死亡率"] = da["累计死亡病例"]/da["人口统计"]
261     da = da.sort_values("累计确诊率",ascending=False)
262     #取出前30
263     da_50 = da.iloc[0:50,:]
264     print(f"{i}的前30的平均确诊率为{da_50['累计确诊率'].mean()*100},平均死亡率为{da_50['累计死亡率'].mean()*100}")
265     before_data[i] = [round(da_50['累计确诊率'].mean()*100,3),round(da_50['累计死亡率'].mean()*100,3)]
266     
267     before_data
268     
269     [plt.cm.Spectral(before_data[i][1]) for i in before_data.keys()]
270     
271     ## recovery_percent确诊率为大小,死亡率为颜色
272 name = before_data.keys()
273 recovery_percent = [before_data[i][0] for i in before_data.keys()]
274 colors = [plt.cm.Spectral(before_data[i][1]) for i in before_data.keys()]
275 
276 # 绘图details
277 plot = squarify.plot(sizes = recovery_percent, # 指定绘图数据
278                      label = name, # 指定标签
279                      color = colors, # 指定自定义颜色
280                      alpha = 0.6, # 指定透明度
281                      value = recovery_percent, # 添加数值标签
282                      edgecolor = 'white', # 设置边界框为白色
283                      linewidth =0 # 设置边框宽度为3
284                     )
285 # 设置标签大小为
286 plt.rc('font', size=20)
287 # 设置标题大小
288 plot.set_title('至4月份各个区域的大致累计确诊和死亡率',fontdict = {'fontsize':15})
289 # 除坐标轴
290 plt.axis('off')
291 # 除上边框和右边框刻度
292 plt.tick_params(top = 'off', right = 'off')
293 # 图形展示
294 plt.show()
295 
296 data = df[df['日期'].array.year==2022]
297 data = data.loc[data['日期']=='2022-01']
298 data1 = data.groupby('国家')['累计确诊病例'].sum()
299 data1
300 
301 data1.values
302 
303 import plotly.graph_objects as go
304 from plotly.subplots import make_subplots
305 
306 fig = make_subplots(rows = 2,cols = 1, # 指定行列个数
307                     subplot_titles=['各区域新增确诊人数分布图','各区域新增确诊人数占比图'],
308                    )
309 
310 colors = ['#a4adf8','#eaa098','#72dcc6','#c8a7f8','#f2c6a8']
311 
312 for (k,v),i in zip(data.groupby('国家')['每日新增确诊病例'],colors):
313     fig.add_trace(row = 1,col = 1,trace = go.Box(
314         y=v,
315         name = k,
316         
317         boxpoints = 'all',
318         boxmean = True,
319         marker = dict(
320             size = 2,
321             color = i,
322         ),
323         
324         line = dict(
325             width = 1,
326         ),
327     ))
328 fig.add_trace(row = 2,col = 1,trace = go.Bar(
329     x = data1.index, 
330     y = data1.values, 
331     width=0.6,
332     opacity=0.8,
333     
334     marker=dict(
335         color=colors,
336         line=dict(color='black',width=6)
337     ),
338 ))
339 
340 fig.update_traces(showlegend = False)
341     
342 fig.update_layout(
343     title = '各区域确诊人数情况分布图',
344     xaxis2 = dict(
345         title = '区域',
346     ),
347     yaxis = dict(
348         title = '每日新增确诊病例',
349         range=[0,1000],
350     ),
351     yaxis2 = dict(
352         title = '总新增确诊人数',
353     ),
354     margin = dict(l = 0,r = 0,b = 0)
355 )
356 fig.show()

 五、总结

新冠疫情大数据分析是一个非常复杂的过程,需要从多个角度对数据进行处理和分析。一般来说,我们可以将分析流程分为以下几个步骤:

  1. 数据收集:从各种公开数据源(如政府网站、科学期刊等)收集疫情相关数据,例如病例数、死亡率、感染风险等。
  2. 数据清洗和预处理:将收集到的原始数据进行清洗和预处理,去除异常值、填充缺失值、数据归一化等操作。
  3. 数据可视化:利用Python中的各种数据可视化库(如Matplotlib、Seaborn等)进行图表绘制,以便更好地观察数据变化趋势和分布情况。
  4. 数据分析和建模:利用Python中的机器学习库(如Scikit-learn、TensorFlow等)对处理后的数据进行分析和建模,得出一些有意义的结果和结论。
  5. 结果展示和报告撰写:根据前面的数据分析和建模结果,进行结果展示和报告撰写,向相关人员或者团队进行汇报。

总的来说,通过对新冠疫情数据的分析,我们可以更好地了解疫情发展的趋势和规律,提高疫情防控的效率和精准性,为公众提供更好的服务和保障。