داده کاوی

داده کاوی در ارائه محصولات فروشگاهی به کمک بانک اطلاعاتی دشت


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

داده کاوی چیست؟

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

درحال حاضر داده کاوی مهمترین فن آوری جهت بهره برداری موثر از داده های حجیم است و اهمیت آن رو به افزونی است. تخمین زده می شود که مقدار داده ها در جهان هر 20 ماه تقریبا دو برابر شود. در یک تحقیق که برروی گروه های تجاری بسیار بزرگ در جمع آوری داده ها صورت گرفت، مشخص شد که 19 درصد از این گروه ها داری پایگاه داده هایی با سطح بیشتر از 50 گیگابایت می باشند و 59 درصد آنها انتظار دارند که در آینده نزدیک در این سطح قرار بگیرند.

در صنایعی مانند کارت های اعتباری، ارتباطات، فروشگاه های زنجیره ای، خرید های الکترونیکی، اسکنرهای بارکد خوان، هر روزه داده های زیادی تولید و ذخیره می شوند و افزایش سرعت کامپیوترها باعث به وجود آمدن الگوریتم هایی شده است که قدرت تجزیه و تحلیل بسیار بالایی دارند بدون اینکه محدودیتی در زمینه ظرفیت و سرعت کامپیوترها داشته باشند. (Knowledge Discovery in Database – KDD)

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


مراحل داده کاوی:

به منظور داده کاوی از ابتدا تا انتها مراحل زیر باید طی شود:

  1. جمع آوری داده های ثبت شده
  2. پیش پردازی داده و تبدیل به داده های قابل پردازش: در این مرحله داده های جمع آوری شده به داده های تمیز و قابل پردازش می شوند. این مرحله ممکن است تا 60 درصد زمان داده کاوی را دربر بگیرد.
  3. مشخص کردن ویژگی هایی که میخواهیم بر اساس این ویژگی ها داده کاوی انجام شود (برای مثال: چه محصولاتی با هم فروش رفته اند یا تنوع کدام محصول را بیشتر کنیم و ویژگی هایی از این قبیل)
  4. اجرای عملیات داده کاوی و جستجو برای یافتن الگوی مناسب
  5. تفسیر نتایج داده ها استخراج نتیجه تحلیل

داده کاوی


برخی از کاربردهای داده کاوی:

  • خرده فروشی: از کاربردهای رایج داده کاوی، استفاده از آن در خرده فروشی است که می توان به موارد زیر اشاه کرد
    • تعیین الگوهای خرید مشتریان
    • تجزیه و تحلیل سبد خرید بازار
    • پیشگویی میزان خرید مشتریان از طریق پست (فروش اینترنتی)
  • بانکداری:
    • پیش بینی الگوهای کلاه برداری از طریق کارت های اعتباری
    • تشخیص مشتریان ثابت
    • تعیین میزان استفاده از کارت های اعتباری بر اساس گروه های اجتماعی
  • بیمه:
    • تجزیه و تحلیل دعاوی
    • پیشگویی میزان خرید بیمه نامه های جدید توسط مشتریان
  • پزشکی:
    • تعیین نوع رفتار با بیماران و پیشگویی موفقیت اعمال جراجی
    • تعیین میزان موفقیت روش های درمانی در برخورد با بیماری های سخت

 


داده کاوی با استفاده از نرم افزار دشت

تحلیل داده های یک فروشگاه که از نرم افزار دشت استفاده می کند:

پیشرفت تکنولوژی، فروشگاه های خرده فروشی را قادر ساخته است که حجم زیادی از داده های مربوط به خرید هریک از مشتریان را که آن را با نام “سبد کالا” یا “فاکتور خرید” می شناسیم، جمع آوری و ذخیره کنند. داده های موجود در سبد کالا نشان دهنده خرید هر مشتری در یک زمان خاص است. هر مشتری خریدهای مجزایی در کمیّت ها و زمان های متفاوتی انجام می دهد. با تجزیه و تحلیل سبد کالا، بینشی برای خرده فروشان بوجود می آید که مشخص می شود چه کالاهایی با هم خریداری شده اند و با این اطلاعات می توان رفتار مشتریان را در خرید کالا پیش بینی کرد و این فرایند به مدیر فروشگاه در تهیه، سازماندهی و چیدمان کالاها در فروشگاه کمک می کند.

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

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

باتوجه به اینکه قبل از محاسبه مقدار اهمیت و جهت کاهش حجم محاسبات، فیلترهای زیادی برروی کالاها و فاکتورها قرار دادیم، مقادیر اهمیت به دست آمده را به دو دسته تقسیم می کنیم:

  • اگر مقدار اهمیت بزرگتر از یک باشد، آنگاه کالای مقدم و تالی با یکدیگر رابطه مثبت دارند، یعنی اگر مشتری کالای مقدم را بخرد با احتمال (1-مقدار اهمیت) * 100 کالای تالی را خواهد خرید. برای مثال اگر مشتری کالای 184 را بخرد با احتمال (1.7833 – 1) * 100 = 78.33% کالای 172 را خواهد خرید
  • اگر مقدار اهمیت کمتر از یک باشد، آنگاه کالای مقدم و تالی با یکدیگر رابطه منفی دارند، یعنی اگر مشتری کالای مقدم را بخرد با احتمال (مقدار اهمیت) * 100 کالای تالی را نخواهد خرید. برای مثال اگر مشتری کالای 199 را بخرد با احتمال 8667 * 100 = 86.67% کالای 182 را نخواهد خرید.

با استفاده از مراحل فوق به همراه اسکریپت های SQL و اکسل، می توانید با تقریب بسیار خوبی رفتار مشتری را در رابطه با خرید چند قلم کالا پیش بینی کنید و با فیلتر کردن فاکتورهای براساس تاریخ میتوانید رفتارهای فصلی را نیز پیشبینی کنید.

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