الفيروس التاجي: هل نموت جميعًا؟

ماذا نقول لإله الموت؟ - ليس اليوم.
سيريو تراوت ، مسلسل تلفزيوني Game of Thrones.


ما مدى خطورة الفيروس التاجي COVID-19؟ كم عدد الأشخاص الذين سيموتون من فيروس كورونا في العالم؟ وكم - في روسيا؟ هل التدابير الصارمة المتخذة لمكافحة الفيروس التاجي في معظم دول العالم ضرورية حقا؟ ما الذي سيسبب المزيد من الضرر: موت الأشخاص بسبب فيروس كورونا أو التدهور الاقتصادي الناجم عن التدابير التقييدية؟

للإجابة على هذه الأسئلة الملحة ، من الضروري إجراء النمذجة الرياضية والتنبؤ بالضرر الناجم عن فيروسات التاجية في البلدان الفردية والعالم ككل. تم تخصيص بناء مثل هذه التوقعات لهذه المقالة.

لجعل المواد في متناول جميع القراء ، سنركز في بداية المقال على التحليل النوعي والصور الجميلة. وفي النهاية ، بالنسبة للمهتمين ، سنعطي شفرة المصدر للحسابات التي يتم إجراؤها في Python.

دقيقة العناية UFO


تم الإعلان رسمياً عن وباء COVID-19 الوبائي ، وهو عدوى تنفسية حادة حادة محتملة ناجمة عن الفيروس التاجي SARS-CoV-2 (2019-nCoV) ، في العالم. هناك الكثير من المعلومات حول حبري حول هذا الموضوع - تذكر دائمًا أنه يمكن أن يكون موثوقًا / مفيدًا ، والعكس صحيح.

نحثك على انتقاد أي معلومات منشورة.


مصادر رسمية

, .

اغسل يديك ، ورعاية أحبائك ، والبقاء في المنزل كلما أمكن ذلك والعمل عن بعد.

قراءة المنشورات حول: فيروسات التاجية | العمل عن بعد

يحسب الموت فقط


لاحظ أننا سنقوم بتقييم الضرر الناتج عن COVID-19 في عدد الوفيات البشرية المرتبطة بهذا المرض. سيتم تخصيص جزء كبير من المقال للتنبؤ بعدد الوفيات الناجمة عن الفيروس التاجي. رفضنا بشكل عام النظر في عدد المرضى الذين يعانون من الفيروس التاجي والتنبؤ بعددهم. هناك عدة أسباب لذلك. الشيء الرئيسي هو أنه من المستحيل مقارنة الإحصائيات حول عدد حالات COVID-19 في بلدان مختلفة. في بعض البلدان ، تتوفر طرق الاختبار السريع أكثر بكثير من غيرها. في بعض البلدان ، يتم إجراء فحص شامل تقريبًا للسكان ، بينما في بلدان أخرى يتم فحص الأشخاص الذين يعانون من أعراض شديدة. بالنظر إلى أنه في عدد كبير من الحالات ، يكون المرض عديم الأعراض تقريبًا ، نرى انتشارًا كبيرًا في عدد الوفيات بين المرضى: من أقل من 0.5 ٪ إلى أكثر من 3.5 ٪.

على الأرجح ، مبعثر في بيانات الوفيات يرجع إلى حد كبير إلى الكشف عن حالات COVID-19.

تبدو إحصاءات الوفيات في هذه الحالة أكثر موثوقية. بطبيعة الحال ، يمكن أن نواجه كلًا من التقليل من عدد الوفيات ، عندما لا يُشار إلى سبب الوفاة على أنه فيروس تاجي ، ولكن مرض يصاحب ذلك ، والعكس صحيح ، الإفراط في التقدير ، عندما يتم تشخيص COVID-19 بشكل غير صحيح ، ويموت شخص ، على سبيل المثال ، بسبب الإنفلونزا الموسمية. ومع ذلك ، يمكننا أن نتوقع أن إحصاءات الوفيات أكثر موثوقية ، لأنه يمكن أن يمر المرض بدون أعراض بدرجة عالية من الاحتمالية بشكل عام من قبل المتخصصين ، ويضطر الأطباء إلى تحليل كل حالة وفاة.

كما نلاحظ أن الضرر الحقيقي الذي يلحق بالمجتمع ناجم عن وفاة أعضائه ، وليس بسبب مرض خفيف يمر بسرعة نسبية.

هل تعتقد أن العارض يحكم العالم؟ و لا!


بمجرد أن نبدأ في التنبؤ بعدد الوفيات ، نواجه على الفور الأسطورة الأولى: يموت عشرات أو حتى مئات الملايين من الناس من فيروس كورونا. تستند هذه الأسطورة إلى الاعتقاد بأن العارضين يحكمون العالم. نلقي نظرة على الرسم البياني.



