دست به کد

پیش‌بینی قیمت خودرو بر اساس دیتاست منتشر شده سایت دیوار

اصل این مقاله به قلم جناب سعید میرشکاری در سایت ویرگول منتشر شده است و سایت مهندسی داده با هدف جمع آوری مطالب مفید حوزه علم داده به معرفی و بازنشر آن پرداخته است.

این نوشته برای فارسی زبانانی است که می‌خواهند «یادگیری ماشینی» و «تحلیل داده‌ها» و مراحل کلی حل یک مساله را در غالب مثالی ساده مرور کنند و ممکن است هنوز تجربه‌ی تخصصی زیادی از مباحث ریاضی و برنامه‌نویسی لازم در این زمینه نداشته باشند. عده‌ی زیادی هم هستند که ممکن است راجع به یادگیری ماشینی چیزهایی شنیده باشند و حدس می‌زنند این روش ها به همراه تکنولوژی‌های زیرساختی جدید در دنیای بزرگ دیجیتال داده‌ها‌ی امروز می‌تواند به رشد کسب و کار آن‌ها در آینده کمک کند. مرور کاربرد‌های قدرتمند تکنیک‌های  یادگیری ماشین و نتیجه‌های سریع و باکیفیت آن در غالب یک مثال ملموس می‌تواند کمکی به این افراد نیز باشد. این مطالب می‌تواند به سایت دیوار و کسب و کار‌های مرتبط با این داده‌ها نیز کمک مستقیم بکند.

امروز سایت کافه‌بازار «دیتاست»ی (مجموعه‌ای مرتب از داده‌ها) از آگهی‌های خرید و فروش در سایت دیوار را منتشر کرد. در این نوشته روی این دیتاست متمرکز خواهیم شد.

توییت : اولین دیتاست #دیوار به امید پر کردن جای خالی یه دیتاست ایرانی در فضای آکادمیک کشور ریلیز شد. این دیتاست شامل حدوداً یک میلیون پست در دیوار هستش. اگر کار جالبی روش انجام دادید بگید که ما هم استفاده کنیم. — Amin Moghaddam (@_m30m) January 31, 2019

 اولین قدم، دیتا : چه داریم؟

اولین قدم در هر مساله‌ی «تحلیل داده‌‌» این است که بررسی کنیم چه داده‌هایی داریم و سعی کنیم تا جایی که امکان دارد آن را از وجوه مختلف بررسی کنیم و بشناسیم. این مرحله در تمام مراحل بعدی علی‌الخصوص اینکه اصولا چه سوالی می‌توان پرسید و چه سوالی جالب\مهم است پرسیده شود و از طریق «تحلیل‌داده‌ها» و «یادگیری ماشینی» پاسخ داده شود، اهمیت ویژه‌ دارد. هر چقدر بیشتر روی این قسمت وقت بگذارید در قدم‌های بعدی راحت‌تر و با آگاهی ‌بیشتر حرکت خواهید کرد. ممکن است در مراحل بعدی حل مساله مجبور شوید دوباره و چند باره به این قدم برگردید. این اصلا غیر طبیعی نیست و در بسیاری موارد لازم است.

این دیتاست حاوی اطلاعات نزدیک به یک میلیون آگهی خرید و فروش سایت دیوار است. در هر آگهی اطلاعات زیر بصورت مجزا و تک‌به‌تک قابل دسترسی می‌‌باشد.

با نگاهی کلی به این مجموعه و طبقه‌بندی های محصولات در آن به‌سرعت می‌توان توزیع نوع محصولاتی که در مورد آن‌ها آگهی‌شده را بصورت زیر نمایش داد:

همانطور که در نمودار بالا مشخص است بیشترین تعداد آگهی‌ها مربوط به «لوازم خانه»(شاخه‌ی مبل و وسائل تزئینی منزل: رنگ سبز) و «وسايل نقلیه‌» (شاخه‌ی ماشین:‌ رنگ خاکستری) می‌باشد.

