Настройка работы SAS с БД Oracle

Всем привет!
Данная статья посвящена тому, как правильно надо настраивать систему для работы с БД Oracle в системах Windows. Так или иначе, какая-то часть информации уже и ранее была опубликована на нашем сайте. Тут будет собрана вся необходимая информация в одном месте!

1. На первом этапе, необходимо убедиться, что SAS Access To Oracle есть в лицензии и установлен. Для этого заходим в SAS Base Enterprise guide и вводим следующий код:

proc setinit;
run;
В логе будет отображён список, где и ищем —SAS/ACCESS Interface to Oracle.
2. Далее, устанавливаем правильную версию клиента Oracle, разрядность которой будет соответствовать разрядности установленного SAS. Для этого заходим на сайт ORACLE, где и ищем необходимую версию и разрядность клиента или базы. После чего скачиваем и устанавливаем дистрибутив. Желательно перезагрузить систему.
Замечу, что изначально рекомендуется установить Oracle Client до установки SAS.
3. В файле TNSNAMES.ORA указываем параметры доступа к нашей БД.
Примерно по следующему пути можно найти необходимый файл:
С:APPPRODUCT11.2.0CLIENT_1NETWORKADMIN
В TNS указываются следующие параметры:
NAME =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = HOST_NAME)(PORT = PORT))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = SID_NAME)
    )
  )
Подчёркнутое прописывать ручками =)
На этом этапе может возникнуть сразу несколько разных нюансов.
4. Клиент SAS неправильно отображает символы из БД. Это может происходить по нескольким причинам:
Меняем параметры системного файла sas9.cfg. Сначала заходим в sas9.cfg, который лежит по адресу ниже:
!ROOTSASSASHomeSASFoundation9.3
!ROOT — это корень где лежит SAS. Это обычно C:Program Files или просто C:. В общем, то место куда устанавливался SAS.
В этом файле прописан путь к другому sas9.cfg файлу, который нас и интересует. В моём случае это:
-config «C:SASSASHomeSASFoundation9.3nlsu8sasv9.cfg»
 Далее переходим к этому файлу. Обязательно делаем копию этого файла, а далее в конце списка добавляем следующие строки или заменяем те, которые уже как-то есть в списке.
-DBCS
-LOCALE ru_RU
-encoding=utf-8 
Перезапускаем SAS Base и смотрим далее. Если картинка изменилась, но всё равно непонятные символы, то переходим к следующему шагу, иначе сразу к шагу 6.
5. Изменение записей в реестре.
Для правильного отображения меняем параметр NLS_LANG.
Переходим в HKEY_LOCAL_MACHINESOFTWAREoracleKEY_OraClient11g_home1
И далее меняем параметр на AMERICAN_AMERICA.AL32UTF8
Теперь отображение значений должно быть в норме.
6. Последний момент связан с созданием таблиц на стороне БД. Проблема возникает когда примерно следующий код создаёт табличку:
LIBNAME TEST ORACLE <options>;
PROC SQL;
     CREATE TABLE TEST.A
              (X CHAR(250));
QUIT:
А далее делаем
PROC CONTENTS DATA=TEST.A; RUN;
 
Причём, даже если «провалиться» на БД и написать код, то всё равно размерность будет в 4 раза больше.
Вот такую скромную размерность создаёт SAS при работе с Oracle.
Если посмотреть эту же табличку через SQL Developer, то увидим:
Name  Null               Type          
—-       —-                —————
X                               VARCHAR2(1002)
Всё это происходит по тому, что SAS при работе с Unicode увеличивает размер в 4 раза, как на уровне создания таблички, так и на уровне возвращения запроса.
Для того, чтобы данную проблему избежать необходимо указывать следующие параметры при указании библиотек:
LIBNAME TEST ORACLE <options> DBSERVER_MAX_BYTES=1 DBCLIENT_MAX_BYTES=1;
Теперь SQL Developer возвращает:
Name  Null               Type          
—-       —-                —————
X                               VARCHAR2(250)
Если запустить в SAS процедуру CONTENTS, то она уже возвращает:

