forked from entorb/COVID-19-Coronavirus-German-Regions
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
1335 lines (1179 loc) · 75.4 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!doctype html>
<html lang="en">
<head>
<title>COVID-19 Coronavirus Disease Spread Time Series in German Regions and the World</title>
<meta charset="utf-8">
<meta name="author" content="Dr. Torben Menke">
<link rel="stylesheet" href="/style.css" />
<!-- Matomo -->
<script>
var _paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function () {
var u = "https://entorb.net/stats/matomo/";
_paq.push(['setTrackerUrl', u + 'matomo.php']);
_paq.push(['setSiteId', '1']);
var d = document, g = d.createElement('script'), s = d.getElementsByTagName('script')[0];
g.type = 'text/javascript'; g.async = true; g.defer = true; g.src = u + 'matomo.js'; s.parentNode.insertBefore(g, s);
})();
</script>
<!-- Polyfiles for IE, suggested by Tabulator : http://tabulator.info/docs/4.6/browsers#ie -->
<script src="./tabulator/polyfill.min.js"></script>
<script src="./tabulator/fetch.umd.js"></script>
<!-- Tabulator -->
<link href="./tabulator/tabulator.min.css" rel="stylesheet">
<script src="./tabulator/tabulator-4.6.min.js"></script>
<!-- eCharts -->
<script src="./eCharts/echarts-4.7.0-en.min.js"></script>
<script src="./eCharts/jquery-3.5.0.min.js"></script>
<script src="./eCharts/myHelper.js"></script>
<!-- <body onload="pageLoadPopup()"> -->
</head>
<body>
<!-- Matomo noscript-->
<noscript>
<img src=" https://entorb.net/stats/matomo/matomo.php?idsite=1&rec=1" style="border:0;" alt="" />
</noscript>
<!-- On page load popup -->
<script>
function pageLoadPopup() {
alert("EN: Due to my vacation, in the next few days I will only be able to update the dynamical charts and tables, not the static charts. Sorry for the inconvenience.\n\nDE: Urlaubsbedingt werde ich in den nächsten Tagen nur die dynamischen Tabellen und Graphen aktualisieren können, leider nicht die statischen Graphen. Sorry.");
}
</script>
<h1>COVID-19 Coronavirus Disease Spread Time Series in German Regions and the World</h1>
<p> In early 2020 the SARS-CoV-2 virus (colloquially known as the coronavirus) spread across the globe and caused a pandemic of COVID-19 disease. This page displays a collection of daily updated charts of disease spread in German regions and in selected countries. The focus lies on displaying the data of the past and deriving trends for the near future. In order to compare data of different regions, the data is scaled by the regions' population. Charts are updated daily in the morning (UTC). Raw data and plot scripts are available in <a href="https://github.com/entorb/COVID-19-Coronavirus-German-Regions" target="_blank">my GitHub repository</a>. </p>
<p>Data sources</p>
<ul>
<li> German "Landkreis" data is from Robert Koch Institut (RKI), fetched from <a href="https://experience.arcgis.com/experience/478220a4c454480e823b17327b2bf1d4/page/page_1/" target="_blank">COVID-19-Dashboard der Nationale Plattform für geographische Daten (NPGEO-DE)</a>
</li>
<li> German "Bundesland" data is from <a href="https://www.rki.de/DE/Content/InfAZ/N/Neuartiges_Coronavirus/Fallzahlen.html" target="_blank">Robert Koch Institut</a> fetched from <a href="https://github.com/swildermann/COVID-19" target="_blank">github.com/swildermann/COVID-19</a> where the RKI data is already converted to CSV format. </li>
<li> German hospital data is from <a href="https://www.divi.de/register/tagesreport" target="_blank">DIVI-Intensivregister</a>. (Thanks to Mr. Parvu for granting usage permission!) </li>
<li> International data is from <a href="https://github.com/CSSEGISandData/COVID-19" target="_blank">Johns Hopkins University Center for Systems Science and Engineering (JHU CSSE)</a>, fetched from <a href="https://github.com/pomber/covid19" target="_blank">github.com/pomber/covid19</a> where the JHU data is merged into one json file. </li>
</ul>
<p>Feel free to drop me a <a href="/contact.php?origin=COVID-19">message</a> if you find a typo, bug or bigger issue. I am happy for inspirations for further analyses as well.</p>
<p>Stay safe, <i>Torben</i></p>
<h2>
<a id="ToC"></a>Table of Contents / Inhaltsverzeichnis</h2>
<ul>
<li>
<a href="#Germany">Germany / Deutschland</a>
</li>
<ul>
<li>
<a href="#DeSituation">Aktuelle Lage</a>
</li>
<ul>
<li>
<a href="#DeDistricts">Landkreise</a>
</li>
<ul>
<li>
<a href="#DeDistrictAni">Animation der Ausbreitung in den Landkreisen</a>
</li>
<li>
<a href="#DeDistrictZeroCases">Anzahl der Landkreise mit Neu-Infektion in der letzten Woche</a><b> (new)</b>
</li>
<li>
<a href="#DeDistrictTable">Landkreistabelle</a> <b>neu: nun mit Intensivstationsauslastung</b>
</li>
<li>
<a href="https://entorb.net/COVID-19-coronavirus/newsletter-register.html" target="_blank">Konfigurierbare Landkreis E-Mail Benachrichtigung</a><b> (new)</b>
</li>
<li>
<a href="#DeDistrictChart">Interaktiver Landkreis Vergleich </a> <b>neu: nun mit Intensivstationsauslastung</b>
</li>
</ul>
<li>
<a href="#DeStates">Bundesländer</a>
</li>
<ul>
<li>
<a href="#DeStatesCasesLastWeek">Infektionen</a>
</li>
<li>
<a href="#DeStatesDeaths">Opfer</a>
</li>
</ul>
</ul>
<li>
<a href="#DeAnalyses">Weitere Auswertungen</a>
</li>
<ul>
<li>
<a href="#DE_shift_deaths_to_cases">Um wieviele Tage läuft die Opferzahl der Zahl der Infizierten hinterher?</a>
</li>
<li>
<a href="#DE_calc-cases-from-deaths-DE-total">Abschätzung der Dunkelziffer der Infizierten</a>
</li>
<li>
<a href="#DE_wahrscheinlichkeit-infizierten-treffen">Wie hoch ist die Wahrscheinlichkeit dass beim Treffen mit Personen ein Infizierter dabei ist?</a><b> (new)</b>
</li>
<li>
<a href="#DE_cases_time_series-absolute">Zeitverlauf der Ausbreitung in den Bundesländern</a>
</li>
<li>
<a href="#DE_cases_time_series-per-million">Zeitverlauf der Ausbreitung in den Deutschen Bundesländern, skaliert auf deren Einwohnerzahlen</a>
</li>
<li>
<a href="#DE_cases_new_time_series-per-million">Zeitverlauf der Neu-Infektionen in den Bundesländern, skaliert auf deren Einwohnerzahlen</a>
</li>
</ul>
<li>Archiv</li>
<ul>
<li>
<a href="expGrowth.html#Exp_Wachstum">Untersuchung der exponentiellen Zunahme der Infektionen in Deutschland</a>
</li>
</ul>
</ul>
<li>
<a href="#Countries">International</a>
</li>
<ul>
<li>
<a href="#Countries">Comparing Countries</a>
</li>
<li>
<a href="#CountryTable">Table of all countries' current situation</a>
</li>
<li>
<a href="#CountriesCustomChart">Country comparison custom chart</a>
</li>
<li>
<a href="#countries-timeshifted">How did the death toll develop in different countries?</a>
</li>
<li>
<a href="#RefDeathCauses">Reference data: deaths by other causes</a>
</li>
<li>
<a href="#Countries_Mortality">Investigating the Calculated Case Mortality: Deaths per Reported Infections</a>
</li>
<li>Archive</li>
<ul>
<li>
<a href="expGrowth.html#countries-fit-results">Death toll regression analyses results for selected countries</a>
</li>
</ul>
</ul>
</ul>
<h2>Further good information sources</h2>
<ul>
<li>
<a href="https://www.rki.de/DE/Content/InfAZ/N/Neuartiges_Coronavirus/Fallzahlen.html" target="_blank">Robert Koch Institut</a>: German data and situation reports </li>
<li>
<a href="https://covid19.who.int/" target="_blank">WHO Dashboard</a>
</li>
<li>
<a href="https://experience.arcgis.com/experience/478220a4c454480e823b17327b2bf1d4/page/page_1/" target="_blank">RKI: COVID-19-Dashboard der Nationale Plattform für geographische Daten (NPGEO-DE)</a>
</li>
<li>
<a href="https://www.worldometers.info/coronavirus/" target="_blank">Worldometers.info - Coronavirus</a>
</li>
<li>
<a href="https://www.ndr.de/nachrichten/info/podcast4684.html" target="_blank">Podcast NDR Info: Das Coronavirus-Update mit Christian Drosten</a>
</li>
<li>
<a href="https://medium.com/@tomaspueyo/coronavirus-act-today-or-people-will-die-f4d3d9cd99ca" target="_blank">Tomas Pueyo: Coronavirus: Why You Must Act Now</a>
</li>
<li>
<a href="https://www.washingtonpost.com/graphics/2020/world/corona-simulator/" target="_blank">Washington Post: Virus exponential spread simulator</a>: random live simulations of the effect of social distancing </li>
<li>
<a href="https://inno.uni-hohenheim.de/corona-modell" target="_blank">Simulator by Uni Hohenheim: An agent-based policy laboratory for COVID-19 containment strategies</a>
</li>
<li>
<a href="https://www.youtube.com/watch?v=Kas0tIxDvrg" target="_blank">Youtube: Exponential growth and epidemics</a>
</li>
<li>
<a href="https://docs.google.com/document/d/e/2PACX-1vS0asYZNC46ZDNTlIQsy2zajEsjpqDJcASwENq4_7qUrvbPx0NRigko7Vy5XMdG9NDWR__xNkBdkKQM/pub" target="_blank">Meine DE Linkliste für Kinderbeschäftigungsideen</a>
</li>
<li>
<a href="https://covidcare.de/" target="_blank">Covidcare: Covid-19 Case Number Predictor V3 for clinics</a>
</li>
<li>
<a href="https://www.intensivregister.de/#/intensivregister" target="_blank">DIVI Intensivregister: Aktuelle Belegungssituation intensivmedizinischer Bereiche der Kliniken Deutschlands</a>
</li>
<li>
<a href="https://www.peira.org/das-virus-die-menschen-und-das-leben/" target="_blank">E. Huber @ peira.org: Das Virus, die Menschen und das Leben</a>
</li>
<li>
<a href="https://covid19-trends.de/" target="_blank">covid19-trends.de by Alexander Friedl nicely displaying German trends, using data generated by me.</a>
</li>
<li>
<a href="https://www.quarks.de/gesundheit/was-die-daten-zu-corona-aussagen-und-was-nicht/" target="_blank">Quarks: Was die Daten zu Corona aussagen und was nicht</a>
</li>
<li>
<a href="https://www.destatis.de/DE/Themen/Gesellschaft-Umwelt/Bevoelkerung/Sterbefaelle-Lebenserwartung/sterbefallzahlen.html" target="_blank">Quarks: Statistisches Bundesamt (Destatis): Sonderauswertung zu Sterbefallzahlen des Jahres 2020</a>
</li>
<li>
<a href="https://euromomo.eu/graphs-and-maps" target="_blank">EuroMOMO: mortality graphs and maps</a>
</li>
<li>
<a href="https://ourworldindata.org/grapher/full-list-cumulative-total-tests-per-thousand" target="_blank">Our World In Data: COVID-19 tests per 1,000 people</a>
</li>
</ul>
<h2><a id="Germany"></a>Germany / Deutschland</h2>
<!-- Aktuelle Lage -->
<a id="DeSituation"></a>
<!-- <p>Aktueller Stand der Infektionen in den Landkreisen, skaliert auf deren Einwohnerzahl. Eingebettet von <a href="https://commons.wikimedia.org/wiki/File:COVID-19_outbreak_Germany_per_capita_cases_map.svg" target="_blank">Wikipedia</a></p>
<a title="Ythlev / CC BY-SA (https://creativecommons.org/licenses/by-sa/4.0)" href="https://commons.wikimedia.org/wiki/File:COVID-19_outbreak_Germany_per_capita_cases_map.svg" target="_blank">
<img width="512" alt="COVID-19 outbreak Germany per capita cases map" src="https://upload.wikimedia.org/wikipedia/commons/thumb/a/af/COVID-19_outbreak_Germany_per_capita_cases_map.svg/512px-COVID-19_outbreak_Germany_per_capita_cases_map.svg.png"></a>
<br />
<small>Eingebettet von <a href="https://commons.wikimedia.org/wiki/File:COVID-19_outbreak_Germany_per_capita_cases_map.svg" target="_blank">Wikipedia</a>, Erstell-Skript dazu wurde hier publiziert: <a href="https://github.com/ythlev/covid-19" target="_blank">github.com/ythlev/covid-19</a>
</small> -->
<h3><a id="DeDistricts"></a>Landkreise</h3>
<h4><a id="DeDistrictAni"></a>Animation der Ausbreitung in den Landkreisen</h4>
<p>Grafik anklicken um zur Animation zu gelangen.</p>
<table>
<!-- <tr>
<th>Neu-Infizierte letzte Woche</th>
<th>Infizierte gesamt</th>
</tr> -->
<tr>
<td>
<a href="maps-de-districts.html"><img src="maps/de-districts-Cases_Per_Million-latest.gif" alt="de-districts-Cases_Per_Million-latest.gif" width="480" height="651"></a>
</td>
<td>
<a href="maps-de-districts.html"><img src="maps/de-districts-Cases_Last_Week_Per_Million-latest.gif" alt="de-districts-Cases_Last_Week_Per_Million-latest.gif" width="480" height="651"></a>
</td>
</tr>
<!-- <tr>
<td colspan="2" style="text-align: center;"><br />Einheit: pro Millionen Einwohner</td>
</tr> -->
<tr>
<td>
<a href="maps-de-districts.html"><img src="maps/de-districts-DIVI_Intensivstationen_Covid_Prozent-latest.gif" alt="de-districts-DIVI_Intensivstationen_Covid_Prozent-latest.gif" width="480" height="651"></a>
</td>
<td>
<a href="maps-de-districts.html"><img src="maps/de-districts-DIVI_Intensivstationen_Betten_belegt_Prozent-latest.gif" alt="de-districts-DIVI_Intensivstationen_Betten_belegt_Prozent-latest.gif" width="480" height="651"></a>
</td>
</tr>
</table>
<ul>
<li>Datenquelle: <a href="https://experience.arcgis.com/experience/478220a4c454480e823b17327b2bf1d4/page/page_1/" target="_blank">RKI: COVID-19-Dashboard der Nationale Plattform für geographische Daten (NPGEO-DE)</a>
</li>
<li> Skript Quellcode: ist in meinem <a href="https://github.com/entorb/COVID-19-Coronavirus-German-Regions/blob/master/gen-map-de-districts.py" target="_blank">GitHub Repository</a> zu finden. Es basiert zum Großteil auf der Arbeit von <a href="https://github.com/ythlev/covid-19" target="_blank">ythlev</a>. </li>
</ul>
<!-- <p>siehe <a href="maps/">hier</a></p> -->
<p><small><a href="#ToC">Back to top</a></small></p>
<h4><a id="DeDistrictZeroCases"></a>Anzahl der Landkreise mit Neu-Infektion in der letzten Woche</h4>
<p>In der folgenden Grafik ist als Zeitverlauf die Anzahl der deutschen Land- und Stadtkreise aufgetragen, die COVID-19 Neu-Infektionen in der letzten Woche vermeldet haben.</p>
<img src="plots-gnuplot/de-districts/zero_cases_last_week.png" alt="zero_cases_last_week.png" width="640" height="480">
<br /> <small>generated via Gnuplot <a href="https://github.com/entorb/COVID-19-Coronavirus-German-Regions/tree/master/scripts-gnuplot/" target="_blank">plot-de-districts</a>, raw data can be found in <a href="https://github.com/entorb/COVID-19-Coronavirus-German-Regions/blob/master/data/de-districts/de-districts-zero_cases_last_week.tsv" target="_blank">de-districts-zero_cases_last_week.tsv</a></small>
<p><small><a href="#ToC">Back to top</a></small></p>
<h4><a id="DeDistrictTable"></a>Landkreistabelle</h4>
<p>Es gibt nun auch eine <a href="https://entorb.net/COVID-19-coronavirus/newsletter-register.html" target="_blank">konfigurierbare E-Mail Benachrichtigung</a> für Landkreisdaten.</p>
<p>Ein Klick auf eine Zeile fügt diesen Landkreis in die <a href="#DeDistrictChart">interaktive Landkreis-Grafik</a> hinzu.</p>
<p> 06.05.2020: In Deutschland wurde als Richtwert für die Verschärfung von Maßnahmen der Grenzwert von <a href="https://www.tagesschau.de/inland/lockerungen-bund-laender-101.html" target="_blank">500 Neuinfektionen pro 1.000.000 Einwohnern in sieben Tagen in einem Stadt-/Landkreis</a> festgelegt. Daher habe ich die Landkreistabelle nun nach diesem Wert in der Spalte "Infizierte pro Millionen Einwohner pro Woche" sortiert. </p>
<div id="table-de-districts"></div>
<!-- <script type="text/javascript" src="tabulator/tabulator.min.js"></script> -->
<script>
var table = new Tabulator("#table-de-districts", {
height: 600, // set height of table to enable virtual DOM
layout: "fitColumns", //fit columns to width of table (optional)
// autoColumns: true, // very nice!!!
tooltipsHeader: true,
columns: [ //Define Table Columns
{
title: "Bundesland<br/> <br/> ", field: "Bundesland", sorterParams: {
alignEmptyValues: "bottom"
}, headerFilter: true
// , headerFilterPlaceholder:"select"
},
{ title: "Landkreis<br/> <br/> ", field: "Landkreis", sorter: "string", headerFilter: true },
// {
// title: "ID", field: "LK_ID", sorter: "string", width: 30, sorterParams: {
// alignEmptyValues: "bottom"
// }, headerFilter: true
// },
{
title: "Einwohner<br/> <br/> ", field: "Population", sorter: "number", width: 100, hozAlign: "right", sorterParams: {
alignEmptyValues: "bottom"
}, headerFilter: true, headerFilterPlaceholder: "filter >=", headerFilterFunc: ">="
},
// { title: "Date", field: "Date", sorter: "date", sorterParams: { format: "YYYY-MM-DD" }, hozAlign: "center", headerFilter: true },
{
title: "Infizierte<br/> <br/> ", field: "Cases", sorter: "number", width: 100, hozAlign: "right", sorterParams: {
alignEmptyValues: "bottom"
}, headerFilter: true, headerFilterPlaceholder: "filter >=", headerFilterFunc: ">="
},
{
title: "Tote<br/> <br/> ", field: "Deaths", sorter: "number", width: 100, hozAlign: "right", sorterParams: {
alignEmptyValues: "bottom"
}, headerFilter: true, headerFilterPlaceholder: "filter >=", headerFilterFunc: ">="
},
{
title: "Infizierte<br/>pro Mill.EW.<br/>gesamt", field: "Cases_Per_Million", sorter: "number", hozAlign: "right", sorterParams: {
alignEmptyValues: "bottom"
}, headerFilter: true, headerFilterPlaceholder: "filter >=", headerFilterFunc: ">="
},
{
title: "Tote<br/>pro Mill.EW.<br/>gesamt", field: "Deaths_Per_Million", sorter: "number", hozAlign: "right", sorterParams: {
alignEmptyValues: "bottom"
}, headerFilter: true, headerFilterPlaceholder: "filter >=", headerFilterFunc: ">="
},
{
title: "Infizierte<br/>pro Mill.EW.<br/>pro Woche", field: "Cases_Last_Week_Per_Million", sorter: "number", hozAlign: "right", sorterParams: {
alignEmptyValues: "bottom"
}, headerFilter: true, headerFilterPlaceholder: "filter >=", headerFilterFunc: ">="
},
{
title: "Tote<br/>pro Mill.EW.<br/>pro Woche", field: "Deaths_Last_Week_Per_Million", sorter: "number", hozAlign: "right", sorterParams: {
alignEmptyValues: "bottom"
}, headerFilter: true, headerFilterPlaceholder: "filter >=", headerFilterFunc: ">="
},
{
title: "Infizierte<br/>Trend<br/>Index", field: "Slope_Cases_New_Per_Million", sorter: "number", hozAlign: "right", sorterParams: {
alignEmptyValues: "bottom"
}, headerFilter: true, headerFilterPlaceholder: "filter >=", headerFilterFunc: ">="
},
{
title: "Intensivstationen<br/>% COVID-19<br/> ", field: "DIVI_Intensivstationen_Covid_Prozent", sorter: "number", hozAlign: "right", sorterParams: {
alignEmptyValues: "bottom"
}, headerFilter: true, headerFilterPlaceholder: "filter >=", headerFilterFunc: ">="
},
{
title: "Intensivstationen<br/>% belegt<br/> ", field: "DIVI_Intensivstationen_Betten_belegt_Prozent", sorter: "number", hozAlign: "right", sorterParams: {
alignEmptyValues: "bottom"
}, headerFilter: true, headerFilterPlaceholder: "filter >=", headerFilterFunc: ">="
},
],
rowClick: function (e, row) {
var rowData = row.getData();
// console.log(rowData)
var clickedCode = rowData["LK_ID"];
var clickedDistrict = rowData["Landkreis"];
new_deDistrict_selected(deDistrictCodes, clickedCode);
alert(clickedDistrict + " zum Chart unten hinzugefügt")
},
});
table.setData("https://entorb.net/COVID-19-coronavirus/data/de-districts/de-districts-results-V2.json", {}, "get");
table.setSort([
{ column: "Landkreis", dir: "asc" },
{ column: "Bundesland", dir: "asc" },
{ column: "Cases_Last_Week_Per_Million", dir: "desc" }, //sort by this first
]);
</script>
<small> generated via <a href="http://tabulator.info/" target="_blank">Tabulator</a>, raw data can be found <a href="https://github.com/entorb/COVID-19-Coronavirus-German-Regions/tree/master/data/de-districts" target="_blank">here</a>
</small>
<p><small><a href="#ToC">Back to top</a></small></p>
<h4><a id="DeDistrictChart"></a>Interaktiver Landkreis Vergleich</h4>
<p>Landkreise und Städte in obiger <a href="#DeDistrictTable">Tabelle</a> auswählen. Mit dem Button über der Legende kann in die Daten hinein gezoomt werden.</p>
<table>
<tr>
<td>y-Achse:</td>
<td><select id="sel_y_axis_field_DeDistricts" name="sel_y_axis_field_DeDistricts" style="width:200px"></select></td>
<td><select id="sel_sorting_DeDistricts" name="sel_sorting_DeDistricts" style="width:200px"></select></td>
</tr>
<tr>
<td>x-Achse:</td>
<td><select id="sel_x_axis_time_range_DeDistricts" name="sel_x_axis_time_range_DeDistricts" style="width:200px"> </select></td>
<td><input type="reset" onclick="resetDeDistrictsChart()"></td>
</tr>
</table>
<div id="eChartsDeDistrictsContainer" style="height: 600px; width:1000px; background-color: white;"></div>
<small> generated via <a href="https://echarts.apache.org" target="_blank">eCharts</a>, raw data can be found <a href="https://github.com/entorb/COVID-19-Coronavirus-German-Regions/tree/master/data/de-districts" target="_blank">here</a>
</small>
<!--
Common JS for eCharts
-->
<script>
// array of promises for async fetching, used for eCharts plots
const promises = [];
// This dirty workaround is needed for Edge and IE :-(
var urlParams = [];
if ('search' in window.location) {
urlParams = URLToParameterArray(window.location.search);
}
const options_eCharts_sorting = [
"Sort_by_name",
"Sort_by_max_value",
"Sort_by_last_value"
]
</script>
<!--
JS for eCharts DE Districts
-->
<script>
const eChart_DeDistricts = echarts.init(document.getElementById("eChartsDeDistrictsContainer"));
var mapDeDistrictNames = {};
// fetch mapping_landkreis_ID_name.json reference data like code and continent
function fetch_mapRefDeDistrictData(mapDeDistrictNames) {
const url =
"https://entorb.net/COVID-19-coronavirus/data/de-districts/mapping_landkreis_ID_name.json";
return $.getJSON(url, function (data) {
console.log("success: mapDeDistrictNames");
})
.done(function (data) {
console.log("done: mapDeDistrictNames");
$.each(data, function (key, val) {
mapDeDistrictNames[key] = val;
});
})
.fail(function () {
console.log("fail: mapDeDistrictNames");
});
}
promises.push(fetch_mapRefDeDistrictData(mapDeDistrictNames));
// Initial list of DeDistrict codes
var deDistrictCodesDefaultValue = "05370"; // do not delete, used in reset function as well
if ('DeDistricts' in urlParams) {
var deDistrictCodes = urlParams.DeDistricts.split(",");
// Adding an entry to this array draws a new line
// read districts list from URL parameter if set
} else {
// Adding an entry to this array draws a new line
// read districts list from URL parameter if set
// 02000 = Hamburg
// 05558 = Coesfeld
// 05370 = Heinsberg
var deDistrictCodes = [deDistrictCodesDefaultValue];
}
const data_object_DE_districts = {}; // We store all the data in an object
// For each country code we fetch the data
for (let i = 0; i < deDistrictCodes.length; i++) {
promises.push(fetchData('DeDistrict', deDistrictCodes[i], data_object_DE_districts));
}
// chart parameter option lists
// const options_xAxisProperty
const options_yAxisProperty_DeDistricts = [
"Cases_Last_Week_Per_Million",
"Cases_Per_Million",
"Cases_New_Per_Million",
"Cases",
"Cases_Last_Week",
"Cases_New",
"Deaths_Last_Week_Per_Million",
"Deaths_Per_Million",
"Deaths_New_Per_Million",
"Deaths",
"Deaths_Last_Week",
"Deaths_New",
"DIVI_Intensivstationen_Covid_Prozent",
"DIVI_Intensivstationen_Betten_belegt_Prozent",
];
const select_yAxisProperty_DeDistricts = document.getElementById("sel_y_axis_field_DeDistricts");
setOptionsToSelect(select_yAxisProperty_DeDistricts, options_yAxisProperty_DeDistricts, "");
const select_sorting_DeDistricts = document.getElementById("sel_sorting_DeDistricts");
setOptionsToSelect(select_sorting_DeDistricts, options_eCharts_sorting, "");
const select_xAxisTimeRange_DeDistricts = document.getElementById("sel_x_axis_time_range_DeDistricts");
const options_xaxis_time_range_DeDistricts = [
{ value: "12weeks", text: "12 Wochen" },
{ value: "4weeks", text: "4 Wochen" },
{ value: "all", text: "ganzer Zeitraum" },
];
setOptionsToSelect(select_xAxisTimeRange_DeDistricts, options_xaxis_time_range_DeDistricts, "");
if ('yAxis' in urlParams && options_yAxisProperty_DeDistricts.indexOf(urlParams.yAxis) > -1) {
select_yAxisProperty_DeDistricts.value = urlParams.yAxis;
}
if ('Sort' in urlParams && options_eCharts_sorting.indexOf(urlParams.Sort) > -1) {
select_sorting_DeDistricts.value = urlParams.Sort;
}
select_yAxisProperty_DeDistricts.onchange = function () { refreshDeDistrictsChartWrapper() };
select_sorting_DeDistricts.onchange = function () { refreshDeDistrictsChartWrapper() };
select_xAxisTimeRange_DeDistricts.onchange = function () { refreshDeDistrictsChartWrapper() };
// Wait for all async promises to be done (all data is fetched)
// sets the deDistrictCodes to default value
// then refreshes the chart
Promise.all(promises).then(function () {
console.log("eCharts DeDistricts: all data fetched");
refreshDeDistrictsChart(
eChart_DeDistricts,
deDistrictCodes,
data_object_DE_districts,
select_yAxisProperty_DeDistricts,
select_xAxisTimeRange_DeDistricts,
select_sorting_DeDistricts,
update_url = false
)
});
// Wraps the refreshChart function so it is more readable, takes less space
function refreshDeDistrictsChartWrapper() {
refreshDeDistrictsChart(
eChart_DeDistricts,
deDistrictCodes,
data_object_DE_districts,
select_yAxisProperty_DeDistricts,
select_xAxisTimeRange_DeDistricts,
select_sorting_DeDistricts,
update_url = true
);
}
</script>
<p><small><a href="#ToC">Back to top</a></small></p>
<h3>
<a id="DeStates"></a>Bundesländer</h3>
<p>Darstellungen des Zeitverlaufs an COVID-19 Erkrankungen in den deutschen Bundesländern. Die Zahlen habe ich skaliert auf die Bevölkerung der Bundesländer, damit man diese miteinander vergleichen kann. Da die täglichen Zahlen stark schwanken und Wochenenden einen deutlichen Effekt auf diese Schwankungen haben, habe ich in den Darstellungen der Veränderung zum Vortrag 7-Tagesdifferenzen verwendet.</p>
<h4>
<a id="DeStatesCasesLastWeek"></a>Bundesländer - Infektionen</h4>
<!-- <h5><a id="DeStatesDeathsLastWeek"></a>Neu-Infizierte pro 7 Tage</h5> -->
<img src="plots-gnuplot/de-states/cases-de-last_week-per-million.png" alt="cases-de-last_week-per-million.png" width="640" height="800">
<img src="plots-gnuplot/de-states/cases-de-last_week-per-million-log.png" alt="cases-de-last_week-per-million-log.png" width="640" height="800">
<br />
<small>generated via Gnuplot <a href="https://github.com/entorb/COVID-19-Coronavirus-German-Regions/tree/master/scripts-gnuplot/" target="_blank">plot-de-states-timeseries-joined</a>, raw data can be found in <a href="https://github.com/entorb/COVID-19-Coronavirus-German-Regions/blob/master/data/de-states/" target="_blank">de-state-XX.tsv</a>
</small>
<h4>
<a id="DeStatesDeaths"></a>Bundesländer - Opfer</h4>
<p> In den Darstellungen der Opferzahlen habe ich auf der rechten Seite Referenzwerte zu anderen Todesursachen angegeben, Quellen dazu siehe <a href="#RefDeathCauses">diese Tabelle</a> unten. Hinweis: die Todeszahlen laufen den Infektionszahlen um ca. 3 Wochen hinterher. Im Median sterben Patienten <a href="https://www.worldometers.info/coronavirus/coronavirus-death-rate/#days" target="_blank">14 Tage</a> nach den ersten Symptomen, die wiederrum etwa <a href="https://www.worldometers.info/coronavirus/coronavirus-incubation-period/" target="_blank">3-5 Tage</a> nach der Infektion auftreten.</p>
<h5><a id="DeStatesDeathsLastWeek"></a>Neu-Verstorbene pro 7 Tage</h5>
<img src="plots-gnuplot/de-states/deaths-de-last_week-per-million.png" alt="deaths-de-last_week-per-million.png" width="640" height="800">
<img src="plots-gnuplot/de-states/deaths-de-last_week-per-million-log.png" alt="deaths-de-last_week-per-million-log.png" width="640" height="800"><br />
<!-- <p> Fazit vom 24.04.2020: </p>
<ul>
<li>Bisher noch unter den geschätzten Zahlen der besonders starken Grippe Saison von 2017</li>
<li> In einigen Bundesländern bereits mehr COVID-19 Tote als Verkehrstote im ganzen Jahr 2019</li>
<li>Die Steigerungsrate der Todeszahl hat zwar stagniert, nimmt aber noch immer nicht merklich ab. Sprich bisher
starben jede Woche mehr Menschen an COVID-19 als in den Wochen zuvor.</li>
</ul> -->
<h5>Gesamtzahl der Opfer</h5>
<img src="plots-gnuplot/de-states/deaths-de-per-million.png" alt="deaths-de-per-million.png" width="640" height="800">
<img src="plots-gnuplot/de-states/deaths-de-per-million-log.png" alt="deaths-de-per-million-log.png" width="640" height="800">
<br /> <small>generated via Gnuplot <a href="https://github.com/entorb/COVID-19-Coronavirus-German-Regions/tree/master/scripts-gnuplot/" target="_blank">plot-de-states-timeseries-joined</a>, raw data can be found in <a href="https://github.com/entorb/COVID-19-Coronavirus-German-Regions/blob/master/data/de-states/" target="_blank">de-state-XX.tsv</a></small>
<p><small><a href="#ToC">Back to top</a></small></p>
<h3>
<a id="DeAnalyses"></a>Weitere Auswertungen</h3>
<h3>
<a id="DE_shift_deaths_to_cases"></a> Um wieviele Tage läuft die Opferzahl der Zahl der Infizierten hinterher? </h3>
<p>In der folgenden Abbildung habe ich für Deutschland die Neu-Infizierten und die Neu-Verstorbenen aufgetragen. Die Kurve der Neu-Verstorbenen habe ich dann zeitlich verschoben um heraus zu finden, um wie viele Tage die Verstorbenen "nachlaufen". Anstatt von Tagessummen wurde die 7-Tage-Differenz verwendet um Wochenendeffekte auszuschließen.</p>
<img src="plots-gnuplot/de-states/shift-deaths-to-match-cases_DE_last-week.png" alt="shift-deaths-to-match-cases_DE_last-week.png" width="640" height="480">
<p>Ergebnis vom 27.04.2020: 14 Tage passen ziemlich gut. Somit ist anzunehmen, dass die Opferzahlen noch mindestens 14 Tage lang abnehmen werden. Für die Zeit von Infektion bis positiv getestet vergehen vermutlich nochmal 7 Tage, so dass wohl 3 Wochen zwischen Beginn einer Maßnahme und Sichtbarkeit dieser in den Opferzahlen liegen wird. Für die beste Übereinstimmung der Kurven habe ich die rechte Achse der Verstorbenen auf 4.2% der linken Achse skaliert. Beides habe ich "nach Auge" gemacht und keine Optimierungsroutine verwendet.</p>
<p><a id="DE_forecasting-deaths"></a> Analog lässt sich aus dem Zeitverlauf der Infektionen eine Prognose für die Opferzahl für die nächsten 14 Tage erstellen, die direkt mit der Auslastung der Krankenhäuser korrelieren sollte. Hier exemplarisch für Deutschland, Bundesland Bayern und Stadt Erlangen. Skaliert jeweils pro Millionen Einwohner. </p>
<img src="plots-gnuplot/de-states/forecasting-deaths-DE.png" alt="forecasting-deaths-DE.png" width="640" height="480">
<img src="plots-gnuplot/de-states/forecasting-deaths-BY.png" alt="forecasting-deaths-BY.png" width="640" height="480">
<img src="plots-gnuplot/de-states/forecasting-deaths-Erlangen.png" alt="forecasting-deaths-Erlangen.png" width="640" height="480">
<br />
<small>generated via Gnuplot <a href="https://github.com/entorb/COVID-19-Coronavirus-German-Regions/tree/master/scripts-gnuplot/" target="_blank">plot-de-shift-deaths-to-match-cases.gp</a>, raw data can be found in <a href="https://github.com/entorb/COVID-19-Coronavirus-German-Regions/blob/master/data/de-states/de-state-DE-total.tsv" target="_blank">de-state-DE-total.tsv</a> </small>
<p><small><a href="#ToC">Back to top</a></small></p>
<h3>
<a id="DE_calc-cases-from-deaths-DE-total"></a> Wie hoch ist die Dunkelziffer der Infizierten im Vergleich zu den offiziellen Fallzahlen? </h3>
<p> 04.04.2020: In der letzten Woche habe ich immer mehr Stimmen gehört und gelesen, die den offiziellen Zahlen nicht trauen. Höhepunkt war, dass ein Dresdner Freund, der positiv auf COVID-19 getestet wurde, berichtete, dass von seinen Kontakten der letzten 2 Wochen (vor der Ausgangssperre) keiner einen Test bewilligt bekam. Dies ist vermutlich in der ausgereizten Testkapazität der Labore begründet. Daher habe ich mal versucht eine Abschätzung der Dunkelziffer (=Differenz zwischen der Gesamtzahl der Infizierten und den positiv getesteten Personen) zu treffen. </p>
<p> Folgende sehr vereinfachte grobe Annahmen (Inspiriert von <a href="https://medium.com/@tomaspueyo/coronavirus-act-today-or-people-will-die-f4d3d9cd99ca" target="_blank">diesem Artikel, Abschnitt "Washington State"</a>) habe ich getroffen: </p>
<ul>
<li> Wer heute stirbt, hat sich vor 2 Wochen infiziert</li>
<li> Ein Infizierter stirbt mit einer Wahrscheinlichkeit von 1%</li>
<li> Die Verdopplungszeit der Opferzahl wird aus den Daten der letzten Woche ermittelt und für die Prognose in die Zukunft konstant gehalten </li>
</ul>
<p>Damit lässt sich die Gesamtzahl der Infizierten vor 2 Wochen rückwärts berechnen aus 100x (Kehrwert von 1%) die Zahl der heute Verstorbenen. Diese Rechnung lässt such nun für jeden Tag X durchführen: Zahl der Toten am Tag X mal 100 zugeordnet zum Tag X-14. Daraus lässt sich auf die Gesamtzahl der <u>heute</u> infizierten Personen über eine Regressionsanalyse/Fit der Daten (mehr dazu <a href="#Exp_Wachstum">unten</a>) extrapolieren. Graphisch sieht dies wie folgt aus: </p>
<img src="plots-gnuplot/de-states/calc-cases-from-deaths-DE-total.png" alt="calc-cases-from-deaths-DE-total.png" width="640" height="480">
<br />
<small>generated via Gnuplot <a href="https://github.com/entorb/COVID-19-Coronavirus-German-Regions/tree/master/scripts-gnuplot/" target="_blank">plot-de-calc-deaths.gp</a>, raw data can be found in <a href="https://github.com/entorb/COVID-19-Coronavirus-German-Regions/blob/master/data/de-states/de-state-DE-total.tsv" target="_blank">de-state-DE-total.tsv</a>
</small>
<p> Anmerkung zu den Annahmen: Die Sterblichkeit ist vermutlich geringer als die angenommenen 1%. Es dauert wohl üblicherweise eher 3-4 Wochen von Infektion bis zum Tode, nicht wie von mir gerechnet nur 2 Wochen. Beide Effekte wirken sich vergrößernd auf die Dunkelziffer aus.</p>
<p> Update vom 18.04.2020: Spiegel Online zitiert in <a href="https://www.spiegel.de/wissenschaft/medizin/coronavirus-wie-antikoerpertests-dabei-helfen-die-pandemie-zu-verstehen-a-2258edcd-a304-4ee0-83cc-76a24f340c45" target="_blank">diesem Artikel</a> Thomas Fenner mit der Schätzung, dass 1,9% der Deutschen Bevölkerung bereits von Covid-19 infiziert waren. Meine grobe Abschätzung lieferte an diesem Tag 1.5%, was überraschend dicht dran ist. (Am 04.05.2020 ist diese meine Abschätzung auf 1.1% gesunken. Ursache ist die starke Reduktion des exponentiellen Wachstums, durch die erfolgreichen Lockdown Maßnahmen in der Zwischenzeit.</p>
<p> Mein persönliches Fazit aus dieser sehr groben Abschätzung ist, dass die Dunkelziffer recht groß zu sein scheint und aufgrund der beschränkten Testkapazität in Zukunft wohl weiter zunehmen wird. Dies bewirkt in den Grafiken und Auswertungen eine stärkere Zunahme der berechneten Verdopplungszeit als es in der Realität der Fall sein sollte. Die wirkliche Verdopplungszeit ist daher vermutlich kürzer als von mir <a href="#Exp_Wachstum">unten</a> pro Bundesland ermittelt. Für meine <a href="#Countries">internationalen Vergleiche</a> habe ich mich ausschließlich auf die Opferzahlen gestützt, diese halte ich weiterhin für belastbar. Die folgenden Kapitel belasse ich trotzdem online, so kann jeder Leser selber entscheiden welche Schlüsse er aus den Daten zieht. </p>
<p> Nun folgen noch drei Beispiele die die Idee hinter meiner groben Abschätzung verdeutlichen sollen, da es berechtigte Kritik an der ersten Fassung dieses Abschnitts gab.</p>
<p> Beispiel 1: Eine Insel mit 1000 Einwohnern von denen bisher keiner infiziert war. <br /> Wenn alle 1000 Einwohner am gleichen Tag, zB 1.1.2020 infiziert, sollten nach 14 Tagen (15.01.2020) unter den obigen Annahmen statistisch gemittelt 10 Personen verstorben sein. Werden auf dieser Insel keine Tests durchgeführt, so ist die Zahl der positiv getesteten Personen = 0 und die Dunkelziffer = Gesamtzahl = 1000. 14 Tage später (15.01.2020) sind nun 10 Menschen tot. Wendet man obiges einfaches Model auf die Zahl der 10 Verstorben an: Multiplikation der Anzahl mit dem Kehrwert von 1% und verschieben um 14 Tage in die Vergangenheit, so ergibt sich rückwärts die Gesamtzahl von 1000 Infizierten für den 01.01.2020. Die Zahl der bekannten Infizierten (Hellfeld) war die ganze Zeit = 0. Die Zahl der Verstorbenen ist bis zum 14.01. = 0, dann steigt sie auf 10 und bleibt bei diesem Wert, da die Pandemie auf der Insel vorbei ist. </p>
<p> Beispiel 2: Eine Insel mit 1000 Einwohnern von denen bisher keiner infiziert war, auf der aber getestet wird.<br /> Ergebnis ist das gleiche, mit dem Unterschied, dass die Zahl der positiv getesteten Personen ungleich 0 ist, was aber nicht die Abschätzung einfließt. </p>
<p> Beispiel 3: Eine Insel mit 16000 Einwohnern von denen bisher keiner infiziert war.<br /> Werden nun 1000 am 01.01.2020 infiziert, so werden am 15.01. immer noch 10 sterben. Am 15.01. lässt sich daher wie oben beschrieben auf die Gesamtzahl von 1000 am 01.01. schließen. Allerdings werden weiter Menschen infiziert. Nehmen wir z.B. exemplarisch eine Verdopplungszeit von 7 Tagen an, so ist am 8.01. eine Gesamtzahl von 2000 Personen infiziert, am 15.01. dann 4000. Somit ist die Gesamtzahl der Infizierten am 15.01. größer als 1000, was zur Folge hat, dass an den Folgetagen weitere Menschen sterben werden. Am 15.01. sind 4000 infiziert (Verstorbene mitgezählt) aber nur 10 verstorben. Würde man am 15.01. großangelegte Tests durchführen, so würde man im Idealfall alle 4000 infizierten Personen bestimmen und die Dunkelziffer wäre 0. Bestimmt man an diesem Tag die Sterblichkeit, so würde man am 15.01.2020 10 Tote auf 4000 Infizierte = 0.25% finden, was der Eingangsgröße/Annahme widerspricht. Wartet man allerdings weiteren 2 Verdopplungszeiten ab, so sind am 29.01. alle 16000 Einwohner infiziert. Wartet man nochmal 2 Wochen, bis die unglücklichen schweren Fälle verstorben sind, so findet man dann dass von den 16000 Einwohnern 160 verstorben sind, und die Sterblichkeit ist wie erwartet 1%. Dies verdeutlicht, dass die Sterblichkeit erst korrekt ermittelt werden kann, wenn das exponentielle Wachstum vorbei ist. </p>
<h3><a id="DE_wahrscheinlichkeit-infizierten-treffen"></a>Wie hoch ist die Wahrscheinlichkeit dass beim Treffen mit Personen ein Infizierter dabei ist? </h3>
<p>Hier eine kleine Exkursion in die Stochastik. Die einfache Excel-Berechnung dazu ist unter der Tabelle verlinkt.</p>
<img src="data/wahrscheinlichkeit-infizierten-treffen.png" width="438" height="483" alt="DE_wahrscheinlichkeit-infizierten-treffen" /><br />
<small>generated via Excel <a href="data/wahrscheinlichkeit-infizierten-treffen.xlsx" target="_blank">wahrscheinlichkeit-infizierten-treffen.xlsx</a>
<br />
</small>
<p><small><a href=" #ToC">Back to top</a></small></p>
<h3>
<a id="DE_cases_time_series-absolute"></a> Zeitverlauf der Ausbreitung in den Bundesländern </h3>
<p> Update vom 04.04.2020: Wie <a href="#DE_calc-cases-from-deaths-DE-total">hier</a> beschrieben, halte ich es mittlerweile für riskant allzuviel in die Daten der positiv getesteten Fälle hinhein zu interpretieren. Für meine <a href="#Countries">internationalen Vergleiche</a> habe ich mich ausschließlich auf die Opferzahlen gestützt, diese halte ich für belastbarer. Die folgenden Kapitel belasse ich trotzdem online. </p>
<p> Die erste Grafik die ich erstellt habe, zeigt den Zeitverlauf der offiziell gemeldeten positiv getesteten Infektionsfälle in den Bundesländern. Dazu habe ich die Daten zunächst normal (mit einer linearen Y-Achse) aufgetragen, wie man dies überall findet. Als nächstes habe ich die y-Achse logarithmisch skaliert, was bedeutet jede Hilfslinie entspricht einem Faktor 10. Der Vorteil diese Darstellung ist, dass man große Wertebereiche darstellen kann. Ferner hat diese Darstellung die Eigenschaft, das exponentielle Zusammenhänge zu einer Geraden werden, deren Steigung die Wachstumsrate beschreibt, was hier sehr gut zu erkennen ist. </p>
<img src="plots-gnuplot/de-states/cases-de-absolute.png" alt="cases-de-absolute.png" width="640" height="800">
<img src="plots-gnuplot/de-states/cases-de-absolute-log.png" alt="cases-de-absolute-log.png" width="640" height="800">
<br />
<small>generated via Gnuplot <a href="https://github.com/entorb/COVID-19-Coronavirus-German-Regions/tree/master/scripts-gnuplot/" target="_blank">plot-de-states-timeseries-joined</a>, raw data can be found in <a href="https://github.com/entorb/COVID-19-Coronavirus-German-Regions/blob/master/data/de-states/" target="_blank">de-state-XX.tsv</a>
<br />
</small>
<p><small><a href="#ToC">Back to top</a></small></p>
<h3>
<a id="DE_cases_time_series-per-million"></a> Zeitverlauf der Ausbreitung in den Bundesländern, skaliert auf deren Einwohnerzahlen </h3>
<p> Ich halte es für irreführend die Absolutzahlen der Infektionen der unterschiedlich stark bevölkerten Bundesländer miteinander zu vergleichen. Stattdessen bevorzuge ich eine Skalierung pro Einwohner der Bundesländer. Die Daten im Folgenden sind auf "pro 1 Millionen Einwohner" skaliert, abermals zuerst mit linearer und anschließend mit logarithmischer Y-Achse. </p>
<img src="plots-gnuplot/de-states/cases-de-per-million.png" alt="cases-de-per-million.png" width="640" height="800">
<img src="plots-gnuplot/de-states/cases-de-per-million-log.png" alt="cases-de-per-million.png" width="640" height="800">
<br />
<small>generated via Gnuplot <a href="https://github.com/entorb/COVID-19-Coronavirus-German-Regions/tree/master/scripts-gnuplot/" target="_blank">plot-de-states-timeseries-joined</a>, raw data can be found in <a href="https://github.com/entorb/COVID-19-Coronavirus-German-Regions/blob/master/data/de-states/" target="_blank">de-state-XX.tsv</a>
</small>
<p><small><a href="#ToC">Back to top</a></small></p>
<h3>
<a id="DE_cases_new_time_series-per-million"></a> Zeitverlauf der Neu-Infektionen in den Bundesländern, skaliert auf deren Einwohnerzahlen </h3>
<p> Nun eine ähnliche Darstellung, allerdings der täglich neuen Fälle anstatt der Summe. Diese Daten habe ich (mit einer Bézierkurve) geglättet. </p>
<img src="plots-gnuplot/de-states/cases-de-new-per-million.png" alt="cases-de-new-per-million.png" width="640" height="800">
<img src="plots-gnuplot/de-states/cases-de-new-per-million-log.png" alt="cases-de-new-per-million-log.png" width="640" height="800">
<p>Als alternative Darstellung nun die Neu-Infektionen als eine gleitenden Summe über 7 Tage. So werden Wochenendeffekte heraus gemittelt. </p>
<img src="plots-gnuplot/de-states/cases-de-last_week-per-million.png" alt="cases-de-last_week-per-million.png" width="640" height="800">
<img src="plots-gnuplot/de-states/cases-de-last_week-per-million-log.png" alt="cases-de-last_week-per-million-log.png" width="640" height="800">
<br />
<small>generated via Gnuplot <a href="https://github.com/entorb/COVID-19-Coronavirus-German-Regions/tree/master/scripts-gnuplot/" target="_blank">plot-de-states-timeseries-joined</a>, raw data can be found in <a href="https://github.com/entorb/COVID-19-Coronavirus-German-Regions/blob/master/data/de-states/" target="_blank">de-state-XX.tsv</a>
</small>
<p>Eine ähnliche <a href="#de-states-deaths">Darstellung für die Opferzahlen</a> ist oben zu finden.</p>
<p><small><a href="#ToC">Back to top</a></small></p>
<h3>
<a id="cases-de-states-latest-per-million"></a> Ist-Stand der Infektionen in den Bundesländern, skaliert auf deren Einwohnerzahlen </h3>
<p>Die graue Linie zeigt den Wert für Gesamtdeutschland.</p>
<img src="plots-gnuplot/de-states/cases-de-states-latest-per-million.png" alt="cases-de-states-latest-per-million.png"><br />
<small>generated via Gnuplot <a href="https://github.com/entorb/COVID-19-Coronavirus-German-Regions/tree/master/scripts-gnuplot" target="_blank">plot-de.gp</a>, raw data can be found in <a href="https://github.com/entorb/COVID-19-Coronavirus-German-Regions/blob/master/data/de-states-latest.tsv" target="_blank">de-states-latest.tsv</a>
</small>
<br />
<p>Erkenntnisse</p>
<ul>
<li>Skaliert man die offiziell gemeldeten positiv getesteten Fälle mit der Bevölkerung des jeweiligen Bundeslandes, so ergibt sich ein ganz anderes Bild als in den üblichen Darstellungen.</li>
<!-- <li>Die graue Linie zeigt den DE Mittelwert</li> -->
<li>15.03.2020: Hamburg ist trauriger Spitzenreiter mit 88 Infektionen pro 1 Millionen Einwohner. Dies ist in absoluten Zahlen immer noch wenig, aber viel mehr als Wirkstoff homöopathischen "Medikamenten" (88x so viel wie in D6) </li>
<li>22.03.2020: Hamburg hat nun eine doppelt so hohe offizielle Infektionsdichte in der Bevölkerung wie NRW. Es ist knapp 1 von 2000 Einwohnern positiv getestet.</li>
</ul>
<p><small><a href="#ToC">Back to top</a></small></p>
<h3>
<a id="Exp_Wachstum"></a> Untersuchung der exponentiellen Zunahme der Infektionen in Deutschland </h3>
<p>Dieses Kapitel ist nicht mehr relevant, da wir glücklicherweise den Bereich der exponentiellen Zunahme der Neu-Infektionen verlassen haben. Daher habe ich es <a href="expGrowth.html#Exp_Wachstum">archiviert</a>.</p>
<h2>
<a id="Countries"></a>Comparing Countries</h2>
<a title="Dan Polansky and authors of File:BlankMap-World.svg. / CC BY-SA (https://creativecommons.org/licenses/by-sa/4.0)" href="https://commons.wikimedia.org/wiki/File:COVID-19_Outbreak_World_Map_Total_Deaths_per_Capita.svg" target="_blank"><img width="1024" alt="COVID-19 Outbreak World Map Total Deaths per Capita" src="https://upload.wikimedia.org/wikipedia/commons/thumb/8/88/COVID-19_Outbreak_World_Map_Total_Deaths_per_Capita.svg/1024px-COVID-19_Outbreak_World_Map_Total_Deaths_per_Capita.svg.png"></a>
<br />
<small>Map Deaths per Capita, borrowed from <a href="https://commons.wikimedia.org/wiki/File:COVID-19_Outbreak_World_Map_Total_Deaths_per_Capita.svg" target="_blank">Wikipedia</a>. </small>
<p> Data source: the <a href="https://pomber.github.io/covid19/timeseries.json" target="_blank">.json file</a> provided by <a href="https://github.com/pomber/covid19" target="_blank">github.com/pomber/covid19</a>, based on <a href="https://github.com/CSSEGISandData/COVID-19" target="_blank">data</a> provided by Johns Hopkins University Center for Systems Science and Engineering (JHU CSSE) </p>
<p> As the number of infections strongly depend upon the test coverage, this number is hardly comparable between countries. The number of deaths due to COVID-19 is more reliably, so I used this to compare the disease spread in different countries. </p>
<p><small><a href="#ToC">Back to top</a></small></p>
<h3><a id="CountryTable"></a>Country Table</h3>
<p>Click on a row to add it to the <a href="#CountriesCustomChart">country comparison chart</a> below.</p>
<div id="table-countries-latest-all"></div>
<small> generated via <a href="http://tabulator.info/" target="_blank">Tabulator</a>, raw data can be found in <a href="https://github.com/entorb/COVID-19-Coronavirus-German-Regions/blob/master/data/int/countries-latest-all.tsv" target="_blank">countries-latest-all.tsv</a> / <a href="https://github.com/entorb/COVID-19-Coronavirus-German-Regions/blob/master/data/int/countries-latest-all.json" target="_blank">countries-latest-all.json</a></small>
<!-- <script type="text/javascript" src="tabulator/tabulator.min.js"></script> -->
<script>
var table = new Tabulator("#table-countries-latest-all", {
height: 600, // set height of table to enable virtual DOM
layout: "fitColumns", //fit columns to width of table (optional)
// autoColumns: true, // very nice!!!
tooltipsHeader: true,
columns: [ //Define Table Columns
{
title: "Continent<br/> ", field: "Continent", width: 75, editor: "select", sorter: "string", sorterParams: {
alignEmptyValues: "bottom"
}, headerFilter: true, headerFilterParams: {
"": "any",
"Africa": "Africa",
"Asia": "Asia",
"Europe": "Europe",
"North America": "North America",
"South America": "South America",
"Oceania": "Oceania"
// "Antarctica": "Antarctica",
}
// , headerFilterPlaceholder:"select"
},
{ title: "Country<br/> ", field: "Country", sorter: "string", width: 100, headerFilter: true },
{
title: "Code<br/> ", field: "Code", sorter: "string", width: 30, sorterParams: {
alignEmptyValues: "bottom"
}, headerFilter: true
},
{
title: "Population<br/> ", field: "Population", sorter: "number", width: 100, hozAlign: "right", sorterParams: {
alignEmptyValues: "bottom"
}, headerFilter: true, headerFilterPlaceholder: "filter >=", headerFilterFunc: ">="
},
// { title: "Date", field: "Date", sorter: "date", sorterParams: { format: "YYYY-MM-DD" }, hozAlign: "center", headerFilter: true },
{
title: "Cases<br/> ", field: "Cases", sorter: "number", width: 100, hozAlign: "right", sorterParams: {
alignEmptyValues: "bottom"
}, headerFilter: true, headerFilterPlaceholder: "filter >=", headerFilterFunc: ">="
},
{
title: "Deaths<br/> ", field: "Deaths", sorter: "number", width: 100, hozAlign: "right", sorterParams: {
alignEmptyValues: "bottom"
}, headerFilter: true, headerFilterPlaceholder: "filter >=", headerFilterFunc: ">="
},
{
title: "Cases<br/>per Million", field: "Cases_Per_Million", sorter: "number", hozAlign: "right", sorterParams: {
alignEmptyValues: "bottom"
}, headerFilter: true, headerFilterPlaceholder: "filter >=", headerFilterFunc: ">="
},
{
title: "Deaths<br/>per Million", field: "Deaths_Per_Million", sorter: "number", hozAlign: "right", sorterParams: {
alignEmptyValues: "bottom"
}, headerFilter: true, headerFilterPlaceholder: "filter >=", headerFilterFunc: ">="
},
{
title: "Cases Last Week<br/>per Million", field: "Cases_Last_Week_Per_Million", sorter: "number", hozAlign: "right", sorterParams: {
alignEmptyValues: "bottom"
}, headerFilter: true, headerFilterPlaceholder: "filter >=", headerFilterFunc: ">="
},
{
title: "Deaths Last Week<br/>per Million", field: "Deaths_Last_Week_Per_Million", sorter: "number", hozAlign: "right", sorterParams: {
alignEmptyValues: "bottom"
}, headerFilter: true, headerFilterPlaceholder: "filter >=", headerFilterFunc: ">="
},
{
title: "Cases<br/>Trend Index", field: "Slope_Cases_New_Per_Million", sorter: "number", width: 100, hozAlign: "right", sorterParams: {
alignEmptyValues: "bottom"
}, headerFilter: true, headerFilterPlaceholder: "filter >=", headerFilterFunc: ">="
},
// {
// title: "Deaths<br/>Doubling Time (Days)", field: "Deaths_Doubling_Time", sorter: "number", hozAlign: "right", sorterParams: {
// alignEmptyValues: "bottom"
// }, headerFilter: true, headerFilterPlaceholder: "filter >=", headerFilterFunc: ">="
// },
],
rowClick: function (e, row) {
var rowData = row.getData();
var clickedCode = rowData["Code"];
var clickedCountry = rowData["Country"];
new_country_selected(countryCodes, clickedCode);
alert(clickedCountry + " added to country comparison custom chart below")
},
});
table.setData("https://entorb.net/COVID-19-coronavirus/data/int/countries-latest-all.json", {}, "get");
table.setSort([
{ column: "Country", dir: "asc" }, //then sort by this second
{ column: "Deaths_Last_Week_Per_Million", dir: "desc" }, //sort by this first
]);
</script>
<p><small><a href="#ToC">Back to top</a></small></p>
<h3>Country comparison custom chart</h3>
<p>Usage hints</p>
<ul>
<li>Browse and click in <a href="#CountryTable">country table</a> above to search and select interesting countries </li>
<li>Deselect a country by clicking on its name in the legend</li>
<li>Download your chart using the button top right</li>
<li>Reset chart by reloading of this page</li>
</ul>
<p>Nomenclature</p>
<ul>
<li><b>Cases</b> means positively tested on COVID-19 and reported to JHU. I do not trust <b>Cases</b> data for international comparison too much.</li>
<li><b>Deaths</b> are much more reliable than <b>Cases</b>, I suppose. <b>Deaths</b> are furthermore stronger related to the hospital workload.</li>
<li><b>Per Million</b> means scaled per million population. These series should be used when comparing countries. </li>
<!-- <li><b>Doubling Time</b> is in days. For each day it is calculated from the 7 previous days, for details see <a
href="#CountriesDeathTimeSeries">below</a>. Higher value is better, of cause, therefore I inverted the y axis.
</li> -->
<li><b>New</b> means change with respect to the previous day.</li>
<li><b>Last Week</b> means change with respect to 7 days in the past (=rolling week). It is therefore is smoother than the <b>New</b> series.</li>
</ul>
<form>
<h4>1. Select countries</h4>
<table>
<tr>
<th>Africa</th>
<th>Asia</th>
<th>Europe</th>
<th>North America</th>
<th>South America</th>
<th>Oceania</th>
<th> </th>
</tr>
<tr>
<td>
<select id="sel_countries_africa" name="sel_countries_africa" style="width:140px"> </select>
</td>
<td>
<select id="sel_countries_asia" name="sel_countries_asia" style="width:140px"> </select>
</td>
<td>
<select id="sel_countries_europe" name="sel_countries_europe" style="width:140px"> </select>
</td>
<td>
<select id="sel_countries_north_america" name="sel_countries_north_america" style="width:140px"> </select>
</td>
<td>
<select id="sel_countries_south_america" name="sel_countries_south_america" style="width:140px"> </select>
</td>
<td>
<select id="sel_countries_oceania" name="sel_countries_oceania" style="width:140px"> </select>
</td>
<td>
<input type="reset" onclick="resetCountryChart()">
</td>
</tr>
</table>
<h4>2. Select data</h4>
<table>
<tr>
<td>y axis:</td>
<td>
<select id="sel_y_axis_field" name="sel_y_axis_field" style="width:200px"> </select>
</td>
<td> <select id="sel_y_axis_scale" name="sel_y_axis_scale" style="width:200px"> </select>
</td>
<td> <select id="sel_sorting_Countries" name="sel_sorting_Countries" style="width:200px"></select></td>
</tr>
<tr>
<td>
<label>x axis:</label>
</td>
<td>
<select id="sel_x_axis_field" name="sel_x_axis_field" style="width:200px"> </select>
</td>
<td> <select id="sel_x_axis_scale" name="sel_x_axis_scale" style="width:200px"> </select>
</td>
<td> <select id="sel_x_axis_time_range" name="sel_x_axis_time_range" style="width:200px"> </select>
</td>
</tr>
</table>
</form>
<!--
End Form
-->
<h4><a id="CountriesCustomChart"></a>3. Chart</h4>
<div id="eChartsCountryContainer" style="height: 600px; width:1000px; background-color: white;"></div>
<small> generated via <a href="https://echarts.apache.org" target="_blank">eCharts</a>, raw data can be found in <a href="https://github.com/entorb/COVID-19-Coronavirus-German-Regions/blob/master/data/int/" target="_blank">country-XX.tsv / .json</a>
<br /> Many thanks to Attila for code review, cleanup and implementation of the first version of the select data logic!</small>
<!--
JS for eCharts Countries
-->
<script>
const eChart_countries = echarts.init(document.getElementById("eChartsCountryContainer"));
// fetch ref list: Country Code -> Country Name
var mapCountryNames = {};
var mapContinentCountries = {};
// fetch countries-latest-all.json containing country reference data like code and continent
function fetch_mapRefCountryData(mapCountryNames, mapContinentCountries) {
const url =
"https://entorb.net/COVID-19-coronavirus/data/int/countries-latest-all.json";
return $.getJSON(url, function (data) {
console.log("success: mapCountryNames");
})
.done(function (data) {
console.log("done: mapCountryNames");
$.each(data, function (key, val) {
mapCountryNames[data[key].Code] = data[key].Country;
const this_continent = data[key].Continent;
if (!(this_continent in mapContinentCountries)) {
mapContinentCountries[this_continent] = [];
}
mapContinentCountries[this_continent].push([data[key].Code, data[key].Country]); // pair of country_code , country_name
});
})
.fail(function () {
console.log("fail: mapCountryNames");
});
}
promises.push(fetch_mapRefCountryData(mapCountryNames, mapContinentCountries));
// Initial list of country codes
if ('countries' in urlParams) {
var countryCodes = urlParams.countries.split(",");
} else {
// Adding a new country code to this array draws a new line
var countryCodes = ["DE"];
}
const data_object_countries = {}; // We store all the data in an object
// For each country code we fetch the data
for (let i = 0; i < countryCodes.length; i++) {
promises.push(fetchData('Country', countryCodes[i], data_object_countries));
}
// Wait for all async promises to be done (all data is fetched),
// populates the select dropdowns
// refreshes the chart
Promise.all(promises).then(function () {
console.log("eCharts Countries: all data fetched");
populateCountrySelects();
refreshCountryChart(
eChart_countries,
countryCodes,
data_object_countries,
select_xAxisProperty,
select_yAxisProperty,
select_xAxisTimeRange,
select_xAxisScale,
select_yAxisScale,
select_sorting_Countries,
update_url = false
)
});
// chart parameter option lists
const options_xAxisProperty = [
"Date",
"Days_Since_2nd_Death",
"Days_Past",
"Deaths_Per_Million",
"Deaths_Last_Week_Per_Million",
"Deaths_New_Per_Million",
"Deaths",
"Deaths_Last_Week",