ويظهر عدد الوفيات من COVID-19 في الصين حتى 7 فبراير. إذا قمنا ببناء توقعات تستند إلى هذا الرسم البياني باستخدام دالة أسية ، فإننا نحصل على أنه بحلول 29 فبراير ، كان من المفترض أن يموت 50 مليون شخص في الصين!



وكم مات حقا؟ 2837 شخصا. لماذا هذا الاختلاف الهائل؟
الشيء هو أن العالم لا يحكمه عارض ، بل بمنحنى لوجستي.

على عكس العارض ، لا يمر المنحنى اللوجستي ليس فقط في المدرسة ، ولكن حتى في الجامعات التقنية الرائدة (على سبيل المثال ، في قسم الفيزياء في جامعة موسكو الحكومية وفي PhysTech). لذلك ، غالبًا ما لا يكون لدى الفيزيائيين والفنيين بشكل عام أي فكرة عن ذلك.

ومع ذلك ، فإن عددًا كبيرًا من الظواهر في الاقتصاد والبيولوجيا وعلم الاجتماع والعلوم والتكنولوجيا تتطور بشكل كامل مع هذا النموذج الرياضي. دعونا نلقي نظرة فاحصة عليه. ها هي. يتم رسم الوقت على المحور x ، وعلى y الرقم الذي يميز الظواهر التي درسناها (في حالتنا ، عدد الوفيات الناجمة عن الفيروس التاجي).



منحنى خبيث يقطع الضجيج كله


يوضح المنحنى اللوجستي الانتقال بين حالتين مستقرتين. تعتبر الحالة الدنيا تقليديا مساوية للصفر. الدولة العليا هي الحد الأقصى الذي يمكن للظاهرة التي تم التحقيق فيها تحقيقها من حيث المبدأ. يقترب المنحنى من الإغلاق التعسفي ، لكنه لا يصل أبدًا إلى قيمته القصوى.

أهم نقطة في المنحنى هي نقطة الانعطاف. يقع بالضبط في المنتصف بين الحد الأدنى والحد الأقصى. عند هذه النقطة يكون الحد الأقصى لمعدل نمو المنحنى. ولكن يحدث انعطاف فيها. إلى هذه النقطة ، تسارع نمو المنحنى فقط. بعد - يتلاشى فقط.
عادة لا يلاحظ أحد في البداية ظاهرة معينة (حيث لم يلاحظ الفيروس التاجي حتى نهاية يناير). عند هذه النقطة ، تكون قيمة المنحنى قريبة من الصفر. تدريجيا ، تتزايد الظاهرة ، ويبدأون في ملاحظتها ، وتحدث ضجة حولها. يمكن أن تكون الضجيج إيجابيًا (على سبيل المثال ، في وقت رحلة غاغارين ، أصيب الناس في جميع أنحاء العالم بالمرض) وسلبية (الوضع مع الفيروس التاجي الحالي). في وقت الضجيج ، يتوقع الجميع أن هذه الظاهرة ستكتسب أبعادًا لا تصدق وتقلب العالم رأساً على عقب. لذلك ، في وقت رحلة غاغارين ، اعتقد المحترفون أن غزو النظام الشمسي سيحدث في القرن العشرين. ولم يتوقعوا على الإطلاق أن تنتهي جميع نجاحات رواد الفضاء في عام 1969 بهبوط رجل على سطح القمر.

في وقت الضجيج الأقصى ، يصل المنحنى إلى نصف الحد الأقصى المستقبلي. ثم يتلاشى النمو والظاهرة لا تبرر تماما الآمال المعلقة عليها (وكذلك المخاوف).

المنحنى اللوجستي الصيني


دعونا نرى ما حدث في الصين.



في الرسم البياني أدناه ، تشير النقاط الحمراء إلى عدد الوفيات من الفيروس في تاريخ معين. المنحنى الأزرق هو منحنى لوجستي يقارب البيانات الحقيقية. نرى أن البيانات تقع عليه بشكل مثالي تقريبًا. يوضح الرسم البياني أدناه عدد الوفيات التي حدثت في تاريخ محدد. في الواقع ، هذا هو الفرق بين قيم المنحنى اللوجستي لليوم وللأمس. من وجهة نظر رياضية ، هذا هو المشتق الأول للمنحنى اللوجستي.



نرى أنه في البداية يتزايد عدد الوفيات الجديدة بشكل كبير تقريبًا. ثم يبدأ النمو في التباطؤ ، ويصل منحنى الوفيات الجديدة إلى الحد الأقصى عند نقطة الانعطاف ، عندما يصل المنحنى اللوجستي إلى نصف قيمته القصوى. ثم ينخفض ​​عدد الوفيات الجديدة ، وينتقل إلى الصفر. تشير النقاط الحمراء إلى وفيات جديدة ، والمنحنى الأزرق مشتق من المنحنى اللوجستي لتقريبها.

