از گذشته، کسبه بازار توجه بسیاری به تصمیم گیری در رابطه با خرید تعداد و نوع کالای مورد نیاز مردم داشته اند و با توجه به تجربه و شناخت بازار محصولات پرفروش را برای خرید انتخاب می کردند. ولی امروزه باتوجه به گستردگی اجناس، توسعه شهرها، حجم وسیع داده های موجود و بی تجربه بودن کسبه نوپا، تحلیل بازار و استخراج کالاهای مورد نیاز بازار با سیستم های کامپیوتری که توانایی تصمیم گیری نزدیک به تصمیم گیری های انسانی را دارا هستند مورد توجه قرار گرفته است. این استقبال به دلیل سهولت استفاده و عدم نیاز به تجربه چندین ساله به وجود آمده است.به زبان ساده تر می توان گفت، داده های زیادی موجود است ولی دانش (دانش تصمیم گیری و تصمیم سازی) وجود ندارد. دانش تصمیم گیری و تصمیم سازی با استفاده از داده کاوی (Data Mining) بدست می آید.
درحال حاضر داده کاوی مهمترین فن آوری جهت بهره برداری موثر از داده های حجیم است و اهمیت آن رو به افزونی است. تخمین زده می شود که مقدار داده ها در جهان هر 20 ماه تقریبا دو برابر شود. در یک تحقیق که برروی گروه های تجاری بسیار بزرگ در جمع آوری داده ها صورت گرفت، مشخص شد که 19 درصد از این گروه ها داری پایگاه داده هایی با سطح بیشتر از 50 گیگابایت می باشند و 59 درصد آنها انتظار دارند که در آینده نزدیک در این سطح قرار بگیرند.
در صنایعی مانند کارت های اعتباری، ارتباطات، فروشگاه های زنجیره ای، خرید های الکترونیکی، اسکنرهای بارکد خوان، هر روزه داده های زیادی تولید و ذخیره می شوند و افزایش سرعت کامپیوترها باعث به وجود آمدن الگوریتم هایی شده است که قدرت تجزیه و تحلیل بسیار بالایی دارند بدون اینکه محدودیتی در زمینه ظرفیت و سرعت کامپیوترها داشته باشند. (Knowledge Discovery in Database – KDD)
داده کاوی کمک می کند تا سازمان های (هرنوع سازمانی اعم از سازمان های دولتی، فروشگاه ها، بانک ها و …) با کاوش بروی داده های یک سیستم، الگوهای و رفتارهای آینده را کشف و پیش بینی کنند تا مدیران و ذینفعان بتوانند تصمیم گیری های بهتری انجام دهند. داده کاوی با استفاده از تحلیل وقایع گذشته، رفتار آینده سیستم یا مشتری را پیش بینی می کند و به سوالاتی جواب می دهد که پاسخ آنها در گذشته ممکن نبوده و یا به زمان زیادی نیاز داشته است.
به منظور داده کاوی از ابتدا تا انتها مراحل زیر باید طی شود:
داده کاوی با استفاده از نرم افزار دشت
تحلیل داده های یک فروشگاه که از نرم افزار دشت استفاده می کند:
پیشرفت تکنولوژی، فروشگاه های خرده فروشی را قادر ساخته است که حجم زیادی از داده های مربوط به خرید هریک از مشتریان را که آن را با نام “سبد کالا” یا “فاکتور خرید” می شناسیم، جمع آوری و ذخیره کنند. داده های موجود در سبد کالا نشان دهنده خرید هر مشتری در یک زمان خاص است. هر مشتری خریدهای مجزایی در کمیّت ها و زمان های متفاوتی انجام می دهد. با تجزیه و تحلیل سبد کالا، بینشی برای خرده فروشان بوجود می آید که مشخص می شود چه کالاهایی با هم خریداری شده اند و با این اطلاعات می توان رفتار مشتریان را در خرید کالا پیش بینی کرد و این فرایند به مدیر فروشگاه در تهیه، سازماندهی و چیدمان کالاها در فروشگاه کمک می کند.
بعد از بیان تعاریف کلی در بخش های قبلی، در این بخش به بررسی و تحلیل یک فروشگاه نمونه که از نرم افزار فروشگاهی دشت استفاده می کند می پردازیم و با یک نمونه کاربردی نشان می دهیم که چگونه می توان با تحلیل فاکتور خریدهای ثبت شده در رابطه با تامین کالا، طراحی و چیدمان قفسه ها و ویترین فروشگاه تصمیم گیری کنیم.
1) جمع آوری داده ها:
بعد از توافقی که با فروشگاه موردنظر صورت گرفت، درحدود 17000 فاکتورِ ثبت شده، شامل 35000 کالای خریداری شده از پایگاه داده فروشگاه در اختیار قرار گرفت (به جهت توافق عدم افشای اطلاعات مشتری، در جداول زیر نام کالا حذف شده و بجای آن از کد کالا استفاده شده است). هر ردیف از داده ها که حاوی یک تراکنش است، شامل شش ستون به شرح زیر است:
ستون اول: شماره فاکتور ، ستون دوم: تاریخ، ستون سوم: کد کالا، ستون چهارم نام کالا، ستون پنجم: قیمت هر واحد، ستون ششم: تعداد، ستون هفتم: قیمت کل.
اسکریپت SQL جهت استخراج این گزارش در زیر آمده است:
SELECT [POS].[SaleInvoice].[SaleInvoiceID] AS [شماره فاکتور],
[POS].[SaleInvoice].[Date] AS [تاریخ],
[POS].[Item].[ItemID] AS [کد کالا],
[POS].[Item].[Title] AS [نام کالا],
[POS].[SaleInvoiceItem].[Fee] AS [قیمت واحد],
[POS].[SaleInvoiceItem].[Quantity] AS [تعداد],
[POS].[SaleInvoiceItem].[Price] AS [قیمت کل]
FROM [POS].[Item] INNER JOIN [POS].[SaleInvoiceItem] ON [POS].[Item].[ItemID] = [POS].[SaleInvoiceItem].[ItemRef]
INNER JOIN [POS].[SaleInvoice] ON [POS].[SaleInvoiceItem].[SaleInvoiceRef] = [POS].[SaleInvoice].[SaleInvoiceID]
WHERE [POS].[SaleInvoiceItem].[Quantity] > 0 AND
[POS].[SaleInvoiceItem].[SaleInvoiceRef]
IN (SELECT [CountRef].[SaleInvoiceRef] AS [FactorID]
FROM [POS].[SaleInvoiceItem] AS [CountRef]
WHERE [CountRef].[Quantity] > 0
GROUP BY [CountRef].[SaleInvoiceRef]
HAVING Count([CountRef].[SaleInvoiceRef]) > 1)
2) آماده سازی داده ها:
در ابتدا، داده های جمع آوری شده از بانک اطلاعات فروشگاه را در نرم افزار اکسل وارد می کنیم. بعد از بررسی، فاکتورهای دارای فیلدهای خالی و فاکتورهای شامل تنها یک قلم کالا را حذف می کنیم (البته این پاک سازی در اسکریپت SQL درنظر گرفته شده است). بعد از این پاک سازی تعداد 9302 فاکتور شامل 26264 قلم کالای خریداری شده باقی مانده است. (اسکریپت قسمت قبل بخشی از این فیلترینگ را انجام می دهد.)
در مرحله بعدی آماده سازی، جهت مشخص شدن کالاهایی که با یکدیگر در یک فاکتور خریداری شده اند و با فرض اینکه هر فاکتور شماره مخصوص خود را دارد، (شماره فاکتور تکرار پذیر نباشد)، سطرهای فایل اکسل را براساس شماره فاکتور مرتب می کنیم. در این مرحله مشخص می شود که چه کالا هایی با کالای دیگر خریداری شده است.
باتوجه به تعداد زیاد کالا های موجود، جهت حذف کالاهایی که تاثیر کمی در تصمیم گیری دارند و بهینه کردن فرایند تصمیم گیری، ابتدا تعداد فروش هر کالا را مشخص می کنیم. در این گزارش سه ستون قرار دارد:
ستون اول: کد کالا، ستون دوم: عنوان کالا، ستون سوم: تعداد فروش و این گزارش را بر اساس تعداد فروش مرتب می کنیم.
اسکریپت استخراج این گزارش را در زیر مشاهده می کنید:
SELECT [POS].[Item].[ItemID] AS [کد کالا],
[POS].[Item].[Title] AS [عنوان کالا],
COUNT([POS].[SaleInvoiceItem].[ItemRef]) AS [تعداد فروش ]
FROM [POS].[SaleInvoiceItem] INNER JOIN [POS].[Item] ON [POS].[Item].[ItemID] = [POS].[SaleInvoiceItem].[ItemRef]
GROUP BY [POS].[Item].[ItemID], [POS].[SaleInvoiceItem].[ItemRef], [POS].[Item].[Title]
ORDER BY COUNT([POS].[SaleInvoiceItem].[ItemRef]) DESC
با توجه به تعدد کالا های فروش رفته (240 قلم کالا) و برای سادگی درک مفهوم این الگوریتم، کالاهای با فروش کمتر از 500 عدد فروش را حذف می کنیم. (با اسکریپت زیر) :
SELECT [POS].[Item].[ItemID] AS [کد کالا],
[POS].[Item].[Title] AS [عنوان کالا],
COUNT([POS].[SaleInvoiceItem].[ItemRef]) AS [تعداد فروش ]FROM [POS].[SaleInvoiceItem] INNER JOIN [POS].[Item] ON [POS].[Item].[ItemID] = [POS].[SaleInvoiceItem].[ItemRef]GROUP BY [POS].[Item].[ItemID], [POS].[SaleInvoiceItem].[ItemRef], [POS].[Item].[Title]HAVING COUNT([POS].[SaleInvoiceItem].[ItemRef]) > 500
ORDER BY COUNT([POS].[SaleInvoiceItem].[ItemRef]) DESC
کد کالا | تعداد فروش |
170 | 4,322 |
180 | 2,933 |
184 | 2,489 |
172 | 2,269 |
387 | 1,317 |
386 | 1,158 |
182 | 1,154 |
199 | 952 |
227 | 812 |
239 | 659 |
422 | 592 |
169 | 583 |
224 | 554 |
باتوجه به تغییر محدوده محاسباتی ما، می بایست گزارش لیست فاکتورها نیز بر اساس این محدوده تغییر کند. بنابر این با تغییر اسکریپت SQL مرحله اول، به شکل زیر تعداد کالاهای موجود در گزارش از حدود 35000 رکورد به حدود 15000 رکورد می رسد.
SELECT [POS].[SaleInvoice].[SaleInvoiceID] AS [شماره فاکتور],
[POS].[SaleInvoice].[Date] AS [تاریخ],
[POS].[Item].[ItemID] AS [کد کالا],
[POS].[Item].[Title] AS [نام کالا],
[POS].[SaleInvoiceItem].[Fee] AS [قیمت واحد],
[POS].[SaleInvoiceItem].[Quantity] AS [تعداد],
[POS].[SaleInvoiceItem].[Price] AS [قیمت کل]FROM [POS].[Item] INNER JOIN [POS].[SaleInvoiceItem] ON [POS].[Item].[ItemID] = [POS].[SaleInvoiceItem].[ItemRef]INNER JOIN [POS].[SaleInvoice] ON [POS].[SaleInvoiceItem].[SaleInvoiceRef] = [POS].[SaleInvoice].[SaleInvoiceID]WHERE [POS].[SaleInvoiceItem].[Quantity] > 0 AND
[POS].[SaleInvoiceItem].[SaleInvoiceRef]IN (SELECT [CountRef].[SaleInvoiceRef] AS [FactorID]FROM [POS].[SaleInvoiceItem] AS [CountRef]WHERE [CountRef].[Quantity] > 0
GROUP BY [CountRef].[SaleInvoiceRef]HAVING Count([CountRef].[SaleInvoiceRef]) > 1)
AND [POS].[Item].[ItemID] IN (SELECT [tmpitem].[ItemID] AS [tmpitemid]FROM [POS].[SaleInvoiceItem] AS [tmpfactor] INNER JOIN [POS].[Item] AS [tmpitem]ON [tmpitem].[ItemID] = [tmpfactor].[ItemRef]GROUP BY [tmpitem].[ItemID]HAVING COUNT([tmpfactor].[ItemRef]) > 500)
در مرحله بعد “نسبت هر سبد کالای شامل هر کالای فروش رفته را به کل سبد کالا ها محاسبه می کنیم و نام آن را پشتیبان کالا می گذاریم. تعداد کل سبد کالاها به معنای تعداد کل فاکتورهایی است که در محاسبات ما شرکت می کنند و با استفاده از اسکریپت زیر قابل استخراج است: (برای مثال ما عدد 8009 بدست آمده است)
SELECT COUNT([FactorID]) AS [تعداد فاکتورهای فیلتر شده]FROM (SELECT [POS].[SaleInvoice].[SaleInvoiceID] AS [FactorID]FROM [POS].[Item] INNER JOIN [POS].[SaleInvoiceItem] ON [POS].[Item].[ItemID] = [POS].[SaleInvoiceItem].[ItemRef]INNER JOIN [POS].[SaleInvoice] ON [POS].[SaleInvoiceItem].[SaleInvoiceRef] = [POS].[SaleInvoice].[SaleInvoiceID]WHERE [POS].[SaleInvoiceItem].[Quantity] > 0 AND
[POS].[SaleInvoiceItem].[SaleInvoiceRef]IN (SELECT [CountRef].[SaleInvoiceRef] AS [FactorID]FROM [POS].[SaleInvoiceItem] AS [CountRef]WHERE [CountRef].[Quantity] > 0
GROUP BY [CountRef].[SaleInvoiceRef]HAVING Count([CountRef].[SaleInvoiceRef]) > 1)
AND [POS].[Item].[ItemID] IN (SELECT [tmpitem].[ItemID] AS [tmpitemid]FROM [POS].[SaleInvoiceItem] AS [tmpfactor] INNER JOIN [POS].[Item] AS [tmpitem]ON [tmpitem].[ItemID] = [tmpfactor].[ItemRef]GROUP BY [tmpitem].[ItemID]HAVING COUNT([tmpfactor].[ItemRef]) > 500)
GROUP BY [POS].[SaleInvoice].[SaleInvoiceID]) AS tmpFactorCount
سپس با استفاده از فایل اکسل که نتایج اجرای تمام اسکریپت های خود را در آن قرار داده ایم و باتوجه به کد کالا، تعداد فاکتورهایی که هر کالا در آن فروش رفته است را استخراج و سپس عدد پشتیبان ان را با فرمول زیر بدست می آوریم:
پشتیبان = تعداد فاکتورهای شامل کالای موردنظر / تعداد کل فاکتورها
برای مثال: عدد پشتیبان کالای بستنی قیفی با کد کالای 386 برابراست با تعداد فاکتورهای شامل بستنی قیفی (556) تقسیم بر تعداد کل فاکتورها(8009) که برابر 0.0482 می شود. به همین ترتیب مقدار پشتیبان تمامی کالاهای مورد نظر را استخراج می کنیم و سپس بر اساس مقدار پشتیبان و بصورت نزولی مرتب می کنیم. که نتیجه را در جدول زیر مشاهده می کنید.
کد کالا | تعداد فروش | تعداد کل فاکتورها | تعداد فاکتورهای شامل این کالا | مقدار پشتیبان |
170 | 4,322 | 8,009 | 3,509 | 0.4381 |
180 | 2,933 | 8,009 | 2,311 | 0.2886 |
184 | 2,489 | 8,009 | 1,961 | 0.2448 |
172 | 2,269 | 8,009 | 1,949 | 0.2434 |
199 | 952 | 8,009 | 901 | 0.1125 |
182 | 1,154 | 8,009 | 882 | 0.1101 |
387 | 1,317 | 8,009 | 782 | 0.0976 |
227 | 812 | 8,009 | 692 | 0.0864 |
239 | 659 | 8,009 | 504 | 0.0629 |
224 | 554 | 8,009 | 457 | 0.0571 |
386 | 1,158 | 8,009 | 386 | 0.0482 |
169 | 583 | 8,009 | 347 | 0.0433 |
422 | 592 | 8,009 | 308 | 0.0385 |
همانطور که مشاهده می کنید، ترتیب کالاها براساس تعداد فروش و براساس مقدار پشتیبان با یکدیگر متفاوت است و این به معنای تاثیر فروش یک کالا بر کالای دیگر است.
در مرحله بعد می بایست مشخص کنیم با هرکالا چه کالاهای دیگری به فروش رفته است. برای مثال تعداد فاکتورهایی که در آنها به همراه کالای کد 170، کالای کد 180 نیز خریداری شده است برابراست با 1491و این مقادیر را می بایست در این مرحله برای تمامی جفت کالاهایی که با هم خریداری شده اند استخراج کرد. سپس برای تمامی ترکیبات آنها (170 با 196 و 180 و …) این کار را انجام می دهیم و میدانیم که تمامی این کالاها برای ما اهمیت ندارند، به همین دلیل یک مقدار حداقل برای پشتیبان تعیین می کنیم و تمامی فاکتورهایی که کالاهایی با مقداری پشتیبان کمتر از حداقل تعیین شده قرار داردند را حذف می کنیم. در این مثال، مقدار برابر 0.1 قرار می دهیم و مابقی را نادیده می گیریم. در جدول بالا کالاهایی را که در محاسبات شرکت می دهیم با رنگ سبز و کالاهای حذف شده را با رنگ قرمز نمایش می دهیم.
سپس همانطور که مقدار پشتیبان هرکالا را محاسبه کردیم پشتیبان فاکتورهایی که کالای مقدم و تالی همزمان در آنها قرار دارد را محاسبه می کنیم.
کدکالای مقدم | کد کالای تالی | تعداد فاکتورهای شامل مقدم | تعداد فاکتورهای شامل مقدم و تالی | تعداد کل فاکتورها | مقدار پشتیبان تالی و مقدم |
170 | 180 | 3,509 | 1491 | 8,009 | 0.1862 |
170 | 184 | 3,509 | 648 | 8,009 | 0.0809 |
170 | 172 | 3,509 | 356 | 8,009 | 0.0444 |
170 | 199 | 3,509 | 396 | 8,009 | 0.0494 |
170 | 182 | 3,509 | 458 | 8,009 | 0.0572 |
180 | 184 | 2,311 | 266 | 8,009 | 0.0332 |
180 | 172 | 2,311 | 36 | 8,009 | 0.0045 |
180 | 199 | 2,311 | 191 | 8,009 | 0.0238 |
180 | 182 | 2,311 | 68 | 8,009 | 0.0085 |
184 | 172 | 1,961 | 851 | 8,009 | 0.1063 |
184 | 199 | 1,961 | 189 | 8,009 | 0.0236 |
184 | 182 | 1,961 | 133 | 8,009 | 0.0166 |
172 | 199 | 1,949 | 322 | 8,009 | 0.0402 |
172 | 182 | 1,949 | 242 | 8,009 | 0.0302 |
199 | 182 | 901 | 86 | 8,009 | 0.0107 |
در مرحله بعد می بایست مقدار اهمیت یا وابستگی کالای مقدم و تالی را با فرمول زیر محاسبه می کنیم.
مقدار اهمیت (کالای مقدم و کالای تالی) = پشتیبان مقدم و تالی / (پشتیبان تالی * پشتیبان مقدم)
نتیجه را در جدول زیر مشاهده می کنید.
کدکالای مقدم | کد کالای تالی | مقدار اهمیت |
170 | 180 | 1.4726 |
170 | 184 | 0.7542 |
170 | 172 | 0.4169 |
170 | 199 | 0.4609 |
170 | 182 | 1.1852 |
180 | 184 | 0.4701 |
180 | 172 | 0.0640 |
180 | 199 | 0.3375 |
180 | 182 | 0.2672 |
184 | 172 | 1.7833 |
184 | 199 | 0.3936 |
184 | 182 | 0.6159 |
172 | 199 | 0.6748 |
172 | 182 | 1.1275 |
199 | 182 | 0.8667 |
باتوجه به اینکه قبل از محاسبه مقدار اهمیت و جهت کاهش حجم محاسبات، فیلترهای زیادی برروی کالاها و فاکتورها قرار دادیم، مقادیر اهمیت به دست آمده را به دو دسته تقسیم می کنیم:
با استفاده از مراحل فوق به همراه اسکریپت های SQL و اکسل، می توانید با تقریب بسیار خوبی رفتار مشتری را در رابطه با خرید چند قلم کالا پیش بینی کنید و با فیلتر کردن فاکتورهای براساس تاریخ میتوانید رفتارهای فصلی را نیز پیشبینی کنید.
البته همان طور که مشاهده کردید این مقاله تنها خرید دو کالای همزمان را به عنوان نمونه بررسی کرد و جهت بررسی مقدار اهمیت خرید چند کالا به همراه یک کالا، می توانید با استفاده از مراحل مطرح شده ولی با فرایند محاسباتی بیشتر و پیچیده تر سایر رفتارها را نیز پیش بینی کنید.