新型冠状病毒COVID-19数据集分析
随着新型冠状病毒COVID-19的威胁在全球蔓延,我们生活在一个日益焦虑的时代。当医护人员在第一线抗击病毒时,我们通过保持社交距离来减缓疫情蔓延,尽自己的一份力量。今天的嘉宾博客Toshi Takeuchi.,想分享他如何花费他的时间在MATLAB分析数据。
免责声明:此帖子不是Covid-19的有效和可信的信息来源,这是一个严重的威胁,您应该咨询权威来源,以获得准确的信息,例如世卫组织或CDC。
内容
COVID-19数据源
随着我们日复一日地听到新型冠状病毒COVID-19的消息,我们开始练习社交距离,我需要找到一种方法来平息我的紧张情绪。我是唯一一个发现MATLAB中的数据分析是一种冥想练习的人吗?我问自己,为什么不分析COVID-19呢?
我查了档案交换室,发现Kevin Chng在Covid-19制作了这款FileexChnage提让程序.我也被发现了新型电晕病毒2019年数据集在卡格上。我决定使用来自卡格的数据集。
我从Kaggle下载了zip文件,并将其内容移动到我当前的工作目录。
让我们检查解压缩的文件。请注意“| 2019_NCOV_DATA.CSV |”已经过时了,我们不应该使用它。
s = dir(“* .csv”);S = S (arrayfun(@(x) ~matches(x, x))“2019_ncov_data.csv”),s));filenames = arrayfun(@(x)字符串(x.name),s)
filenames = 6×1字符串数组“covid19_line_list_data.csv”“covid19_open_line_list.csv”“covid_19_data.csv”“time_series_covid_19_confirmed.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”那“细绳”);opts.variablenamesline = 1;opts.datalines = [2,inf];opts.prevevariablenames = true;times_conf = readtable(文件名(4),optss);
数据集包含省/州变量,但我们希望汇总数据国家/地区等级。在我们这样做之前,我们需要清理数据。请注意,我已经使用()表示法,因为变量名称不是有效的MATLAB标识符。
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。(“国家/地区”)==“越南”) =“越南”;times_conf。(“国家/地区”) (times_conf。(“省/州”)==“圣马丁岛”) =“圣马丁岛”;times_conf。(“国家/地区”) (times_conf。(“省/州”)==“圣巴特米米”) =“圣巴特米米”;
现在我们可以使用groupsummary汇总数据国家/地区通过对确认的病例进行求和并平均纬度和纵向。
vars = times_cone_conf.properties.variablenames;times_conf_country = gransummary(time_conf,“国家/地区”, {“和”那“的意思是”},vars(3:结束));
该输出包含不必要的列,例如纬度和长型或确认案例的手段。让我们删除那些变量,并删除'和_'或'吝啬的_'我们保留的变量的前缀。
vars = times_conf_country.properties.variablenames;var = regexprep (var,“^ (sum_) (? = L (| o))”那“去掉_”);var = regexprep (var,“^(平均值_)(?= [0-9])”那“去掉_”);var =擦掉(var, {'和_'那'吝啬的_'});times_conf_country.properties.variablenames = vars;times_conf_country = removevars(time_conf_country,[{'groupcount'}, var(包含(var,“去掉_”))));
由于中国大陆如此不成比例地,我们希望将其从可视化中排除。
times_conf_exchina = times_conf_country(time_conf_country。(“国家/地区”)〜=“中国大陆”,:);vars = times_conf_exchina.properties.variablenames;
让我们使用geobubble可视化数据集中的第一个和最后一个日期。由于数字数据的列名是日期,我可以简单地选择第一个日期和最后一个日期一起显示地图。请注意,geobubble将显示零值的气泡,因此如果我们不想显示零例的气泡,我们需要删除带零值的行。
图t = tiledlayout(“流”);为了II = [4,长度(vars)] times_conf_exchina.category = pattorical(repmat(“<100”,高度(time_conf_exchina),1));times_conf_exchina.category(table2array(time_conf_exchina(:,ii))> = 100)=“> = 100”;nexttile tbl = times_conf_exChina(:,[1:3, ii, end]);Tbl (Tbl .(4) == 0,:) = [];gb = geobubble(资源描述,“拉特”那“长”那“SizeVariable”,vars(ii),“ColorVariable”那“类别”);gb.bubblecolorlist = [1,0,1; 1,0,0];gb.Legendvisible =“关闭”;gb。Title =“作为 ”+ var(ii);gb.sizelimits = [0,max(time_conf_exchina。(vars {length(vars)}))];gb.mapcenter = [21.6385 36.1666];gb.zoomlevel = 0.3606;结尾标题(t,[“Covid-19中国大陆以外的确认案例”;......“以红色突出显示的国家/地区100案”])
我们可以看到,它最初只影响了中国大陆周围的国家/地区,但由于在韩国、意大利和伊朗有大规模爆发。值得注意的是,美国早在2020年1月22日就已确诊病例。
映射美国的确认案例
自从我住在波士顿以来,我对更多本地案件感兴趣。让我们走到省/州在美国水平。
times_conf_us = times_conf((time_conf。(“国家/地区”)==“我们”),:);times_conf_us(time_conf_us。(“省/州”)==“钻石公主”,:) = [];vars = times_conf_us.properties.variablenames;图t = tiledlayout(“流”);为了Ii = [5, length(vars)] times_conf_us。类别=分类(repmat (“<100”,高度(time_conf_us),1));times_conf_us.category(table2array(time_conf_us(:,ii))> = 100)=“> = 100”;Nexttile TBL = times_conf_us(:,[1:4, ii, end]);Tbl (Tbl .(5) == 0,:) = [];gb = geobubble(资源描述,“拉特”那“长”那“SizeVariable”,vars(ii),“ColorVariable”那“类别”);gb.bubblecolorlist = [1,0,1; 1,0,0];gb.Legendvisible =“关闭”;gb。Title =“作为 ”+ var(ii);gb.sizelimits = [0,max(time_conf_us。(vars {lengths(vars)}))];gb.mapcenter = [44.9669 -113.6201];gb.zoomlevel = 1.7678;结尾标题(t,[“美国新冠肺炎确诊病例”;......“省/国家以红色突出显示”])
你可以看到它在华盛顿开始,它成为一个主要的爆发,以及加州和纽约。
按确诊病例对国家/地区进行排名
让我们使用国家/地区使用国家/地区的确认案件数量covid_19_data.csv.DateTime格式存在不一致,因此我们将其作为文本将其视为最初。
opts = detectimportoptions(文件名(3),“texttype”那“细绳”那“dateTimetype”那“文本”);ProvData = Readtable(文件名(3),OPTS);
警告:从文件中的列标题被修改为在为表创建变量名称之前,使其有效的MATLAB标识符。原始列标题保存在VariaBlyEscrips属性中。将“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 ==“('St. Martin',)”) =“圣马丁”;provdata.country_region(provdata.country_region ==“教廷”) =“梵蒂冈城”;provdata.country_region(provdata.country_region ==“巴勒斯坦占领”) =“巴勒斯坦”;
数据集包含省/州多变的。让我们汇总数据国家/地区等级。
CountryData = Glianummary(ProvData,{'abangationdate'那'country_region'},......“和”, {'确认的'那'死亡人数'那'恢复'});countrydata.properties.variablenames = erase(countrydata.properties.variablenames,“和_”);
CountryData.包含每日累积数据。(我们只需要最新的数据。)
courtrylatest = commanummary(CountryData,“country_region”那“最大限度”那“确认的”);countryLatest.Properties.VariableNames =擦掉(countryLatest.Properties.VariableNames,“最大限度_”);
让我们排名前10名,并用一个人想象它们直方图.
[排序,idx] =排序(courtryrest.confirmed,“下降”);标签= countryLatest.Country_Region (idx);k = 10;topK =排序(1:k);labelsK =标签(1:k);图直方图(“类别”,分类(标签),“bincounts”,托克,......“显示顺序”那“提升”那“方向”那“水平的”)包含(“确诊病例”)标题([组成)(“Covid-19确认的国家/地区的确认案例 - TOP%D”,k);......“作为 ”+ datestr(max(provdata.observationdate))])
中国大陆以外,意大利是伊朗现在超越韩国。
按国家/地区分列的确诊病例增长情况
我们还可以检查这些国家的病例增长有多快。
图绘图(countrydata.observationdate(countrydata.country_region == labelsk(2)),......CountryData.Confirmed(CountryData.country_Region == Labelsk(2)));抓住在为了II = 3:长度(标签)绘图(CountryData.ObservationDate(CountryData.country_Region == Labelsk(II)),......countrydata.confirmed(countrydata.country_region == labelsk(ii)),“线宽”1);结尾抓住从标题([“Covid-19中国大陆以外的确认案例”;组成(“顶级% d国家/地区”,k)])传奇(标签(2:结束),“地点”那“西北”)包含(“作为 ”+ datestr(max(provdata.observationdate))ylabel(“案件”)
虽然韩国显示了放缓的迹象,但它在其他地方加速了。
国家/地区新案例的增长
我们可以通过减去两个日期之间的确认案件的累积数量来计算新案例的数量。
by_country = cell(size(标签));图t = tiledlayout('流');为了II = 1:长度(标签)国家= provdata(provdata.country_region == labelsk(ii),:);乡村=组ummary(国家,{'abangationdate'那'country_region'},......“和”, {'确认的'那'死亡人数'那'恢复'});country.properties.variablenames = erase(country.properties.variablenames,“和_”);的国家。新= 0;country.Confirmed(2:结束)- country.Confirmed (1: end-1)];country.New(国家。New < 0) = 0;by_country{2} =国家;如果标签(II)〜=“其他”nextdile plot(country.observationdate,country.new)标题(标签(ii)+ compose(“ - %d”,max(country.confirmed))))))结尾结尾标题(t,compose(“2019冠状病毒病新增病例-排名前%d的国家/地区”,k))xlabel(t,“作为 ”+ datestr(max(provdata.observationdate)))ylabel(t,“新案例”)
您可以看到中国大陆和韩国没有许多新案例。似乎他们设法遏制了爆发。
仔细看看中国大陆
由于感染在中国大陆减速,让我们看看有多少活跃的案例仍在这里。您可以通过从确认案件中减去回收的病例和死亡来计算活动案例。
为了II = 1:长度(Labelsk)by_country {ii} .active = by_country {ii} .confirmed - by_country {ii} .deaths - by_country {ii} .recovered;结尾Figure区域(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:长度(by_country {1} .active))',by_country {1} .active);ft = fittype(“高斯1”);选择= fitoptions(“方法”那“NonlinearLeastSquares”);opts.display =“关闭”;opts.lower = [-inf -inf 0];opts.startpoint = [58046 27 7.66733432245782];[fobj,gof] = fit(x,y,ft,选择);GOF.
GOF =带有字段的结构:SSE:4.4145E + 08 RSQUARE:0.9743 DFE:47 Adjrsquare:0.9732 RMSE:3.0647E + 03
让我们通过加20天将输出项目投入到来。
扩展_days = 20;xhat = [x;(x(结束)+1:x(end)+ extend_days)'];xdates = [by_country {1} .observationdate;......(by_country {1} .ObservationDate(结束)+天(1):......by_country {1} .observationdate(结束)+天(扩展_days))'];yhat = fobj(xhat);ci = predint(fobj,xhat);
现在我们准备绘制它。
Figure Aca(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} .active by_country {4}。recovered by_country {4} .deaths])传奇(“积极的”那“恢复”那“死亡人数”那“地点”那“西北”) 标题(“韩国确认案件的细分”)包含(“作为 ”+ datestr(max(provdata.observationdate))ylabel(“案件”)
正如你可以在情节中看到的那样,它太快地告诉他们尚未达到峰值。我认为我们不可能使用高斯的健康。
概括
你使用matlab进行帮助打击covid-19吗?或者也许你已经是自我隔离的?在您完成此尝试时分享您使用matlab的方式这里.
版权所有2020 MathWorks,Inc。
评论
要发表评论,请点击这里登录您的MathWorks帐户或创建新的。