Loren谈MATLAB的艺术

将想法转化为MATLAB

请注意

Loren谈MATLAB的艺术已退役,将不再更新。

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

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

免责声明:本文不是关于COVID-19的有效和可信的信息来源,这是一个严重的威胁,您应该咨询权威来源,如世卫组织或CDC的准确信息。

内容

COVID-19数据源

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

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

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

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

s = dir (“* . csv”);S = S (arrayfun(@(x) ~matches(x.name,“2019 _ncov_data.csv”), s));文件名= arrayfun(@(x) string(x.name), s)
文件名= 6×1 string array "COVID19_line_list_data.csv" "COVID19_open_line_list.csv" "covid_19_data.csv" " time_series_covid_19_confirmed_csv " " time_series_covid_19_death_csv " " time_series_covid_19_recovere_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以可视化数据集中的第一个和最后一个日期。由于数字数据的列名是日期,我可以简单地选择第一个日期和最后一个日期一起显示地图。请注意,geobubble会显示零值的冒泡,因此如果我们不想显示零值的冒泡,我们需要删除零值的行。

图t = tiledlayout(“流”);ii = [4, length(vars)] times_conf_exChina。类别=分类(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(资源描述,“纬度”“长”“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)] times_conf_us. [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.日期时间格式不一致,所以我们最初将它视为文本。

选择= detectImportOptions(文件名(3),“TextType”“字符串”“DatetimeType”“文本”);provData = readtable(文件名(3),选择);
警告:在为表创建变量名之前,文件中的列标题被修改为有效的MATLAB标识符。原始列标题保存在variabledescription属性中。将'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名进行排名,用一个柱状图

(排序,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:长度(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 = provData(provData.)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)组成(2019冠状病毒病新增病例百分比d国家/地区最多、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.版权所有2020




发布与MATLAB®R2020a

|
Baidu
map