اگر به دسته بندی‌ جزئی‌تر آن‌ها نیز نگاهی بیاندازیم (تصویر زیر) متوجه می‌شویم دسته‌ی «ماشین‌های سبک» (رنگ قرمز در تصویر پایینی) تعداد زیادی از آگهی‌های این سایت را به‌خود اختصاص داده است (بیشتر از همه‌ی شاخه‌های دیگر) . ضمن آن‌که از جدول بالا نیز می‌دانیم اطلاعات بیشتری از این دسته آگهی جمع‌آوری شده است، مانند سال تولید (عمر خودرو) و مسافت طی شده (کیلومتر، مایلج) که در مورد دسته‌های دیگر موجود نیست. بنابراین به عنوان مثال روی این دسته از آگهی‌ها متمرکز می‌شویم.

قدم اول را در این‌جا متوقف می‌کنیم اما همانطور که اشاره شد این مرحله، مرحله‌ی بسیار مهمی است و جای کنکاش بسیار بیشتری دارد (همانند همه‌ی مراحل بعدی).

قدم دوم: مساله: چه می‌خواهیم؟

بعد از اینکه داده‌هایی که در دسترس داریم را شناختیم و تا حدودی مطالعه کردیم نوبت به آن می‌رسد که بپرسیم چه می‌خواهیم؟ و به‌ دنبال پاسخ دادن به ‌چه پرسش یا تولید کردن چه سرویسی و در جهت چه نیازی هستیم. معمولا حتی با داشتن داده‌هایی محدود مانند مثال داده‌های این یادداشت (آگهی‌های سایت دیوار)، سوال‌های بی‌شماری از تحلیل‌های توصیفی (اینکه چه اتفاقی افتاده؟) گرفته تا واکاوی (اینکه چرا چنین اتفاقی افتاده؟) و پیش‌بینی (چه اتفاقی‌خواهد افتاد؟) و توصیه‌گر (چه‌ کار باید کرد؟) به ذهن می‌آید که اتفاقا برای هرکدام تعداد زیادی الگوریتم و روش‌های تحلیلی در یادگیری ماشینی و تحلیل داده‌ها وجود دارد که پرداختن به همه‌ی آن‌ها از حوصله‌ی این یادداشت خارج است. یک تمرین بسیار جالب حتی می‌تواند تحلیل توضیحات متنی آگهی‌ها از طریق روش‌های زبان‌های طبیعی و داده‌های ترتیبی باشد.

در این مرحله باتوجه به شرایط، سوال‌های مهم تر را پیدا کرده و در اولویت قرار می‌دهیم. در این یادداشت من سعی کرده ام بدانم آیا میتوانم با داشتن مسافت طی‌ شده ماشین و سال تولید  و شهری که آگهی در آن منتشر شده، قیمت ماشین را با تقریب خوبی حدس بزنم یا خیر؟

اگر بتوان با داده‌های موجود مدلی ساخت که با آن بتوان  با  دقت قابل قبولی این قیمت ماشین را تخمین زد، این یکی از سرویس‌های داده‌محوری است که می‌تواند بلافاصله در سایت دیوار یا سایت‌های  مشابه جهت کمک به خریداران و فروشندگان جهت قیمت‌گذاری استفاده شود.

