Phân tích, đánh giá kết quả

Một phần của tài liệu Ứng dụng một số thuật toán phân cụm phân tích dữ liệu ngân hàng (Trang 82)

Tổng số 0 1 2 1640 1889 1470 4999 Vấn tin 9101 0 491 287 778 Đổi Pin 9128 0 0 0 0 Rút tiền nhanh 9110 915 905 929 2749 Rút tiền thƣờng 9111 712 424 208 1344 Chuyển khoản cùng chủ 9113 0 0 0 0

Chuyển khoản cho ngƣời khác 9103 13 15 19 47

Mở sổ tiết kiệm 9119 0 54 0 54

In sao kê rút gọn 9143 0 0 27 27

Vấn tin sao kê 9115 0 0 0

Mở sổ séc 9114 0 0 0 0

PIN Verify 9131 0 0 0 0

Thanh toán hoá đơn 9136 0 0 0 0

1640 1889 1470

Etran365+ - Golden Card - Primary CardGOLD001 121 84 155 360

Etran365+ - Golden Card - Secondary CardGOLD002 13 11 12 36

Etran365+ - Normal Card - Primary CardNORM001 835 1425 0 2260

Etran365+ - Normal Card - Secondary CardNORM002 16 15 26 57

Thẻ Vạn dặm NSV001 625 332 333 1290

Etran365+ - VIP Card - Primary CardVIP001 0 0 863 863

Etran365+ - VIP Card - Secondary CardVIP002 15 14 49 78

Power Card VSV001 15 8 32 55 1640 1889 1470 1066 545 439 2050 574 91 90 755 0 667 107 774 0 586 834 1420 1640 1889 1470 0 0 0 0 1640 1889 1470 4999 0 0 0 0 0 0 0 0

Từ 6 giờ đến sau 12 giờ trƣa

Từ 12 giờ trƣa đến sau 18 giờ chiều Từ sau 18 giờ đến 24 giờ

Từ 500.000 đến dƣới 1.000.000 Từ 1.000.000 trở lên Giờ giao dịch Từ 0 đến sau 6 giờ sáng Loại thẻ Lƣợng tiền giao dịch Từ 0 đến dƣới 200.000 Từ 200.000 đến dƣới 500.000 Thuộc tính Cluster Loại giao dịch  Phân tích kết quả

Từ kết quả thu đƣợc ở bảng trên, ta có thể nhận xét nhƣ sau: dựa trên các thuộc tính đã xác định trƣớc là loại giao dịch, loại thẻ, lƣợng tiền giao dịch

và thời gian giao dịch. Dữ liệu giao dịch ATM đƣợc phân thành 3 cụm với một số thuộc tính liên quan

- Cụm thứ nhất:

Khách hàng phần lớn sử dụng thẻ NORM001 và thẻ NSV001, một số sử dụng thẻ GOLD001 và chủ yếu thực hiện các giao dịch rút tiền nhanh, rút tiền bình thƣờng. Lƣợng tiền giao dịch của cụm khách hàng này nhỏ, tập trung vào khối lƣợng nhỏ hơn 200.000 và từ 200.000 đến 500.000.

- Cụm thứ 2:

Khách hàng sử dụng thẻ NORM001 và thẻ NSV001, loại giao dịch thƣờng thực hiện là vấn tin, rút tiền và rút tiền nhanh. Lƣợng tiền giao dịch của cụm này tập trung chủ yếu từ 500.000 đến 1.000.000 và hơn 1.000.000 đồng.

- Cụm thứ 3:

Ở cụm này, khách hàng sử dụng nhiều nhất là thẻ VIP001, sau đó mới đến thẻ NSV001 và các loại khác, loại giao dịch thƣờng thực hiện là rút tiền và rút tiền nhanh. Lƣợng tiền giao dịch của cụm này tập trung chủ yếu lớn hơn 1.000.000 đồng.

Về mặt thời gian thực hiện giao dịch của ba cụm: do lƣợng dữ liệu đƣa vào xử lý không nhiều nên các giao dịch đều thực hiện từ khoảng 6h sáng đến 12 giờ trƣa và không đƣa ra nhận xét nào đặc biệt.

 Hạn chế của chƣơng trình

