{"id":"l-pda-5-1","courseId":"python-data-analysis","lang":"ar","kind":"lesson","summary":"صِف عمودًا رقميًا بصدق باستخدام الوسيط والمئينات والتشتّت، وتعرّف على التوزيعات الملتوية والقيم الشاذة، واقرأ الارتباطات دون أن تخلط بينها وبين الأسباب.","html":"<p>يسألك أحدهم: “ما الطلب النموذجي في Cartwheel؟” فتحسب المتوسط، 228 دولارًا، وتقول ذلك. ثم يصمّم فريق التسويق حدًّا للشحن المجاني حول 228 دولارًا، فيكتشف أن ثلثي الطلبات لا تصل إليه أبدًا. كان المتوسط صحيحًا والإجابة خاطئة، لأن قيم الطلبات ليست موزّعة بالتساوي حول متوسطها. وصف البيانات بصدق يعني وصف شكلها، لا مركزها فقط.</p>\n<h2 id=\"sec-1\" tabindex=\"-1\">المتوسط والوسيط والمئينات</h2>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"python\" data-run=\"python\" data-index=\"0\"><div class=\"code-head\"><span class=\"code-title\">Python</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn code-run\" data-action=\"run\" data-lang=\"python\" data-index=\"0\" aria-label=\"شغّل هذا المثال\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"/></svg><span>تشغيل</span></button><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">import</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pandas </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">as</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pd</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">items </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pd.read_csv(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_items.csv\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">orders </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pd.read_csv(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"orders.csv\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">parse_dates</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_date\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">])</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">items[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"revenue\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> items[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"quantity\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">*</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> items[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"unit_price\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">*</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> (</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">1</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> -</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> items[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"discount\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">])</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">orders </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> orders.merge(items.groupby(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_id\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">as_index</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">False</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"revenue\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">].sum(), </span><span style=\"color:#953800;--shiki-dark:#FFA657\">on</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_id\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">validate</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"one_to_one\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">orders </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> orders[orders[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"status\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">!=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"cancelled\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">]</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">value </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> orders[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"revenue\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">]</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(value.describe(</span><span style=\"color:#953800;--shiki-dark:#FFA657\">percentiles</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">[</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">0.1</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">0.25</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">0.5</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">0.75</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">0.9</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">0.99</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">]).round(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">2</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">))</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"skew:\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">round</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(value.skew(), </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">2</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">))</span></span></code></pre><div class=\"run-output\" data-run-output=\"0\" hidden></div></div>\n<p>اقرأها من الوسط إلى الخارج. <strong>الوسيط (median)</strong> ‏(50%) هو 147 دولارًا: نصف الطلبات كلها أصغر منه. ويقول الرُّبيعان إن النصف الأوسط من الطلبات يقع بين 68 و303 دولارات. المئين التسعون 505 والمئين التاسع والتسعون 1,168، بينما الحد الأقصى 2,117. أما <strong>المتوسط (mean)</strong>، 228، فيقع فوق الوسيط بكثير بسبب ذلك الذيل الأيمن الطويل، ويؤكّد ذلك الالتواء الموجب (skew) البالغ 2.43. للقيمة النموذجية في البيانات الملتوية، اذكر الوسيط؛ وللمجاميع والتوقّعات، المتوسط هو الرقم الصحيح، لأن المتوسط × العدد = المجموع.</p>\n<p><code dir=\"ltr\">std</code>، أي الانحراف المعياري، يساوي 241 دولارًا، أكبر من الوسيط نفسه. هذه علامة أخرى على توزيع (distribution) منتشر وملتوٍ؛ وفي هذه الحالة تصف المئينات التشتّت أفضل بكثير من “المتوسط زائد أو ناقص انحراف معياري واحد”.</p>\n<h2 id=\"sec-2\" tabindex=\"-1\">الشكل دون رسم بياني</h2>\n<p>تعدّ <code dir=\"ltr\">value_counts</code> مع الفئات عدد القيم التي تقع في كل نطاق، وهذا مدرّج تكراري في صيغة نصية:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"python\" data-run=\"python\" data-index=\"1\"><div class=\"code-head\"><span class=\"code-title\">Python</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn code-run\" data-action=\"run\" data-lang=\"python\" data-index=\"1\" aria-label=\"شغّل هذا المثال\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"/></svg><span>تشغيل</span></button><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">import</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pandas </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">as</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pd</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">items </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pd.read_csv(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_items.csv\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">orders </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pd.read_csv(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"orders.csv\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">parse_dates</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_date\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">])</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">items[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"revenue\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> items[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"quantity\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">*</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> items[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"unit_price\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">*</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> (</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">1</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> -</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> items[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"discount\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">])</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">orders </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> orders.merge(items.groupby(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_id\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">as_index</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">False</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"revenue\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">].sum(), </span><span style=\"color:#953800;--shiki-dark:#FFA657\">on</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_id\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">validate</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"one_to_one\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">orders </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> orders[orders[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"status\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">!=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"cancelled\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">]</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(orders[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"revenue\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">].value_counts(</span><span style=\"color:#953800;--shiki-dark:#FFA657\">bins</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">[</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">0</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">50</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">100</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">200</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">400</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">800</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">3000</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">]).sort_index())</span></span></code></pre><div class=\"run-output\" data-run-output=\"1\" hidden></div></div>\n<figure class=\"diagram\"><svg class=\"diagram-svg\" focusable=\"false\" viewBox=\"0 0 700 250\" role=\"img\" aria-labelledby=\"l-pda-5-1-t1\"><defs><marker id=\"arrow-l-pda-5-1-1\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"7\" markerHeight=\"7\" orient=\"auto-start-reverse\"><path d=\"M0 0 L10 5 L0 10 z\" class=\"d-arrowhead\"/></marker></defs>\n  <title id=\"l-pda-5-1-t1\">رسم أعمدة لأعداد الطلبات بحسب نطاق القيمة: 338 طلبًا حتى 50 دولارًا، و 398 من 50 إلى 100، و 476 من 100 إلى 200، و 420 من 200 إلى 400، و 256 من 400 إلى 800، و 73 فوق 800. علامة تبيّن الوسيط عند 147 دولارًا في النطاق الثالث والمتوسط عند 228 دولارًا في النطاق الرابع.</title>\n  <path class=\"d-line\" d=\"M40 200 L680 200\"/>\n  <rect class=\"d-box-accent\" x=\"60\" y=\"129\" width=\"80\" height=\"71\"/>\n  <rect class=\"d-box-accent\" x=\"160\" y=\"116\" width=\"80\" height=\"84\"/>\n  <rect class=\"d-box-accent\" x=\"260\" y=\"100\" width=\"80\" height=\"100\"/>\n  <rect class=\"d-box-accent\" x=\"360\" y=\"112\" width=\"80\" height=\"88\"/>\n  <rect class=\"d-box-accent\" x=\"460\" y=\"146\" width=\"80\" height=\"54\"/>\n  <rect class=\"d-box-accent\" x=\"560\" y=\"185\" width=\"80\" height=\"15\"/>\n  <text class=\"d-label\" x=\"100\" y=\"122\" text-anchor=\"middle\">338</text>\n  <text class=\"d-label\" x=\"200\" y=\"109\" text-anchor=\"middle\">398</text>\n  <text class=\"d-label\" x=\"300\" y=\"93\" text-anchor=\"middle\">476</text>\n  <text class=\"d-label\" x=\"400\" y=\"105\" text-anchor=\"middle\">420</text>\n  <text class=\"d-label\" x=\"500\" y=\"139\" text-anchor=\"middle\">256</text>\n  <text class=\"d-label\" x=\"600\" y=\"178\" text-anchor=\"middle\">73</text>\n  <text class=\"d-label-muted\" x=\"100\" y=\"220\" text-anchor=\"middle\">0-50</text>\n  <text class=\"d-label-muted\" x=\"200\" y=\"220\" text-anchor=\"middle\">50-100</text>\n  <text class=\"d-label-muted\" x=\"300\" y=\"220\" text-anchor=\"middle\">100-200</text>\n  <text class=\"d-label-muted\" x=\"400\" y=\"220\" text-anchor=\"middle\">200-400</text>\n  <text class=\"d-label-muted\" x=\"500\" y=\"220\" text-anchor=\"middle\">400-800</text>\n  <text class=\"d-label-muted\" x=\"600\" y=\"220\" text-anchor=\"middle\">800+</text>\n  <path class=\"d-line d-dashed\" d=\"M318 40 L318 200\"/>\n  <text class=\"d-label-strong\" x=\"318\" y=\"32\" text-anchor=\"middle\">الوسيط 147</text>\n  <path class=\"d-arrow d-dashed\" d=\"M374 60 L374 200\"/>\n  <text class=\"d-label-strong\" x=\"420\" y=\"56\" text-anchor=\"middle\">المتوسط 228</text>\n  <text class=\"d-label-muted\" x=\"350\" y=\"244\" text-anchor=\"middle\">قيمة الطلب بالدولار (النطاقات غير متساوية العرض)</text>\n</svg><figcaption>قيم الطلبات ملتوية: معظم الطلبات صغيرة، وذيل طويل كبير</figcaption></figure>\n<p>معظم الطلبات تقع بين 50 و400 دولار، وذيل يرقّ تدريجيًا يمتد إلى ما بعد 800. لاحظ أن النطاقات تتّسع كلما اتجهت يمينًا؛ النطاقات المتساوية العرض بمقدار 100 دولار كانت ستضغط كل شيء تقريبًا في الأعمدة الأولى.</p>\n<h2 id=\"sec-3\" tabindex=\"-1\">القيم الشاذة: ضع علامة ثم قرّر</h2>\n<p>قاعدة عملية شائعة تضع علامة على القيم التي تبعد عن الرُّبيعين أكثر من 1.5 ضعف المدى الرُّبيعي (IQR، المسافة بين الرُّبيعين):</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"python\" data-run=\"python\" data-index=\"2\"><div class=\"code-head\"><span class=\"code-title\">Python</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn code-run\" data-action=\"run\" data-lang=\"python\" data-index=\"2\" aria-label=\"شغّل هذا المثال\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"/></svg><span>تشغيل</span></button><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">import</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pandas </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">as</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pd</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">items </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pd.read_csv(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_items.csv\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">orders </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pd.read_csv(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"orders.csv\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">parse_dates</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_date\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">])</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">items[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"revenue\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> items[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"quantity\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">*</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> items[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"unit_price\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">*</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> (</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">1</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> -</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> items[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"discount\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">])</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">orders </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> orders.merge(items.groupby(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_id\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">as_index</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">False</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"revenue\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">].sum(), </span><span style=\"color:#953800;--shiki-dark:#FFA657\">on</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_id\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">validate</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"one_to_one\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">orders </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> orders[orders[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"status\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">!=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"cancelled\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">]</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">value </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> orders[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"revenue\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">]</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">q1, q3 </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> value.quantile([</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">0.25</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">0.75</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">])</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">upper </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> q3 </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">+</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 1.5</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> *</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> (q3 </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">-</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> q1)</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">big </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> value </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">></span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> upper</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">f</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"fence </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">{</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">upper</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">:.2f}</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">: </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">{</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">big.sum()</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">}</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> orders, </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">{</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">value[big].sum() </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">/</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> value.sum()</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">:.1%}</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> of revenue\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span></code></pre><div class=\"run-output\" data-run-output=\"2\" hidden></div></div>\n<p>125 طلبًا فوق 656.62 دولارًا، وتجلب معًا 25.9% من الإيراد. هذه ليست أخطاء تُنظَّف: إنها طلبات متعددة العناصر من مكاتب وكراسٍ وأوزان رياضية، حقيقية ومهمة. قاعدة القيم الشاذة (outliers) تخبرك أين تنظر. أخطاء الإدخال، مثل مجموع ضاعت فاصلته العشرية، تُصلَح؛ والقيم المتطرّفة الحقيقية تبقى، وتتحقّق أنت من أن استنتاجك يصمد معها وبدونها.</p>\n<aside class=\"callout callout-mistake\" role=\"note\"><p class=\"callout-title\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\"/><path d=\"M12 9v4\"/><path d=\"M12 17h.01\"/></svg><span><span class=\"callout-kind\">خطأ شائع</span><span class=\"callout-sep\" aria-hidden=\"true\"> · </span>مقارنة متوسطات مجموعات صغيرة وملتوية</span></p>\n<p>طلب واحد بقيمة 2,000 دولار يُضاف إلى مجموعة من 30 طلبًا يحرّك متوسطها بنحو 60 دولارًا. قبل أن تقول “عملاء الـ marketplace ينفقون أقل”، ضع العدد والمتوسط والوسيط جنبًا إلى جنب: <code dir=\"ltr\">orders.groupby(&quot;channel&quot;)[&quot;revenue&quot;].agg([&quot;count&quot;, &quot;mean&quot;, &quot;median&quot;])</code>. هنا تتراوح المتوسطات بين 214 دولارًا (الـ marketplace) و236 (الويب)، لكن أعلى وسيط من نصيب التطبيق، 153 مقابل 147 للويب: المقياسان لا يتّفقان حتى على القناة صاحبة الطلب النموذجي الأكبر.</p>\n</aside>\n<h3 id=\"sec-4\" tabindex=\"-1\">العدسة نفسها عبر الزمن</h3>\n<p>يمكن مقارنة التوزيعات عبر الفترات أيضًا، وهذه المقارنة تحمل دليلًا لدراسة الحالة. إذا قفز إيراد الربع الرابع من 2025 لأن العملاء ملؤوا سلات شراء أكبر، فيجب أن يكون الطلب النموذجي قد كبر:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"python\" data-run=\"python\" data-index=\"3\"><div class=\"code-head\"><span class=\"code-title\">Python</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn code-run\" data-action=\"run\" data-lang=\"python\" data-index=\"3\" aria-label=\"شغّل هذا المثال\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"/></svg><span>تشغيل</span></button><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">import</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pandas </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">as</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pd</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">items </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pd.read_csv(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_items.csv\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">orders </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pd.read_csv(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"orders.csv\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">parse_dates</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_date\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">])</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">items[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"revenue\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> items[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"quantity\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">*</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> items[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"unit_price\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">*</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> (</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">1</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> -</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> items[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"discount\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">])</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">orders </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> orders.merge(items.groupby(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_id\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">as_index</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">False</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"revenue\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">].sum(), </span><span style=\"color:#953800;--shiki-dark:#FFA657\">on</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_id\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">validate</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"one_to_one\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">orders </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> orders[orders[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"status\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">!=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"cancelled\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">]</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">quarter </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> orders[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_date\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">].dt.to_period(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"Q\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(orders.groupby(quarter)[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"revenue\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">].agg([</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"count\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"median\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">]).round(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">1</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">).tail(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">4</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">))</span></span></code></pre><div class=\"run-output\" data-run-output=\"3\" hidden></div></div>\n<p>لم يكبر. بلغ وسيط الطلب في الربع الرابع من 2025 قيمة 151.70 دولارًا، أي <strong>أقل</strong> قليلًا من 159.20 في الربع الثالث، بينما تضاعف عدد الطلبات. أيًّا كان ما حدث في الربع الرابع، فقد تعلّق بعدد الطلبات التي وصلت، لا بحجمها. جدول واحد من الوسيطات استبعد بالفعل تفسيرًا شائعًا.</p>\n<h2 id=\"sec-5\" tabindex=\"-1\">الارتباط: التحرّك معًا ليس تسبّبًا</h2>\n<p>تقيس <code dir=\"ltr\">corr()</code> مدى قوة تحرّك عمودين رقميين معًا، من ‎-1 (متعاكسان تمامًا) مرورًا بـ 0 (لا علاقة خطية) إلى 1 (متلازمان تمامًا). في <code dir=\"ltr\">churn.csv</code> صف لكل عميل وعلَم <code dir=\"ltr\">churned</code> للانصراف:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"python\" data-run=\"python\" data-index=\"4\"><div class=\"code-head\"><span class=\"code-title\">Python</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn code-run\" data-action=\"run\" data-lang=\"python\" data-index=\"4\" aria-label=\"شغّل هذا المثال\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"/></svg><span>تشغيل</span></button><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">import</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pandas </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">as</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pd</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">churn </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pd.read_csv(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"churn.csv\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">cols </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> [</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"tenure_days\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"orders\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"days_since_last_order\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"support_tickets\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"churned\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">]</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(churn[cols].corr().round(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">2</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"churned\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">])</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(churn.groupby(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"churned\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"days_since_last_order\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">].median())</span></span></code></pre><div class=\"run-output\" data-run-output=\"4\" hidden></div></div>\n<p>العملاء الذين انصرفوا مضت عليهم مدة أطول بكثير منذ آخر طلب: وسيط قدره 214 يومًا مقابل 46، وارتباط (correlation) قدره 0.45. هذا يجعل الفجوة إشارة تحذير جيدة. لكنه لا يبيّن أن الفجوة <strong>تسبّب</strong> الانصراف؛ فالعميل الذي فقد اهتمامه أصلًا يتوقّف عن الطلب وينصرف، والقياسان كلاهما يعكسان تلك الحقيقة الواحدة. عامل الارتباطات كخيوط تستحق التحقيق، واحتفظ بكلمة “يسبّب” للتجارب.</p>\n<p>في التمرين تصف قيم طلبات Cartwheel بنفسك. وفي الدرس التالي تحوّل أرقامًا كهذه إلى رسوم بيانية.</p>\n","toc":[{"id":"sec-1","text":"المتوسط والوسيط والمئينات","level":2},{"id":"sec-2","text":"الشكل دون رسم بياني","level":2},{"id":"sec-3","text":"القيم الشاذة: ضع علامة ثم قرّر","level":2},{"id":"sec-4","text":"العدسة نفسها عبر الزمن","level":3},{"id":"sec-5","text":"الارتباط: التحرّك معًا ليس تسبّبًا","level":2}],"takeaways":["في البيانات الملتوية مثل قيم الطلبات، يقع المتوسط فوق الوسيط بكثير؛ أبلغ عن الوسيط (وبضعة مئينات) حين تصف القيمة النموذجية.","تعطي <code dir=\"ltr\">quantile([0.25, 0.75])</code> الرُّبيعين؛ والقيم التي تبعد عنهما أكثر من 1.5 ضعف المدى الرُّبيعي تستحق نظرة، لا حذفًا تلقائيًا.","<code dir=\"ltr\">value_counts(bins=[...])</code> مدرّج تكراري (histogram) نصي سريع يبيّن شكل التوزيع دون رسم بياني.","قارن المجموعات بمتوسطها ووسيطها وحجمها معًا، كي لا يقود الاستنتاجَ طلبٌ كبير واحد أو مجموعة صغيرة جدًا.","تقيس <code dir=\"ltr\">corr()</code> مدى تحرّك عمودين معًا؛ والارتباط القوي خيط يستحق التحقيق، وليس أبدًا دليلًا على أن أحدهما يسبّب الآخر."],"further":[{"title":"Descriptive statistics in pandas","url":"https://pandas.pydata.org/docs/user_guide/basics.html#descriptive-statistics"},{"title":"pandas.Series.quantile","url":"https://pandas.pydata.org/docs/reference/api/pandas.Series.quantile.html"},{"title":"pandas.DataFrame.corr","url":"https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.corr.html"}],"quiz":[{"q":"<p>متوسط قيم الطلبات في Cartwheel ‏228 دولارًا والوسيط 147. ماذا يخبرك ذلك عن التوزيع؟</p>","options":[{"text":"إنه ملتوٍ إلى اليمين؛ أقلية من الطلبات الكبيرة تسحب المتوسط فوق الطلب النموذجي.","why":"صحيح. نصف الطلبات كلها أقل من 147 دولارًا، وذيل طويل من الطلبات الكبيرة يرفع المتوسط بمقدار 81 دولارًا."},{"text":"البيانات فيها أخطاء، لأن المتوسط والوسيط يجب أن يتساويا.","why":"لا يتساويان إلا في التوزيعات المتماثلة. المبالغ المالية والمُدد والأعداد ملتوية عادةً، دون أي خطأ."},{"text":"معظم الطلبات قريبة من 228 دولارًا.","why":"يقول الوسيط إن نصف الطلبات أقل من 147، فليست 228 حيث تقع معظم الطلبات."},{"text":"الطلبات الصغيرة أكثر من الكبيرة، فالمتوسط منخفض أكثر من اللازم.","why":"الطلبات الصغيرة الكثيرة مع قليل من الطلبات الضخمة تدفع المتوسط <strong>إلى الأعلى</strong> لا إلى الأسفل."}],"answer":0},{"q":"<p>وجدت 125 طلبًا فوق الحد الأعلى 1.5 × IQR. ماذا تفعل بها؟</p>","options":[{"text":"احذفها؛ القيم الشاذة تشوّه المتوسطات.","why":"هذه طلبات حقيقية تساوي 26% من الإيراد. حذفها سيعطي صورة خاطئة عن العمل."},{"text":"استبدلها بالوسيط.","why":"استبدال مبيعات حقيقية بقيمة نموذجية اختراع للبيانات، وسيمحو معظم ذلك الربع من الإيراد."},{"text":"افحصها، وتحقّق من أنها حقيقية، وأبلغ عن النتائج معها وبدونها إذا كانت تغيّر الاستنتاج.","why":"صحيح. الحد يضع علامة على القيم للمراجعة. الطلبات الكبيرة الحقيقية جزء من القصة، وكثيرًا ما تكون أكثر أجزائها إثارة."}],"answer":2},{"q":"<p>في <code dir=\"ltr\">churn.csv</code>، ارتباط <code dir=\"ltr\">days_since_last_order</code> بـ <code dir=\"ltr\">churned</code> يساوي 0.45. أيّ عبارة لها ما يبرّرها؟</p>","options":[{"text":"الفجوات الطويلة بين الطلبات تسبّب انصراف العملاء.","why":"الارتباط لا يستطيع إثبات السبب. قد يعكس كلاهما عاملًا ثالثًا، مثل فقدان العميل اهتمامه."},{"text":"العملاء الذين انصرفوا كانت الفجوة منذ آخر طلب لهم أطول في الغالب، فالفجوة إشارة تحذير مفيدة.","why":"صحيح. الارتباط الموجب المتوسط يدعم استخدامها كمؤشّر، وهذا ما تبني عليه دورة تعلّم الآلة، دون ادّعاء سبب."},{"text":"45% من العملاء ذوي الفجوات الطويلة انصرفوا.","why":"معامل الارتباط ليس نسبة من العملاء؛ إنه يقيس قوة علاقة خطية بين ‎-1 و1."},{"text":"العلاقة أضعف من أن تكون مفيدة.","why":"0.45 ارتباط متوسط، والوسيطان (46 يومًا للعملاء النشطين، و214 للمنصرفين) يبيّنان فرقًا عمليًا كبيرًا."}],"answer":1}],"exercise":{"kind":"python","files":["order_items.csv","orders.csv"],"starter":"import pandas as pd\n\nitems = pd.read_csv(\"order_items.csv\")\norders = pd.read_csv(\"orders.csv\", parse_dates=[\"order_date\"])\nitems[\"revenue\"] = items[\"quantity\"] * items[\"unit_price\"] * (1 - items[\"discount\"])\norders = orders.merge(items.groupby(\"order_id\", as_index=False)[\"revenue\"].sum(), on=\"order_id\", validate=\"one_to_one\")\norders = orders[orders[\"status\"] != \"cancelled\"]\nvalue = orders[\"revenue\"]\n\n# 1. Median and 90th percentile of order value, each rounded to 2 decimals\nmedian_value = None\np90_value = None\n\n# 2. Share of orders below the mean order value, rounded to 3 decimals\nbelow_mean_share = None\n\n# 3. Upper outlier fence (Q3 + 1.5 * IQR) and the number of orders above it\nupper_fence = None\nn_outliers = None\n\n# 4. A DataFrame indexed by channel with columns count, mean, median of order value\nby_channel = None\n","solution":"import pandas as pd\n\nitems = pd.read_csv(\"order_items.csv\")\norders = pd.read_csv(\"orders.csv\", parse_dates=[\"order_date\"])\nitems[\"revenue\"] = items[\"quantity\"] * items[\"unit_price\"] * (1 - items[\"discount\"])\norders = orders.merge(items.groupby(\"order_id\", as_index=False)[\"revenue\"].sum(), on=\"order_id\", validate=\"one_to_one\")\norders = orders[orders[\"status\"] != \"cancelled\"]\nvalue = orders[\"revenue\"]\n\nmedian_value = round(value.median(), 2)\np90_value = round(value.quantile(0.9), 2)\n\nbelow_mean_share = round((value < value.mean()).mean(), 3)\n\nq1, q3 = value.quantile([0.25, 0.75])\nupper_fence = q3 + 1.5 * (q3 - q1)\nn_outliers = int((value > upper_fence).sum())\n\nby_channel = orders.groupby(\"channel\")[\"revenue\"].agg([\"count\", \"mean\", \"median\"])\nprint(by_channel.round(1))\n","checks":[{"id":"median","test":"abs(float(median_value) - 147.26) < 0.01"},{"id":"p90","test":"abs(float(p90_value) - 505.0) < 0.01"},{"id":"below-mean","test":"round(float(below_mean_share), 3) == 0.663"},{"id":"fence","test":"abs(float(upper_fence) - 656.625) < 0.01 and int(n_outliers) == 125"},{"id":"by-channel","test":"isinstance(by_channel, pd.DataFrame) and list(by_channel.columns) == ['count', 'mean', 'median'] and int(by_channel.loc['web', 'count']) == 1089 and abs(float(by_channel.loc['marketplace', 'median']) - 132.2) < 0.1"}],"title":"صِف الطلب النموذجي","prompt":"<p>تحتوي <code dir=\"ltr\">value</code> على إيراد كل طلب غير ملغى. اجعل <code dir=\"ltr\">median_value</code> و<code dir=\"ltr\">p90_value</code> (المئين التسعين)، كلٌّ منهما مقرّبًا إلى منزلتين عشريتين. واجعل <code dir=\"ltr\">below_mean_share</code> حصة الطلبات التي قيمتها أقل من المتوسط، مقرّبة إلى 3 منازل عشرية. احسب <code dir=\"ltr\">upper_fence</code> على أنه Q3 + 1.5 × (Q3 − Q1)، و<code dir=\"ltr\">n_outliers</code> على أنه عدد الطلبات التي فوقه. وأخيرًا ابنِ <code dir=\"ltr\">by_channel</code>، جدولًا (DataFrame) فهرسه القناة وأعمدته <code dir=\"ltr\">count</code> و<code dir=\"ltr\">mean</code> و<code dir=\"ltr\">median</code> لقيمة الطلب، بهذا الترتيب.</p>\n","hints":["<code dir=\"ltr\">value.median()</code> و<code dir=\"ltr\">value.quantile(0.9)</code>؛ وغلّف كلًّا منهما بـ <code dir=\"ltr\">round(..., 2)</code>.","الحصة هي متوسط Series منطقية: <code dir=\"ltr\">(value &lt; value.mean()).mean()</code>. وتعيد <code dir=\"ltr\">value.quantile([0.25, 0.75])</code> الرُّبيعين معًا، فتستطيع فكّهما إلى اسمين.","<code dir=\"ltr\">orders.groupby(&quot;channel&quot;)[&quot;revenue&quot;].agg([&quot;count&quot;, &quot;mean&quot;, &quot;median&quot;])</code> تعطي الأعمدة الثلاثة بهذا الترتيب."],"explanation":"<p>وسيط الطلب 147.26 دولارًا، و66.3% من الطلبات أقل من المتوسط 227.77: أوضح برهان ممكن على أن المتوسط ليس هو الطلب النموذجي في البيانات الملتوية. يضع الحد عند 656.62 علامة على 125 طلبًا كبيرًا، تفحصها بدلًا من حذفها. ويضع جدول القنوات الأحجام بجانب المتوسط والوسيط معًا، فترى أن المتوسطات والوسيطات لا ترتّب القنوات بالترتيب نفسه، وأن مجموعة الـ marketplace هي الأصغر بـ 208 طلبات.</p>\n","checkLabels":{"median":"<code dir=\"ltr\">median_value</code> يساوي 147.26","p90":"<code dir=\"ltr\">p90_value</code> هو المئين التسعون","below-mean":"66.3% من الطلبات أقل من المتوسط","fence":"الحد يساوي 656.62 وفوقه 125 طلبًا","by-channel":"في <code dir=\"ltr\">by_channel</code> العدد والمتوسط والوسيط لكل قناة"}},"words":595,"readMinutes":4}