هوش تجاری (Business Intelligence)

هوش تجاری (Business Intelligence)

به اشتراک بگذاریم برای یادگیری، یاد بگیریم برای به اشتراک گذاری
هوش تجاری (Business Intelligence)

هوش تجاری (Business Intelligence)

به اشتراک بگذاریم برای یادگیری، یاد بگیریم برای به اشتراک گذاری

الگوریتم خوشه‌بندی در داده کاوی

همانطور که می‌دانید از داده‌کاوی برای کاوش در اطلاعات و کشف دانش استفاده می‌شود. برای اینکار الگوریتم‌های متعددی وجود دارد که هر یک برای هدف خاصی کاربرد دارند. در  SQL Server Business Intelligence Development Studio تعداد 9 الگوریتم مختلف برای انجام عمل داده‌کاوی وجود دارد که از هر یک در شرایط خاص و در جهت رسیدن به اهداف مشخصی استفاده می‌شود. خوشه بندی از مهمترین الگوریتم‌های داده کاوی است و کاربرد بسیاری در کشف دانش دارد به همین دلیل در این مقاله به الگوریتم خوشه بندی که یکی از مهمترین الگوریتم‌های داده‌کاوی است، خواهیم پرداخت.

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

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

  

تعریف خوشه بندی

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

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

زمانی که با یک مجموعه کوچک از خصوصیات سروکار داریم، خوشه‌بندی یک عمل ساده ای است که می توانیم آن را انجام دهیم. اما زمانی که خصوصیات رشد می‌کنند مشکلات خوشه‌بندی افزایش پیدا کرده و حتی ممکن است از طریق ذهن آدمی غیر ممکن باشد. عمل خوشه‌بندی فقط در 5 یا 6 بٌعد برای افراد نظریه پرداز که فهم عمیقی از داده‌ها دارند امکان پذیر است. اما مجموعه داده‌های مدرن، عموماً شامل ده‌ها (اگر نگوییم صدها) بٌعد هستند و زمانی که ما نمی‌توانیم روابط ممکن بین خصوصیات را درک کنیم، عمل خوشه‌بندی غیر ممکن می‌شود.

توجه: در این مقاله منظور از بٌعد تعداد خصوصیات اشیاء می‌باشد. به عنوان مثال، نقاط در صفحه دکارتی دارای دو بعد X و Y هستند.

کلاسترینگ، اشیاء را براساس ویژگی‌هایی که با هم دارند گروه‌بندی می‌کند. هدف اصلی در خوشه بندی تقسیم بندی اشیاء به گونه‌ای است که بیشترین شباهت در یک گروه و بیشترین تفاوت با اشیاء گروه‌های دیگر را دارا ‌باشد. بعنوان تعریف ساده‌تر می‌توان گفت که اشیاء در خوشه مخصوص خود دارای بیشترین شباهت و در برابر اشیای متعلق به خوشه‌های دیگر دارای بیشترین تفاوت هستند.

در برنامه‌های کاربردی، عمل خوشه‌بندی بصورت کاملا متمایز انجام نمی‌گیرد. جدا از مسائل فوق خوشه‌بندی داده‌ها را از هم جدا می‌کند و هر خوشه داده‌های مخصوص خود را دارد و از تداخل داده در خوشه جلوگیری می‌شود. البته خوشه بندی فازی جدا از مسئله فوق می‌باشد و اجازه می‌دهد که یک شیء متعلق به چند گروه وابسته باشد.


در کلاسترینگ هر خوشه می‌تواند خود به چند زیر خوشه تبدیل شود. برای درک بهتر مشکلات تصمیم‌گیری برای تشکیل یک خوشه بندی به شکل زیر توجه کنید. در این شکل 20 شخص که می‌توانند بصورت سه روش در خوشه بندی تقسیم شوند، نمایش داده شده است.




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

 چه تحلیل و آنالیزهایی خوشه بندی نیستند؟

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

بعنوان مثال تقسیم بندی پیکسل‌های عکس به دو قسمت رنگ و شدت رنگ و یا تقسیم بندی مردم به گروهایی بر اساس درآمد و یا نام خانوادگی؛ با این وجود بعضی از تقسیم‌بندی‌های عکس و تجزیه و تحلیل بازار خوشه‌ می‌باشد و از یک چارچوب ریاضی برای داده‌کاوی استفاده می‌کنند. قوانین زیادی از داده‌کاوی روی مشکلات تقسیم بندی فعالیت و نظارت دارد و به همین ترتیب روش‌های فراوانی برای پارتیشن بندی مجموعه‌ای از داده وجود دارد اما هیچ کدام در سطح تجزیه و تحلیل خوشه‌بندی نمی‌باشند.

 ارتباط محکمی میان پارتیشن‌بندی و گراف خوشه بندی وجود دارد. برای درک بهتر تفاوت میان خوشه بندی و سایر تکنیک‌های گروه‌بندی اشیاء به مثال زیر توجه کنید.

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

