罗兰关于MATLAB的艺术

将想法转化为MATLAB

分析新型冠状病毒COVID-19数据集

随着新型冠状病毒COVID-19的威胁在全球蔓延,我们生活在一个越来越焦虑的时代。医护人员在一线抗击疫情的同时,我们也通过保持社会距离来减缓疫情。今天的嘉宾博客古原竹内,想要分享他如何利用MATLAB分析数据的时间。

声明:本文不是COVID-19的有效和可信信息来源,COVID-19是一种严重威胁,您应咨询权威来源,以获得准确信息,如世卫组织或美国疾病控制与预防中心。

内容

COVID-19数据源

在接连不断地听到新型冠状病毒感染症(COVID-19病毒)的消息,并开始保持社交距离的情况下,我需要找到一种放松紧张情绪的方法。我是唯一一个在MATLAB中发现数据分析是一种冥想练习的人吗?我问自己,为什么不分析一下COVID-19呢?

我查了文件交换,发现Kevin Chng提交了关于COVID-19的文件交换.我还发现新型冠状病毒2019数据集Kaggle。我决定使用Kaggle的数据集。

我从Kaggle下载了zip文件,并将其内容移动到我当前的工作目录。

让我们检查解压后的文件。请注意“|2019_nCoV_data.csv|”已经过时,我们不应该使用它。

s = dir (“* . csv”);arrayfun(@(x)) ~match (x.name,)“2019 _ncov_data.csv”), s));@(x) string(x.name), s)
filenames = 6×1 string array "COVID19_line_list_data.csv" "COVID19_open_line_list.csv" " covid19_data .csv" " time_series_covid_19_confirve.csv " "time_series_covid_19_deaths.csv" "time_series_covid_19_recovered.csv"
  • covid_19_data.csv-这是2020年1月22日起按省/州分类的全球病例主要每日档案水平数据
  • time_series_covid_19_confirmed.csv-确诊病例的时间序列数据
  • time_series_covid_19_deaths.csv-累计死亡人数的时间序列数据
  • time_series_covid_19_recovered.csv-累计康复病例数的时间序列数据
  • COVID19_line_list_data.csv-个人级别信息
  • COVID19_open_line_list.csv-个人级别信息

绘制全球确诊病例图

让我们在地图上可视化确诊病例的数量。我们从装载开始time_series_covid_19_confirmed.csv其中包含我们映射所需要的纬度和经度变量。我还决定保持变量名不变,而不是让MATLAB将它们转换为有效的MATLAB标识符,因为有些列名是日期。

选择= detectImportOptions(文件名(4),“TextType”“字符串”);选择。VariableNamesLine = 1;选择。DataLines =(2,正);选择。PreserveVariableNames = true;times_conf = readtable(文件名(4),选择);

数据集包含省/州变量,但我们想在国家/地区的水平。在此之前,我们需要清理一下数据。请注意,我使用了()符号,因为变量名不是有效的MATLAB标识符。

times_conf。(“国家/地区”) (times_conf。(“国家/地区”) = =“中国”) =“Mainland China”;times_conf。(“国家/地区”) (times_conf。(“国家/地区”) = =“Czechia”) =“捷克”;times_conf。(“国家/地区”) (times_conf。(“国家/地区”) = =伊朗(伊斯兰共和国)) =“伊朗”;times_conf。(“国家/地区”) (times_conf。(“国家/地区”) = =“韩国”) =“朝鲜,南”;times_conf。(“国家/地区”) (times_conf。(“国家/地区”) = =“摩尔多瓦共和国”) =“摩”;times_conf。(“国家/地区”) (times_conf。(“国家/地区”) = =“俄罗斯联邦”) =“俄罗斯”;times_conf。(“国家/地区”) (times_conf。(“国家/地区”) = =“台北和环境”) =“台湾”;times_conf。(“国家/地区”) (times_conf。(“国家/地区”) = =“台湾*”) =“台湾”;times_conf。(“国家/地区”) (times_conf。(“国家/地区”) = =“联合王国”) =“英国”;times_conf。(“国家/地区”) (times_conf。(“国家/地区”) = =“越南”) =“越南”;times_conf。(“国家/地区”) (times_conf。(“省/州”) = =“圣马丁岛”) =“圣马丁岛”;times_conf。(“国家/地区”) (times_conf。(“省/州”) = =“圣人”巴特尔米) =“圣人”巴特尔米