На этом всё! Спасибо за внимание!

SAS Share, ORACLE library

Всем привет!

В этой статье я поделюсь решением одной из проблем, когда требуется подключить библиотеку из Oracle к SAS Share Server.


В прошлой статье я описал подключение библиотек SAS к Share серверу.

Полагая, что аналогичным образом можно подключить и все другие библиотеки, я попробовал подключить и библиотеку Oracle:

Действуя по тем же шагам, что и делал ранее была создана библиотека Oracle:

Далее:

Далее:

В Advanced Options делаем по аналогии с Base:
 

 Далее создаём новый сервер Oracle:

Далее:

Далее указываем PATH (SID), User Password:


Завершаем установку.

Добавляем эту библиотеку по аналогии с прошлым постом в SAS Share.

Далее перезагружаем SAS Share Server и регистрируем таблички в библиотеке.

На этом этапе появляются варианты: либо проблем нету и всё работает, либо в логах появляются ошибки, о которых пишет SAS MC.

В моём случае появилась не совсем ожидаемая ошибка.
ERROR: Libname oralib is not assigned.
ERROR: Error in the LIBNAME statement

В логах ShareServer видно следующее:
ORACLE connection error: ORA-01017: invalid username/password; logon denied

Озадачило меня то, что эта библиотека прекрасно подключается с аналогичными параметрами к Oracle, если не через SAS Share Server.

Долго проковырявшись в настройках, мне пришла идея добавить в закладку
Properties => Options => Advanced Options => Other Options
следующие параметры: user = «user» password = «password» path =»path»
Где вместо userpasswordpath выставляются соответствующие значения для подключения к необходимой библиотеке Oracle.

После чего всё заработало.

Крепких вам нервов и удачи в работе с SAS SHARE!

p.s.
При написании статьи я подразумевал, что клиент Oracle с указанными tnsnames установлен в системе. Более того, разрядность (x32x64) этого клиента должна соответствовать разрядности SAS.

Работа с SAS Share, Remote Libraries

Всем привет!
В последнее время я занят настройкой и правильной работой SAS Digital Marketing. По этой причине, у меня сегодня не так много интересных задач, которыми я мог бы поделиться.
В этой статье хочу обратить внимание на следующие вещи: методы связи в SAS, особенность работы с SAS SHARE, создание remote библиотек для работы с SAS SHARE.


SAS использует методы доступа связи, которые представляют собой интерфейс между SAS и сетевым протоколом, который в свою очередь используется для соединения двух операционных сред. Для этой цели в SAS используются 2 метода: SAS SHARE и SAS CONNECT.

 

SAS SHARE сервер данных, который позволяет нескольким пользователям получать одновременный доступ к SAS файлов без необходимости использовать отдельные SAS CONNECT удаленные входы для каждого пользователя. SAS SHARE позволяет не только консолидировать несколько раздельных библиотек данных, но управлять и координировать запросы на данных по сети в реальном времени.

SAS CONNECTнабор инструментов SAS как для клиента, так и для сервера. Он устанавливает связи между компьютерами в сети с различными операционными системами. SAS CONNECT позволяет пользователям и разработчикам возможность доступа, управления и обработки данных, используя различные сетевые архитектуры, а также различные версии SAS.

Эти методы используют следующие интерфейсы:
TCP/IP — программный интерфейс (program-to-program), который поддерживается на аппаратном уровне от разных производителей
XMSэто интерфейс, который является частью операционной среды z/OS и используется программами, которые работают в этой среде.
 
Более подробная информация по работе этих методов доступна на официальном сайте http://support.sas.com 

В данной статье речь будет идти о работе с SAS SHARE.
В первую очередь в вашей лицензии должен быть SAS SHARE. Для того чтобы убедиться, что лицензия у вас есть, перечитайте одну из статей выложенных на нашем сайте ранее.

Мой опыт работы с системой SAS на данный момент был только в среде Windows. По этому, некоторые моменты по работе с Unix будут отличаться.

После успешной установки SAS Depot в Windows службах (services) появляются ряд служб, отвечающий за SAS. Среди них должен быть и SAS SHARE Server — сервер, который и отвечает за необходимый нам метод сетевого соединения:
 