- Chƣơng trình hiện mới hoàn thành cho các thuật toán K-means và phân cấp. (adsbygoogle = window.adsbygoogle || []).push({});

- Về mặt kỹ thuật, chƣơng trình vẫn đang có một số vấn đề:

+ Tốc độ xử lý chƣa cao (nếu chạy trên 20.000 bản ghi thì cần thời gian hơn 10 phút).

+ Chƣa thực hiện đƣợc với số phần tử lớn (hạn chế của việc dùng mảng).

Do những hạn chế đó nên chƣơng trình cần cải tiến khi áp dụng vào thực tế, xử lý đƣợc lƣợng dữ liệu lớn (hàng triệu bản ghi).

KẾT LUẬN 1. TÓM TẮT KẾT QUẢ

Luận văn đã nêu khái quát về cơ sở lý thuyết phân cụm dữ liệu cũng nhƣ một số thuật toán phân cụm phổ biến nhƣ K-means, Fuzzy K-means, K-Nearest Neighbour, Sequential, Hierachical.

Luận văn cũng đã xây dựng đƣợc chƣơng trình để thực hiện các thuật toán, đó là K-means và Hierachical và một số module liên quan nhƣ các thuật toán tính khoảng cách theo các công thức khác nhau.

Đặc biệt, chƣơng trình đã đƣợc áp dụng cho việc phân cụm dữ liệu ATM của Ngân hàng ĐT&PT Việt nam và bƣớc đầu đã phát hiện đƣợc một số thuộc tính giúp Ngân hàng phân cụm khách hàng và đề xuất đƣợc những dịch vụ thích hợp để phục vụ nhu cầu của khách hàng.

Do chƣơng trình đƣợc viết tổng quát nên có thể áp dụng cho các loại hình giao dịch khác và tất cả các loại dữ liệu.

2. PHƢƠNG HƢỚNG PHÁT TRIỂN

Định hƣớng của đề tài là sẽ khắc phục một số hạn chế đã nêu ở trên và tiếp tục hoàn thành các thuật toán còn lại để có thể áp dụng vào thực tế. Cụ thể:

- Các module tiền xử lý dữ liệu sẽ đƣợc chỉnh sửa, bổ sung để tinh chỉnh dữ liệu trƣớc khi phân cụm.

- Tiếp tục hoàn thành module thực hiện thuật toán Fuzzy K-means và Sequential, từ đó so sánh và chọn ra thuật toán phù hợp nhất cho các loại hình dữ liệu.

- Khắc phục hạn chế của số lƣợng phần tử trong mảng bằng giải pháp tách thành các mảng con và tổ chức đƣa vào cơ sở dữ liệu.

- Nghiên cứu và đƣa thêm các thuộc tính của dữ liệu ATM để phát hiện thêm các thuộc tính về khách hàng.

Đầu ra của chƣơng trình sẽ đƣợc bổ sung chức năng mô hình hoá và đồ hoạ, giúp hiển thị kết quả một cách trực quan và tƣờng minh.

Một số chƣơng trình phân cụm dữ liệu nhƣ Mineset [8] sẽ đƣợc nghiên cứu để có thể bổ sung các tính năng phù hợp cho chƣơng trình.

TÀI LIỆU THAM KHẢO Tiếng Việt:

- [1] Bùi Công Cƣờng (2005): “Một số hướng mới trong công nghệ tri thức và khai phá dữ liệu. Viện toán học, Trƣờng thu “Hệ mờ và ứng dụng” lần thứ 4.

- [2] Bùi Công Cƣờng, Nguyễn Doãn Phƣớc (2001): “Hệ mờ, hệ Nơron và ứng dụng”, Nhà xuất bản KHKT.

Tiếng Anh:

- [3] Sergios Theodoridis, Konstantinos Koutroumbas: “Pattern Recognition”, Academic Press, CA, 1999.

- [4] Spath H: “Clustring Analysis Algorithms”, Ellis Horwood, 1980.

- [5] MacQuenn J.B: “Some methods for classification and Analysis of multivariate observations”. Processings of the Symposium on Mathematical Statistics and Probability, 5th Beckley, Vol. 1 University of California Press.

- [6] Mataras R.L., Aguilar-Martin J: “Self-learning pattern classification using a sequential clusstering technique”, Pattern Recognition, Vol 18, 1985.

