18.7.16

SAP HANA PAL 시나리오 1 - 슈퍼마켓의 신규 고객 세분화 예측하기

이번 Blog에서는 SAP HANA PAL, 즉 Data Mining Library를 활용한 예제를 Post합니다.

고객은 슈퍼마켓을 위한 새로운 고객 세분화 / 클러스터링을 예측하기를 원합니다. 최초의 슈퍼마켓 고객에게 기존의 분할 / 클러스터링을 수행하기 위해 HANA PAL의 K-means 기능을 사용합니다. 출력된 결과는 새로운 고객 세분화 / 클러스터링을 예측하는 C4.5 결정 트리의 기능에 대한 교육 자료로 사용할 수 있습니다.

기술 배경

- K-means clustering은 알고리즘이 N 개의 observation 또는 record들을 K개의 cluster로 분할하는 cluster 분석 방법이며, 각 observation들은 center와 가장 가까운 cluster에 속합니다. 이것은 클러스터링 방법 중 가장 일반적으로 사용되는 알고리즘의 하나입니다.
- Decision Tree는 분류 및 예측을 위한 강력하고 인기있는 도구입니다. 통계에 사용되는 Decision tree learning, data mining, 그리고 machine learning은 decision tree를 예측 모델로 사용하며, 이 예측 모델은 항목에 대한 점(observation)들을 항목의 목표 값에 대한 conclustion과 매핑합니다.

구현 단계

구현을 위해서는 다음과 같은 Role 할당이 요구됩니다.
• DM_PAL은 USER1에 속하는 스키마 입니다.
• USER1은 AFLPM_CREATOR_ERASER_EXECUTE 역할이 할당되어 있습니다.
• USER1은 AFL__SYS_AFL_AFLPAL_EXECUTE 또는 FL__SYS_AFL_AFLPAL_EXECUTE_WITH_GRANT_OPTION 역할이 할당되어 있습니다.

1 단계

입력 된 고객 데이터와 사용 K- 수단은 K 개의 클러스터에 설정된 데이터를 분할하는 방식으로 작동합니다. 이 예에서는 데이터의 9 행이 입력됩니다. K는 고객이 3 단계로 분할되는 것을 의미하는 3와 동일합니다.

SET SCHEMA DM_PAL;

DROP TYPE PAL_KMEANS_RESASSIGN_T;
CREATE TYPE PAL_KMEANS_RESASSIGN_T AS TABLE(
"ID" INT,
"CENTER_ASSIGN" INT,
"DISTANCE" DOUBLE
);

DROP TYPE PAL_KMEANS_DATA_T;
CREATE TYPE PAL_KMEANS_DATA_T AS TABLE(
"ID" INT,
"AGE" DOUBLE,
"INCOME" DOUBLE,
PRIMARY KEY("ID")
);

DROP TYPE PAL_KMEANS_CENTERS_T;
CREATE TYPE PAL_KMEANS_CENTERS_T AS TABLE(
"CENTER_ID" INT,
"V000" DOUBLE,
"V001" DOUBLE
);

DROP TYPE PAL_CONTROL_T;
CREATE TYPE PAL_CONTROL_T AS TABLE(
"NAME" VARCHAR(100),
"INTARGS" INTEGER,
"DOUBLEARGS" DOUBLE,
"STRINGARGS" VARCHAR(100)
);

-- create kmeans procedure
DROP TABLE PAL_KMEANS_PDATA_TBL;
CREATE COLUMN TABLE PAL_KMEANS_PDATA_TBL(
"POSITION" INT,
"SCHEMA_NAME" NVARCHAR(256),
"TYPE_NAME" NVARCHAR(256),
"PARAMETER_TYPE" VARCHAR(7)
);

INSERT INTO PAL_KMEANS_PDATA_TBL VALUES (1, 'DM_PAL', 'PAL_KMEANS_DATA_T', 'IN');
INSERT INTO PAL_KMEANS_PDATA_TBL VALUES (2, 'DM_PAL', 'PAL_CONTROL_T', 'IN');
INSERT INTO PAL_KMEANS_PDATA_TBL VALUES (3, 'DM_PAL', 'PAL_KMEANS_RESASSIGN_T', 'OUT');
INSERT INTO PAL_KMEANS_PDATA_TBL VALUES (4, 'DM_PAL', 'PAL_KMEANS_CENTERS_T', 'OUT');