Нас интересует последний:

Как видите, по умолчанию для этого сервера присваивается 8551 порт. Его можно изменить при установке SAS, но я не рекомендую этого делать. Может что-нибудь сломаться.

Так же этот сервер доступен из SAS Management Console:
Для того, чтобы окончательно убедиться, что сервер работает и порт открыт можно использовать в командной строке (предварительно требуется установить TELNET client): telnet localhost 8551. Чёрный экран командной строки будет означать, что всё работает.
Мы подошли к моменту, когда мы можем создать библиотеки для работы с SAS SHARE.
Создаём новую библиотеку в SAS Management Console, где выбираем SAS/SHARE REMOTE Engine Library:
 
 Переходим далее, указываем имя и место хранения в SAS MC. Переходим далее, где указываем SAS Application server, который будет работать с этой библиотекой. Доступно на выбор 3: Share Server, SAS Meta, SAS App. Выбираем SAS App:
Далее указываем libref (учитывая требования к названиям библиотек в SAS).
В следующем окне необходимо указать SAS/SHARE Server Library. 
Создаём новую, где указываем тип библиотеки.  На этом этапе всё зависит от того, с какой БД будет осуществляться работа. На данном этапе уже нельзя выбрать SAS/SHARE REMOTE Engine Library.
Рассмотрим сначала простейший случай и выберем SAS Base Library:
 
Далее указываем название, которое будет отображаться в SAS MC, далее выбираем сервер. Тут надо указать Share Server:
 
Далее указываем libref и переходим в Advanced Options:
 
Где требуется поставить галочку Library is Pre-Assigned и выбрать By Native library engine. Это особенность работы SAS SHARE с библиотеками SAS Base. Если так не указать, то при дальнейшей регистрации табличек в библиотеках будет возникать ошибка.
 
Далее завершаем создание обеих библиотек. Таким образом в SAS MC появляется 2 библиотеки:
 
Далее требуется ПЕРЕЗАПУСТИТЬ СЛУЖБУ SAS SHARE. Заходим в Windows -> Services. Находим необходимую службу и перезапускаем её.
Возвращаемся в SAS MC. 
Правой кнопкой по библиотеке типа REMOTE -> Register Tables -> Next -> выбираем необходимую таблицу.
Теперь вы сможете найти данную библиотеку, если подсоединитесь к серверу SAS SHARE. 
Как это сделать? Это уже тема другой статьи.
На этом всё.

Проверка на существование макропеременных

Всем привет!

В данной статье я опишу способы проверки существования макропеременных. Случается, что несуществующая макропеременная в функции ломает программу, то есть в логе появляется запись типа ERROR:…


Самый колхозный случай, который обычно применяется в случае дебага, это вывод всех макропеременных в лог (или куда-либо ещё):
%PUT _ALL_;
Так же могут быть варианты типа вывода только локальных (_LOCAL_) или глобальных (_GLOBAL_) макропеременных.
Далее уже идёт обработка этого списка на наличие или отсутствие необходимых значений.
Можно также вывести значение переменной NAME:
%PUT &NAME;

Другой вариант проверки предоставляет сам SAS. Существует функция %SYMEXIST, которая проверяет макропеременную на наличие:
           %SYMEXIST(макропеременная)
Функция возвращает значение 1 (TRUE) или 0 (FALSE).

Пример кода, с официальной страницы прост и понятен:

%global x;
%macro test;
%local y;
%if %symexist(x) %then %put %nrstr(%symexist(x)) = TRUE;
%else %put %nrstr(%symexist(x)) = FALSE;
%if %symexist(y) %then %put %nrstr(%symexist(y)) = TRUE;
%else %put %nrstr(%symexist(y)) = FALSE;
%if %symexist(z) %then %put %nrstr(%symexist(z)) = TRUE;
%else %put %nrstr(%symexist(z)) = FALSE;
%mend test;
%test;

А вот что появится в ЛОГе:

%symexist(x) = TRUE
%symexist(y) = TRUE
%symexist(z) = FALSE

