ليس سرا أن طرق التعلم الآلي بدأت في اختراق مجالات مختلفة من الأعمال في كل مكان ، وتحسين وتحسين وحتى إنشاء عمليات تجارية جديدة. أحد المجالات الهامة هو مسألة تحديد سعر السلع ، وهنا ، مع وجود بيانات كافية ، تساعد MO على القيام بما كان من الصعب تحقيقه سابقًا - لاستعادة منحنى الطلب متعدد العوامل من البيانات. بفضل منحنى الطلب المستعاد ، أصبح من الممكن بناء أنظمة تسعير ديناميكية تسمح بتحسين الأسعار اعتمادًا على الغرض من التسعير - لزيادة الإيرادات أو الربح. هذه المقالة عبارة عن تجميع لأطروحاتي ، حيث تم تطوير نموذج التسعير الديناميكي LSTM-ANN واختباره عمليًا لمدة 4 أسابيع لأحد سلع بائع التجزئة للسلع المنزلية.
أود أن أشير على الفور إلى أنني لن أفصح في هذه المقالة عن اسم الشركة التي أجريت فيها الدراسة (ومع ذلك ، فهذه إحدى الشركات من القائمة الموجودة في المبنى) ، بدلاً من ذلك سأقوم ببساطة بتسميتها - بائع التجزئة.
الخلفية
هناك شركة رائدة في الأسعار في سوق التجزئة للسلع المنزلية ، ليروي ميرلين. تسمح لهم أحجام مبيعات هذه الشبكة بالحفاظ على استراتيجية السعر الأدنى لمجموعة المنتجات بأكملها ، مما يؤدي إلى ضغط الأسعار على اللاعبين الآخرين في السوق.
إيرادات وأرباح تجار التجزئة الرئيسيين في سان بطرسبرج اعتبارًا من 31 ديسمبر 2017

في هذا الصدد ، يستخدم بائع التجزئة نهجًا مختلفًا في التسعير:
- يتم تحديد السعر على أدنى مستوى من المنافسين ؛
- قيود على السعر من أدناه: سعر الشراء + الحد الأدنى للأقساط يعكس التكاليف التقريبية لكل وحدة من السلع.
هذا النهج هو مزيج من طريقة التسعير المكلفة والتسعير المنافس. ومع ذلك ، فهي ليست مثالية - فهي لا تأخذ في الاعتبار طلب المستهلك بشكل مباشر.
نظرًا لحقيقة أن نموذج التسعير الديناميكي يأخذ في الاعتبار العديد من العوامل (الطلب ، الموسمية ، العروض الترويجية ، أسعار المنافسين) ، ويسمح لك أيضًا بفرض قيود على السعر المقترح (على سبيل المثال ، من أسفل - تغطية التكاليف) ، من المحتمل أن يتخلص هذا النظام من كل جانب واحد و مساوئ طرق التسعير الأخرى.
البيانات
للدراسة ، قدمت الشركة بيانات من يناير 2015 إلى يوليو 2017 (920 يومًا / 131 أسبوعًا). تضمنت هذه البيانات:
- مبيعات نهارية ، بما في ذلك عطلات نهاية الأسبوع ، لـ 470 منتجًا (16 مجموعة منتجات) ؛
- أيام الترقيات في المتجر ؛
- الأيام التي تم فيها توفير خصومات على البضائع ؛
- أسعار كل منتج من المنتجات البالغ عددها 470 ؛
- البيانات اليومية حول عدد الشيكات عبر الشبكة في سان بطرسبرج ؛
- أسعار المنافسين الرئيسيين لمعظم المنتجات الـ 470 (تم تصوير البيانات مرة واحدة في الأسبوع).
بالإضافة إلى هذه البيانات ، أضفت أيضًا متغيرات وهمية للتقويم:
- موسم السنة (خريف / شتاء / صيف / ربيع) ؛
- الشهر
- ربع
- يوم الأسبوع ؛
- العطل
أيضا ، متغيرات الطقس:
- هطول الأمطار - دمية
- درجة الحرارة
- انحراف درجة الحرارة عن المتوسط في الموسم.
من خلال التحليل المباشر للمبيعات اليومية للسلع ، وجدت ما يلي:
تم بيع حوالي 30 ٪ فقط من السلع طوال الوقت ، أو تم بيع جميع السلع الأخرى في وقت لاحق من عام 2015 ، أو تم إزالتها من البيع في وقت سابق عن عام 2017 ، مما أدى إلى تقييد كبير على اختيار السلع للبحث وتجربة الأسعار. هذا يقودنا أيضًا إلى حقيقة أنه بسبب التغيير المستمر للسلع في خط المتجر ، يصبح من الصعب إنشاء نظام متكامل لتسعير السلع ، ومع ذلك ، هناك بعض الطرق للتغلب على هذه المشكلة ، والتي سيتم مناقشتها لاحقًا.
نظام التسعير
لإنشاء نظام لتوصيات الأسعار للسلع للفترة الزمنية القادمة على أساس نموذج يتنبأ بالطلب ، توصلت إلى المخطط التالي:

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