CALL SYS.AFLLANG_WRAPPER_PROCEDURE_DROP('DM_PAL', 'PAL_KMEANS_PROC');
CALL SYS.AFLLANG_WRAPPER_PROCEDURE_CREATE('AFLPAL', 'KMEANS', 'DM_PAL', 'PAL_KMEANS_PROC', PAL_KMEANS_PDATA_TBL);

DROP TABLE PAL_KMEANS_DATA_TBL;
CREATE COLUMN TABLE PAL_KMEANS_DATA_TBL LIKE PAL_KMEANS_DATA_T;

INSERT INTO PAL_KMEANS_DATA_TBL VALUES (0 , 20, 100000);
INSERT INTO PAL_KMEANS_DATA_TBL VALUES (1 , 21, 101000);
INSERT INTO PAL_KMEANS_DATA_TBL VALUES (2 , 22, 102000);
INSERT INTO PAL_KMEANS_DATA_TBL VALUES (3 , 30, 200000);
INSERT INTO PAL_KMEANS_DATA_TBL VALUES (4 , 31, 201000);
INSERT INTO PAL_KMEANS_DATA_TBL VALUES (5 , 32, 202000);
INSERT INTO PAL_KMEANS_DATA_TBL VALUES (6 , 40, 400000);
INSERT INTO PAL_KMEANS_DATA_TBL VALUES (7 , 41, 401000);
INSERT INTO PAL_KMEANS_DATA_TBL VALUES (8 , 42, 402000);

DROP TABLE #PAL_CONTROL_TBL;
CREATE LOCAL TEMPORARY COLUMN TABLE #PAL_CONTROL_TBL(
"NAME" VARCHAR(100),
"INTARGS" INTEGER,
"DOUBLEARGS" DOUBLE,
"STRINGARGS" VARCHAR(100)
);

INSERT INTO #PAL_CONTROL_TBL VALUES ('THREAD_NUMBER', 2, NULL, NULL);
INSERT INTO #PAL_CONTROL_TBL VALUES ('GROUP_NUMBER', 3, NULL, NULL);
INSERT INTO #PAL_CONTROL_TBL VALUES ('INIT_TYPE', 1, NULL, NULL);
INSERT INTO #PAL_CONTROL_TBL VALUES ('DISTANCE_LEVEL', 2, NULL, NULL);
INSERT INTO #PAL_CONTROL_TBL VALUES ('MAX_ITERATION', 100, NULL, NULL);
INSERT INTO #PAL_CONTROL_TBL VALUES ('EXIT_THRESHOLD', NULL, 0.000001, NULL);
INSERT INTO #PAL_CONTROL_TBL VALUES ('NORMALIZATION', 0, NULL, NULL);

--clean kmeans result
DROP TABLE PAL_KMEANS_RESASSIGN_TBL;
CREATE COLUMN TABLE PAL_KMEANS_RESASSIGN_TBL LIKE PAL_KMEANS_RESASSIGN_T;
DROP TABLE PAL_KMEANS_CENTERS_TBL;

CREATE COLUMN TABLE PAL_KMEANS_CENTERS_TBL LIKE PAL_KMEANS_CENTERS_T;
CALL DM_PAL.PAL_KMEANS_PROC(PAL_KMEANS_DATA_TBL, "#PAL_CONTROL_TBL", PAL_KMEANS_RESASSIGN_TBL, PAL_KMEANS_CENTERS_TBL) WITH OVERVIEW;

SELECT * FROM PAL_KMEANS_CENTERS_TBL;
SELECT * FROM PAL_KMEANS_RESASSIGN_TBL;

DROP TABLE PAL_KMEANS_RESULT_TBL;
CREATE COLUMN TABLE PAL_KMEANS_RESULT_TBL(
"AGE" DOUBLE,
"INCOME" DOUBLE,
"LEVEL" INT
);
TRUNCATE TABLE PAL_KMEANS_RESULT_TBL;
INSERT INTO PAL_KMEANS_RESULT_TBL(
SELECT PAL_KMEANS_DATA_TBL.AGE, PAL_KMEANS_DATA_TBL.INCOME, PAL_KMEANS_RESASSIGN_TBL.CENTER_ASSIGN
FROM PAL_KMEANS_RESASSIGN_TBL
INNER JOIN PAL_KMEANS_DATA_TBL
ON PAL_KMEANS_RESASSIGN_TBL.ID = PAL_KMEANS_DATA_TBL.ID
);
SELECT * FROM PAL_KMEANS_RESULT_TBL;