И третий способ заключается в написании своего собственного способа. Здесь вариантов много, всё зависит от задачи.
Данный вариант взят с официального сайта поддержки.

%macro check(mvar);
    %local i tmp;
    %let dsid=%sysfunc(open(sashelp.vmacro));
    %let num=%sysfunc(varnum(&dsid,name));

    %do %until(&ob = -1);
        %let i=%eval(&i+1);
        %let ob=%sysfunc(fetchobs(&dsid,&i));
        %let val=%sysfunc(getvarc(&dsid,&num));

        %if &val = %upcase(&mvar) %then
            %do;
                %let ob = -1;
                %let tmp=yes;
            %end;
        %else
            %do;
                %let tmp=no;
            %end;

        %if &ob=-1 %then
            %do;
                &tmp
            %end;
    %end;
    %let rc=%sysfunc(close(&dsid));
%mend check;

Или вот один из примеров, взятых отсюда:
%macro isBlank(param);
       %sysevalf(%superq(param)=,boolean)
%mend isBlank;
В это плане мне нравится сравнительная статья.

На этом всё!

Обработка ошибок через SAS Macro

Всем привет!
Я прошу прощения, что некоторое время не писал, так как проходил тренинг в Московском Тренинговом Центре. Если у Вас есть вопросы по поводу тренинга, то пишите: я всегда рад поделиться!
В данной статье я опишу достаточно простой способ обработки ошибок в SAS.

Недавно я столкнулся с задачей, где требовалось обрабатывать ошибку связанную с неправильной работой БД Oracle. То есть, например, необходимо было записать что-то, а база недоступна.
Начну по порядку. Ошибки записываются в стандартные автоматические макропеременные:
&SYSERR
&SYSERRORTEXT
&SYSWARNINGTEXT
Для того, чтобы код отработал после ошибки (которая по идее прекращает работу программы) необходимо создать макрос и поместить его в конец программы.
На официальном сайте очень подробно расписано какие значения может принимать макропеременная SYSERR. Данная переменная содержит коды по ТИПАМ ошибок. И используя, например, следующий код можно проверить условие на то, что есть ошибка или нет:
%MACRO ERROR_CHECK1();
     %IF &SYSERR NE 0 %THEN
            %DO;
                %PUT %SYSERR;
                * <В ДАННОЕ МЕСТО МОЖНО ВСТАВИТЬ НЕОБХОДИМЫЙ КОД!> ;
            %END:
%MEND;
%ERROR_CHECK1;
К сожалению, не всегда и не во всех приложениях SAS можно использовать данную переменную. Особенно это заметно, когда «проваливаешься» на стороннюю БД.
В этом случае приходят на помощь SYSERRORTEXT и SYSWARNINGTEXT. На официальном сайте есть несколько примеров по работе с ними. Данные переменные содержат тексты ошибок и предупреждений, даже если &SYSERR = 0. В качестве примера можно использовать следующий код, которые обрабатывает оракловые ошибки:
%MACRO ERROR_CHECK2();
     %IF  %SYSFUNC(FIND(&SYSERRORTEXT, ‘ORACLE EXECUTE ERROR’,1)) %THEN
            %DO;
                %PUT %SYSERRORTEXT;
                * <В ДАННОЕ МЕСТО МОЖНО ВСТАВИТЬ НЕОБХОДИМЫЙ КОД!> ;
            %END:
%MEND;
%ERROR_CHECK2;
Также есть интересные примеры на сайте support.sas.com, связанные с обработкой ошибок. google.com в данном случае поможет =)
В некоторых приложениях SAS существуют дополнительные макропеременные. Например, в SAS Customer Intelligence Studio можно выделить две: MAError и MAMsg. Принцип работы примерно такой-же, как и для стандартных ошибок, описанных выше.
На этом всё!
До скорых встреч!

Немного о сертификатах SAS

Всем привет!
В данной статье я напишу об официальных сертификатах от компании SAS, немного о своём опыте получения сертификатов, и помогли ли они мне при трудоустройстве на работу.

