در هر صنعتی بیشینهکردن سود یه معنیای داره. مثلا جدیدا توی صنعت هواپیمایی متوجه شدن که بیشینه کردن سود با هواپیماهای کوچیکتر مثل بوئینگ ۷۳۷ با راهروهای تنگتر و مسافر کمتر خیلی راحتتره تا با هواپیماهای بزرگ مثل بوئینگ ۷۷۷. دلیل این قضیه خیلی جالبه. شاید فکر بکنین هواپیماهای گندهتر = مسافر بیشتر = سود بیشتر.
اما در عمل هزینههای نگهداری هواپیماهای پهنتر بیشتره، تعداد دفعاتی که در روز میشه ازش استفاده کرد هم خیلی کمتره. یه هواپیمای نازکتر و کوچیکتر میتونه در روز پنج شیش سفر کوتاهتر داشته باشه و در مجموع مسافر بیشتری رو جابهجا کنه.
یا مثلا شاید فکر کنین که بیشنیه کردن سود برای یه پلتفرم پخش آنلاین فیلم و سریال توی اینه که عناوین اختصاصی بیشتری داشته باشه. یه سریال خیلی خفن داشته باشه که در هیچ پلتفرم دیگهای نیست یا یه فیلم که برای دیدنش همه فقط باید اشتراک شما رو خریداری کنن. منتها تجربه این چند سال جنگ بین پلتفرمهای مختلف نشون داده که یه پلتفرم عمومی که روی شخصیسازی تجربه برای کاربرهاش میچرخه و درضمن انتخابهای عمومی بیشتری توی هر ژانر سینمایی/سریالی داره، در کل بهتر عمل میکنه. آدما حاضر نیستن فقط برای یه سریال خیلی خفن پیش شما بمونن وقتی توی یه پلتفرم دیگه انتخابای بیشتری دارن.
در نهایت منظورم اینه که واقعا توی هر صنعتی بیشینه کردن سود یه معنی داره. فکر کردن به اینکه چطوری میشه توی صنعت شما سود رو بیشینه کرد یه کار پیچیدهست که با تجربه و مدلهای آماری و ریاضیاتی و داشتن دادههای تاریخی به حد کافی ممکنه.
ولی یه سری چیزا همیشه ثابته. مثلا داشتن یه تخمین قابل اتکا از تقاضای بازار همیشه میتونه کار شما رو برای فکر کردن به بیشینهسازی سود راحتتر بکنه. اینکه من بدونم چقدر محصولم تقاضا داره میتونه بهم کمک کنه RIOC یا بازگشت سرمایهم رو بالا ببرم.
صنعتی که من توش کار میکنم هتلداری و مهماننوازیه. توی این صنعت معمولا حیاتیترین موضوع اینه که اقامتگاه یا اتاق هتل شما چه درصدی پره، چه روزهایی خالیه و مهمونهای بلندمدت و کوتاهمدتش چه نسبتی به هم دارن.
کاری که من قرار بود بکنم (یا در واقع تقاضایی که از سمت تیم فروش از من شد) این بود که سیستمی طراحی کنم که یه تخمین قابل اتکا از تقاضای بازار توی آینده نزدیک بهمون بده. این تخمین قرار بود به تیم فروش کمک کنه که بتونه قیمتگذاری استاتیک و ثابت رو بذاره کنار و با قیمتگذاری دینامیک، نرخ اشغال اقامتگاههای خودش رو بالا ببره.
قیمتگذاری دینامیک یعنی من بتونم از قبل بفهمم کی باید قیمت یه اقامتگاه رو بیارم پایین و کی این قیمت رو ببرم بالا. توی صنعت هتلداری یه سری تخمین آماری از این موضوع وجود داره. همون چیزی که مثلا به اسم های سیزن high season یا فصل پرطرفدار میشناسیم. مثلا تابستون برای شمال ایران های سیزن محسوب میشه. ولی برای جنوب ایران لو سیزن low season محسوب میشه. در عوض زمستون برای جنوب ایران مثل کیش و قشم های سیزن محسوب میشه که طبیعیه. حالا فرض کنین این ابرالگوهای فصلی رو داریم. میدونیم با تغییرات فصلی یه سری تغییرات در قیمتگذاری باید اتفاق بیفته.
بهترین روش یا best practice قیمتگذاری این رو بهمون میگه که بهتره توی ذهنمون باشه که توی لو سیزن قراره اتاقهای خالی بیشتری داشته باشیم. برای همین قیمت رو باید تا حد مشخصی پایین بیاریم. احتمالا وقت خوبیه که توی این دوره اگه نیازه تعمیرات اساسی و تأسیساتی انجام بدیم.
حالا فرض کنین قراره یه سیستم پیشبینی یکم جزئینگرتر داشته باشیم که مثلاً توی هفتههای آینده با توجه به فاکتورهای مختلف مثل نرخ اشغال فعلی، دادههای تاریخی، مناسبتهای تقویمی و چیزایی از این دست بهمون بگه مثلا هفته آینده که فلان مناسبت مذهبی یا تاریخیه و تعطیلاته، قیمت رو باید چقدر پایین بیاریم یا بالا ببریم.
به نظر من رسید بهترین راه اینه که بتونیم با اتکا به دادههای تاریخی یا همون Historical Data و با استفاده از تحلیل از سری زمانی تولید شده از داده تاریخی، در هر لحظه یه پیشبینی از تقاضای بازار داشته باشیم. این پیشبینی شاید یکم سخت باشه ولی اگه به اندازه کافی داده تاریخی داشته باشیم میتونیم یه سری الگو ازشون بیرون بکشیم. این الگوها در نهایت میتونن مثل یه فاکتور توی هر معادلهای وارد بشن و وزن خودشون رو اعمال کنن.
فرض کنیم تقاضای بازار در زمان t و در سطح قیمت p با تابعی مثل d(p,t) قابل نمایش باشه. در این صورت، هدف بهینهسازی تابع زیر نسبت به پارامتر p (سطح قیمت) خواهد بود:
درآمد= قیمت*تقاضا یا به عبارتی I(t,p)=d(p,t)*p
بهینهسازی این تابع با مشتقگیری و روشهای معمول بهینهسازی قابل انجامه و به این ترتیب، با قیمتگذاری دینامیک، میتونیم در هر لحظه از زمان، پیشبینیای از سطح قیمتی داشته باشیم که درآمد رو بیشینه میکنه. مشکل اصلی اما قاعدتا توی پیدا کردن این تابع تقاضاست. پیدا کردن تابع تقاضا دو مرحله داره. مرحله اول، با توجه به همگنی زمانی تقریبی داده، پیدا کردن تابع تقاضای مستقل از قیمت و وابسته به زمان و پیدا کردن تابع تقاضای مستقل از زمان وابسته به قیمته. ضرب این دو تابع، تقریب مناسبی از تابعی که به دنبالش هستیم رو به ما میده. تابع مستقل از زمان تابعیه که روشهای پیدا کردن اون متفاوتن و برای توضیحش یه مقاله جداگانه نیاز داریم. اینجا میخوایم فقط یه تابع پیدا کنیم که وابسته به زمان و مستقل از قیمت باشه. یه همچین تابعی نه فقط توی قیمتگذاری دینامیک، بلکه برای ایجاد یه سیستم اعلام هشدار واسه شناسایی وضعیتها و روزهای خطرناک هم مفیده.
یعنی چی؟ یعنی میتونیم پیشگویی کنیم که چه روزایی ممکنه وضعیت خالی بودن اتاقهای یه هتل هشداردهنده باشه. براش از قبل برنامهریزی کنیم که تبلیغ مناسب بریم. یا اصن تبلیغ نریم و پولمون رو دور نریزیم. چون هرقدر هم در این روز تبلیغات کنیم، با توجه به شرایط زمانی، بازده پایینه.
راهی که ما برای پیدا کردن این تابع تقاضا پیدا کردیم، با فرضهای سادهسازی خیلی راحت قابل انجامه و نتایج غیرمنتظره و جالبی هم داره. در قدم اول، دادههای تعداد سفارشهای دریافتی در هر روز را با روشهایی مثل میانگین متحرک تحلیل کردیم و شاخصهای کلان آماری این داده رو به دست آوردیم. بعد به شناسایی outlier ها یا دادههای پرت یا مشکوک پرداختیم. دادههای پرت از ۳ جنس بودن:
۱. یا یه توجیه متادیتایی (فرادادهای) ولی غیرفصلی(مثل خرابی و تعمیرات واحد) برای همچین دادههای خارج از میانگینی وجود داره که در این صورت باید دادهها رو بریزیم دور.
۲. یا به خاطر تصادفات احتمالاتی هستن که به عنوان معیارهای خطا در نظر گرفته میشن.
۳. یا واقعا نشوندهندهی تغییرات فصلی و تقویمی هستن.
به این ترتیب و با توجه به این سه مدل دادههای پرت؛ وقایعی فصلی از مناسبتهای قمری و شمسی، روزهای هفته، تعطیلات رسمی و وقایع خاص مثل شیوع کرونا شناسایی و کدگذاری شدن و براساس همین، وقایع فصلی در کنار تعداد سفارشهای روزهای قبل تا تعداد روز مشخصی (که در اینجا فعلا فرض میکنیم عدد ثابت k باشه)، متغیرهای مستقل یا به اصطلاح فیچرهای مساله یادگیری ماشینی شناسایی شدن.
در مرحله بعد، با توجه به دادههایی که از تعداد روزهای خالی واقعی وجود داشت (متغیر مستقل یا هدف)، از روشهای مختلفی از جمله انواع رگرسیون در رستههای خطی، غیر خطی و GLM و همچنین شبکههای عصبی عمیق چندلایه برای رسیدن به یه پیشبینی از تقاضا در هر روز و مناسبت خاص با توجه به سفارشهای روزهای قبل، استفاده کردیم.
متأسفانه روش شبکههای عصبی به خاطر تعداد پایین دادههای موجود، دچار مشکل Overfitting شد و با اینکه خطا رو مینیمم کرد، ولی وقتی که آزمایشش کردیم، در عمل خطایی بیشتر از اپراتور انسانی داشت که به عنوان متغیری کنترلی تقاضا رو پیشبینی میکرد. ولی روشهای ساده رگرسیونی، از اپراتور انسانی هم پیشبینی بهتر و خطای کمتری داشتن و از قضا پیادهسازیشون هم راحتتره. برای شناسایی میزان k یا میزان look back یا تعداد روزهای قبل از روز هدف که در تابع نهایی استفاده بشه، مقادیر مختلف امتحان شدن و لحظه تغییر علامت elbow curve یا منحنی آرنج به عنوان میزان بهینه k انتخاب شد. به این ترتیب، به یه پیشبینی قابل اتکا با خطایی کراندار برای تقاضای هر روز رسیدیم و با این پیشبینی، میتونیم قیمت بهینه هر روز رو پیشبینی کنیم.
در مرحله بعد احتمالا جالب میشه با جمعآوری دیتای هیستوریکال بیشتر، سراغ روشهای کلاسیک شبکه عصبی هم بریم و البته روشهای معمول سریهای زمانی مثل روش ARIMA یا ARCH رو هم امتحان کنیم. جمعبندی اینکه با بهینهسازی خطای پیشبینی و رسیدن به تابع پیشبین تقاضای جدید، بازه قیمتگذاری دینامیک هم کوچکتر خواهد شد و نهایتا به سیستم اتوماتیکی خواهیم رسید که بتونه حتی در غیاب اپراتور انسانی، قیمتهای مناسب رو خودش تشخیص بده و در سایت بذاره.
همونطور که گفتم هدف اصلی ما این بود که ROIC رو بهبود بدیم. ولی توی مسیر به یه سیستم هشدار هم رسیدیم. این سیستم هشدار الان داره به ما کمک میکنه که هم منابع خودمون رو برای تبلیغات خیلی هدفمندتر خرج کنیم و هم قیمت بهینهای برای هر روزمون داشته باشیم که خطاش از اپراتور انسانی پایینتره.
درسی که من از این قضیه دوست دارم بگیرم اینه که ثبت داده، حتی دادههایی که به ظاهر خیلی ساده و بیاهمیت هستن، میتونن به ما توی بیرون کشیدن الگوهای واقعی و قابل استفاده کمک کنن. برای همین پیشنهاد میکنم ثبت کردن آمارها و دادهها رو خیلی جدی بگیرین. این دادهها میتونن در بلندمدت به شما اطلاعات حیاتیای بدن که از تجربه منحصربهفرد اپراتور انسانی هم مهمتر باشن یا لااقل اون رو به صورت ملموسی قابلاستفادهتر کنن.