결과는 PAL_KMEANS_RESULT_TBL에 다음과 같이 표시 될 것입니다.

2 단계

C4.5 결정 트리 학습 데이터로 위의 출력을 사용하십시오. C4.5 의사 결정 트리 기능은 항목의 목표 값에 대한 결론에 항목에 대한 관측을지도하는 트리 모델을 생성합니다.
SET SCHEMA DM_PAL;

DROP TYPE PAL_CDT_DATA_T;
CREATE TYPE PAL_CDT_DATA_T AS TABLE(
"AGE" DOUBLE,
"INCOME" DOUBLE,
"LEVEL" INT
);

DROP TYPE PAL_CDT_JSONMODEL_T;
CREATE TYPE PAL_CDT_JSONMODEL_T AS TABLE(
"ID" INT,
"JSONMODEL" VARCHAR(5000)
);

DROP TYPE PAL_CDT_PMMLMODEL_T;
CREATE TYPE PAL_CDT_PMMLMODEL_T AS TABLE(
"ID" INT,
"PMMLMODEL" VARCHAR(5000)
);

DROP TYPE PAL_CONTROL_T;
CREATE TYPE PAL_CONTROL_T AS TABLE(
"NAME" VARCHAR (100),
"INTARGS" INTEGER,
"DOUBLEARGS" DOUBLE,
"STRINGARGS" VARCHAR(100)
);

--create procedure
DROP TABLE PAL_CDT_PDATA_TBL;
CREATE COLUMN TABLE PAL_CDT_PDATA_TBL(
"POSITION" INT,
"SCHEMA_NAME" NVARCHAR(256),
"TYPE_NAME" NVARCHAR(256),
"PARAMETER_TYPE" VARCHAR(7)
);

INSERT INTO PAL_CDT_PDATA_TBL VALUES (1, 'DM_PAL', 'PAL_CDT_DATA_T', 'IN');
INSERT INTO PAL_CDT_PDATA_TBL VALUES (2, 'DM_PAL', 'PAL_CONTROL_T', 'IN');
INSERT INTO PAL_CDT_PDATA_TBL VALUES (3, 'DM_PAL', 'PAL_CDT_JSONMODEL_T', 'OUT');
INSERT INTO PAL_CDT_PDATA_TBL VALUES (4, 'DM_PAL', 'PAL_CDT_PMMLMODEL_T', 'OUT');

CALL SYS.AFLLANG_WRAPPER_PROCEDURE_DROP('DM_PAL', 'PAL_CREATEDT_PROC');
CALL SYS.AFLLANG_WRAPPER_PROCEDURE_CREATE('AFLPAL', 'CREATEDT', 'DM_PAL', 'PAL_CREATEDT_PROC', PAL_CDT_PDATA_TBL);

DROP TABLE PAL_CDT_TRAINING_TBL;
CREATE COLUMN TABLE PAL_CDT_TRAINING_TBL(
"REGION" VARCHAR(50),
"SALESPERIOD" VARCHAR(50),
"REVENUE" Double,
"CLASSLABEL" VARCHAR(50)
);

DROP TABLE #PAL_CONTROL_TBL;
CREATE LOCAL TEMPORARY COLUMN TABLE #PAL_CONTROL_TBL(
"NAME" VARCHAR(100),
"INTARGS" INTEGER,
"DOUBLEARGS" DOUBLE,
"STRINGARGS" VARCHAR(100)
);

INSERT INTO #PAL_CONTROL_TBL VALUES ('PERCENTAGE', NULL, 1.0, NULL);
INSERT INTO #PAL_CONTROL_TBL VALUES ('THREAD_NUMBER', 2, NULL, NULL);
INSERT INTO #PAL_CONTROL_TBL VALUES ('IS_SPLIT_MODEL', 1, NULL, NULL);
INSERT INTO #PAL_CONTROL_TBL VALUES ('PMML_EXPORT', 2, NULL, NULL);
DROP TABLE PAL_CDT_JSONMODEL_TBL;
CREATE COLUMN TABLE PAL_CDT_JSONMODEL_TBL LIKE PAL_CDT_JSONMODEL_T;

DROP TABLE PAL_CDT_PMMLMODEL_TBL;
CREATE COLUMN TABLE PAL_CDT_PMMLMODEL_TBL LIKE PAL_CDT_PMMLMODEL_T;