لاحظ أن المنحنى اللوجستي متماثل حول نقطة انعطافه ، ومشتقه الأول نسبيًا للخط العمودي الذي يمر عبر هذه النقطة. نلاحظ أيضًا أن البيانات الحقيقية تقع بشكل مثالي على المنحنى اللوجستي ، لكنها "ترقص" نسبة إلى مشتقها الأول. والحقيقة هي أن معدل الوفيات في نقطة ما يخضع للانتثار العالي ، ومعدل الوفيات الإجمالي هو مجموع هذه المؤشرات. يتم تنعيمها وفقًا لنظرية الحد المركزي.

لذا ، نرى أنه يمكن استخدام المنحنى اللوجستي بشكل فعال للتنبؤ بالوفيات الناجمة عن فيروس كورونا. خاصية مهمة هنا هي تناظرها. عندما يتم الوصول إلى نقطة الانعطاف ، يمكننا استعادة النصف الآخر بدقة عالية من نصف المنحنى.

في المقابل ، لتحديد ما إذا تم الوصول إلى نقطة الانعطاف ، ما عليك سوى إلقاء نظرة على الرسم البياني للمشتق الأول. بمجرد أن نزل - تم الوصول إلى النقطة المقابلة.

كيف ستنتهي الكارثة الإيطالية؟


دعونا ننتقل من وجهة نظرنا في البلدان الثلاثة إلى الحرف "أنا": إيطاليا وإيران وإسبانيا. بالنظر إلى منحنيات الموت في تاريخ معين ، نرى ، على الأرجح ، أن ذروة الكارثة قد مرت هناك ، وحان الوقت لتقييمها.













وفقًا لتوقعاتنا ، سيموت COVID-19 فقط:
في إيطاليا - حوالي 19 ألف شخص
في إيران - حوالي 4 آلاف شخص
في إسبانيا - حوالي 15 ألف شخص.

في منتصف الطريق إلى معدل الوفيات النهائي


يبدو أن الوباء في ألمانيا قد وصل إلى ذروته وسيبلغ العدد الإجمالي للوفيات الناجمة عن الفيروس التاجي في هذا البلد حوالي 2.6 ألف شخص.





في بلدان مثل هولندا وسويسرا وبلجيكا ، تظهر النمذجة الرياضية أن الوباء في نقطة انعطاف. إذا كان الأمر كذلك ، فإن العدد المتوقع للوفيات فيها:

في هولندا - حوالي 2.5 ألف شخص
في سويسرا - حوالي 1.1 ألف شخص
في بلجيكا - حوالي 2.2 ألف شخص.













بالنسبة لشخص ما ، إنها البداية فقط


في الولايات المتحدة ، لم يتم تمرير نقطة الانعطاف بعد ، لذلك يمكن تعديل توقعاتها بشكل كبير. حاليا ، يبلغ عددهم 23 ألف شخص.





هل المملكة المتحدة مركز جديد للمأساة؟


وأخيرًا ، لا يزال هناك قدر كبير من عدم اليقين بين البلدين في الوصول إلى نقطة الانعطاف. هذه هي المملكة المتحدة وفرنسا.









تتزايد باستمرار توقعات العدد النهائي للوفيات عليهم. وهي تتألف حاليًا من:

  • في المملكة المتحدة - حوالي 33 ألف شخص
  • في فرنسا - حوالي 12 ألف شخص.

يأمل المؤلف أن تكون هذه التوقعات نتيجة لتقلبات عشوائية ، وفي الأيام القادمة سيتم تعديلها إلى أسفل.

إن المملكة المتحدة هي مصدر قلق خاص لصاحب البلاغ. وفقًا للبيانات حتى 25 مارس ، توقع المؤلف معدل الوفيات في هذا البلد عند مستوى ألف شخص ، وفقًا للبيانات اعتبارًا من 01.04 - عند مستوى 8 آلاف ، والآن تظهر التوقعات 33 ألفًا. توقعات عدم وجود دولة أخرى لديها مثل هذا التقلب.

ربما كان مركز مأساة الوفيات الناجمة عن فيروسات كورونا ينتقل تدريجياً إلى بريطانيا. من الممكن أيضًا أن يكون تطور الوضع في البلاد مرتبطًا بسياسة بوريس جونسون غير المسؤولة في البداية ، التي رفضت حتى وقت قريب فرض قيود صارمة وتأمل في "تحصين القطيع". في هذه الحالة ، يأمل المؤلف في أن يتذكره المواطنون ، الذين عبر جونسون عن عدم احترامهم ، لهذه السياسة في الانتخابات التالية ، بل بالأحرى - الانتخابات غير العادية.

