罗兰谈MATLAB的艺术

将想法转化为MATLAB

请注意

罗兰谈MATLAB的艺术已存档,不会更新。

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

随着新型冠状病毒COVID-19的威胁在全球蔓延,我们生活在一个越来越焦虑的时代。当医护人员在第一线抗击病毒时,我们通过保持社交距离来减缓大流行,尽自己的一份力量。今天的嘉宾博主,古原竹内,他想分享他是如何利用MATLAB分析数据的。

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

内容

COVID-19数据来源

当我们日复一日地听到新型冠状病毒COVID-19的消息,我们开始练习保持社交距离时,我需要找到一种方法来安抚我的神经。我是唯一一个发现MATLAB数据分析是冥想练习的人吗?我问自己,那为什么不分析COVID-19呢?

我在文件交换系统里找到了Kevin Chng提交了关于COVID-19的fileexchangnage文件.我还发现新型冠状病毒2019数据集Kaggle。我决定使用Kaggle的数据集。

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

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

S = dir(“* . csv”);S = S (arrayfun(@(x) ~匹配(x.name,“2019 _ncov_data.csv”), s));文件名= arrayfun(@(x)字符串(x.name), s)
文件名= 6×1字符串数组"COVID19_line_list_data.csv" "COVID19_open_line_list.csv" " covid19_data .csv" " time_series_covid_19_确认。csv" "time_series_covid_19_deaths.csv" " time_series_covid_19_restoring .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标识符,因为有些列名是日期。

opts = detectImportOptions(文件名(4),“TextType”,“字符串”);选择。VariableNamesLine = 1;选择。DataLines = [2,inf];选择。preservvariablenames = true;Times_conf = readtable(文件名(4),opts);

数据集包含省/州变量,但我们希望在国家/地区的水平。在此之前,我们需要稍微清理一下数据。请注意,我使用了()符号,因为变量名不是有效的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来聚合数据国家/地区通过汇总确诊病例并求经纬度平均值。

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

输出包含不必要的列,例如纬度和经度的和或确诊病例的平均值。我们去掉这些变量,同时去掉“sum_”“mean_”前缀来自我们所保留的变量。

vars = times_conf_country.Properties.VariableNames;Vars = regexp (Vars,“^ (sum_) (? = L (| o))”,“remove_”);Vars = regexp (Vars,“^ (mean_)(? =[0 - 9])”,“remove_”);Vars =删除(Vars,{“sum_”,“mean_”});times_conf_country.Properties。VariableNames = vars;Times_conf_country = removevars(Times_conf_country,[{“GroupCount”}, var(包含(var,“remove_”)));

因为中国大陆是如此不成比例的大,我们想把它排除在我们的可视化中。

times_conf_exChina = times_conf_country(times_conf_country. cn)(“国家/地区”) ~ =“Mainland China”:);vars = times_conf_ex中国网;

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

图t = tiledlayout(“流”);ii = [4, length(vars)] times_conf_exChina. ii = [4, length(vars)]类别=类别(repmat(" < 100、高度(times_conf_exChina), 1));time_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(tbl,“纬度”,“长”,“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. conf.)(“国家/地区”) = =“我们”):);times_conf_us (times_conf_us。(“省/州”) = =“钻石公主”,:) = [];vars = times_conf_us.Properties.VariableNames;图t = tiledlayout(“流”);Ii = [5, length(vars)] times_conf_us。类别=类别(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(tbl,“纬度”,“长”,“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格式中存在不一致,因此我们最初将其视为文本。

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

让我们清理datetime格式。

provData。ObservationDate = regexprep(provData. exe)ObservationDate,“\ / 20美元”,“/ 2020”);provData。观测日期= 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 = erase(countryData.Properties.VariableNames,“sum_”);

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

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

让我们对前10个进行排序,并将它们形象化柱状图

[sorted,idx] = sort(countryLatest.)确认,“下”);labels = countryLatest.Country_Region(idx);K = 10;topK =排序(1:k);labelsK = label (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:长度(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)))“案例”

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

分国家/地区新增病例情况

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

by_country = cell(size(labelsK));图t = tiledlayout(“流”);ii = 1:length(labelsK) country = provData(provData. labelsK)Country_Region == labelsK(ii),:);国家= groupsummary(国家,{“ObservationDate”,“Country_Region”},...“和”,{“确认”,“死亡”,“恢复”});country.Properties.VariableNames = erase(country.Properties.VariableNames,“sum_”);的国家。New = [0;country.Confirmed(2:end) - country.Confirmed(1:end-1)];country.New(国家。New < 0) = 0;By_country {ii} =国家;如果labelsK (ii) ~ =“他人”nexttile plot(国家。观测日期,国家。new) title(labelsK(ii) + compose(" - %d"马克斯(country.Confirmed)))结束结束标题(t)组成(“COVID-19新病例-前%d国家/地区”、k))包含(t)“截至”+ datestr(max(provData.ObservationDate)))“新病例”

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

仔细看看中国大陆

既然中国大陆的感染正在减缓,让我们看看还有多少活动性病例。确诊病例减去康复病例和死亡病例,即可计算活跃病例。

ii = 1:length(labelsK) by_country{ii}。Active = by_country{ii}。已确认-由国家{ii}。死亡人数————按国家分列{二}。结束图区域(by_country{1}。ObservationDate,...[by_country{1}。活跃的by_country{1}.Recovered by_country{1}.Deaths]) legend(“活跃”,“恢复”,“死亡”,“位置”,“西北”)标题(《中国内地确诊病例分表》)包含(“截至”+ datestr(max(provData.ObservationDate)))“案例”

拟合曲线

活动病例数正在下降,曲线大致呈高斯分布。我们能否拟合高斯模型并预测活动情况何时为零?

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

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

[x, y] = prepareCurveData((1:length(by_country{1}.Active))',by_country{1}.Active);Ft = fittype(“gauss1”);Opts = 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(end) + days(1):...by_country{1}.ObservationDate(end) + days(extend_days))'];Yhat = fobj(xhat);Ci = predint(fobj,xhat);

现在我们可以画出来了。

figure area(by_country{1}.ObservationDate,by_country{1}.Active)保持情节(xdates yhat,“线宽”2)图(xdates ci,“颜色”,“m”,“线型”,”:“,“线宽”, 2)Ylim ([0 inf])“实际”,“高斯适合”,“信心Intevals”,“位置”,“东北”)标题(《中国大陆活跃病例的高斯模型》)包含(“实际截至”+ datestr(max(provData.ObservationDate)))“案例”

当然,我不会光看表面,但如果中国大陆能在4月初之前将活跃病例降至零,不是很好吗?

韩国呢?

让我们绘制韩国的活跃病例数、康复病例数和死亡人数。

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

正如你在图表中看到的,现在判断他们是否达到了顶峰还为时过早。我不认为用高斯函数能得到很好的拟合。

总结

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

The MathWorks, Inc.版权所有




发布与MATLAB®R2020a


评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。

Baidu
map