{"id":"l-pda-5-3","courseId":"python-data-analysis","lang":"ar","kind":"lesson","summary":"أجب عن سؤال عمل حقيقي من البداية إلى النهاية - عرّف المقياس، وافحص البيانات، وفكّك الإيراد إلى طلبات وعملاء وقيمة طلب، واختبر كل تفسير، واكتب استنتاجًا مع تحفّظاته.","html":"<p>رسالة رئيس النمو تنتظر منذ الدرس 1.1: “كان إيراد الربع الرابع من 2025 أعلى بكثير من أي ربع قبله. هل السبب الجمعة السوداء، أم عملاء أكثر، أم سلال أكبر، أم خطأ في البيانات؟ أحتاج إجابة أستطيع تكرارها أمام مجلس الإدارة.” يعمل هذا الدرس على الإجابة كما كنت ستفعل في العمل: عرّف، وافحص، وفكّك، واختبر التفسيرات، واستنتج. كل خطوة تستخدم أداة تعرفها مسبقًا.</p>\n<h2 id=\"sec-1\" tabindex=\"-1\">الخطوة 1: عرّف المقياس وافحص البيانات</h2>\n<p>المقياس هو تعريف الإيراد في الدورة من الدرس 4.2: إيراد البنود بعد الخصومات، دون الشحن ودون الطلبات الملغاة. ابنِ صفًا لكل طلب، وأكّد بـ assert الحقائق التي يعتمد عليها التحليل قبل أن تثق برقم واحد:</p>\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\">per_order </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> 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>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">df </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> orders.merge(per_order, </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\">how</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"left\"</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>\n<span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">assert</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> df[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_id\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">].is_unique</span></span>\n<span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">assert</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> df[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"revenue\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">].notna().all(), </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"an order has no items\"</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">df </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> df[df[</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\">].copy()</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">df[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"quarter\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> df[</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>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(df.groupby(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"quarter\"</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().round(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">0</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\">(df.loc[df[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"quarter\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">==</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"2025Q4\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"status\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">].value_counts())</span></span></code></pre><div class=\"run-output\" data-run-output=\"0\" hidden></div></div>\n<p>انتقل الإيراد من 80,523 دولارًا في الربع الثالث من 2025 إلى 146,825 في الربع الرابع، بزيادة 82%. لا مكرّرات، ولا طلبات بلا بنود. ويظهر تحفّظ واحد فورًا: 63 طلبًا من الربع الرابع قيمتها 11,321 دولارًا، أي نحو 8% من الربع، ما زالت <code dir=\"ltr\">processing</code> أو <code dir=\"ltr\">shipped</code>. إنها تُحسب إيرادًا بحسب التعريف، لكن بعضها قد يُلغى. سجّل ذلك الآن؛ فمكانه في الإجابة النهائية.</p>\n<h2 id=\"sec-2\" tabindex=\"-1\">الخطوة 2: فكّك التغيّر</h2>\n<p>الإيراد هو الطلبات مضروبة في متوسط قيمة الطلب (AOV)، والطلبات هي العملاء النشطون مضروبين في الطلبات لكل عميل. حساب كل عامل يُظهر أيّها تحرّك:</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\">df </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\">df </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> df[df[</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\">].copy()</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">df[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"quarter\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> df[</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>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">q </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> df.groupby(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"quarter\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">).agg(</span></span>\n<span class=\"line\"><span style=\"color:#953800;--shiki-dark:#FFA657\">    revenue</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</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\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"sum\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">),</span></span>\n<span class=\"line\"><span style=\"color:#953800;--shiki-dark:#FFA657\">    orders</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_id\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"count\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">),</span></span>\n<span class=\"line\"><span style=\"color:#953800;--shiki-dark:#FFA657\">    customers</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"customer_id\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"nunique\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">),</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">q[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"aov\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> q[</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\"> q[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"orders\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">]</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">q[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"orders_per_customer\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> q[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"orders\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">/</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> q[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"customers\"</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\">(q.round(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">2</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">).tail(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">5</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\">((q.loc[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"2025Q4\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">/</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> q.loc[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"2025Q3\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">-</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 1</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">).round(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">3</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">))</span></span></code></pre><div class=\"run-output\" data-run-output=\"1\" hidden></div></div>\n<p>أمر الطباعة الثاني هو التفكيك في سطر واحد. ارتفعت الطلبات 98% بينما <strong>انخفض</strong> متوسط قيمة الطلب 8%: كان الربع الرابع مسألة حجم مبيعات لا سلال أكبر، وهذا يطابق الوسيطات التي رأيتها في الدرس 5.1. وجاءت الطلبات الإضافية من الاتجاهين: عملاء نشطون أكثر بنسبة 54%، وكل منهم طلب أكثر (2.28 طلب لكل عميل مقابل 1.77).</p>\n<h2 id=\"sec-3\" tabindex=\"-1\">الخطوة 3: ضعه بجانب العام الماضي</h2>\n<p>القفزة لا تكون مفاجئة إلا مقارنةً بما يحدث عادةً. وقد أظهر الدرس 4.4 بالفعل المقارنة المهمة:</p>\n<div class=\"table-wrap\" role=\"region\" aria-label=\"جدول قابل للتمرير\" tabindex=\"0\"><table><thead>\n<tr>\n<th></th>\n<th>النمو من الربع الثالث إلى الرابع</th>\n<th>النمو السنوي في الربع الرابع</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>2024</td>\n<td>‎+73%</td>\n<td>(لا بيانات لعام 2023)</td>\n</tr>\n<tr>\n<td>2025</td>\n<td>‎+82%</td>\n<td>‎+180%</td>\n</tr>\n</tbody>\n</table></div><p>كان الربع الرابع أعلى بنسبة 73% من الثالث في 2024 أيضًا، وكان نوفمبر أكبر شهر في السنتين. ارتفاع 2025 من الربع الثالث إلى الرابع أقوى بعض الشيء فقط من الدفعة الموسمية المعتادة، ونمو الربع الرابع بنسبة 180% على العام السابق يقع ضمن نطاق أرباع 2025 الأخرى (من 145% إلى 200%). وتبدأ رسالة مجلس الإدارة بالتشكّل: العمل نما إلى نحو ثلاثة أضعاف حجمه سنة مقابل سنة (إذ بلغ إيراد 2025 نحو 2.7 ضعف إيراد 2024)، والربع الرابع هو ذلك العمل الأكبر وهو يبلغ ذروة موسم الأعياد المعتادة.</p>\n<h2 id=\"sec-4\" tabindex=\"-1\">الخطوة 4: اختبر التفسيرات الشائعة</h2>\n<p>كل تفسير يحصل على رقم محدّد:</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\">df </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\">df </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> df[df[</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\">].copy()</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">df[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"quarter\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> df[</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>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">first_q </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> df.groupby(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"customer_id\"</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\">].min().dt.to_period(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"Q\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">).rename(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"first_quarter\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">df </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> df.merge(first_q, </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\">\"customer_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\">\"many_to_one\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">df[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"customer_type\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> (df[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"quarter\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">==</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> df[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"first_quarter\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">]).map({</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">True</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"new\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </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\">\"returning\"</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\">q4 </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> df[df[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"quarter\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">==</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"2025Q4\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">]</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">total </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> q4[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"revenue\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">].sum()</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(q4.groupby(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"customer_type\"</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().div(total).round(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">3</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">))</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">bf </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> q4[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"coupon_code\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">==</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"BLACKFRIDAY25\"</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\">\"Black Friday coupon orders:\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, bf.sum(), </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"| share of Q4 revenue:\"</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\">(q4.loc[bf, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"revenue\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">].sum() </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">/</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> total, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">3</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\">(q4.groupby(q4[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_date\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">].dt.month)[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"revenue\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">].sum().round(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">0</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><strong>الجمعة السوداء؟</strong> استُخدم الكوبون <code dir=\"ltr\">BLACKFRIDAY25</code> في 69 طلبًا من الربع الرابع، جلبت 8.4% من إيراد الربع. كان نوفمبر ضخمًا، 75,334 دولارًا، لكن معظمه جاء من طلبات بلا ذلك الكوبون. ساعدت الجمعة السوداء، لكنها لا تفسّر القفزة. <strong>عملاء جدد؟</strong> العملاء الذين قدّموا أول طلب لهم جلبوا 36% من إيراد الربع الرابع، بينما جاء 64% من عملاء عائدين، وهؤلاء أيضًا مصدر ثلثي الزيادة البالغة 66,302 دولار على الربع الثالث. القفزة تقوم في معظمها على قاعدة عملاء قائمة ظلّت تنمو وتعود. <strong>سلال أكبر؟</strong> استُبعد هذا في الخطوة 2. <strong>زيادة الأسعار؟</strong> دخلت الزيادة بنسبة 5% حيّز التنفيذ في مارس 2025، فهي ترفع الربعين الثالث والرابع بالتساوي ولا تفسّر شيئًا من التغيّر بينهما. <strong>خطأ في البيانات؟</strong> لم تجد فحوص الخطوة 1 مكرّرات ولا طلبات يتيمة؛ والخطر الوحيد المفتوح هو الـ 8% التي لم تُسلَّم بعد.</p>\n<figure class=\"diagram\"><svg class=\"diagram-svg\" focusable=\"false\" viewBox=\"0 0 700 200\" role=\"img\" aria-labelledby=\"l-pda-5-3-t1\"><defs><marker id=\"arrow-l-pda-5-3-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-3-t1\">خمس خطوات متتالية: التعريف والفحص، والتفكيك، والمقارنة بالعام الماضي، واختبار التفسيرات، والاستنتاج. وتحت كل خطوة اكتشافها: البيانات نظيفة و 8 بالمئة لم تُسلَّم؛ الطلبات زادت 98 بالمئة وقيمة الطلب انخفضت 8 بالمئة؛ في 2024 كانت قفزة الربع الرابع 73 بالمئة أيضًا؛ كوبونات الجمعة السوداء 8 بالمئة والعملاء العائدون 64 بالمئة؛ ذروة موسمية لعمل نما إلى نحو ثلاثة أضعاف حجمه.</title>\n  <rect class=\"d-box\" x=\"10\" y=\"20\" width=\"124\" height=\"50\" rx=\"10\"/><text class=\"d-label-strong\" x=\"72\" y=\"50\" text-anchor=\"middle\">افحص</text>\n  <rect class=\"d-box\" x=\"148\" y=\"20\" width=\"124\" height=\"50\" rx=\"10\"/><text class=\"d-label-strong\" x=\"210\" y=\"50\" text-anchor=\"middle\">فكّك</text>\n  <rect class=\"d-box\" x=\"286\" y=\"20\" width=\"124\" height=\"50\" rx=\"10\"/><text class=\"d-label-strong\" x=\"348\" y=\"50\" text-anchor=\"middle\">العام الماضي</text>\n  <rect class=\"d-box\" x=\"424\" y=\"20\" width=\"124\" height=\"50\" rx=\"10\"/><text class=\"d-label-strong\" x=\"486\" y=\"50\" text-anchor=\"middle\">اختبر الأفكار</text>\n  <rect class=\"d-box-success\" x=\"562\" y=\"20\" width=\"128\" height=\"50\" rx=\"10\"/><text class=\"d-label-strong\" x=\"626\" y=\"50\" text-anchor=\"middle\">استنتج</text>\n  <path class=\"d-arrow\" d=\"M134 45 L146 45\" marker-end=\"url(#arrow-l-pda-5-3-1)\"/>\n  <path class=\"d-arrow\" d=\"M272 45 L284 45\" marker-end=\"url(#arrow-l-pda-5-3-1)\"/>\n  <path class=\"d-arrow\" d=\"M410 45 L422 45\" marker-end=\"url(#arrow-l-pda-5-3-1)\"/>\n  <path class=\"d-arrow\" d=\"M548 45 L560 45\" marker-end=\"url(#arrow-l-pda-5-3-1)\"/>\n  <text class=\"d-label-muted\" x=\"72\" y=\"100\" text-anchor=\"middle\">نظيفة؛</text><text class=\"d-label-muted\" x=\"72\" y=\"120\" text-anchor=\"middle\">8% لم تُسلَّم</text>\n  <text class=\"d-label-muted\" x=\"210\" y=\"100\" text-anchor=\"middle\">الطلبات زادت 98%</text><text class=\"d-label-muted\" x=\"210\" y=\"120\" text-anchor=\"middle\">AOV انخفض 8%</text>\n  <text class=\"d-label-muted\" x=\"348\" y=\"100\" text-anchor=\"middle\">قفزة الربع الرابع</text><text class=\"d-label-muted\" x=\"348\" y=\"120\" text-anchor=\"middle\">في 2024: 73%</text>\n  <text class=\"d-label-muted\" x=\"486\" y=\"100\" text-anchor=\"middle\">الكوبون 8%؛</text><text class=\"d-label-muted\" x=\"486\" y=\"120\" text-anchor=\"middle\">العائدون 64%</text>\n  <text class=\"d-label-muted\" x=\"626\" y=\"100\" text-anchor=\"middle\">ذروة موسمية</text><text class=\"d-label-muted\" x=\"626\" y=\"120\" text-anchor=\"middle\">لعمل بلغ 2.7 ضعف</text>\n</svg><figcaption>من السؤال إلى الإجابة: كل خطوة تضيّق التفسير</figcaption></figure>\n<h2 id=\"sec-5\" tabindex=\"-1\">الخطوة 5: اكتب الإجابة</h2>\n<p>لا يكتمل التحليل إلا حين يستطيع شخص آخر تكراره في اجتماع. ابدأ بالاستنتاج، وقدّم الأدلة بالأرقام، واختم بالتحفّظات:</p>\n<blockquote>\n<p><strong>كان إيراد الربع الرابع من 2025 (146,825 دولارًا، بزيادة 82% على الربع الثالث) في الأساس ذروة موسم الأعياد المعتادة لدى Cartwheel، لعمل بلغ حجمه 2.7 ضعف ما كان عليه قبل سنة.</strong> جاء الارتفاع من حجم الطلبات (زيادة 98%)، لا من حجم الطلب (انخفض متوسط قيمة الطلب 8%)، مع عملاء نشطين أكثر بنسبة 54% طلبوا بوتيرة أعلى. وكان الربع الرابع أعلى بنسبة 73% من الثالث في 2024 أيضًا. أنتج العملاء العائدون 64% من إيراد الربع الرابع؛ وأنتجت طلبات كوبون الجمعة السوداء 8.4%. <strong>التحفّظات:</strong> 8% من إيراد الربع الرابع من طلبات لم تُسلَّم بعد، وانخفاض قيمة الطلب جزء منه ثمن خصومات الربع الرابع، التي زادت على ثلاثة أضعاف مقارنةً بالربع الثالث (5,581 دولارًا مقابل 1,615).</p>\n</blockquote>\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>“كانت الجمعة السوداء” تناسب التوقيت، وكانت ستُقبل في معظم الاجتماعات. لكنها تفسّر 8% من الربع. العادة التي تحميك هي أن تمنح كل تفسير رقمًا، وتسأل ما الحصة التي يفسّرها من التغيّر، قبل أن تكتبه في شريحة عرض.</p>\n</aside>\n<p>في التمرين تعيد بناء التفكيك بالكود. والدرس الأخير يحوّل هذا التحليل إلى شيء تستطيع إعادة تشغيله في الربع القادم دون أن تبدأ من الصفر.</p>\n","toc":[{"id":"sec-1","text":"الخطوة 1: عرّف المقياس وافحص البيانات","level":2},{"id":"sec-2","text":"الخطوة 2: فكّك التغيّر","level":2},{"id":"sec-3","text":"الخطوة 3: ضعه بجانب العام الماضي","level":2},{"id":"sec-4","text":"الخطوة 4: اختبر التفسيرات الشائعة","level":2},{"id":"sec-5","text":"الخطوة 5: اكتب الإجابة","level":2}],"takeaways":["ابدأ سؤال العمل بكتابة المقياس وتعريفه الدقيق، ثم افحص البيانات التي تغذّيه قبل أي تحليل.","فكّك المجموع إلى محرّكاته (الإيراد = الطلبات × متوسط قيمة الطلب؛ والطلبات = العملاء × الطلبات لكل عميل) لترى أيّها تحرّك.","قارن بالفترة نفسها من العام الماضي وبالنمط الموسمي، كي لا تظنّ ذروة طبيعية اختراقًا.","اختبر كل تفسير شائع برقم محدّد، وقل كم من التغيّر يستطيع تفسيره وكم لا يستطيع.","الإجابة المكتملة استنتاج قصير، والأدلة التي خلفه، والتحفّظات التي قد تغيّره."],"further":[{"title":"Group by: split-apply-combine","url":"https://pandas.pydata.org/docs/user_guide/groupby.html"},{"title":"Time series / date functionality","url":"https://pandas.pydata.org/docs/user_guide/timeseries.html"}],"quiz":[{"q":"<p>ارتفع إيراد الربع الرابع بنسبة 82% على الثالث، بينما ارتفعت الطلبات 98% وانخفض متوسط قيمة الطلب 8%. ما الذي قاد الزيادة؟</p>","options":[{"text":"سلال أكبر، لأن الإيراد نما","why":"انخفض متوسط قيمة الطلب، فصارت السلال أصغر قليلًا. نما الإيراد رغم ذلك لا بسببه."},{"text":"عدد الطلبات، الذي نما أسرع من الإيراد نفسه","why":"صحيح. الإيراد = الطلبات × متوسط قيمة الطلب. تضاعف الطلبات تقريبًا مع قيمة طلب أقل قليلًا يعطي ارتفاعًا بنسبة 82%."},{"text":"زيادات الأسعار","why":"حدثت زيادة الأسعار بنسبة 5% في مارس 2025، وتنطبق على الربعين الثالث والرابع بالتساوي، فلا تستطيع تفسير النمو بينهما."},{"text":"يستحيل الحكم دون رسم بياني.","why":"التفكيك يجيب رقميًا؛ والرسم البياني سيُظهر الشيء نفسه."}],"answer":1},{"q":"<p>كان الربع الرابع من 2024 أيضًا أعلى بنسبة 73% من الربع الثالث من 2024. لماذا يهم ذلك في قصة الربع الرابع من 2025؟</p>","options":[{"text":"لا يهم؛ 2024 بيانات قديمة.","why":"العام السابق هو أفضل خط أساس لعمل موسمي؛ وتجاهله هو ما يحوّل الذروات الطبيعية إلى عناوين زائفة."},{"text":"يثبت أن أرقام 2025 خاطئة.","why":"نمط متشابه في السنتين يدعم بيانات 2025 بدلًا من أن يشكّك فيها."},{"text":"يبيّن أن بيانات 2024 مكرّرة في 2025.","why":"المستويات مختلفة جدًا (52,537 مقابل 146,825)؛ وحده الشكل الموسمي يتكرّر."},{"text":"معظم القفزة من الربع الثالث إلى الرابع نمط موسمي يحدث كل عام، فقفزة 2025 أكبر من المعتاد بقليل فقط.","why":"صحيح. ارتفاع بنسبة 82% مقابل ارتفاع معتاد قدره نحو 73% مفاجأة متواضعة فوق ذروة متوقّعة."}],"answer":3},{"q":"<p>63 طلبًا من الربع الرابع قيمتها 11,321 دولارًا ما زالت <code dir=\"ltr\">processing</code> أو <code dir=\"ltr\">shipped</code> في نهاية البيانات. كيف يجب أن يتعامل التقرير معها؟</p>","options":[{"text":"أدرِجها، واذكر كتحفّظ أن نحو 8% من إيراد الربع الرابع لم يُسلَّم بعد وقد ينكمش إذا أُلغي بعضه.","why":"صحيح. إنها تستوفي تعريف الإيراد اليوم؛ وتسمية الخطر تتيح للقرّاء الحكم عليه."},{"text":"استبعدها بصمت احتياطًا.","why":"هذا يغيّر تعريف الإيراد دون إخبار أحد، ويجعل الربع الرابع يبدو أصغر مما في كل تقرير آخر."},{"text":"احسبها مرتين، لأنها ستُسلَّم في يناير.","why":"الطلب يُحسب مرة واحدة، في الفترة التي قُدّم فيها، أيًّا كان تاريخ تسليمه."}],"answer":0}],"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\"])\ndf = orders.merge(items.groupby(\"order_id\", as_index=False)[\"revenue\"].sum(), on=\"order_id\", validate=\"one_to_one\")\ndf = df[df[\"status\"] != \"cancelled\"].copy()\ndf[\"quarter\"] = df[\"order_date\"].dt.to_period(\"Q\")\n\n# 1. q: one row per quarter with columns revenue, orders, customers (distinct), aov\nq = None\n\n# 2. Growth from 2025Q3 to 2025Q4 as fractions (0.5 = +50%), each rounded to 3 decimals\nrevenue_growth = None\norders_growth = None\naov_growth = None\n\n# 3. Share of 2025Q4 revenue from orders with the BLACKFRIDAY25 coupon, rounded to 3 decimals\nbf_share = None\n\n# 4. Q3-to-Q4 revenue growth in 2024, rounded to 3 decimals (the seasonal baseline)\ngrowth_2024 = 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\"])\ndf = orders.merge(items.groupby(\"order_id\", as_index=False)[\"revenue\"].sum(), on=\"order_id\", validate=\"one_to_one\")\ndf = df[df[\"status\"] != \"cancelled\"].copy()\ndf[\"quarter\"] = df[\"order_date\"].dt.to_period(\"Q\")\n\nq = df.groupby(\"quarter\").agg(\n    revenue=(\"revenue\", \"sum\"),\n    orders=(\"order_id\", \"count\"),\n    customers=(\"customer_id\", \"nunique\"),\n)\nq[\"aov\"] = q[\"revenue\"] / q[\"orders\"]\n\nchange = q.loc[\"2025Q4\"] / q.loc[\"2025Q3\"] - 1\nrevenue_growth = round(change[\"revenue\"], 3)\norders_growth = round(change[\"orders\"], 3)\naov_growth = round(change[\"aov\"], 3)\n\nq4 = df[df[\"quarter\"] == \"2025Q4\"]\nbf_share = round(q4.loc[q4[\"coupon_code\"] == \"BLACKFRIDAY25\", \"revenue\"].sum() / q4[\"revenue\"].sum(), 3)\n\ngrowth_2024 = round(q.loc[\"2024Q4\", \"revenue\"] / q.loc[\"2024Q3\", \"revenue\"] - 1, 3)\nprint(change.round(3), bf_share, growth_2024)\n","checks":[{"id":"table","test":"isinstance(q, pd.DataFrame) and len(q) == 8 and {'revenue', 'orders', 'customers', 'aov'} <= set(q.columns)"},{"id":"q4-row","test":"int(q.iloc[-1]['orders']) == 642 and int(q.iloc[-1]['customers']) == 282 and abs(float(q.iloc[-1]['aov']) - 228.70) < 0.01"},{"id":"growth","test":"abs(float(revenue_growth) - 0.823) < 0.0011 and abs(float(orders_growth) - 0.981) < 0.0011"},{"id":"aov-growth","test":"abs(float(aov_growth) - (-0.080)) < 0.0011"},{"id":"bf","test":"abs(float(bf_share) - 0.084) < 0.0011"},{"id":"baseline","test":"abs(float(growth_2024) - 0.727) < 0.0011"}],"title":"فكّك قفزة الربع الرابع","prompt":"<p>في <code dir=\"ltr\">df</code> صف لكل طلب غير ملغى، مع <code dir=\"ltr\">revenue</code> و<code dir=\"ltr\">customer_id</code> و<code dir=\"ltr\">coupon_code</code> وفترة <code dir=\"ltr\">quarter</code>. ابنِ <code dir=\"ltr\">q</code>، صفًا لكل ربع، بالأعمدة <code dir=\"ltr\">revenue</code> (المجموع) و<code dir=\"ltr\">orders</code> (العدد) و<code dir=\"ltr\">customers</code> (العملاء المختلفون) و<code dir=\"ltr\">aov</code> (الإيراد ÷ الطلبات). ثم احسب نمو الإيراد والطلبات ومتوسط قيمة الطلب من الربع الثالث إلى الرابع من 2025 ككسور (<code dir=\"ltr\">revenue_growth</code> و<code dir=\"ltr\">orders_growth</code> و<code dir=\"ltr\">aov_growth</code>)، وحصة إيراد الربع الرابع من 2025 التي جاءت من طلبات <code dir=\"ltr\">BLACKFRIDAY25</code> (<code dir=\"ltr\">bf_share</code>)، ونمو الإيراد من الربع الثالث إلى الرابع في 2024 (<code dir=\"ltr\">growth_2024</code>). قرّب كل رقم من هذه الأرقام الخمسة إلى 3 منازل عشرية.</p>\n","hints":["<code dir=\"ltr\">df.groupby(&quot;quarter&quot;).agg(revenue=(&quot;revenue&quot;, &quot;sum&quot;), orders=(&quot;order_id&quot;, &quot;count&quot;), customers=(&quot;customer_id&quot;, &quot;nunique&quot;))</code>، ثم أضِف <code dir=\"ltr\">aov</code> كعمود.","صفوف <code dir=\"ltr\">q</code> مسمّاة بالفترات؛ و<code dir=\"ltr\">q.loc[&quot;2025Q4&quot;] / q.loc[&quot;2025Q3&quot;] - 1</code> تعطي نمو كل الأعمدة دفعة واحدة.","لحصة الكوبون، صفِّ الربع الرابع من 2025 أولًا، ثم اقسم إيراد طلبات الكوبون على كل إيراد الربع الرابع."],"explanation":"<p>قسمة صف من <code dir=\"ltr\">q</code> على صف آخر تحسب كل معدّلات النمو في خطوة واحدة، لأن للصفين الأعمدة نفسها. الإيراد ‎+82.3% = الطلبات ‎+98.1% مع متوسط قيمة الطلب ‎−8.0% ‏(1.981 × 0.920 ≈ 1.823): التفكيك دقيق تمامًا، ولهذا هو خطوة أولى بهذه القوة. كانت طلبات كوبون الجمعة السوداء 8.4% من إيراد الربع الرابع، ويبيّن خط الأساس في 2024 أن الربع الرابع كان في العام السابق أيضًا أعلى بنحو 73% من الثالث. معًا تدعم هذه الأرقام استنتاج الدرس: ذروة موسمية طبيعية لعمل أكبر بكثير، يقودها حجم الطلبات.</p>\n","checkLabels":{"table":"في <code dir=\"ltr\">q</code> 8 أرباع مع revenue و orders و customers و aov","q4-row":"يعرض الربع الرابع من 2025 ما مجموعه 642 طلبًا و282 عميلًا ومتوسط قيمة طلب قدره 228.70","growth":"نما الإيراد 82.3% والطلبات 98.1%","aov-growth":"انخفض متوسط قيمة الطلب 8.0%","bf":"طلبات كوبون الجمعة السوداء 8.4% من إيراد الربع الرابع","baseline":"كان النمو من الربع الثالث إلى الرابع في 2024 بنسبة 72.7%"}},"words":735,"readMinutes":4}