现在我们可以用groupsummary通过。聚合数据国家/地区通过汇总确诊病例和平均纬度和经度。

var = times_conf.Properties.VariableNames;times_conf_country = groupsummary (times_conf,“国家/地区”, {“和”“的意思是”}, var(3:结束));

输出包含不必要的栏,如纬度和经度的总和或确诊病例的方式。让我们移除这些变量“sum_”“mean_”我们保留的变量的前缀。

var = times_conf_country.Properties.VariableNames;var = regexprep (var,“^ (sum_) (? = L (| o))”“remove_”);var = regexprep (var,“^ (mean_)(? =[0 - 9])”“remove_”);var =擦掉(var, {“sum_”“mean_”});times_conf_country.Properties。VariableNames = var;times_conf_country = removevars (times_conf_country, {“GroupCount”}, var(包含(var,“remove_”)));

因为中国大陆太大了,我们想把它排除在我们的想象之外。

times_conf_exChina = times_conf_country (times_conf_country。(“国家/地区”) ~ =“Mainland China”:);var = times_conf_exChina.Properties.VariableNames;

让我们使用geobubble可视化数据集中的第一个和最后一个日期。因为numerica数据的列名是日期,所以我可以简单地选择第一个日期和最后一个日期来一起显示地图。请注意,geobubble将显示一个0值的冒泡,因此,如果我们不想在0情况下显示冒泡,我们需要删除值为0的行。