Насколько мне известно, сертификаты от SAS можно получить двумя способами:
1. Пройти обучение и после него получить сертификат об успешном прохождении курсов
2. Пройти тестирование в специальных центрах
Сертификаты в этом случае немного разные. Насколько мне известно, вторые за рубежом ценятся больше и имеют вес при приёме на работу. В России пока разницу я не заметил.
Я попробую немного рассказать о втором пункте, а именно о сертификатах, которые надо сдавать.
На официальном сайте можно найти список экзаменов. К слову, список экзаменов иногда меняется: что-то появляется, что-то уходит. Некоторые экзамены меняют версии по продуктам, но в целом они не сильно отличаются. Если была 8 версия продукта, то экзамен по 9 будет идентичным. Сертификаты с некоторых пор выдают бессрочно.
Блок SAS программирование:
SAS Certified Base Programmer for SAS 9 представляет собой экзамен по программированию в DATA STEP. Ни больше, ни меньше. По-моему, для успешной сдачи данного экзамена требуется уделить от 3 до 6 месяцев на подготовку. Мне было достаточно легко подготовиться, так как я активно использовал SAS Base в учебе за рубежом. И всё же, даже при активном программировании в SAS, сдать успешно экзамен без подготовки маловероятно. Некоторые люди, которые программировали в SAS более 15 лет набирали всего 80%. Собственно, как и в любом другом тесте. Из этой серии, как вы думаете в тесте на знание английского языка, какой балл в среднем набирает носитель языка? =)

SAS Certified Advanced Programmer for SAS 9 — экзамен по MACRO, PROC SQL и оптимизации кода. Получение этого сертификата возможно только при наличии сертификата SAS Base. На подготовку к этому экзамену зависит то, чем вы занимаетесь. Если в вашей рутиной работе вы постоянно сталкиваетесь с вышеперечисленными вещами, то я думаю можно подготовиться за 1-3 месяца. Хотя я сам только планирую сдавать этот экзамен в ближайшее время =)

Мой личный опыт сдачи экзамена можно прочитать тут.

SAS Certified Clinical Trials Programmer Using SAS 9 — экзамен для тех, кто собирается работать и заниматься клиническими исследованиями. Как я понял, экзамен представляет собой смесь из SAS Base, некоторых специфических процедур и очень сугубо специфических вопросов по клиническим исследованиям. Сам не сдавал и не планирую.

Блок продвинутой аналитики
SAS Certified Predictive Modeler Using SAS Enterprise Miner 7 — на мой взгляд самый сложный экзамен. Экзамен этот по Data Mining. Подготовиться к нему без преподавателя будет очень сложно. Во время экзамены сдающий подсоединяется к некой тестируемой базе, заходит в Enterprise Miner. Далее экзамен представляет собой список вопросов по основным блокам для статистического анализа. Один блок — одна база. Для каждого пользователя создаётся своя база, то есть списать не получится. Почти на каждый вопрос приходится искать ответ в Enterprise Miner. Из 10 человек, кто сдавал со мной, сдало лишь 3. Все мы проходили полугодовой курс по SAS EM.

SAS Certified Statistical Business Analyst Using SAS 9: Regression and Modeling — судя по вариантам вопросов, экзамен представляет собой на понимание основ построения регрессий и моделирования. Так же будет набор вопросов по процедурам связанным с моделированием.

Блок BI
SAS Certified BI Content Developer for SAS 9 — экзамен по Web Studio и BI DashBoard. На мой взгляд экзамен простоват.

Блок Работа с данными
SAS Certified Data Integration Developer for SAS 9 — как видно из названия экзамен по DIS, то есть по ETL в SAS. Аналогично, экзамен выглядит простым.

Блок администрирования
SAS Certified Platform Administrator for SAS 9 — экзамен на понимание работы библиотек, администрирования в Eguide и Management Console. 
Кстати, SAS делит тесты на уровни сложности. Каждый из них помечен в описании на официальном сайте.
Для сдачи теста необходимо зарегистрироваться на сайте http://www.pearsonvue.com/sas/, выбрать место и время, а затем оплатить.