توقعات لروسيا


بما أن الوباء في روسيا قد بدأ للتو ، فلن يكون من الممكن التنبؤ بعدد الوفيات باستخدام المنحنى اللوجستي. أدناه سنستخدم طريقة تنبؤ مختلفة.

وماذا على نطاق عالمي؟


حان الوقت لوضع توقعات للعالم كله.





يعطي المنحنى اللوجستي الذي قمنا ببنائه النتائج التالية: ذروة الأزمة ستحدث في الأيام العشرة الأولى من مايو ، وينتهي الوباء في منتصف يوليو. سيقتل حوالي 1 مليون 800 ألف شخص.

نظرًا لأن الوباء على نطاق عالمي يتفاقم فقط ، فإن التوقعات المستندة إلى منحنى لوجستي يمكن أن تعطي نتيجة غير صحيحة ، لذلك سنستخدم طريقة بديلة للتنبؤ.

خذ بعين الاعتبار البلدان التي قمنا بتنبؤات لها.



يحدد الجدول نسبة سكان هذه البلدان الذين سيموتون من الفيروس التاجي (يتم استبعاد بريطانيا العظمى وفرنسا مؤقتًا بسبب عدم اليقين العالي للتنبؤات). نرى أن مجموعتي البلدان مختلفتان بشكل كبير. في بلدان مثل إيطاليا وإسبانيا وبلجيكا ، يُتوقع أن يصل معدل الوفيات إلى 0.029٪ من السكان. في مجموعة أكثر ازدهارًا من البلدان (الصين وألمانيا وإيران والولايات المتحدة وهولندا وسويسرا) ، من المتوقع أن يكون معدل الوفيات حوالي 0.007 ٪ - أقل 4 مرات.

يمكن الافتراض أن العالم ككل سيتميز بمعدل وفيات أعلى. والحقيقة هي أننا في تحليلنا قمنا بدراسة الدول الغنية نسبيًا ذات الحكومات القادرة التي لديها موارد مالية وتنظيمية للتعامل مع الوباء. ولكن على الأرض هناك العديد من الدول التي لديها قدرات أكثر تواضعا ، ماليا وتنظيميا. كثير من هذه البلدان ذات كثافة سكانية عالية. يمكن افتراض أن الوباء في هذه البلدان سيجمع حتى نسبة أكبر من الضحايا مقارنة بإيطاليا الغنية وإسبانيا وبلجيكا. من ناحية أخرى ، فإن نسبة كبار السن في هذه البلدان أقل ، مما يقلل من الوفيات المحتملة.
إذا قدرنا معدل الوفيات في العالم على مستوى أسوأ مجموعة من البلدان ، فإن حوالي 2 مليون 100 ألف شخص سيموتون في العالم. إذا كنت تستخدم متوسط ​​القيم - عندها حوالي 900 ألف.
كانت توقعاتنا المتشائمة لعدد الوفيات في العالم ، المحسوبة على أساس حصة السكان المتوفين ، قريبة بشكل مدهش من التوقعات المحسوبة على أساس المنحنى اللوجستي.

وهكذا ، سيموت 1-2 مليون شخص في العالم ، والأرجح أن الرقم مليوني شخص.

ماذا سيحدث للوطن الأم ولنا؟


أما بالنسبة لروسيا ، التي يبلغ عدد سكانها 148 مليون نسمة ، فإن التوقعات المتفائلة (استنادًا إلى المتوسط ​​لجميع البلدان باستثناء أكبر ثلاثة أطراف خارجية) هي 10 آلاف شخص. والمتشائم (بناءً على معدل الوفيات على مستوى إيطاليا وإسبانيا وبلجيكا) - 40 ألفًا.

الرقم 10 آلاف أكثر احتمالا بكثير. والحقيقة هي أن روسيا لديها العديد من العوامل المواتية: انخفاض الكثافة السكانية ، والمسافات الكبيرة بين المدن الكبيرة ، وتدفق الهجرة المنخفض نسبيًا بين المناطق (باستثناء المنطقة الحضرية) ، والحسم ، والملاءمة وحسن توقيت إجراءات السلطات لمكافحة الوباء. تعطي هذه العوامل الأمل لتجنب تطور الوضع وفقًا للنسخة الإيطالية الإسبانية البلجيكية.

فيما يتعلق بتوقيت الانتهاء من الوباء في روسيا ، ننتقل إلى الرسم البياني أدناه. على ذلك ، صورنا المنحنيات اللوجستية لمختلف البلدان في رسم بياني واحد. في هذه الحالة ، قمنا بتطبيع جميع المنحنيات في الارتفاع بحيث تكون القيمة القصوى واحدة ، وجمعنا نقطة الانعطاف ، ووضعناها عند الصفر.