图t = tiledlayout(“流”);ii = [4, length(vars)]类别=分类(repmat (" < 100、高度(times_conf_exChina), 1));times_conf_exChina. category (table2array(times_conf_exChina(:,ii)) >= 100) =“> = 100”;nexttile tbl = times_conf_exChina(:,[1:3, ii, end]);Tbl (Tbl .(4) == 0,:) = [];gb = geobubble(资源描述,“纬度”“长”“SizeVariable”一样,var (ii),“ColorVariable”“类别”);gb。BubbleColorList = [1, 0, 1, 1, 0, 0);gb。LegendVisible =“关闭”;gb。Title =“的”+ var (ii);gb。SizeLimits = [0, max(times_conf_exChina.(vars{length(vars)}))];gb。MapCenter = [21.6385 36.1666];gb。ZoomLevel = 0.3606;结束标题(t) [“境外新冠肺炎确诊病例”...“100个以上案例用红色标注的国家/地区”])

我们可以看到,它最初只影响到中国大陆周围的国家/地区,但随着韩国、意大利和伊朗的大规模爆发。值得注意的是,美国早在2020年1月22日就出现了确诊病例。

绘制美国确诊病例地图

因为我住在波士顿,我对更多的本地案件感兴趣。我们下去省/州在美国的水平。

times_conf_us = times_conf ((times_conf。(“国家/地区”) = =“我们”):);times_conf_us (times_conf_us。(“省/州”) = =“钻石公主”:) = [];var = times_conf_us.Properties.VariableNames;图t = tiledlayout(“流”);Ii = [5, length(vars)]类别=分类(repmat (" < 100、高度(times_conf_us), 1));times_conf_us. category (table2array(times_conf_us(:,ii)) >= 100) =“> = 100”;Nexttile TBL = times_conf_us(:,[1:4, ii, end]);Tbl (Tbl .(5) == 0,:) = [];gb = geobubble(资源描述,“纬度”“长”“SizeVariable”一样,var (ii),“ColorVariable”“类别”);gb。BubbleColorList = [1, 0, 1, 1, 0, 0);gb。LegendVisible =“关闭”;gb。Title =“的”+ var (ii);gb。SizeLimits = [0, max(times_conf_us.(vars{length(vars)}))];gb。MapCenter = [44.9669 -113.6201];gb。ZoomLevel = 1.7678;结束标题(t) [“美国新冠肺炎确诊病例”...“100个以上案例用红色标注的省/州”])

你可以看到它开始于华盛顿并在那里爆发,加州和纽约也是如此。

按确诊病例排名国家/地区

让我们用国家/地区来比较确诊病例的数量covid_19_data.csv.datetime格式不一致,所以我们首先将其视为文本。

选择= detectImportOptions(文件名(3),“TextType”“字符串”“DatetimeType”“文本”);provData = readtable(文件名(3),选择);
警告:在为表创建变量名之前,文件中的列标头被修改为有效的MATLAB标识符。原始的列标题保存在VariableDescriptions属性中。设置'PreserveVariableNames'为true以使用原始列标题作为表变量名。

让我们清理一下datetime格式。

provData。ObservationDate = regexprep (provData。ObservationDate,“\ / 20美元”“/ 2020”);provData。ObservationDate = datetime (provData.ObservationDate);

我们还需要标准化国家/地区的价值观。

provData.Country_Region (provData。Country_Region = =伊朗(伊斯兰共和国)) =“伊朗”;provData.Country_Region (provData。Country_Region = =“爱尔兰共和国”) =“爱尔兰”;provData.Country_Region (provData。Country_Region = =“韩国”) =“韩国”;provData.Country_Region (provData。Country_Region = =“(圣马丁,)”) =“圣·马丁”;provData.Country_Region (provData。Country_Region = =“教廷”) =“梵蒂冈城”;provData.Country_Region (provData。Country_Region = =“巴勒斯坦被占领土”) =“巴勒斯坦”

数据集包含省/州变量。让我们在国家/地区的水平。

countryData = groupsummary (provData, {“ObservationDate”“Country_Region”},...“和”, {“确认”“死亡”“恢复”});countryData.Properties.VariableNames =擦掉(countryData.Properties.VariableNames,“sum_”);

countryData包含每日累积数据。我们只需要最新的数据。

countryLatest = groupsummary (countryData,“Country_Region”“马克斯”“确认”);countryLatest.Properties.VariableNames =擦掉(countryLatest.Properties.VariableNames,“max_”);

让我们对前10名进行排名,用a来形象化柱状图

(排序,idx) = (countryLatest排序。确认,“下”);标签= countryLatest.Country_Region (idx);k = 10;topK =排序(1:k);labelsK =标签(1:k);图直方图(“类别”分类(labelsK),“BinCounts”topK,...“DisplayOrder”“提升”“定位”“水平”)包含(“确诊病例”)标题([组成(“按国家/地区分列的COVID-19确诊病例-前%d”、k);...“的”+ datestr (max (provData.ObservationDate))))

在中国大陆以外,意大利的伊朗现在正在超越韩国。

国家/地区确诊病例增长

我们还可以查看这些国家的病例增长有多快。

图绘制(countryData.ObservationDate (countryData。Country_Region = = labelsK (2)),...countryData.Confirmed (countryData。Country_Region = = labelsK (2)));持有ii = 3:length(labelsK) plot(countryData. observationdate (countryData. observationdate))Country_Region = = labelsK (ii)),...countryData.Confirmed (countryData。Country_Region = = labelsK (ii)),“线宽”1);结束持有标题([“境外新冠肺炎确诊病例”;组成(“顶级% d国家/地区”传说,k)]) (labelsK(2:结束),“位置”“西北”)包含(“的”+ datestr (max (provData.ObservationDate))) ylabel (“案例”

虽然韩国出现了经济放缓的迹象,但其他地方的经济都在加速增长。

按国家/地区分列的新病例增长情况

我们可以通过减去两个日期之间的累计确诊病例数来计算新增病例数。

by_country =细胞(大小(labelsK));图t = tiledlayout(“流”);ii = 1:length(labelsK) country =Country_Region = = labelsK (ii):);= groupsummary(国家,{“ObservationDate”“Country_Region”},...“和”, {“确认”“死亡”“恢复”});country.Properties.VariableNames =擦掉(country.Properties.VariableNames,“sum_”);的国家。新= 0;country.Confirmed(2:结束)- country.Confirmed (1: end-1)];country.New(国家。New < 0) = 0;by_country{2} =国家;如果labelsK (ii) ~ =“他人”nexttile plot(country.ObservationDate,country.New) title(labelsK(ii) + compose(”——% d”马克斯(country.Confirmed)))结束结束标题(t)组成(“COVID-19新病例-百分比最高的国家/地区”、k))包含(t)“的”+ datestr (max (provData.ObservationDate))) ylabel (t)“新病例”