نکته: شاید به نظر برسد که پاسخ های کوئری دارای شباهت هایی هستند، اما باید توجه داشت که در پرس و جو عموما تمام ابعاد درخواست نمی‌شوند و ممکن است شباهت ها فقط در چند بٌعد کوچک باشد.

الگوریتم خوشه بندی  

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

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

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

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

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

ساخت پارتیشن برای Cube

همانطور که پیش‌تر گفته شد، سه روش MOLAP، ROLAP و HOLAP برای ذخیره‌سازی اطلاعات در Cube وجود دارد.

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

در این آموزش فرض بر وجود دو گروه معیار (Measure Group) با نام های Sales و Order است.


 - پس از ایجاد Cube در SSAS به سربرگ Partition رفته و پارتیشن‌های ایجاد شده را حذف کنید.

 - برروی NewPartition.. مربوط به Sales کلیک کرده و پارتیشن جدیدی با نام Sales_1 ایجاد نمایید.

 - کوئری موجود در  پارتیشن را مطابق کد زیر قرار دهید.


SELECT * FROM [dbo].[sales] WHERE DDate>='1383/01/01' and DDate<'1383/01/10'


- همین کار را برای Order انجام دهید و در پایان نام آن را Order_1 قرار دهید.




حال Cube را پردازش کرده و از SSAS خارج شوید.


-مطابق تصویر زیر در   بر رویMicrosoft Analysis Services Sales_1 راست کلیک کنید و یک ((اسکریپتِ ایجاد)) ساخته و با نام CreatePartition-Sales_1 ذخیره نمایید.



-مجدد بر روی Sales_1 کلیک راست کرده و Process را انتخاب کنید.

-در صفحه‌ی باز شده بر روی Script کلیک کنید تا کد XML مربوط به پردازش نمایش داده شود. کد را با نام ProcessPartition-Sales_1 ذخیره نمایید.

-مراحل بالا را برای Order_1 انجام دهید. از نام‌های CreatePartition-Order _1 و ProcessPartition-Order _1  برای ذخیره فایل‌های XML استفاده کنید.


مطابق شکل زیر یک جدول با عنوان PartitionsLog ایجاد کنید.




سه رویه زیر را دریافت و ایجاد کنید.


FindIsProcess

Findinfo

InsertNewPartitionInfo



ممکن است پس از مدتی اطلاعات موجود در Fact در یک تاریخ خاصی که پارتیشن آن پیشتر ساخته شده است تغییر کند. از اینرو برای پردازش مجدد پارتیشن مذکور، کافیست فیلد IsProcess آن را به صفر تغییر دهید. Store Procedure اول برای انجام این کار ایجاد شده است.

دومین SP برای دریافت اطلاعات پارتیشن‌های قبلی جهت ساخت پارتیشن جدید ایجاد شده است.

سومین SP وظیفه ثبت اطلاعات پارتیشن جدید در PartitionsLog را دارد.

تا به اینجای کار مراحل اولیه آماده سازی شد، از این پس در SSIS به ایجاد یک Package برای ایجاد پارتیشن می‌پردازیم.

یک پروژه‌ی SSIS با نام Partition ایجاد کرده و مطابق شکل زیر در قسمت Variable متغیرها را تعریف نمایید.



در جدول زیر شرح مختصری از وظیفه متغیرها  آمده



برای ساخت XMLA جدید از آن استفاده می‌شود.

CreatePartitionXMLA

آدرس فایل‌های XMLA که پیشتر ساخته شده را در خود دارد.

Directory

مشخص کننده تاریخ شروع اطلاعات موجود در پارتیشن است.

FromDate

نشان دهنده وجود داشتن/ نداشتن پارتیشن است.

IsPartitionExists

نشان دهنده پارتیشن پردازش شده / پارتیشن پردازش نشده است.

IsProcess

اطلاعات مربوط به تکرار را در خود ذخیره می‌کند.

LoopFlag

کد گروه معیار را در خود جای می‌دهد.

MeasureGroupCode

نام پارتیشن در این متغیر قرار می‌گیرد.

PartitionName

شماره پارتیشن در این متغیر قرار می‌گیرد.

PartitionNumber

تعداد دفعات پردازش یک پارتیشن در این متغیر قرار می‌گیرد.