يظهر الرسم البياني أن الوباء ينتهي في 40-60 يوما. إذا أخذنا 30 مارس كنقطة انطلاق ، فعندئذ يجب أن ينتهي الوباء في روسيا بحلول 10-30 مايو.

هل الضحايا مبررون؟


وأخيرًا ، السؤال الأخير الذي أثير في بداية المقال: ما مدى مبرر إجراءات الحجر الصحي الصارمة التي تتخذها حكومات معظم دول العالم؟
يموت حوالي 58 مليون شخص كل عام في العالم. 2 مليون شخص ، وفقا لتوقعات متشائمة ، سيموتون من فيروس كورونا ، سيزيد هذا الرقم بنسبة 3.5 ٪. من ناحية أخرى ، يهدد الحجر الصحي العالمي الواسع النطاق بالتصاعد إلى أكبر أزمة اقتصادية منذ الكساد الكبير. ونتيجة لذلك ، سيبقى عشرات أو حتى مئات الملايين من الناس بدون عمل. ستنخفض دخول السكان ، ويموت الكثيرون من الجوع أو عدم القدرة على دفع تكاليف الرعاية الطبية.

غالبًا ما يتم التعبير عن الآراء ، بما في ذلك بعض قادة العالم ، أنه سيكون من الأفضل ترك الناس لمصيرهم وعدم تدمير الاقتصاد. في النهاية ، يموت من 300 إلى 650 ألف شخص من الأنفلونزا الموسمية كل عام ، ولكن لا أحد يتخذ مثل هذه الإجراءات التقييدية المدمرة للاقتصاد.

يتيح لنا نموذجنا أن نذكر ما يلي: إن COVID-19 ليس إنفلونزا موسمية على الإطلاق. هذا الفيروس أكثر خطورة بشكل لا مثيل له. والحقيقة هي أن نقطة انعطاف المنحنى اللوجستي لا توجد بمفردها. يتأثر بشكل كبير بظروف الوباء. يتم وصف مسار أي وباء من خلال منحنى لوجستي ، لكن المنحنيات اللوجستية هي عائلة بأكملها. نتذكر أن نقطة الانعطاف هي بالضبط نصف الحد الأقصى للمنحنى. لذلك ، كلما مرت ذروة الوفيات في وقت لاحق ، كلما زاد العدد النهائي للوفيات. رأينا أنه بالقرب من نقطة الانعطاف ينمو المنحنى اللوجستي بأسرع ما يمكن. لذلك ، إذا مرت ذروة المرض بعد 10 أيام ، فقد يزيد عدد الضحايا عدة مرات!

إن التوقعات التي تلقيناها لنقاط انعطاف المنحنيات اللوجستية تشمل بالفعل جميع تدابير الحجر الصحي التي اتخذتها حكومات دول العالم. إذا لم تكن هناك مثل هذه التدابير ، فقد تم الوصول إلى نقاط الانعطاف في وقت لاحق. في هذه الحالة ، يمكن أن تصل الوفيات إلى مستوى 0.4-0.5 ٪ من سكان العالم.

لماذا نقدر معدل الوفيات من وباء غير مراقب في 0.4-0.5 ٪ من السكان. نفترض أنه في هذه الحالة ، بشكل أو بآخر ، فإن جميع سكان الأرض سيصابون بالفيروس. ومع ذلك ، في عدد كبير من الناس ، سيكون المرض بدون أعراض. لذلك ، نستخدم إحصاءات من دول مثل كوريا الجنوبية وألمانيا ، والتي تمكنت من تنظيم أوسع اختبار ممكن للسكان من أجل فيروسات التاجية وتحديد غالبية الحالات الحقيقية. في بلدان أخرى ، في رأينا ، يتم تشويه الإحصاءات على وجه التحديد لأن عدد الحالات يتم التقليل من شأنها إلى حد كبير. ومن هنا كان معدل الوفيات الفائق 3.5٪.

0.4-0.5 ٪ من سكان العالم 28-35 مليون شخص. على الرغم من كل الحروب التي خاضتها البشرية في تاريخها بالكامل ، فإن عدد الخسائر في الحرب العالمية الثانية فقط يتجاوز هذا الرقم. إن حقيقة أن حكومات الغالبية العظمى من دول العالم قدمت تضحيات اقتصادية غير مسبوقة من أجل إنقاذ الناس تظهر مدى ارتفاع سعر الحياة البشرية في العالم. كيف انتشرت الأفكار الإنسانية وأولوية مصالح الفرد. وهذا يلهم المؤلف بفخر بالإنسانية ويأمل بمستقبل أفضل للبشرية جمعاء.

أكبر عيب في هذه المقالة