قدم سوم: حل مساله:‌چگونه مساله‌ را حل کنیم؟

 این مرحله قسمت اصلی کار و در عین حال یکی از سریع‌ترین مراحل کار است که معمولا از قسمت ها‌ی دیگر کمتر طول می‌کشد (گول عریض طویل تر بودن این بخش را نخورید!) و ممکن است برای بسیاری جای سوال و تعجب باشد. این به دلیل آن است که بسیاری از الگوریتم‌هایی که به حل مسا‌له‌ی ما کمک می‌کند به راحتی از طریق کتابخانه‌های زبان‌های برنامه‌نویسی مانند آر و پایتون در دسترس همگان است. اگر نیازی نداشته باشید  تغییر بنیادینی در این الگوریتم ها بدهید یا الگوریتم کاملا جدیدی را برنامه‌نویسی کنید، استفاده از این کتابخانه ها بسیار راحت و سریع است. نکته‌ی قابل تاکید این است که اگرچه این الگوریتم ها به آسانی و سرعت قابل دسترس و استفاده است اما بدون فهمیدن و درک عمیقی از چگونگی کارکرد آن‌ها، به احتمال خیلی زیاد به سرعت دچار مشکل خواهید شد. بنابراین نکته اساسی این است که مطمئن شوید منطق الگوریتمی که استفاده می‌کنید را فهمیده اید.

برای این مساله‌ی خاص من از الگوریتم بسیار معروفی بنام «رندوم فارست» از یک کتابخانه‌ی پایتون بسیار معروفتر بنام «اس-کی-لرن» استفاده کرده‌ام. توجه کنید که من برای هر برند ماشین یک مدل جداگانه درست می‌کنم که منطقی هم به نظر می‌رسد. در مراحل زیر توضیح داده ام چگونه این کار را در پایتون انجام داده‌ام. شما برای دنبال کردن و اجرا کردن کُد‌های زیر نیاز دارید پایتون را روی ماشین خود نصب کنید که اتفاقا رایگان و بسیار راحت است. با یک جستجوی ساده در اینترنت می‌توانید مراحل کار را در بیاورید.

قدم سوم خود شامل پنج مرحله‌ی کوچک‌تر می‌شود:

یک- خواندن دیتا:

دیتا در قالب‌های بی‌شماری می‌آید، اما در قالب این یادداشت، با تقریبِ خوبی، همه‌ی آن‌ها را می‌توان به فرمت ساده‌ی یک (یا چندین) فایل به فرمت سی-اس-وی تبدیل کرد، مانند همین مثال که به همین فرمت است

Python

دو- تمیزکاری دیتا:

Python

سه- دستکاری کردن ستون‌های دیتا (فیچر انجینیرینگ):

در بسیاری موارد ممکن است بخواهید یا لازم باشد تغییراتی در شکل داده‌های ورودی به مدلی که می‌خواهید بسازید و استفاده کنید انجام دهید یا حتی آنها را با هم به شکل خاصی ترکیب کنید و ستون‌های جدیدی بسازید که قبلا وجود نداشت.

در این مثال چون من  می‌خواهم از تابعی استفاده کنم که ورودی به شکل کتگوریکال (غیرعددی) نمی‌پذیرد از ترفند معروفی استفاده می‌کنم که برای هر شهر (که طبیعتا متغیر غیرعددی است) ستون جدیدی می‌سازد و اگر آگهی در آن شهر بود برای ستونِ آن شهر مقدار عددی غیر صفر قرار می‌دهد:

Python

چهار- دسته بندی دیتا به دو دسته‌ی: یادگیری و آزمایش:

در این مرحله داده ها را بصورت تصادفی به دو دسته‌ تقسیم میکنم، یکی دسته‌ ی بزرگتر (معمولا حدود هفتاد تا هشتاد درصد از کل داده‌های موجود) برای استفاده در «یادگیری» ماشین و دیگری قسمت کوچتری (بیست تا سی درصد باقی‌مانده) ( را که مدل با آن آموزش ندیده و بنابراین هرگز ندیده و داده‌ی تازه محسوب می‌شود) به منظور «آزمایش» و تعیین دقت مدل آموزش داده شده در شرایط جدید:

Python
Python

پنج- اجرا کردن الگوریتم یادگیری ماشینی:

در اینجا الگوریتم معروف «رندوم فارست» با پارامتر‌های پیش‌فرض:

Python