CALL DM_PAL.PAL_CREATEDT_PROC(PAL_KMEANS_RESULT_TBL, "#PAL_CONTROL_TBL", PAL_CDT_JSONMODEL_TBL, PAL_CDT_PMMLMODEL_TBL) WITH OVERVIEW;

SELECT * FROM PAL_CDT_JSONMODEL_TBL;
SELECT * FROM PAL_CDT_PMMLMODEL_TBL;

STEP3

자신이 속한 해당 레벨에 각각의 새로운 고객을지도하기 위해 상기 트리 모델을 사용하십시오.
SET SCHEMA DM_PAL;

DROP TYPE PAL_PCDT_DATA_T;
CREATE TYPE PAL_PCDT_DATA_T AS TABLE(
"ID" INT,
"AGE" DOUBLE,
"INCOME" DOUBLE
);

DROP TYPE PAL_PCDT_JSONMODEL_T;
CREATE TYPE PAL_PCDT_JSONMODEL_T AS TABLE(
"ID" INT,
"JSONMODEL" VARCHAR(5000)
);

DROP TYPE PAL_CONTROL_T;
CREATE TYPE PAL_CONTROL_T AS TABLE(
"NAME" VARCHAR (100),
"INTARGS" INTEGER,
"DOUBLEARGS" DOUBLE,
"STRINGARGS" VARCHAR (100)
);

DROP TYPE PAL_PCDT_RESULT_T;
CREATE TYPE PAL_PCDT_RESULT_T AS TABLE(
"ID" INT,
"CLASSLABEL" VARCHAR(50)
);

-- create procedure
DROP TABLE PAL_PCDT_PDATA_TBL;
CREATE COLUMN TABLE PAL_PCDT_PDATA_TBL(
"POSITION" INT,
"SCHEMA_NAME" NVARCHAR(256),
"TYPE_NAME" NVARCHAR(256),
"PARAMETER_TYPE" VARCHAR(7)
);

INSERT INTO PAL_PCDT_PDATA_TBL VALUES (1, 'DM_PAL', 'PAL_PCDT_DATA_T', 'IN');
INSERT INTO PAL_PCDT_PDATA_TBL VALUES (2, 'DM_PAL', 'PAL_CONTROL_T', 'IN');
INSERT INTO PAL_PCDT_PDATA_TBL VALUES (3, 'DM_PAL', 'PAL_PCDT_JSONMODEL_T', 'IN');
INSERT INTO PAL_PCDT_PDATA_TBL VALUES (4, 'DM_PAL', 'PAL_PCDT_RESULT_T', 'OUT');

CALL SYS.AFLLANG_WRAPPER_PROCEDURE_DROP('DM_PAL', 'PAL_PREDICTWITHDT_PROC');
CALL SYS.AFLLANG_WRAPPER_PROCEDURE_CREATE('AFLPAL', 'PREDICTWITHDT', 'DM_PAL', 'PAL_PREDICTWITHDT_PROC', PAL_PCDT_PDATA_TBL);

DROP TABLE PAL_PCDT_DATA_TBL;
CREATE COLUMN TABLE PAL_PCDT_DATA_TBL LIKE PAL_PCDT_DATA_T;

INSERT INTO PAL_PCDT_DATA_TBL VALUES (10, 20, 100003);
INSERT INTO PAL_PCDT_DATA_TBL VALUES (11, 30, 200003);
INSERT INTO PAL_PCDT_DATA_TBL VALUES (12, 40, 400003);

DROP TABLE #PAL_CONTROL_TBL;
CREATE LOCAL TEMPORARY COLUMN TABLE #PAL_CONTROL_TBL(
"NAME" VARCHAR (100),
"INTARGS" INTEGER,
"DOUBLEARGS" DOUBLE,
"STRINGARGS" VARCHAR (100)
);

INSERT INTO #PAL_CONTROL_TBL VALUES ('THREAD_NUMBER', 2, NULL, NULL);
DROP TABLE PAL_PCDT_RESULT_TBL;

CREATE COLUMN TABLE PAL_PCDT_RESULT_TBL LIKE PAL_PCDT_RESULT_T;
CALL DM_PAL.PAL_PREDICTWITHDT_PROC(PAL_PCDT_DATA_TBL, "#PAL_CONTROL_TBL", PAL_CDT_JSONMODEL_TBL, PAL_PCDT_RESULT_TBL) WITH OVERVIEW;

SELECT * FROM PAL_PCDT_RESULT_TBL;
예상되는 예측 결과는 다음과 같습니다.

No comments:

Post a Comment