تم تقسيم السلسلة الزمنية الكاملة للمبيعات على الرسم البياني إلى متوسط المبيعات لهذه الفترة ، حتى لا تكشف عن القيم الحقيقية ، ولكن للحفاظ على المظهر.
بشكل عام ، الكثير من الضجيج ، في حين أن هناك انفجارات واضحة - هذا هو إجراء الترقيات على مستوى الشبكة.
نظرًا لأنها كانت أول تجربة لي في بناء نماذج تعلُّم الآلة ، كان عليّ قضاء الكثير من الوقت في العديد من المقالات والوثائق المختلفة ، بحيث نجح الأمر في النهاية في تحقيق شيء.
قائمة أولية بالعوامل التي من المفترض أن تؤثر على المبيعات:
- بيانات عن المبيعات اليومية للسلع الأخرى من هذه المجموعة ، إجمالي المبيعات في المجموعة بالقطع وعدد الشيكات لجميع المتاجر في سان بطرسبرج مع التأخر 1 ، 2 ، 3 ، 7 ، 14 ، 21 ، 28 ؛
- بيانات عن أسعار السلع الأخرى من المجموعة ؛
- نسبة سعر المنتج الذي تم فحصه مع أسعار سلع أخرى من المجموعة ؛
- أدنى سعر بين جميع المنافسين (تم أخذ البيانات مرة واحدة في الأسبوع ، وافترضت أن هذه الأسعار ستكون صالحة للأسبوع القادم) ؛
- نسبة سعر المنتج محل البحث بأقل سعر من المنافسين ؛
- تباطؤ المبيعات حسب المجموعة (بالقطع) ؛
- متوسط بسيط ومؤشر القوة النسبية على أساس التخلف عن مبيعات سلع المجموعة ، إجمالي المبيعات في المجموعة وعدد الشيكات.
ما مجموعه 380 عامل. (2.42 ملاحظة لكل عامل). وبالتالي ، كانت مشكلة قطع العوامل غير المهمة عالية حقًا ، ومع ذلك ، ساعد XGBoost على التعامل مع هذا ، مما أدى إلى خفض عدد العوامل إلى 23 (40 ملاحظة لكل عامل).
أفضل نتيجة يمكنني تحقيقها باستخدام البحث عن الجشع هي كما يلي:

R ^ 2-adj = 0.4 في عينة الاختبار
تم تقسيم البيانات إلى عينات تدريب واختبار دون خلط (لأن هذه سلسلة زمنية). كمقياس ، استخدمت المؤشر R ^ 2 المعدل بوعي ، حيث كان يجب تقديم النتائج النهائية للعمل قبل اللجنة ، بما في ذلك. يتكون من ممثلي الأعمال ، لذلك ، تم استخدامه كأشهر وأسهل الفهم.
قللت النتائج النهائية من إيماني بالنجاح ، لأن نتيجة R ^ 2-adj 0.4 تعني فقط أن نظام التنبؤ لن يكون قادرًا على التنبؤ بالطلب في اليوم التالي بشكل جيد ، ولن تختلف التوصية بالسعر كثيرًا عن نظام "الإصبع في السماء".
بالإضافة إلى ذلك ، قررت التحقق من مدى فعالية استخدام XGBoost للتنبؤ بالمبيعات اليومية لمجموعة من السلع (في النكات) والتنبؤ بعدد الشيكات بشكل عام عبر الشبكة.
المبيعات حسب مجموعة المنتجات:

R ^ 2-adj = 0.71
الشيكات:

R ^ 2-adj = 0.86
أعتقد أن سبب عدم إمكانية التنبؤ ببيانات المبيعات لمنتج معين واضح من الرسوم البيانية المقدمة - الضجيج. تبين أن المبيعات الفردية للسلع أكثر عرضة للصدفة ، لذلك لم تكن طريقة بناء الانحدار فعالة. في الوقت نفسه ، من خلال تجميع البيانات ، أزلنا تأثير العشوائية وحصلنا على قدرات تنبؤية جيدة.
من أجل التأكد أخيرًا من أن التنبؤ بالطلب ليوم واحد مقدمًا هو تمرين لا طائل منه ، استخدمت نموذج SARIMAX (حزمة statsmodels لـ python) للمبيعات اليومية:


في الواقع ، لا تختلف النتائج بأي شكل من الأشكال عن تلك التي تم الحصول عليها باستخدام XGBoost ، مما يشير إلى أن استخدام نموذج معقد في هذه الحالة ليس له ما يبرره.
في الوقت نفسه ، أود أيضًا أن أشير إلى أنه لا عوامل الطقس XGBoost ولا SARIMAX كانت كبيرة.
بناء النموذج النهائي
كان حل مشكلة جودة التنبؤ هو تجميع البيانات على مستوى أسبوعي. هذا سمح لنا بتقليل تأثير العوامل العشوائية ، ومع ذلك ، قلل بشكل كبير من كمية البيانات التي تمت ملاحظتها: إذا كان هناك 920 بيانات يومية ، فقط بيانات أسبوعية 131. تفاقم الوضع لأن عدد العوامل ظل دون تغيير تقريبًا (تم استبعاد الدمى لأيام الأسبوع) ، ولكن عدد مشاهدات المتغير المستهدف انخفض بشكل كبير.
بالإضافة إلى ذلك ، كانت مهمتي معقدة بسبب حقيقة أنه في ذلك الوقت ، قررت الشركة تغيير المنتج الذي سيتم تطبيق التجربة باستخدام النموذج ، لذلك كان علي تطوير نموذج من الصفر.
حدث تغيير البضائع على البضائع مع موسمية واضحة:

بسبب التحول إلى المبيعات الأسبوعية ، نشأ سؤال منطقي: هل يكفي استخدام نموذج LSTM على الإطلاق مع مثل هذه الكمية الصغيرة من البيانات؟ قررت معرفة ذلك عمليًا ، وقبل كل شيء ، لتقليل عدد العوامل (حتى لو كان ضررًا محتملاً في تقليل المعلومات المهمة). لقد تخلصت من جميع العوامل التي يتم حسابها على أساس تباطؤ المبيعات (المتوسط ، مؤشر القوة النسبية) ، وعوامل الطقس (على البيانات اليومية ، والطقس لا يهم ، والتحول إلى المستوى الأسبوعي ، أكثر من ذلك ، فقد بعض المعنى). بعد ذلك ، استخدمت ، تقليديًا ، XGBoost لقطع عوامل أخرى غير مهمة. في وقت لاحق ، قمت أيضًا بتقسيم عدة عوامل أخرى بناءً على نموذج LSTM ، ببساطة استبعاد العوامل واحدة تلو الأخرى ، وتدريب النموذج مرة أخرى ومقارنة النتائج.
القائمة النهائية للعوامل هي كما يلي:
- نسبة السعر لكل كيلوغرام من المنتج الذي تم فحصه والتمهيدي CERESIT ST 17 10 l.
- نسبة سعر المنتج الذي تم التحقيق فيه والمنتج والمنتج التمهيدي CERESIT ST 17 10 l ؛
- نسبة سعر المنتج الذي تم فحصه والتمهيدي EURO PRIMER 3 l ؛
- نسبة سعر المنتج الذي تم التحقيق فيه والحد الأدنى للسعر من المنافسين ؛
- المتغيرات الوهمية لثلاث ترقيات على مستوى الشبكة ؛
- المتغيرات الوهمية لموسم الربيع والصيف والخريف ؛
- تسجيلات 1-5 مبيعات أسبوعية للمنتج الذي تم التحقيق فيه.
15 عاملاً فقط (9 ملاحظات لكل عامل).
تم كتابة نموذج LSTM النهائي باستخدام Keras ، وتضمن طبقتين مخفيتين (25 و 20 خلية عصبية ، على التوالي) ، وكان المنشط سينيًا.
كود نموذج LSTM النهائي باستخدام Keras:
model = Sequential() model.add(LSTM(25, return_sequences=True, input_shape=(1, trainX.shape[2]))) model.add(LSTM(20)) model.add(Dense(1, activation='sigmoid')) model.compile(loss='mean_squared_error', optimizer='adam') model.fit(trainX, trainY, epochs=40, batch_size=1, verbose=2) model.save('LSTM_W.h5')
النتيجة:


بدت جودة التنبؤ في عينة الاختبار مقنعة تمامًا بالمقياس ، ومع ذلك ، في رأيي ، لم تصل بعد إلى المثالية ، لأنه على الرغم من التحديد الدقيق نوعًا ما لمتوسط مستوى المبيعات ، يمكن للانحرافات في الأسابيع الفردية أن تنحرف قليلاً عن " متوسط "مستوى المبيعات ، والذي أعطى انحرافًا قويًا لتوقعات المبيعات عن الواقع في الأيام الفردية (حتى 50٪). ومع ذلك ، استخدمت هذا النموذج مباشرة للتجربة في الممارسة.
من المثير للاهتمام أيضًا رؤية كيف يبدو منحنى الطلب المستعاد من حيث السعر. للقيام بذلك ، قمت بتشغيل النموذج عبر النطاق السعري ، وبناءً على المبيعات المتوقعة ، قمت ببناء منحنى طلب:

تجربة
كل أسبوع ، قدمت الشبكة بيانات المبيعات للأسبوع السابق في سان بطرسبرج ، بالإضافة إلى الأسعار من المنافسين. استنادًا إلى هذه البيانات ، قمت بتحسين السعر لتحقيق أقصى قدر من الأرباح المتوقعة ، قال السعر الذي يجب أن تحدده الشبكة للأسبوع المقبل ، وهو ما فعلته. استمر هذا لمدة 4 أسابيع (تم الاتفاق على المدة مع بائع التجزئة).
تم تحقيق أقصى قدر من الربح مع قيود: الحد الأدنى للسعر كان سعر الشراء + الإصلاح. نظير تكلفة إضافية ، كان الحد الأقصى للسعر محدودًا بسعر برايمر من نفس الشركة المصنعة ، فقط في عبوة 10 لتر.
يتم عرض النتائج التجريبية في الجداول أدناه (يتم تقسيم جميع الأرقام حسب قيمة معينة حتى لا تكشف عن القيم المطلقة):
التنبؤ بالمبيعات:

توقع الربح:

من أجل تقييم تأثير نظام التسعير الجديد على المبيعات ، قارنت المبيعات للفترة نفسها فقط للسنوات السابقة.
نتائج ملخص الأسبوع الرابع:

ونتيجة لذلك ، نحصل على صورة ذات شقين: تنبؤات غير واقعية تمامًا عن المبيعات ، ولكن في الوقت نفسه ، نتائج إيجابية بحتة على المؤشرات الاقتصادية (من حيث الربح والإيرادات).
التفسير ، في رأيي ، هو أنه في هذه الحالة ، النموذج الذي يتنبأ بالمبيعات بشكل غير صحيح ، مع ذلك ، فهم الفكرة الصحيحة - مرونة السعر لهذا المنتج كانت أقل من 1 ، مما يعني أنه يمكن زيادة السعر ، دون خوف من انخفاض المبيعات الذي شهدناه (بقيت المبيعات في الوحدات عند نفس المستوى تقريبًا كما كان في العام السابق والعام الماضي).
ولكن لا تنس أن 4 أسابيع هي فترة قصيرة وأن التجربة أجريت على منتج واحد فقط. على المدى الطويل ، تؤدي زيادة أسعار البضائع في المتجر ، كقاعدة عامة ، إلى انخفاض مبيعات المتجر ككل. لتأكيد حدسي حول هذا الأمر ، قررت باستخدام XGBoost ، للتحقق مما إذا كان لدى المستهلكين "ذاكرة" لأسعار الفترات السابقة (إذا كانت في الماضي أكثر تكلفة "بشكل عام" من المنافسين ، يذهب المستهلك إلى المنافسين). على سبيل المثال ما إذا كان متوسط سعر المجموعة للأشهر 1 و 3 و 6 الأخيرة سيتم توفيره للمبيعات من قبل مجموعات المنتجات.

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