- [7] Nan-Chen Hsieh (2004): “An integrated data mining and behavioral scoring model for analyzing Bank customers”. Expert System with Application 27 (2004)

Một số trang WEB: - [8] http://www.purpleinsight.com - [9] http://bonsa1.ims.u-tokyo.ac.jp/~mdehoon/software/cluster/ - [10] http://rana.lbl.gov/EisenPublications.htm - [11] http://people.revoledu.com/kardi/tutorial/index.html - [12] http://sourceforge.net/project/showfiles.php?group_id=72667

PHỤ LỤC 1: MÃ NGUỒN CHƢƠNG TRÌNH

Chƣơng trình thực hiện bằng ngôn ngữ Visual Basic 6.0.

'*********************************************************************** ' CHUONG TRINH PHAN CUM DU LIEU „ (adsbygoogle = window.adsbygoogle || []).push({});

' TAC GIA: Nguyen Doan Hien „

' Hoc Vien lớp K10T3CN - Cao hoc CNTT - Dai hoc Cong nghe – DHQHN „ '***********************************************************************

1 MODULE TÍNH KHOẢNG CÁCH GIỮA CÁC PHẦN TỬ 1.1 Tính khoảng cách theo Manhattan 1.1 Tính khoảng cách theo Manhattan

„Đầu vào: hai mảng chứa các trường của hai phần tử, kiểu double „Đầu ra: khoảng cách Manhattan

Public Function Manhattan_Distance (Arr1() As Variant, Arr2() As Variant) As Double Dim Count As Integer

Dim Sum As Double

If UBound(Arr1) <> UBound(Arr2) Then

MsgBox "So luong phan tu hai mang phai bang nhau" Else

Count = UBound(Arr1) End If

Sum = 0

For i = 0 To Count

Sum = Sum + Abs(Arr1(i) - Arr2(i)) Next i

Manhattan_Distance = Sum / Count

1.2 Tính khoảng cách theo công thức Euclide

„Đầu vào: hai mảng chứa các trường của hai phần tử, kiểu Double „Đầu ra: khoảng cách Euclide

Public Function Euclid_Distance (Arr1() As Variant, Arr2() As Variant) As Double Dim Count As Integer

Dim Sum As Double

If UBound(Arr1) <> UBound(Arr2) Then

MsgBox "So luong phan tu hai mang phai bang nhau" Else

Count = UBound(Arr1) End If

Sum = 0

For i = 0 To Count

Sum = Sum + (Arr1(i) - Arr2(i)) * (Arr1(i) - Arr2(i)) Next i

Euclid_Distance = Math.Sqr(Sum) / Count

1.3 Tính khoảng cách hỗn hợp (công thức Kaufman và Rousseeuw)

'Arr1(),Arr2() là hai mảng lƣu dữ liệu để tính khoảng cách 'Arr3() là mảng lƣu kỉeu dữ liệu tƣơng ứng

'Có các kiểu dữ liệu nhƣ sau 'BINARY: nhị phân 'NORMINAL: định danh 'ODINAL: thứ tự

'INTERVAL: khoảng cáh 'RATIO: tỷ lệ (adsbygoogle = window.adsbygoogle || []).push({});

'Công thức tính: Kaufman và Rousseeuw

Public Function Mixed_distance (Arr1() As String, Arr2() As String, Arr3() As String) As Double

Dim Count As Integer Dim i As Double Dim j As Integer

Dim Sum As Double Dim Total As Double

' Tu so va mau so trong cong thuc Kaufman và Rousseeuw

Dim Max_ As Double Dim Min_ As Double Dim Max1_ As Double Dim Min1_ As Double Dim Max2_ As Double Dim Min2_ As Double

Dim a() As Double Dim b() As Double Dim c() As Double Dim d() As Double Dim e() As Double

'Cac mang tam de luu trong qua trinh tinh toan

Dim Check As Boolean Dim DArr1() As Variant Dim DArr2() As Variant

If UBound(Arr1) <> UBound(Arr2) Then

MsgBox "So luong phan tu hai mang phai bang nhau" Else

Count = UBound(Arr1) End If

Sum = 0 ' Tu so ap dung cho cong thuc Total = 0 ' Mau so ap dung cho cong thuc