Подготовиться и сдать эти экзамены вполне реально. Существует несколько сайтов, где выложены примеры вопросов и ответы к ним (возможно даже правильные).
Вот некоторые из них:
Достаточно много сайтов готовы предоставить эти примеры за символическую плату в 5-20 американских долларов.
К большинству экзаменов можно будет подготовиться, если скачать ответы и их выучить.
Как вы можете убедиться, большого ума не надо, для того чтобы сдать тест. Всего лишь необходимо выучить 200-300 вариантов.
Но тут есть небольшой подвох:
  • Не все ответы правильные, их надо проверять
  • SAS добавляет новые вопросы (может и удаляет старые)
  • Визуально ответы будут расположены каждый раз в случайном порядке
  • Не все тесты имеют подготовленные заранее ответы (SAS Enterprise Miner)
  • Не все варианты вопросов можно найти в интернете
Для сдачи теста, достаточно набрать 70%. У каждого теста есть свои нюансы, смотрите ссылки выше.
Про сертификаты у меня всё. А вот про то, насколько они помогают при трудоустройстве на работу, много писать не придётся.
Как я понял, сегодня российский работодатель не в курсе что это за сертификаты такие и зачем они ему нужны (или мне как работнику). Моя статистика говорит, что только 2 из 9 работодателей сегодня в курсе что это за сертификат. На моё нынешнее трудоустройство  наличие сертификатов повлияло.
Заинтересованы в сертифицированных специалистах пока только IT компании, так как это может позволить выиграть тендер или иметь статус компании партнёра. Банкам нужны руки, а не сертификаты. Компаниям, которые занимаются клиническими исследованиями нужны люди, которые умеют программировать. Научить программировать в SAS Base они вроде знают как.
Есть ещё наверно и другие вакансии где используется SAS, но на собеседования меня в эти компании не приглашали.
На этом всё!
До следующего раза!

Возможные проблемы при работе с SFTP в SAS

Всем привет!

Надеюсь, что вы уже прочитали мой пост ранее.

В данной статье я хочу поделиться о возможных трудностях с которыми можно столкнуться при работе с SFTP.

Обычно при первом подсоединении SAS выдаёт следующее сообщение:

Looking up host. Connecting to 00.00.00.00 port 000
..
..
The server’s host key is not cached in the registry.
You have no guarantee that the server is the computer you think it is.
The server’s rsa2 key fingerprint is: ..
If you trust this host, enter «y» to add the key to PuTTY’s cache and carry on connecting.
If you want to carry on connecting just once, without adding the key to the cache, enter «n».
If you do not trust this host, press Return to abandon the connection.
Store key in cache? (y/n)
Решение этой проблемы лежит на поверхности: необходимо подсоединиться к серверу клиентом PUTTY, чтобы он запомнил fingerpring сервера в реестре.

HKEY_CURRENT_USERSoftwareSimonTathamPuTTYSshHostKeys

Так же официальная поддержка ссылается на документ в котором расписаны некоторые детали подключения по защищённым соединениям.

Но что будет, если вам надо запланировать или отправить на расписание процесс, которые использует SFTP соединение?
В этом случае в логах мы опять увидим сообщение, что ключ не зарегистрирован.

Дело в том, что запланированный процесс запускается не вами, а пользователем SASSRV или Stored Process Server (Spawned Servers). 

Как было указано ранее, для того, чтобы SAS сумел подсоединиться требуется запись в реестре. И тут возникает вопрос, а как сделать запись в реестре для пользователя SASSRV?
Я подозреваю, что есть несколько вариантов, но расскажу лишь про самый «колхозный» =)

Заходим в локальные политики User Rights Assignment Allow log on through Remote Desktop Services и добавляем туда пользователя SASSRV.
Если такого пользователя нет, то необходимо его создать в Server Manager.
Далее заходим в систему под SASSRV, запускаем Putty и подсоединяемся по SFTP.

Вуаля! Теперь всё работает!

До скорых встреч!

UPDATE:
Другая проблема может быть связана с настройками самого SFTP сервера. В этом случае в логах можно увидеть следующее сообщение:

ERROR: Public Key Authentication is required, Password validation is not supported.
ERROR: For further debugging assistance, insert the PSFTP verbose parameters «options=’-v’ debug» on the Filename sftp statement
and review the SAS log.
ERROR: Connection refused, check key authentication and sshd server status.

Одним из возможных  решений данной проблемы может быть указание дополнительных опций в FILENAME statement. Необходимо добавить следующий параметр:

filename XXX sftp <options> WAIT_MILLISECONDS=XXXX;

То есть, мы искусственно добавляем время ожидания сервера, например до 5 секунд (5000) и всё опять начинает работать! 

SAS Fraud detection

Все наверное видели рекламный ролик SAS: Enterprise Fraud and Financial Crimes. Оратор произнес очень важную фразу — “reducing false positives”. Это, наверное, одна из важнейших характеристик fraud detection системы для организации работающей с клиентами. Абсолютно не проблема отметить как подозрительные транзакции все действия “похожие” на уже совершенные мошеннические операции. Проблема — не отпугнуть добросовестных клиентов, попавших в этот список.

Приведу несколько цитат из статьи “Statistical Fraud Detection: A Review” by Richard J.Bolton and David J.Hand:

“One of the difficulties with fraud detection is that typically there are many legitimate records for each fraudulent one. A detection method which correctly identifies 99% of the legitimate records as legitimate and 99% of the fraudulent records as fraudulent might be regarded as a highly effective system. However, if only 1 in 1000 records is fraudulent, then, on average, in every 100 that the system flags as fraudulent, only about 9 will in fact be so. In particular, this means that to identify those 9 requires detailed examination of all 100 — at possibly considerable cost. This leads us to a more general point: fraud can be reduced to as low a level as one likes, but only by virtue of a corresponding level of effort and cost. In practice, some compromise has to be reached, often a commercial compromise, between the cost of detecting a fraud and the savings to be made by detecting it.”
  

Почему так происходит поясняет следующая схема:

Области множества символизируют:
1 — все транзакции (N)
2 — мошеннические транзакции классифицированные как не мошениические (False negatives)
3 — правильно классифицированные мошеннические транзакции (True positives)
4 — нормальные транзакции классифированные как мошеннические (False positives)
Мы предполагаем что в базе данных примерно каждая тысячная транзакция — мошенническая

 

Это так называемая prior probability. Т.е. изначально мы можем сказать (после просмотра существующей базы данных), что каждая следующая транзакция которую мы будем наблюдать, с вероятностью 0.001 является мошеннической. Математически это так, но это тоже самое как если бы врач объявлял пациенту, только что зашедшему в кабинет, что он болен с такой то вероятностью такой то болезнью. Но потом бы он проводил осмотр, проверял симптомы и корректировал бы вероятность, получая posterior probability, которая нас и интересует (и потенциального больного тоже). 
Предположим что всего в базе содержится N записей. Точность классификации (accuracy) мошенников и нормальных транзакций- 0.99 (в обоих случаях). Далее, 100 записей было классифицировано как fraud (область 3 + область 4):

истинные мошенники попадают только в область 3:

Теперь посчитаем долю истинных fraud transactions (область 3) среди всех записей классифицированных как fraud (область 3 + область 4)

То есть из 100 “подозрительных” транзакций только примерно 0.09 будут действительно мошеннические. И это при том, что наш классификатор имеет очень выскокую точность 99%.

Еще несколько цитат:

“Fraud detection is a continuously evolving discipline.Whenever it becomes known that one detection method is in place, criminals will adapt their strategies and try others..”
“The development of new fraud detection methods is made more difficult by the fact that the exchange of ideas in fraud detection is severely limited.”
Т.е. помимо того, что имеется очень мало записей о реальных мошеннических операциях, мы еще имеем адаптивное поведение мошенников и естественные ограничения на обмен знаниями между банками в силу специфики отрасли. Всё это делает fraud detection очень сложной задачей. Скорее всего для ее решения нужна комбинация supervised (для мониторига он-лайн) и unsupervised (для выявления новых, ранее не известных мошеннических схем) алгоритмов.
Банки должны находить некий баланс между стоимостью “ручной проверки” всех транзакций классифицированных как fraud и возможными потерями связанными с false positives.
Второй случай встречается довльно часто. Одним из важных параметров fraud detection системы является location транзакции. Если клиент совершал транзакции в течении месяца например из Франции, а в один прекрасный день прилетел в Бразилию и решил там срочно снять наличных на 1000 евро, то велика вероятность что карточу заблокируют. Тоже самое и в США, только там банки рекомендуют клиентам сообщать о своих передвижениях даже если они перемещаются в другой штат.
Вывод: учитывая перечисленные трудности, коробочное решение, которое работает “out of the box” — врят ли возможно в принципе.