وهنا أكبر عيب في هذه المقالة. لسوء الحظ ، لا توفر لنا الإحصاءات الكلاسيكية أدوات لتقدير أخطاء التوقعات استنادًا إلى وظيفة لوجستية. هذا يرجع إلى شكل الوظيفة ، التي لها انعطاف. إذا لم يكن هذا الانعطاف كذلك ، وكان المنحنى رتيبًا ، فسنقوم ، بمساعدة تحويل Box-Cox ، أولاً بإحضار الوظيفة إلى شكل خطي. بعد ذلك ، باستخدام معادلة الخطأ للانحدار الخطي ، سنقوم ببناء الحد العلوي والسفلي للأخطاء ، وبعد ذلك ، باستخدام تحويل Box-Cox المعكوس ، نحصل على حدود خطأ منحنية ، على أساسها سننشئ الحد الأقصى والحد الأدنى للتنبؤ لعدد الوفيات من فيروس التاجية.

للأسف ، تجعل أدوات الإحصاءات الكلاسيكية من المستحيل إنشاء حدود الخطأ في حالة منحنى الانعطاف. ولكن قد تأتي طرق التعلم الآلي لمساعدتنا. في المقالة التالية ، سأوضح كيف يتم وضع حدود الأخطاء في هذه الحالة ، وسأضع الحد الأدنى والحد الأقصى للتنبؤات لعدد الوفيات لكل دولة يتم النظر فيها أعلاه بشكل منفصل ، وللعالم كله.

والآن الكثير من الرموز والأرقام


حسنًا ، الآن ، في الواقع ، الرياضيات لأولئك الذين يريدون فهم كيف توصلنا إلى الاستنتاجات المذكورة أعلاه. أولئك الذين ليسوا مهتمين بالحسابات المملة لا يمكنهم قراءة المزيد.

تم إجراء العمليات الحسابية في Python في بيئة المشتري باستخدام مكتبات إضافية سخيفة ، وعتيدة ، وباندا ، ووقت. للتصور ، استخدمنا الحزمة matplotlib.pyplot. تم الحصول على البيانات الأولية حول عدد الوفيات في هذا الرابط ومعالجتها مسبقًا في Excel. المعلومات المأخوذة حتى 4 أبريل. هنا رابط للملف بمعلومات المصدر .

لذلك ، نستورد المكتبات ، والتي سنستخدمها لاحقًا:

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import pandas as pd
from IPython.display import display
import scipy as sp
from datetime import datetime 
from scipy.optimize import minimize

نقرأ البيانات المصدر ونحولها إلى كائن DataFrame. يتم تحويل التسميات المتغيرة إلى كائن الطابع الزمني. من حيث المبدأ ، يمكننا أن نقتصر على المصفوفات البسيطة ، ولكننا نستخدم DataFrame لراحة تخزين البيانات مع التاريخ المقابل لها ، والطابع الزمني للتصور ، لعرض هذه التواريخ بشكل جميل على الرسوم البيانية.
corona = pd.read_csv ('D: /coronavirus.csv'،sep= "؛")
corona.set_index (' Date '، inplace = True)
corona.index = pd.to_datetime (corona.index)

ثم ، من إطار DataFrame واحد ، نقوم بإنشاء متغيرات من نوع السلسلة تتوافق مع إجمالي الوفيات في كل بلد. X هو متغير يساوي رقم اليوم من بداية العام. سنحتاج إليها عند التنبؤ.

X = corona['X']
chi = corona['China']
fr = corona['France']
ir = corona['Iran']
it = corona['Italy']
sp = corona['Spain']
uk = corona['UK']
us = corona['US']
bg = corona['Belgium']
gm = corona['Germany']
nt = corona['Netherlands']
sw = corona['Switzerland']
tot = corona['Total']

بعد ذلك ، نحسب صفائف numpy البسيطة للوفاة في تاريخ محدد. لاحظ أن طول مثل هذا المصفوفة أقل من طول متغير السلسلة المقابلة.

dchi = chi[1:].values - chi[:-1].values
dfr = fr[1:].values - fr[:-1].values
dit = it[1:].values - it[:-1].values
diran = ir[1:].values - ir[:-1].values
dsp = sp[1:].values - sp[:-1].values
duk = uk[1:].values - uk[:-1].values
dus = us[1:].values - us[:-1].values
dbg = bg[1:].values - bg[:-1].values
dgm = gm[1:].values - gm[:-1].values
dnt = nt[1:].values - nt[:-1].values
dsw = sw[1:].values - sw[:-1].values
dtot = tot[1:].values - tot[:-1].values

نقدم متغير إضافي للتنبؤ. هذه مجموعة تبدأ في 20 يناير وتنتهي في 180 يومًا في 17 يوليو. نقوم أيضًا بإنشاء كائن الطابع الزمني المقابل لهذا الصفيف لتوقيع المحاور.

X_long = np.arange(20, 200)
time_long = pd.date_range('2020-01-20', periods=180)