ProcessCount

جهت پردازش پارتیشن از این متغیر استفاده می‌شود.

ProcessPartitionXMLA

خروجی SP دوم که برای پردازش مجدد استفاده می‌شود در این متغیر قرار می‌گیرد.

Result

نتیجه پردازش مجدد

ResultReprocess

اطلاعات موجود در Fact تا این تاریخ در پارتیشن ثبت می‌شود.

ToDate


-مطابق شکل زیر 11 عدد Execute SQL Task، یک Analysis Services Processing Task، 2عدد For Loop Container، 4 عدد Analysis Services Execute DDL Task و 4 عدد Script Task به پروژه اضافه کرده و به هم متصل کنید.



با توجه به شماره‌های قرار گرفته بر روی هر کامپننت توضیحاتی میدهم که باید قدم به قدم اجرا شود.


1-      رویه Findisprocess را فراخوانی کرده تا اطلاعات پارتیشن‌هایی که فیلد IsProcess آن‌ها صفر است در متغیر‌ها قرار گیرد.

2-      تمامی دایمنشن‌ها را پردازش می‌کند.

3-      برای پردازش مجدد تمامی پارتیشن‌ها، یک حلقه ایجاد می‌کند و تا زمانی که نتیجه پردازش 1 است به کار خود ادامه می‌دهد.

4-      رویه Findisprocess را فراخوانی کرده تا تمامی اطلاعات مربوط به پارتیشن را دریافت کند.

5-      توسط این کامپننت می‌توانیم از زبان‌های برنامه نویسی C# و VB در پکیج استفاده کنیم. توسط مجموعه کد‌های نوشته شده در این قسمت تغییرات مورد نیاز جهت پردازش مجدد اعمال می‌شوند.

کدهای مربوط به کامپننت‌های  Script Task شماره 5 را از اینجا دریافت کنید.


6-      پارتیشن مورد نظر را پردازش می‌کند.

7-      فیلد‌های موجود در PartitionsLog بروز‌رسانی می‌شوند.

8-      گروه معیارها شناسایی می‌شوند.

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

10-   تمامی اطلاعات مورد نیاز برای پردازش مجدد پارتیشن دریافت می‌شود.

11-   تغییرات مورد نیاز جهت پردازش مجدد اعمال می‌شوند.

کدهای مربوط به کامپننت‌  Script Task شماره 11 را از اینجا دریافت کنید.


12-   پارتیشن مورد نظر را پردازش می‌کند.

13-   فیلد‌های موجود در PartitionsLog بروز‌رسانی می‌شوند.

14-   تمامی اطلاعات مورد نیاز برای ایجاد و پردازش پارتیشن دریافت می‌شود.

15-   فایل‌های XMLA ایجاد شده در ابتدای پروژه را بازخوانی و متغیرهای مربوطه را بارگذاری می‌کند.

کدهای مربوط به کامپننت‌  Script Task شماره 15 را از اینجا دریافت کنید.


16-   اطلاعات مورد نیاز برای ایجاد و پردازش پارتیشن را آماده می‌کند.

کدهای مربوط به کامپننت‌  Script Task شماره 16 را از اینجا دریافت کنید.


17-   پارتیشن جدید را ایجاد می‌کند.

18-   پارتیشن ایجاد شده را پردازش می‌کند.

19-   اطلاعات مربوط به پارتیشن جدید توسط رویه InsertNewPartitionInfo ثبت می‌شود.

20-   مقدار فیلد LoopFlag  را به صفر تغییر می‌دهد. دلیل اینکار جلوگیری از تکرار بی‌دلیل در پردازش پارتیشن است.

21-   اطلاعات تکمیلی پارتیشن جدید را بروزرسانی می‌کند.

22-   مقدار فیلد LoopFlag  را به یک تغییر می‌دهد. دلیل اینکار فراهم نمودن شرایط تکرار در پردازش پارتیشن در صورت لزوم است.

کار تمام است! حال می‌توانید از Package خود استفاده کنید.


لازم به ذکر است که با کمی کار بیشتر و ایجاد تغییرات جزئی می‌توان این پکیج را بهینه‌ کرد.

شروع به کار با SSIS

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

نحوه خواندن داده‌ها از شیرپوینت و بارگذاری در SQL توسط SSIS

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

برای خواندن و بارگذاری داده‌های شیرپوینت در SQL Server از طریق SSIS چندین روش وجود دارد که در این مقاله به یکی از بهترین و ساده‌ترین آن‌ها که استفاده از SharePoint Web services است، می‌پردازم.


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

http://spdor.ir/p/83/ssis-sharepoint