در این مرحله مدل ما آماده است! ورودی این مدل همانطور که دیدیم «مسافت طی شده» و «سال تولید» و «شهر انتشار آگهی» است و خروجی مدل «قیمت تخمینی خودرو» است. جدول زیرچند نمونه از تخمین قیمت خودرو پژو ۲۰۶ توسط این مدل را نشان می‌دهد.

توجه کنید که قیمت های تخمینی بالا برای مقایسه با داده‌های خارج از این دیتاست علی‌الخصوص برای مقایسه قیمت روزخودرو  دربازار، مقایسه‌ی مناسبی نیست به علت آن‌که قیمت خودرو در طی‌سال گذشته تغییرات عمده داشته است که به دلیل آن‌که در این دیتاست تاریخ و سال آگهی‌ها دردسترس نیست، این مورد قابل تمایز و تصحیح نیست.

قدم چهارم- آزمایش و اعتبارسنجی مدل

درست است که ما مدل را در مرحله‌ی قبل ساختیم و اکنون مُدلی داریم که می‌توانیم به وسیله‌ی آن قیمت خودرو را تخمین بزنیم، اما نمی‌دانیم این مدل تا چه اندازه دقیق و بنابراین تا چه اندازه قابل اعتماد است. آیا این مدل، مدل خوبی است، یا خیر؟ و اگر خوب است، چقدر خوب است؟ برای این کار از دسته‌ی کوچک‌تر داده‌ها که قبلا آماده کردیم (ولی تا اینجا استفاده نکردیم) کمک می‌گیریم (دسته‌ی آزمایش). به این ترتیب که ورودی های آن دسته را به مدل می‌دهیم (خروجی را که قیمت باشد پیش خودمان نگه می‌داریم و به مدل نشان نمی‌دهیم، بنابراین مدل هیچ اطلاع قبلی از قیمت این خودروهای جدیدی که تا بحال ندیده ندارد) و از مدل می‌خواهیم که برای همه‌ی خودرو های موجود در دسته‌ی آزمایش قیمتی پیش‌بینی کند، سپس نتیجه را با قیمت‌های واقعی‌ای که از قبل می‌دانیم مقایسه می‌کنیم.

 پژو ۲۰۶ - مقایسه‌ی قیمت تخمینی (توسط مدل) و قیمت واقعی (در آگهی) (هر نقطه نماینده‌ی یک آگهی است)
پژو ۲۰۶ – مقایسه‌ی قیمت تخمینی (توسط مدل) و قیمت واقعی (در آگهی) (هر نقطه نماینده‌ی یک آگهی است)

نتیجه برای مثال بالا به شکل زیر است. پیش‌بینی‌های مدلی که ساختیم با قیمت‌های واقعی‌ که در سایت آگهی شده بیشتر از ۸۵ درصد همبستگی دارد که عدد نسبتا بالایی است. برای بازسازی نتایج این مرحله می‌توانید کد زیر را اجرا کنید:

Python

در نمودار زیر می‌توانید میزان اهمیت هریک از پارامتر‌هایی که در مدلمان استفاده کردیم را نیز ببینید. همانطور که مشخص است فاکتور اصلی در نرخ خودروها «سال تولید» و پس از آن «مسافت طی شده» (یا همان «مایلج») است. در ضمن اینکه شهر محل انتشار آگهی (شهر محل معامله) نقش بسیار تعیین‌کننده‌ای در قیمت خودرو ندارد.

توجه داشته باشید مدل بالا را برای پژو ۲۰۶ ساختیم، که دقت نسبتا خوبی هم داشت. در زیر نمودار همبستگی مشابه آنچه برای پژو ۲۰۶ توضیح داده شد را به ترتیب برای پیکان و پراید صندوق‌دار و پراید هاچ بک ببینید.

پیکان ظاهرا برای تخمین قیمت، هنوز ماشین سختی است! :)))

 پیکان - مقایسه‌ی قیمت تخمینی (توسط مدل) و قیمت واقعی (در آگهی)