نحدد الدالة resLogistic ، التي تكون وسيطة الإدخال منها مجموعة من 3 أرقام ، والناتج هو مجموع مربعات الفرق بين قيم المنحنى اللوجستي والعدد الفعلي للوفيات من الوباء في الصين.

def resLogistic(coefficents):
    A0 = coefficents[0]
    A1 = coefficents[1]
    A2 = coefficents[2]
    teor = A0 / (1 + np.exp(A1 * (X.ravel() - A2)))
    
    return np.sum((teor - chi) ** 2)

يتم أخذ عدد الوفيات في كل تاريخ كمجموع متراكم. يتم تحديد المنحنى اللوجستي من خلال 3 مكونات لمتجه الإدخال. الصفر (عدد عناصر الصفيف في Python يبدأ من الصفر) للمكون مسؤول عن الحد الأقصى للقيمة ، الأول يميز معدل نمو الوظيفة ، والثاني - موضع نقطة الانعطاف على محور الوقت.
teor - عدد الوفيات لكل يوم ، بناءً على متجه معلمة الإدخال ، chi - العدد الفعلي للوفيات في الصين. تعرض الدالة مجموع الاختلافات المربعة بين القيمة النظرية والقيمة الفعلية.

الآن ، باستخدام طريقة تصغير مكتبة scipy.optimize ، نجد متجهًا يقلل من مجموع الانحرافات المربعة. المنحنى اللوجستي المبني على أساس هذا الناقل هو توقع معدل الوفيات المطلوب على أساس طريقة المربعات الدنيا.

نضيف أن طريقة التصغير تتطلب نقطة بداية. نختارها بناءً على خصائص الوظيفة اللوجستية المعروفة لنا (يجب أن يكون الحد الأقصى أكبر من أي عدد تجريبي للوفيات ، ويجب أن تكون نقطة الانعطاف قريبة من الحد الأقصى لمنحنى dtot الذي يميز عدد الوفيات الجديدة في اليوم). عادة ما تكون نتائج طريقة التصغير مستقلة عن نقطة البداية ، ولكن هناك استثناءات.
mimim.x هي قيم متجه التقليل.

minim = minimize(resLogistic, [3200, -.16, 46])
minim.x

نعرض الآن على الرسم البياني العدد الفعلي للوفيات ، تقريبًا منحنى توقعاتها اللوجيستية ، ونوقع أيضًا المحور الزمني بالتواريخ.

plt.figure(figsize=(15,10))
teorChi = minim.x[0] / (1 + np.exp(minim.x[1] * (X_long - minim.x[2])))
plt.plot(X,chi,'ro', label=' ')
plt.plot(X_long[:80], teorChi[:80],'b', label='  ')
plt.xticks(X_long[:80][::2], time_long.date[:80][::2], rotation='90');
plt.title('  , ', Size=20);
plt.ylabel('  ')
plt.legend()
plt.grid()



في الرسم البياني السفلي ، نرسم المشتق الأول للمنحنى اللوجستي المحدد أعلاه (الخط الأزرق) ، بالإضافة إلى المنحنى الحقيقي للوفيات الجديدة (الخط الأحمر).

plt.figure(figsize = (15,10))
plt.grid()
plt.title('    , ', Size=20);
plt.plot(X[1:], dchi, 'r', Marker='o', label=' ')
plt.xticks(X_long[1:120][::3], time_long.date[1:120][::3], rotation='90');
plt.plot(X_long[1:120], teorChi[1:120] - teorChi[:119],'b', label='  ')
plt.ylabel('  ')
plt.legend()



نقوم بإجراء حسابات مماثلة لكل من البلدان المذكورة في المقالة.

ثم كتب المؤلف رمزًا غير جميل للغاية. كان من الضروري كتابة وظيفة واحدة لجميع البلدان وتمرير عدد الوفيات الحقيقية إليها من خلال معلمات طريقة التقليل. لكن المؤلف لم يكن لديه الوقت للتعامل مع هذه الآلية ، لذلك كتب وظيفته الخاصة لكل دولة ، وداخل الوظيفة قدم نداء إلى متغير يحتوي على معلومات حول عدد الوفيات في بلد معين.

فيما يلي الحسابات الخاصة بإيران وإيطاليا وإسبانيا والولايات المتحدة الأمريكية. لإعادة الحسابات إلى بلدان أخرى ، أعتقد أن القراء لن يكون صعباً.

def resLogisticIr(coefficents):
    A0 = coefficents[0]
    A1 = coefficents[1]
    A2 = coefficents[2]
    teor = A0 / (1 + np.exp(A1 * (X.ravel() - A2)))
    return np.sum((teor - ir) ** 2)

minim = minimize(resLogisticIr, [3200, -.16, 80])
minim.x

