التقريب غير الدقيق لنسب استطلاعات الرأي

استكمالاً للسلسلة تقريب النسب المئوية في الاستطلاعات غير دقيق:

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

أجرينا استطلاعاً عاماً حيث أُدلي بـ 106 أصوات. كانت هناك 69 صوتاً لـ “لا” و 37 صوتاً لـ “نعم”. يعطي القسمة البسيطة أن 69/106 تساوي حوالي 65.09٪. ومع ذلك، يخبرنا النظام أن 66٪ صوتوا لـ “لا” و 34٪ لـ “نعم”. إليك صورة:

كانت النتيجة النهائية 72 صوتاً لـ “لا” و 38 صوتاً لـ “نعم”، والآن تم إغلاق الاستطلاع. 72/110 تساوي حوالي 65.45٪ والتي يقربها النظام أيضاً إلى 66٪، لذا يمكنك رؤية الخطأ في العمل في Tappara.co.

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

Not sure I understand what’s broken here. The poll will round the % so they add up to 100%.

إعجاب واحد (1)

النتيجة سيئة للغاية، وهذا هو الخلل. :slight_smile:

شكرًا لك على الكود. لم أتمكن من العثور عليه، مما يدل على مدى سوء مهارتي في استخدام GitHub. الكود مقتبس من Stack Overflow، حيث يكتب مؤلفه:

لست متأكدًا من مستوى الدقة الذي تحتاجه، لكن ما سأفعله هو ببساطة إضافة 1 إلى أول n من الأرقام، حيث n هو القيمة الصحيحة العلوية لمجموع الكسور العشرية. في هذه الحالة، يكون المجموع 3، لذا سأضيف 1 إلى العناصر الثلاثة الأولى وأقرب الباقي للأسفل. بالطبع، هذه الطريقة ليست دقيقة للغاية، فقد يتم تقريب بعض الأرقام لأعلى أو لأسفل رغم عدم الحاجة لذلك، لكنها تعمل بشكل مقبول وستؤدي دائمًا إلى نتيجة 100%.

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

هناك العديد من الطرق للقيام بذلك، شريطة ألا تقلق بشأن الاعتماد على البيانات العشرية الأصلية.

الطريقة الأولى وربما الأكثر شيوعًا هي “طريقة الباقي الأكبر” (Largest Remainder Method).

والتي تعمل بشكل أساسي على:

  1. تقريب كل الأرقام لأسفل
  1. حساب الفرق بين المجموع و100
  1. توزيع هذا الفرق عن طريق إضافة 1 إلى العناصر بناءً على ترتيب تنازلي لأجزاء كسورها العشرية

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

الإجابة ذات التقييم العالي من قبل Varun Vohra تقلل من مجموع الأخطاء المطلقة، وهي سهلة التنفيذ للغاية. ومع ذلك، هناك حالات حافة لا تتعامل معها - ما هي نتيجة تقريب 24.25، 23.25، 27.25، 25.25؟ يجب تقريب أحدها لأعلى بدلاً من لأسفل.

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

على الأرجح ستختار الأول أو الأخير في القائمة بشكل تعسفي.

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

تعديل: حسّنت العنوان قليلاً بتغيير كلمة “معطوب” إلى “غير دقيق”. ينبغي أيضًا نقل هذا الموضوع إلى Contribute > Feature أو دمجه مع الموضوع السابق.

4 إعجابات

Feel free to submit a pull request to change the rounding algorithm :wink:

5 إعجابات

It was like classic exercises for beginning programmers. Here is a way to do it, but someone who has more experience and isn’t totally new to JavaScript might find some shortcuts.

https://github.com/rizka10/discourse/pull/1/files

إعجابَين (2)

Looks fine to me. Would you mind making it a PR so that I can merge it?

I thought that was a pull request already… I’m as confused as always with Github. :confused:
I clicked some more green buttons now, maybe it does the trick?

If you want to create a PR from your code, you should go there: https://github.com/discourse/discourse/compare/master...rizka10:master :wink:

إعجاب واحد (1)

I think I’m getting it now. I ran into some Github tutorials online yesterday and I should really go through one to learn the basics.

إعجاب واحد (1)

Awesome. Before we can merge the code, we’ll need you to sign the CLA. I promise, this is the last step (also, you only have to sign it once ;))

6 إعجابات

Thanks for all the help! I signed it now.

4 إعجابات