0
CDC 发布在 Unsplash 上的照片
一种最初在中国城市武汉被发现的病毒,现在已经传播到世界上十几个国家,引发了前所未有的健康和经济危机。
世界卫生组织(简称世卫组织)宣布武汉冠状病毒爆发为「国际关注的公共卫生突发事件」。
在本文中,我们将简要回顾当前的危机,然后深入研究 Kaggle 的「Novel Corona Virus 2019 Dataset」。我创建了一个 GitHub repo,以供大家发表自己的见解。
什么是冠状病毒?
据世卫组织称,冠状病毒(CoV)是一个病毒大家族,它们引起的疾病很多,包括普通感冒和更严重的疾病,如中东呼吸综合征(MERS-CoV)和严重急性呼吸综合征(SARS-CoV)。
新型冠状病毒(nCoV)是一种新的病毒株,此前尚未被人类发现。最近爆发的病毒被称为 2019-nCoV 或武汉冠状病毒。
我们面临的危机
此前,据《纽约时报》的一篇报道,「确诊感染人数上升至 37198 人」,「中国死亡人数上升至811人,超过了非典疫情造成的死亡人数」。
中国有 16 个城市,超过 5000 万人口,正处于封锁状态。全球各地的航空公司都取消了往返中国的航班。一些国家正通过特别航班疏散本国公民,并进一步对他们实施严格的隔离。
更糟糕的是,中国股市暴跌,全球股市受到了影响。一些分析人士预测,疫情对全球经济构成的威胁,有可能引发深远的政治后果。
数据集简介
约翰霍普金斯大学收集了「Novel Corona Virus 2019 Dataset」,并将该数据集发表在 Kaggle 上。该小组从世界卫生组织、当地疾控中心和媒体等不同渠道收集了这些数据。他们还创建了一个实时仪表盘来监控病毒的传播
免责声明:请注意,数据集没有更新,因此下面记录的结果可能不是当前现状的真实反映。
导入库并加载数据
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
#reading data from the csv file
data= pd.read_csv("/kaggle/input/novel-corona-virus-2019-dataset/2019_nCoV_data.csv")
理解数据集
让我们首先对数据集有一个基本的了解,并在必要时执行数据清洗操作。
#checking the number of rows and columns
data.shape
输出:(770,8)。数据集中有 8 列共 770 个观测值。
#checking the top 5 rows
data.head()
列的名称显而易见。第一列「Sno」看起来像行号,不向分析添加任何值。第五列「Last Update」显示的值与「Date」列相同,但少数情况下,这些数字稍后会更新。在继续之前,我们先删除这两列。
#dropping the 1st and 5th column
data.drop("Sno", axis=1, inplace=True)
data.drop("Last Update", axis=1, inplace=True)
#getting a summary of the columns
data.info()
除「Province/State」外,所有列都没有空值。进一步分析显示,英国、法国和印度等国的省份名称都不见了。在这种情况下,我们不能假设或填充任何主列表中缺少的值。让我们转到数字列。
data.describe()
describe() 方法返回数据帧中数值列的一般统计信息。
这个输出可以得到的一个直接结论是,数据已经累积报告,即任何一天报告的病例数包括先前报告的病例。死亡的最大值是 479,这与几天前媒体的报道(在这一数据公布时)是一致的。
#checking for duplicate rows
duplicate_rows=data.duplicated(['Country','Province/State','Date'])
data[duplicate_rows]
duplicated() 方法返回一个布尔序列,然后将其用作原始数据帧的掩码。结果显示没有两个记录具有相同的国家、州和日期。因此我们可以得出结论,数据集中的所有观测值都是唯一的。
#listing all the countries where the virus has spread to
country_list=list(data['Country'].unique())
print(country_list)
print(len(country_list))
数据显示,该病毒已经传播到亚洲、欧洲和美洲的 32 个国家。为了进行分析,我们可以合并「China」和「Mainland China」的数据。
#merging China and Mainland China
data.loc[data['Country']=='Mainland China','Country']='China'
在开始之前,让我们检查一下 [Date] 栏中的日期。
print(list(data['Date'].unique()))
print(len(list(data['Date'].unique())))
数据似乎每天都在不同的时间更新。我们可以从时间戳中提取日期并将其用于进一步的分析。这将有助于我们保持日期一致。
#converting 'Date' column to datetime object
data['Date'] = pd.to_datetime(data['Date'])
#extracting dates from timestamps
data['Date_date']=data['Date'].apply(lambda x:x.date())
让我们了解一下疫情对每个国家的影响。
#getting the total number of confirmed cases for each country
df_country=data.groupby(['Country']).max().reset_index(drop=None)
print(df_country[['Country','Confirmed','Deaths','Recovered']])
由于数据是累积的,所以我们需要使用 groupby() 和 max() 函数,以获得每个国家报告的最大数目。如果我们使用 sum(),则会导致重复计算。
数据证实,迄今为止,中国报告的病例最多,481 例死亡病例几乎全部来自中国。但另一方面,中国也有 522 人康复,其次是泰国,有 7 人康复。
#preparing data for a time-series analysis
df_by_date=data.groupby(['Date_date']).sum().reset_index(drop=None)
df_by_date['daily_cases']=df_by_date.Confirmed.diff()
df_by_date['daily_deaths']=df_by_date.Deaths.diff()
df_by_date['daily_recoveries']=df_by_date.Recovered.diff()
print(df_by_date)
我们已经完成了数据预处理步骤,接下来让我们继续进行数据可视化,以寻找新的趋势和模式。
数据可视化
对于数据可视化,我们将使用两个强大的 Python 库:Matplotlib 和 Seaborn。Matplotlib 是大多数数据科学家使用的默认二维可视化库。Seaborn 建立在 matplotlib 之上,有助于构建更好看、更复杂的可视化效果,如热图就是用这个库绘制的。
让我们根据从数据的不同方面创建五个可视化图。
1.一段时间内的确诊病例数
#plotting a bar chart of confirmed cases over time
sns.axes_style("whitegrid")
sns.barplot(
x="Date_date",
y="Confirmed",data=data.groupby(['Date_date']).sum().reset_index(drop=None)
)
plt.xticks(rotation=60)
plt.ylabel('Number of confirmed cases',fontsize=15)
plt.xlabel('Dates',fontsize=15)
2.死亡率与康复率
#plotting two line plots for deaths and recoveries respectively
plt.plot('date_updated', 'Deaths',
data=data.groupby(['date_updated']).sum().reset_index(drop=None), color='red')
plt.plot('date_updated', 'Recovered',
data=data.groupby(['date_updated']).sum().reset_index(drop=None), color='green')
plt.xticks(rotation=60)
plt.ylabel('Number of cases',fontsize=15)
plt.xlabel('Dates',fontsize=15)
plt.legend()
plt.show()
3.除中国外,受影响最严重的 10 个国家
#We know that China is the most affected country by a large margin,
#so lets create a bar plot to compare countries other than China
#increasing the figure size
plt.rcParams['figure.figsize']=(15,7)
sns.barplot(
x="Country",
y="Confirmed",
data=df_country[df_country.Country!='China'].nlargest(10,'Confirmed'),
palette=sns.cubehelix_palette(15, reverse=True)
)
plt.ylabel('Number of cases',fontsize=15)
plt.xlabel('Countries',fontsize=15)
plt.xticks(fontsize=13)
plt.yticks(fontsize=13)
4.死亡率和时间的关系
#The mortality rate, at any point in time, can be roughly calculated
#by dividing the number of deaths by the number of confirmed cases
df_by_date['mrate']=df_by_date.apply(lambda x: x['Deaths']*100/(x['Confirmed']), axis=1)
plt.plot('Date_date','mrate',data=df_by_date, color='red')
plt.show()
5.中国十大受灾最重的省份
#creating a separate dataframe for provinces
df_province=data[data['Country']=='China'].groupby(['Province/State']).max().reset_index(drop=None)
#selecting 10 most affected provinces
df_province=df_province.nlargest(10,'Confirmed')
df_province=df_province[['Province/State','Deaths','Recovered']]
#for multi-bar plots in seaborn, we need to melt the dataframe so
#that the the deaths and recovered values are in the same column
df_province= df_province.melt(id_vars=['Province/State'])
sns.barplot(
x='Province/State',
y='value',
hue='variable',
data=df_province
)
plt.xlabel('Provinces',fontsize=15)
plt.ylabel('Number of cases',fontsize=15)
可视化结果分析
自 1 月 28 日以来,每天报告的病例数量增加了近250%。2 月 4 日报告的病例数为 3915 例。这表明该病毒具有高度的传染性,正在迅速传播。
在第一周,死亡率高于康复率。自 1 月 31 日以来,康复率迅速上升,并呈现出积极的趋势。2 月 4 日有 255 人康复,而死亡人数为 66 人。随着越来越多的人了解症状并及时寻求药物治疗,康复率将继续提高。
与在地理上和中国位置相近的国家,如泰国、日本和新加坡,报告的病例比其他亚洲和欧洲国家多。德国是一个例外,其拥有的病例在欧洲最多。
死亡率从未超过 3%,正在逐渐下降到 2%。未来几周更多的康复病例可能会进一步降低这一数字。
中国湖北省是此次疫情的中心,报告的病例明显多于其他所有省份的总和。有些省份没有死亡病例,所有受感染的病人都康复了。
结论
分析显示,武汉冠状病毒的传播速度惊人。目前,至少 811 人在此次疫情中死亡,超过 7 年前非典爆发时报告的 774 人死亡人数。我祈祷并希望病毒能尽快得到控制。
via:https://towardsdatascience.com/a-data-scientists-perspective-on-the-wuhan-coronavirus-4d1110446478
雷锋网雷锋网雷锋网
雷峰网版权文章,未经授权禁止转载。详情见转载须知。