ReDim a(Count), b(Count), c(Count), d(Count), e(Count) As Double For i = 0 To Count a(i) = 0 b(i) = 0 c(i) = 0 d(i) = 0 e(i) = 0 Next i

'Doan chuong trinh kiem tra xem co phai tat ca du lieu co cung kieu khong Check = True

If Arr3(0) = "UNKNOW" Then Check = False

Else

For i = 0 To Count

If Arr3(i) <> Arr3(0) Then Check = False

End If Next i End If

If Check = True Then

'Tinh cho mot loai du lieu dong nhat Select Case Arr3(0)

Case "BINARY" 'Nhi phan doi xung For i = 0 To Count

If (Arr1(i) = Arr2(i)) Then If Arr1(i) = 1 Then a(i) = a(i) + 1 Else d(i) = d(i) + 1 End If Else If Arr1(i) = 1 Then c(i) = c(i) + 1 Else b(i) = b(i) + 1 End If End If

Sum = Sum + b(i) + c(i)

Total = Total + a(i) + b(i) + c(i) + d(i)

Next i

Case "ABINARY" 'Nhi phan bat doi xung For i = 0 To Count

If (Arr1(i) = Arr2(i)) Then If Arr1(i) = 1 Then a(i) = a(i) + 1 Else d(i) = d(i) + 1 End If Else If Arr1(i) = 1 Then c(i) = c(i) + 1 Else b(i) = b(i) + 1 End If End If

Sum = Sum + b(i) + c(i) (adsbygoogle = window.adsbygoogle || []).push({});

Total = Total + a(i) + b(i) + c(i)

Next i

Case "NORMINAL" For i = 0 To Count

If Arr1(i) <> Arr2(i) Then Sum = Sum + 1 End If Next i Total = Count Case "INTERVAL"

'Truong hop nay se ap dung cong thuc Oclit hoac Manhattan For i = 0 To Count

DArr1(i) = Val(Trim(Arr1(i))) DArr2(i) = Val(Trim(Arr2(i))) Next i

Mixed_distance = Euclid_Distance(DArr1, DArr2) Exit Function

Case "ORDINAL" For i = 0 To Count

Sum = Sum + Abs(Arr1(i) - Arr2(i)) Next i

Total = Count End Select

Else ' Cac bien co kieu khac nhau For i = 0 To Count

Select Case Arr3(i) Case "BINARY"

d(i) = 1 Else d(i) = 0 End If e(i) = 1 Case "ABINARY"

If Arr1(i) = Arr2(i) Then d(i) = 1 If Arr1(i) = 0 Then e(i) = 0 Else e(i) = 1 End If Else d(i) = 0 e(i) = 1 End If Case "NORMINAL" If Arr1(i) = Arr2(i) Then d(i) = 0 Else d(i) = 1 End If e(i) = 1 Case "INTERVAL"

'Tim max, min cua cac phan tu hai mang Arr1, Arr2 Max1_ = FindMax(Arr1, Arr3, "INTERVAL") Max2_ = FindMax(Arr2, Arr3, "INTERVAL") If Max1_ > Max2_ Then

Max_ = Max1_ Else

Max_ = Max2_ End If

Min1_ = FindMin(Arr1, Arr3, "INTERVAL") Min2_ = FindMin(Arr2, Arr3, "INTERVAL") If Min1_ > Min2_ Then

Min_ = Min2_ Else

Min_ = Min1_ End If

'Chuan hoa d(i) If Max_ > 0 Then

d(i) = Abs(Val(Trim(Arr1(i))) - Val(Trim(Arr2(i)))) / (Max_ - Min_) Else

d(i) = Abs(Val(Trim(Arr1(i))) - Val(Trim(Arr2(i)))) / Max_ End If Else d(i) = 0 End if e(i) = 1 Case "ORDINAL"

'Tim max, min cua cac phan tu hai mang Arr1, Arr2 Max1_ = FindMax(Arr1, Arr3, "ORDINAL") Max2_ = FindMax(Arr2, Arr3, "ORDINAL") If Max1_ > Max2_ Then

Max_ = Max1_ Else

Max_ = Max2_ End If

(adsbygoogle = window.adsbygoogle || []).push({});

