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

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


از گذشته، کسبه بازار توجه بسیاری به تصمیم گیری در رابطه با خرید تعداد و نوع کالای مورد نیاز مردم داشته اند و با توجه به تجربه و شناخت بازار محصولات پرفروش را برای خرید انتخاب می کردند. ولی امروزه باتوجه به گستردگی اجناس، توسعه شهرها، حجم وسیع داده های موجود و بی تجربه بودن کسبه نوپا، تحلیل بازار و استخراج کالاهای مورد نیاز بازار با سیستم های کامپیوتری که توانایی تصمیم گیری نزدیک به تصمیم گیری های انسانی را دارا هستند مورد توجه قرار گرفته است. این استقبال به دلیل سهولت استفاده و عدم نیاز به تجربه چندین ساله به وجود آمده است.به زبان ساده تر می توان گفت، داده های زیادی موجود است ولی دانش (دانش تصمیم گیری و تصمیم سازی) وجود ندارد. دانش تصمیم گیری و تصمیم سازی با استفاده از داده کاوی (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
کد کالاتعداد فروش
1704,322
1802,933
1842,489
1722,269
3871,317
3861,158
1821,154
199952
227812
239659
422592
169583
224554

باتوجه به تغییر محدوده محاسباتی ما، می بایست گزارش لیست فاکتورها نیز بر اساس این محدوده تغییر کند. بنابر این با تغییر اسکریپت 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 می شود. به همین ترتیب مقدار پشتیبان تمامی کالاهای مورد نظر را استخراج می کنیم و سپس بر اساس مقدار پشتیبان و بصورت نزولی مرتب می کنیم. که نتیجه را در جدول زیر مشاهده می کنید.

کد کالاتعداد فروش تعداد کل فاکتورهاتعداد فاکتورهای شامل این کالامقدار پشتیبان
1704,3228,0093,5090.4381
1802,9338,0092,3110.2886
1842,4898,0091,9610.2448
1722,2698,0091,9490.2434
1999528,0099010.1125
1821,1548,0098820.1101
3871,3178,0097820.0976
2278128,0096920.0864
2396598,0095040.0629
2245548,0094570.0571
3861,1588,0093860.0482
1695838,0093470.0433
4225928,0093080.0385

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

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

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

کدکالای مقدمکد کالای تالیتعداد فاکتورهای شامل مقدمتعداد فاکتورهای شامل مقدم و تالیتعداد کل فاکتورهامقدار پشتیبان تالی و مقدم
1701803,50914918,0090.1862
1701843,5096488,0090.0809
1701723,5093568,0090.0444
1701993,5093968,0090.0494
1701823,5094588,0090.0572
1801842,3112668,0090.0332
1801722,311368,0090.0045
1801992,3111918,0090.0238
1801822,311688,0090.0085
1841721,9618518,0090.1063
1841991,9611898,0090.0236
1841821,9611338,0090.0166
1721991,9493228,0090.0402
1721821,9492428,0090.0302
199182901868,0090.0107

در مرحله بعد می بایست مقدار اهمیت یا وابستگی کالای مقدم و تالی را با فرمول زیر محاسبه می کنیم.

مقدار اهمیت (کالای مقدم و کالای تالی) = پشتیبان مقدم و تالی / (پشتیبان تالی * پشتیبان مقدم)

نتیجه را در جدول زیر مشاهده می کنید.

کدکالای مقدمکد کالای تالیمقدار اهمیت
1701801.4726
1701840.7542
1701720.4169
1701990.4609
1701821.1852
1801840.4701
1801720.0640
1801990.3375
1801820.2672
1841721.7833
1841990.3936
1841820.6159
1721990.6748
1721821.1275
1991820.8667

 

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

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

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

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