大家可以看到,中国大陆和韩国的新增病例并不多。看来他们控制住了疫情

仔细看看中国大陆

由于中国大陆的感染速度正在放缓,让我们看看还有多少活跃病例。通过从确诊病例中减去康复病例和死亡病例,可以计算活跃病例。

ii = 1:length(labelsK) by_country{ii}。积极= by_country{2}。确认——by_country{2}。死亡——by_country {2} .Recovered;结束图区域(by_country{1}。ObservationDate,...[by_country{1}。活跃的by_country{1}.Recovered by_country{1}.Deaths]) legend(“活跃”“恢复”“死亡”“位置”“西北”)标题(“中国内地确诊病例分类”)包含(“的”+ datestr (max (provData.ObservationDate))) ylabel (“案例”

拟合曲线

活动性病例数量正在下降,曲线看起来大致呈高斯分布。我们是否可以拟合一个高斯模型并预测活跃病例何时为零?

免责声明:这是一个非常粗糙的方法,你不应该从中得出任何结论——这只是为了你的阅读乐趣。

我使用了曲线拟合工具箱来拟合高斯函数活跃的线。为了评估拟合优度,看看这个

[x, y] = prepareCurveData((1:length(by_country{1}.Active))',by_country{1}.Active);英国《金融时报》= fittype (“gauss1”);选择= fitoptions (“方法”“NonlinearLeastSquares”);选择。显示=“关闭”;选择。Lower = [-Inf -Inf 0];选择。StartPoint = [58046 27 7.66733432245782];[fobj, gof] = fit(x,y,ft,opts);gof
Gof = struct with fields: sse: 4.4145e+08 rsquare: 0.9743 dfe: 47 adjrsquare: 0.9732 rmse: 3.0647e+03

让我们通过增加20天来预测未来的输出。

extend_days = 20;xhat = [x;(x(结束)+ 1:x(结束)+ extend_days) ');xdates = [by_country {1} .ObservationDate;...(by_country {1} .ObservationDate(结束)+天(1):...by_country {1} .ObservationDate(结束)+天(extend_days)) ');yhat = fobj (xhat);ci = predint (fobj xhat);

现在我们准备绘制它。

图区域(by_country {1} .ObservationDate, by_country {1} .Active)情节(xdates yhat,“线宽”2)图(xdates ci,“颜色”“m”“线型””:““线宽”, 2)ylim([0正])传说(“实际”“高斯适合”“信心Intevals”“位置”“东北”)标题(“中国大陆活动性病例的高斯模型”)包含(“实际日期”+ datestr (max (provData.ObservationDate))) ylabel (“案例”

显然,我不会从表面上接受这一点,但如果中国大陆能在4月初将活跃病例减少到零,岂不是很好?

韩国呢?

让我们画出韩国的活跃病例、恢复病例和死亡人数。

图区域(by_country{4}。ObservationDate,...[by_country{4}。活跃的by_country{4}.Recovered by_country{4}.Deaths]) legend(“活跃”“恢复”“死亡”“位置”“西北”)标题(“韩国确诊病例的分解”)包含(“的”+ datestr (max (provData.ObservationDate))) ylabel (“案例”

正如你在情节中看到的,现在判断他们是否达到了顶峰还为时过早。我不认为我们可以用高斯函数得到任何好的匹配。

总结

你是否使用MATLAB帮助抗击COVID-19?或者你已经开始自我隔离了?分享你如何使用MATLAB,而你经历了这个尝试的时间在这里

The MathWorks, Inc.版权所有




发布与MATLAB®R2020a

|

评论

要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。