Min1_ = FindMin(Arr1, Arr3, "ORDINAL") Min2_ = FindMin(Arr2, Arr3, "ORDINAL") If Min1_ > Min2_ Then

Min_ = Min2_ Else

Min_ = Min1_ End If

'Chuan hoa d(i)

If Max_ <> Min_ Then

d(i) = Abs(Val(Trim(Arr1(i))) - Val(Trim(Arr2(i)))) / (Max_ - Min_) Else

d(i) = Abs(Val(Trim(Arr1(i))) - Val(Trim(Arr2(i)))) / Max_ End If

e(i) = 1 Case "RATIO"

'Tim max, min cua cac phan tu hai mang Arr1, Arr2 Max1_ = FindMax(Arr1, Arr3, "RATIO")

Max2_ = FindMax(Arr2, Arr3, "RATIO") If Max1_ > Max2_ Then

Max_ = Max1_ Else

Max_ = Max2_ End If

Min1_ = FindMin(Arr1, Arr3, "RATIO") Min2_ = FindMin(Arr2, Arr3, "RATIO") If Min1_ > Min2_ Then

Min_ = Min2_ Else

Min_ = Min1_ End If

'Chuan hoa d(i)

If Max_ <> Min_ Then

d(i) = Abs((Val(Trim(Arr1(i))) - Val(Trim(Arr2(i))))) / (Max_ - Min_) Else

d(i) = Abs((Val(Trim(Arr1(i))) - Val(Trim(Arr2(i))))) / Max_ End If

e(i) = 1

Case "UNKNOW" End Select

Sum = Sum + d(i) Total = Total + e(i) Next i

End If

If Total <> 0 Then

Mixed_distance = Sum / Total Else

Mixed_distance = 0 End If

(adsbygoogle = window.adsbygoogle || []).push({});

2. MODULE THỰC HIỆN THUẬT TOÁN K-MEANS

Public Sub KMEANS()

'Chuong trinh phan cum theo thuat toan Kmeans 'ClusterNum - So luong cum can phan

'Mang luu thu tu cua cac hang la tam cac cum Dim ClustArr() As Integer

ReDim ClustArr(ClustNum) As Integer

'Mang luu thu tu cua cac hang la tam cac cum sau khi tinh lai khoang cach Dim ClustArr1() As Integer

ReDim ClustArr1(ClustNum) As Integer

'Mang luu cac khoang cach tu mot dong toi cac tam cum Dim Distance() As Double

ReDim Distance(ClustNum) As Double

'Mang luu cac cum cho cac phan tu Dim Clustcenter() As String

Dim Min_ As Double Dim Cluster_ As Integer

'Bien kiem tra xem co su chuyen doi cum hay khong Dim Found As Boolean

Dim isStillMoving As Boolean

Dim i, j, k As Integer Dim Number_ As Integer

Dim iFileNumber, jFileNumber As Integer

Dim ClusterFile, OldClusterFile, TempStr As String Dim Str_ As String

NumberofRow = GetLine(DataFile)

' Ma tran khoang cach cua tat ca cac dong trong file du lieu ReDim DistMatrix(NumberofRow, NumberofRow) As Double ' Mang luu cac cum cho cac phan tu

ReDim Clustcenter(NumberofRow) As String 'Ma tran chua cac phan tu trong file du lieu ReDim LineMatrix(NumberofRow) As String For j = 0 To NumberofRow - 1

LineMatrix(j) = GetLineValue(DataFile, j + 2) Next j

'Tinh gia tri cho ma tran khoang cach Call DistCalculate

'Khoi tao cac dong dau tien cho n cum For i = 0 To ClustNum - 1

ClustArr(i) = i + 2 Next i

'Xac dinh ten file Cluster

ClusterFile = GetDir(DataFile) & "Kmeans\" & Left(GetFileName(DataFile), InStr(GetFileName(DataFile), ".")) & "Cluster"

OldClusterFile = GetDir(DataFile) & "Kmeans\" & Left(GetFileName(DataFile), InStr(GetFileName(DataFile), ".")) & "Cluster.old" (adsbygoogle = window.adsbygoogle || []).push({});

isStillMoving = True

Number_ = 0

'Thuc hien cho den luc khong con phan tu chuyen sang cum khac Do While isStillMoving And (Number_ < MaxInterative)

