Monday, October 5, 2009

Decision Support System ในด้านอื่นมากกว่า Finance

ตัวอย่างการใช้งานของ DSS นั้น ส่วนใหญ่จะมุ่งไปยังด้านการเงิน หรือไม่ก็ไม่ยุ่งเกี่ยวกับระบบ ERP เป็นหลัก แต่ปัจจุบันมีการใช้งานระบบสารสนเทศกันอย่างกว้างขวาง ดังนั้นจึงเกิดมีการนำระบบ DSS ไปวิเคราะห์ในงานด้านใหม่ ๆ เกิดขึ้นอีกมากมาย

หลายองค์ที่มุ่งเน้นแต่เรื่องทางด้านการเงินก็จะสูญเสียโอกาสอันหนึ่งไปคือ "ระบบการเงินนั้นเป็นระบบปลายน้ำ" กล่าวคือ มันเป็นผลของกิจกรรมอื่น ๆ นั่นเอง จะใช้คาดการอนาคตไม่ได้อย่างถูกต้องนัก

ปัจจัยที่ระบบ DSS ส่วนใหญ่ยังคงอยู่กับระบบการเงินนั้น มีเหตุผลดังนี้

  • เป็นหน่วยงานที่มีข้อมูลให้วิเคราะห์
  • งานทางด้านอื่น ๆ เช่น การตลาดมีการเปลี่ยนแปลงข้อมูลที่ไว และไม่ค่อยเป็นระเบียบ ทำให้ยากต่อการหารูปแบบที่แน่นอน
  • อาจเป็นไปได้ว่าคนที่มาทำระบบให้ ไม่ค่อยมีประสบการณ์กับระบบอื่น ๆ
ยกตัวอย่างระบบที่เค้าเรียกว่าต้นน้ำกัน
  • ระบบวิเคราะห์การจัดส่งจดหมายหรือสื่อสิ่งพิมพ์ ให้กับลูกค้าที่มีความสนใจในผลิตภัณฑ์ เช่น งานวิเคราะห์ Questionnaire งานการลงทะเบียน
  • การวิเคราะห์หาสาเหตุของการเปลี่ยนอะไหล่รถยนต์ในแต่ละพื้นที่
  • การหาช่วงเวลาของการเปิดสัญญาณไฟ ตามแยกต่าง ๆ ตามเวลา ที่เหมาะสม

ช่องว่างของการวิเคราะห์เหล่านี้ต้องการผู้ที่เข้าใจการใช้งานข้อมูลเป็นอย่างยิ่ง ซึ่งปัจจุบันยังขาดบุคคลากรดำเนินการนี้

มาดู WorkFlow ที่เค้าทำกัน

  • ปัญหาที่เกิด
    เมื่อมีลูกจ้างในหน่วยงานด้าน Healthcare จะรู้ได้อย่างไรว่า ใบอนุญาติหมดอายุเมื่อใด วิธีการจัดการมี 2 แบบ คือมอบหมายให้ตัวแทนการจัดหาลูกจ้างคอยจัดหาลูกจ้างที่ใบอนุญาติยังไม่หมดอายุเข้ามาทำงานเท่านั้น หรือ หาทางป้องกันไม่ให้ลูกจ้างที่ใบอนุญาติหมดอายุทำงานที่เสี่ยงจนกว่าจทำการต่อใบอนุญาติ 
  • จุดมุ่งหมายของธุรกิจ
    ต้องการเพิ่มความปลอดภัยของผู้ป่วย โดยการลดจำนวนของลูกจ้างที่ใบอนุญาติหมดอายุ ลดค่าใช้จ่ายของตัวแทนที่ต้องจัดหาลูกค้าที่จะหมดอายุ
  • ขบวนการในปัจจุบัน
    ให้แต่ละผู้จัดการในส่วนต่าง ๆ ตรวจสอบวันหมดอายุของลูกค้าในส่วนที่เกี่ยวข้อง
  • วิธีการตอบปัญหา
    ทำตารางเวลาของรายงานจากฐานข้อมูลส่วนกลาง แต่ละแผนกโดยมีรายละเอียดของลูกจ้าง และวันหมดอายุของใบอนุญาติส่งให้ผู้ที่เกี่ยวข้อง