plt.figure(figsize=(15,10))
teorIr = minim.x[0] / (1 + np.exp(minim.x[1] * (X_long - minim.x[2])))
plt.plot(X_long[:120], teorIr[:120],'b', label='  ')
plt.xticks(X_long[:120][::3], time_long.date[:120][::3], rotation='90');
plt.title('  , ', Size=20);
plt.plot(X,ir,'ro', label=' ')
plt.grid()
plt.legend()
plt.ylabel('  ')



plt.figure(figsize = (15,10))
plt.grid()
plt.title('    , ', Size=20);
plt.plot(X[1:], diran, 'r', Marker='o', label=' ')
plt.plot(X[1:], diran, 'ro')
plt.xticks(X_long[1:120][::3], time_long.date[1:120][::3], rotation='90');
plt.plot(X_long[1:120], teorIr[1:120] - teorIr[:119],'b', label='  ')
plt.ylabel('  ')
plt.legend()



def resLogisticIt(coefficents):
    A0 = coefficents[0]
    A1 = coefficents[1]
    A2 = coefficents[2]
    teor = A0 / (1 + np.exp(A1 * (X.ravel() - A2)))
    return np.sum((teor - it) ** 2)

minim = minimize(resLogisticIt, [3200, -.16, 46])
minim.x

plt.figure(figsize=(15,10))
teorIt = minim.x[0] / (1 + np.exp(minim.x[1] * (X_long - minim.x[2])))
plt.plot(X,it,'ro', label=' ')
plt.plot(X_long[:120], teorIt[:120],'b', label='  ')
plt.xticks(X_long[:120][::3], time_long.date[:120][::3], rotation='90');
plt.title('  , ', Size=20);
plt.ylabel('  ')
plt.grid()
plt.legend()



plt.figure(figsize = (15,10))
plt.grid()
plt.title('    , ', Size=20);
plt.plot(X[1:], dit, 'r', Marker='o', label=' ')
plt.xticks(X_long[1:120][::3], time_long.date[1:120][::3], rotation='90');
plt.plot(X_long[1:120], teorIt[1:120] - teorIt[:119],'b', label='  ')
plt.ylabel('  ')
plt.legend()



def resLogisticSp(coefficents):
    A0 = coefficents[0]
    A1 = coefficents[1]
    A2 = coefficents[2]
    teor = A0 / (1 + np.exp(A1 * (X.ravel() - A2)))
    return np.sum((teor - sp) ** 2)

minim = minimize(resLogisticSp, [3200, -.16, 80])
minim.x

plt.figure(figsize=(15,10))
teorSp = minim.x[0] / (1 + np.exp(minim.x[1] * (X_long - minim.x[2])))
plt.plot(X_long[:120], teorSp[:120],'b', label='  ')
plt.xticks(X_long[:120][::3], time_long.date[:120][::3], rotation='90');
plt.title('  , ', Size=20);
plt.plot(X,sp,'ro', label=' ')
plt.grid()
plt.legend()
plt.ylabel('  ')



plt.figure(figsize = (15,10))
plt.grid()
plt.plot(X[1:], dsp, 'r', Marker='o', label=' ')
plt.plot(X[1:], dsp, 'ro')
plt.xticks(X_long[1:120][::3], time_long.date[1:120][::3], rotation='90');
plt.title('    , ', Size=20);
plt.plot(X_long[1:120], teorSp[1:120] - teorSp[:119],'b', label='  ')
plt.ylabel('  ')
plt.legend()



def resLogisticUs(coefficents):
    A0 = coefficents[0]
    A1 = coefficents[1]
    A2 = coefficents[2]
    teor = A0 / (1 + np.exp(A1 * (X.ravel() - A2)))
    return np.sum((teor - us) ** 2)

minim = minimize(resLogisticUs, [3200, -.16, 100])
minim.x

plt.figure(figsize=(15,10))
teorUS = minim.x[0] / (1 + np.exp(minim.x[1] * (X_long - minim.x[2])))
plt.plot(X_long[:120], teorUS[:120],'b', label='  ')
plt.xticks(X_long[:120][::3], time_long.date[:120][::3], rotation='90');
plt.title('  , ', Size=20);
plt.plot(X,us,'ro', label=' ')
plt.grid()
plt.legend()
plt.ylabel('  ')



plt.figure(figsize = (15,10))
plt.grid()
plt.title('    , ', Size=20);
plt.plot(X[1:], dus, 'r', Marker='o', label=' ')
plt.plot(X[1:], dus, 'ro')
plt.xticks(X_long[1:120][::3], time_long.date[1:120][::3], rotation='90');
plt.plot(X_long[1:120], teorUS[1:120] - teorUS[:119],'b', label='  ')
plt.ylabel('  ')
plt.legend()


All Articles