پیکان – مقایسه‌ی قیمت تخمینی (توسط مدل) و قیمت واقعی (در آگهی)
پراید صندوق‌دار - مقایسه‌ی قیمت تخمینی (توسط مدل) و قیمت واقعی (در آگهی)راید صندوقدار -
پراید صندوق‌دار – مقایسه‌ی قیمت تخمینی (توسط مدل) و قیمت واقعی (در آگهی)راید صندوقدار –
پراید هاچ‌بک - مقایسه‌ی قیمت تخمینی (توسط مدل) و قیمت واقعی (در آگهی)
پراید هاچ‌بک – مقایسه‌ی قیمت تخمینی (توسط مدل) و قیمت واقعی (در آگهی)


مجتبی بنائی

دانشجوی دکترای نرم‌افزار دانشگاه تهران (yun.ir/smbanaie)، مدرس دانشگاه و فعال در حوزه توسعه نرم‌افزار و مهندسی داده که تمرکز کاری خود را در چند سال اخیر بر روی مطالعه و تحقیق در حوزه کلان‌داده و زیرساخت‌های پردازش داده و تولید محتوای تخصصی و کاربردی به زبان فارسی و انتشار آنها در سایت مهندسی داده گذاشته است. مدیریت پروژه‌های نرم‌افزاری و طراحی سامانه‌های مقیاس‌پذیر اطلاعاتی از دیگر فعالیتهای صورت گرفته ایشان در چند سال گذشته است.

۹ دیدگاه

  1. مثل همیشه معرکه بود مهندس واقعا تا آخر متن میخکوب شدم .
    هر از گاهی از scale و … تجربیاتتونم بنویسید عالی میشه بیشتر لذت میبریم بازم خیلی ممنوووووووووووووووووووووووووووووووووووووووووووووووووووووووووووووووون

      1. دکتر جان بازنشر هم باشه عاااااااااااااالی بود وب سایت شما تنها سایت ایرانیه که همیشه بهش سر میزنم و برخلاف بقیه وب سایت ها مطالبتون آدمو به مانیتور میخکوب میکنه . 

  2. با سلام، ممنون از مطالب خو‌ب‌تون
     
    عذر میخوام این واکاوی اولیه داده یا فاز آشنایی با داده را با چه ابزاری انجام دادن که این نمودار‌ها را به دست آوردن؟

    1. در متن اصلی اشاره ای به ابزار کار نشده است اما معمولا در فاز آمار توصیفی و تحلیل اکتشافی از کتابخانه Matplotlib پایتون و کتابخانه های مشابه مانند Bokeh استفاده می کنند. در آدرسی که در متن مقاله برای اجرای آنلاین در کتابچه های پایتون آژور مایکروسافت ذکر شده است (کادر سبز رنگ)، یکی از این نمودارها با Bokeh رسم شده است.

  3. سلام الان اگه بخوایم ورودی بدیم بهش باید چیکار کینم؟مثلا مشخصات مورد نیاز ماشین رو بدیم بعد یه قیمت تخمینی بده.میشه لطفا راهنمایی کنین

  4. عرض ادب ممکنه داده و کدها رو روی گیتهاب هم قرار دهید؟
    سپاس

    1. این مقاله فقط بازنشر مقاله اصلی بود و به کدها و داده ها دسترسی نداریم.
      خود دیتاست دیوار از این آدرس قابل مشاهده است :‌
      https://phanous.ir/divar-ads-dataset/و کدها هم تا حد زیادی در مقاله گنجانده شده است و میتوانید آنها را مستقیما بر روی دیتاست فوق اجرا کنید.

  5. بسیار عالی
    فقط اگه از فیلدهای موثر دیگری که در قیمت تاثیر گذار بودند مانند “چند لکه رنگ” استفاده میشد مدل دقیقتری به دست میومد

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.

دکمه بازگشت به بالا