Friday, October 2, 2009

Simple Cube Store

มาดูกันว่า หลังจากได้ Dimension แล้ว คราวนี้ เราจะมาสร้าง Cube อย่างไร



การมอง Cube คือการมองที่ตาราง Fact นั่นเอง โดยมี Foreign key ไปยังแต่ละ Dimension ที่สร้าง

จะมีสิ่งที่ดูแล้วใหม่นิดหนึ่งคือตรง Dimension "Store Type" เพราะว่าเป็นการ Degenerate Dimension เพราะว่าเนื่องจากว่า Store Type นั้นมีสมาชิกไม่กี่ตัว การทำตารางออกมาอีกต่างหากเพื่อ Dimension นั้นดูแล้วจะทำให้การ Query ต้องทำงานมากขึ้น




Join Table ใน Dimension

ปกติแล้วเราจะมีแค่ Table เดียวใน Dimension ซึ่งเรียกว่า Star schema แต่ก็มีบางครั้งที่ ใน Dimension นั้นมีการ Join กันของตารางที่มากกว่า 1 ตาราง เรียกว่า "Snowflake schema" หลักการของการเขียน Dimension ก็แบบนี้ (ดูแล้วคล้าย ๆ กับ Table join กันนั้นแหละ)


พอเรา Join กันแล้ว ตรง Level เราก็สามารถอ้างอิงถึง สมาชิกของแต่ละตารางได้

Time Dimension

Time Dimension เป็นลักษณะการสร้าง Hierarchy ของเวลา โดยรูปแบบมักจะเป็นดังนี้

  • Year
    • Quarter
      • Month
        • Week
          • Day in month
อันนี้ก็แล้วแต่ความต้องการจะวิเคราะห์




เหตุที่มี Hierarchy 2 อันนั้นถ้าดูจากฐานข้อมูลแล้วจะพบว่า ข้อมูลนั้นอยู่บนตารางเดียวกัน ซึ่งในบางครั้งเราสามารถงานต่างกันได้

มาเรียนรู้ FoodMart กันเถอะ

คราวนี้หลังจากทำการติดตั้ง Pentaho เรียบร้อยแล้ว ก็ถึงเวลามาเจอะการใช้งานเป็นส่วนๆ ไป ส่วนแรกในวันนี้เราจะพูดถึง "ทำความเข้าใจกับ Mondrian จาก FoodMart"

Foodmart เป็น Sample Data ที่ติดมากับ Mondrian การติดตั้ง FoodMart นั้นต้องกลับไปดูบทความก่อน ๆ นะครับ

Dimension แรกที่เราจะพูดถึงคือ Store มีโครงสร้างดังนี้



ผมชอบ XML ตรงที่ โครงสร้างอธิบายความหมายด้วยนี่แหละ เพราะว่า ไม่ต้องเสียเวลาอธิบาย ลงไปใน Code

จาก Dimension นี้เราจะได้ Dimension Store ที่บอกถึงคุณลักษณะของ Store เราได้อย่างครบถ้วน  ที่ชอบมาก็เห็นจะเป็น ขนาดต่าง ๆ ใน Dimension นี้นี่แหละ

Store Sqft = ขนาดพื้นที่ทั้งหมดของร้าน มีหน่วยเป็นตารางฟุ๊ต
Grocery Sqft = ขนาดพื้นที่ที่สามารถขายสินค้าได้ มีหน่วยเป็นตารางฟุ๊ต
Frozen Sqft = ขนาดพื้นที่แช่แข็ง
Meat Sqft = ขนาดพื้นที่ของอาหารประเภทเนื้อ
Has coffee bar = ร้านนี้มีชั้นขายเครื่องดื่มกาแฟหรือไม่ (คิดได้ไงเนี่ย)


จะเห็นว่า Dimension นี้มีไว้สำหรับการวิเคราะประเภทร้านได้ดีทีเดียว


แล้วตรง Property มีไว้ทำไม?
Property มีไว้สำหรับการเข้าถึง Member โดยใช้ชื่อของ Property ดังตัวอย่างนี้






Saturday, September 26, 2009

มาเรียนภาษาญี่ปุ่นกันเถอะ