i = 0

Do While i < NumberofRow TempStr = LineMatrix(i)

Min_ = 2 ^ 10 'So lon Str_ = ""

'Vong lap nay tim cum ma co khoang cach toi dong du lieu thu i la nho nhat For j = 0 To ClustNum - 1

'Distance(j) = CalculateDist(i, ClustArr(j)) 'Chi can lay phan tu cua ma tran

Distance(j) = DistMatrix(i, ClustArr(j)) If Min_ >= Distance(j) Then

Min_ = Distance(j) Cluster_ = j

End If Next j

Str_ = Trim(Str(i + 1)) & "&" & Trim(Str(Cluster_)) 'Luu vao mang de giam thoi gian truy cap file

Clustcenter(i) = Str_

i = i + 1 Loop

'Tinh lai tam cac cum dua tren file Cluster va file du lieu For j = 0 To ClustNum - 1

'ClustArr1(j) = AllocateCenter(ClusterFile, j) 'Thay xu ly tren File bang xu ly tren mang ClustArr1(j) = AllocateCenter(Clustcenter, j) Next j

isStillMoving = False For j = 0 To ClustNum - 1

If ClustArr(j) <> ClustArr1(j) Then 'Co su thay doi phan tu tam cum isStillMoving = True

End If Next j

'Gan lai mang vua tinh duoc cho ten mang cu For j = 0 To ClustNum - 1 ClustArr(j) = ClustArr1(j) Next j Number_ = Number_ + 1 Loop

'Chuyen du lieu phancum vao file ClusterFile jFileNumber = FreeFile

Open ClusterFile For Output As #jFileNumber For i = 0 To NumberofRow - 1

'Call AppendFile(ClusterFile, Clustcenter(i))

Write #jFileNumber, LineMatrix(i) & "&" & Right(Clustcenter(i), Len(Clustcenter(i)) - InStr(Clustcenter(i), "&"))

Next i

Close #jFileNumber

3. MODULE THỰC HIỆN THUẬT TOÁN HIERACHICAL

Public Sub HIERACHICAL() (adsbygoogle = window.adsbygoogle || []).push({});

Dim i As Integer Dim j As Integer Dim k As Integer Dim h As Integer

Dim NodeNumber As Integer Dim iNumber, jNumber As Integer Dim StrValue As String

Dim OldTempFile As String Dim Min_ As Double

Dim TempArr() As Double 'Ma tran tam thoi de luu khoang cach giua cac node 'Dim CulsterHier As String 'File luu ket qua phan cum theo thuat toan Hierachical Dim Tempfile As String 'File chua du lieu tam thoi trong qua trinh thuc hien phan cum Dim Trap As Boolean

Dim TempText, TmpStr As String NumberofRow = GetLine(DataFile)

'Ma tran khoang cach cua tat ca cac dong trong file du lieu ReDim DistMatrix(NumberofRow, NumberofRow) As Double

'Tinh gia tri cho ma tran khoang cach Call DistCalculate

ClusterHier = Left(DataFile, InStr(DataFile, ".")) & "Hier" Tempfile = Left(DataFile, InStr(DataFile, ".")) & "Temp"

OldTempFile = Left(DataFile, InStr(DataFile, ".")) & "Temp.old" 'OldCulsterHier = Left(DataFile, InStr(DataFile, ".")) & "Hier.old" 'Tao file Temp ban dau voi gia tri cac dong la Line1 ... LineN jNumber = FreeFile

Open Tempfile For Output As #jNumber For j = 1 To NumberofRow

StrValue = "Line" & Trim(Str(j)) Print #jNumber, StrValue

Next j Close #jNumber i = NumberofRow NodeNumber = 1 Do While i >= 0

If Not CheckFileExist(ClusterHier) Then jNumber = FreeFile

Open ClusterHier For Output As #jNumber Close #jNumber

End If

ReDim TempArr(i, i) As Double

Min_ = 2 ^ 10 'So lon For j = 0 To i - 1 For k = 0 To i - 1

'Tinh gia tri moi cua ma tran Temparr dua tren cac file moi TempFile va ClusterHier If j <> k Then

Một phần của tài liệu Ứng dụng một số thuật toán phân cụm phân tích dữ liệu ngân hàng (Trang 82)