TRANWRD, TRANSTRN функции и макропеременные

Всем привет!

Не так давно я столкнулся с необходимостью замены некоторых символов в макропеременных. Например, задача записать в название файла текущее время в формате HHMM.


Как вы наверное знаете, это можно сделать несколькими способами.

Я решил сделать так:
%let time = %sysfunc(TIME(),hhmm.);

В этом случае мы получим результат в виде hh:mm. Всё было бы отлично, если бы не одно но: система MS Windows не приемлет в названии файлов символы типа » : «.

Попробуем заменить двоеточие на значок нижнего подчёркивания » _ «.
Воспользуемся функцией TRANWRD (можно и TRANSTRN), синтаксис которой следующий:
TRANWRD(источник, что меняем, на что меняем)
Описание функции можно найти на официальном сайте.

Вставляем эту функцию в макрокод, как если бы вставляли в обычный код:
%let time = %sysfunc(tranwrd(%sysfunc(TIME(),hhmm.), «:» , «_»));
Но он не сработал, и результат остался тем же в формате hh:mm.

Так в чём же дело?
А дело в следующем:

  • В макрокоде нет необходимости использовать кавычки, а если они стоят, то они будут считаться частью текста. То есть, «:» — это 3 символа, которых нету в значении времени, а значит и нечего заменить.
  • Если есть необходимость заменить пробел, то в этом случае приходит на помощь %STR(letter), где на месте letter будет стоять пробел или любой другой символ, который необходимо заменить.

То есть, теперь код может выглядеть следующим образом:

%let time = %sysfunc(transtrn(%sysfunc(TIME(),hhmm.),: ,_));

или

%let time = %sysfunc(transtrn(%sysfunc(TIME(),hhmm.),%str(:) ,%str(_)));

На этом всё!
Спасибо за прочтение и до скорых встреч!

Передача макропеременных на сторону Oracle

Всем привет!

Данная статья достаточна проста, но она позволяет предостеречь читателей от потерянного времени на поиск ошибки, которая может быть не очевидна.


Допустим была создана макропеременная:
%let id = 1;

Сразу напомню, что макропеременная &id имеет тип char.

Далее мы хотим передать эту переменную в БД Oracle через pass through. В отличии от работы в SAS, кавычки не требуются.
proc sql noprint;
    connect to oracle as myora (user=»example» password=»example» path=example);
         execute (create table example (id number)) by myora;
         execute (insert into example values (&id)) by myora;
    disconnect from myora;
quit;

Как мы можем убедиться, происходит неявное преобразование и в табличку записывается числовое значение.

Но допустим, вам надо поместить это значение в какую-то процедуру?
Например, example.test(id as number).
proc sql noprint;
    connect to oracle as myora (user=»example» password=»example» path=example);
        execute (
            begin
                example.test(&d);
            end;       
            ) by myora;
    disconnect from myora;
quit;

И вроде бы всё нормально, но не происходит вызов процедуры, и не происходит ошибка Oracle.

Проблема опять же, на поверхности. В данном случае, требуется явно преобразовать тип данных, чтобы Oracle считал как необходимый нам тип. Делаем это функцией to_number.

proc sql noprint;
    connect to oracle as myora (user=»example» password=»example» path=example);
        execute (
            begin
                example.test(to_number(&sess_id));
            end;       
            ) by myora;
    disconnect from myora;
quit;

Всё! Спасибо за прочтение!
До скорых встреч!