ปกติเวลานั่งทำงานอยู่ที่บ้านผมจะเปิดโทรทัศน์ หรือวิทยุ ไปด้วย เพราะว่าทำอย่างที่บ้านไม่ต้องการสมาธิมากมาย วันนี้หมุนหาช่องรายการทีวี น่าดูไม่เจอ สุดท้ายก็ไปเจอรายการ nhkworld ของ www.nhk.co.jp

สถานีนี้เป็นสถานีข่าว แต่ว่ามีรายการสลับระหว่างข่าวน่าดูมาก เอ... แต่ก็ยังไม่เห็นโฆษณานะ ไม่รู้ว่าเป็นเหมือน thai bps บ้านเราหรือเปล่า

วันนี้เป็นรายการของการใช้พลังจากของประเทศญี่ปุ่น เทคโนโลยีของญี่ปุ่นทันสมัยมาก และก็มีการปรับให้เข้ากับวัฒนธรรมด้วย สิ่งที่ได้จากรายการวันนี้มีดังนี้
  1. ญี่ปุ่นเค้าเอาความร้อนของ Magma มาใช้ผลิตไฟฟ้า ถ้าเป็นบ้านเราต้องเอาวัสดุธรรมชาติที่ได้จากการเกษตรมาทำบ้าน
  2. บ้านที่ไม่ต้องใช้เครื่องปรับอากาศ แค่เปลี่ยนทิศทางของลม และ ผสมกับหลักการของธรรมชาตินิดหน่อย
  3. วิธีการลดความร้อนภายในบ้านหรือในอาคารในกรุงโตเกียว โดยใช้การปลูกต้นไม้ เช่น การปลูกต้นไม้ (ที่กินได้ บนดาดฟ้าอาคารสูง) การปลูกผักเป็นม่านกันความร้อนของโรงเรียน การปลูกต้นไม้เป็นที่บังแดดของบ้านที่มีหน้าต่างด้านล่างที่เป็นกระจก
  4. การมุงหลังคาด้วยหญ้า และการเปลี่ยนรอบการมุง
ทั้งหมดยังเป็นการรักษาความเป็นญี่ปุ่นไว้ได้ดี บ้านที่ลดความร้อนและให้แสดงสว่างในตัวเอง ยังเป็นรูปแบบญี่ปุ่นอยู่เลย ถ้าเป็นบ้านหลาย ๆ คนคงว่าเชย

เขียนมาเยอะ ที่จริงแล้ววันนี้มี "มาเรียนภาษาญี่ปุ่นกันเถอะ" หมายความถึง อันนี้ครับ ดูแล้ว นี่สิถึงจะเป็นการใช้เทคโนโลยีที่แท้จริง

ตามนี้เลยครับ http://www.nhk.or.jp/lesson/thai/

Thursday, September 24, 2009

การเปรียบเทียบ Column ใน Analysis Service

เมื่อเรามีข้อมูลหลาย ๆ ช่วงเวลา และต้องการเปรียบเทียบกัน และแสดงผลต่างนั้น ทางที่ดูแล้วง่าย ก็คือเขียน MDX เอง ดีกว่า

ดังนี้

with member [Measures].[Weight] as '([Measures].[Sales] / ([Order Status].Parent, [Measures].[Sales]))', FORMAT_STRING = "#,###.#%"
member [Measures].[Val] as '[Measures].[Sales]', FORMAT_STRING = IIf(([Measures].[Sales] > ([Time].PrevMember, [Measures].[Sales])), "|#|style=green", "|#|style=red")
member [Measures].[Qtd] as '[Measures].[Quantity]', FORMAT_STRING = IIf(([Measures].[Quantity] > ([Time].PrevMember, [Measures].[Quantity])), "|#|style=green", "|#|style=red")
select NON EMPTY (Union({[Time].[All Years]}, [Time].Children) * {[Measures].[Qtd], [Measures].[Val], [Measures].[Weight]}) ON COLUMNS,
NON EMPTY Order([Order Status].Children, [Measures].Value, DESC) ON ROWS
from [SteelWheelsSales]
where ([Product].[All Products], [Markets].[All Markets])


ไม่อธิบายนะครับดูจาก code ก็จะรู้เรื่องดูอยู่แล้ว