Advertisement
Guest User

Untitled

a guest
Feb 15th, 2019
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 30.31 KB | None | 0 0
  1. ods _all_ close;
  2. dm 'log;clear;output;clear';
  3.  
  4.  
  5. /***Lokalizacja projektu***/
  6. %let dir = C:\Users\SAS\Desktop\projekt_sgh_krzys\;
  7.  
  8.  
  9. /**Tworzenie bibliotek**/
  10. libname wyj "&dir.\Tree" compress=yes;
  11. libname dane "&dir.Dane\" compress=yes;
  12. libname daneplot "&dir.Wynik\dane_do_wykresow";
  13. libname wykres "&dir.wykres\";
  14. libname wykreskw "&dir.wykresy-kwotowe\";
  15.  
  16.  
  17.  
  18. /*****************************************************************************************************************/
  19. /****--- Tworzenie VIN1, VIN2, VIN3 po typach produktu(CSS i INS) oraz transpozycja tabel VIN ---****/
  20. /*****************************************************************************************************************/
  21.  
  22. data daneplot.vin;
  23. set dane.Transactions;
  24. seniority=intck('month',input(fin_period,yymmn6.),input(period,yymmn6.));
  25.  
  26. vin1=(due_installments>=1);
  27. vin2=(due_installments>=2);
  28. vin3=(due_installments>=3);
  29.  
  30. output;
  31.  
  32. if status in ('B','C') and period<='200812' then do;
  33. n_steps=intck('month',input(period,yymmn6.),input('200812',yymmn6.));
  34. do i=1 to n_steps;
  35. period=put(intnx('month',input(period,yymmn6.),1,'end'),yymmn6.);
  36. seniority=intck('month',input(fin_period,yymmn6.),input(period,yymmn6.));
  37. output;
  38. end;
  39. end;
  40.  
  41. keep aid fin_period vin1 vin2 vin3 product seniority aid cid;
  42.  
  43. run;
  44.  
  45. %macro pojedyncze_vin(product);
  46.  
  47. %do i=1 %to 3; /* dla vin1, vin2, vin3 */
  48. /* PROC MEANS wyciaga brakujace wartości do analityki przed ich liczeniem. nway ogranicza output statystyki do tych z najwyższym _TYPE_ wartością*/
  49. proc means data=daneplot.vin noprint nway;
  50. /* wybieramy zmienne do grupowania w modelach klasyfikacyjncyh poziomach */
  51. class fin_period seniority;
  52. var vin&i;
  53. output out=vintagr&product&i(drop=_freq_ _type_) n()=production mean()=vintage&product&i;
  54. format vintage&product&i nlpct12.2;
  55. run;
  56.  
  57. proc transpose data=vintagr&product&i out=vintage&product&i (drop=_name_) prefix=months_after_;
  58. by fin_period production;
  59. var vintage&product&i;
  60. id seniority;
  61. run;
  62.  
  63. proc sort data=vintagr&product&i out=daneplot.vint_&product._vin&i;
  64. by seniority;
  65. run;
  66.  
  67.  
  68. proc transpose data=daneplot.vint_&product._vin&i out=daneplot.vinttrans_&product._vin&i (drop=_name_) prefix=m;
  69. id fin_period;
  70. by seniority;
  71. var vintage&product&i;
  72. where seniority>=&i;
  73. run;
  74.  
  75. %end;
  76. %mend;
  77.  
  78. %pojedyncze_vin(product = ins);
  79. %pojedyncze_vin(product = css);
  80.  
  81.  
  82. /*
  83. Powyzszy kod tworzy tabele z wartosciami VIN1, VIN2, VIN3 dla poszczegolnych typow produktu (CSS,INS).
  84. Nastepnie nastepuje transpozycja tabeli SENIORITY jako wiersz | CREATION_MONTH jako wiersz
  85. */
  86.  
  87. /******************* Stworzenie wlasciwego zbioru do analiz: "dane.production_vin_sen&seniority." ********************/
  88.  
  89. /* zawiera dane z production + policzony vin1, vin2, vin3 oraz kwotowy vin1, vin2, vin3 */
  90.  
  91.  
  92. /* Bierzemy do zbioru (seniority = X ) "vinX" tylko losowo wybrane 40% danych */
  93.  
  94. %macro uczenie(seniority=);
  95. data vin_sen&seniority.;
  96. set Daneplot.vin;
  97. where seniority=&seniority. and ranuni(1)<0.4 ;
  98. run;
  99.  
  100.  
  101. /* Sortujemy zbior po numerze ID konta */
  102.  
  103. proc sort data= vin_sen&seniority. nodupkey;
  104. by aid;
  105. run;
  106.  
  107. /* tworzymy posortowana wg ID tabele 'prod', ktora zawiera ID wraz ze zmiennymi kategoryzowanymi */
  108.  
  109. proc sort data=Dane.production nodupkey;
  110. by aid;
  111. run;
  112.  
  113. /* W wyjsciowym zbiorze do analiz laczymy informacje o vintage uzyskana z tabeli 'transactions' z informacjami o klientach z tabeli 'production' */
  114.  
  115. data Dane.production_vin_sen&seniority. ;
  116. merge vin_sen&seniority. (in = z) Dane.production ;
  117. by aid;
  118. if z;
  119. run;
  120.  
  121. /* dodajemy vin kwotowy */
  122. data Dane.production_vin_sen&seniority.;
  123. set Dane.production_vin_sen&seniority.;
  124. vin1_kwotowy =vin1*app_loan_amount;
  125. vin2_kwotowy =vin2*app_loan_amount;
  126. vin3_kwotowy =vin3*app_loan_amount;
  127. run;
  128.  
  129.  
  130.  
  131. %mend;
  132.  
  133. %uczenie(seniority=12);
  134.  
  135.  
  136.  
  137.  
  138.  
  139.  
  140.  
  141.  
  142.  
  143.  
  144.  
  145.  
  146.  
  147.  
  148.  
  149.  
  150.  
  151.  
  152.  
  153. %macro kategoryzuj (vintage=, seniority=, product_typ=, level=);
  154.  
  155. /* utworzenie nowego zbioru - dane.Production_&VINTAGE._&product_typ._sen&seniority. - tylko obserwacje z niepustymi vin1 vin2 vin3, dla danego produktu */
  156.  
  157. %if &level ne %str() %then %do;
  158. %let cond=&vintage ne . and upcase(product)="&product_typ";
  159. %end;
  160.  
  161. %else %do;
  162. %let cond=&vintage ne .;
  163. %end;
  164.  
  165.  
  166. data Dane.Production_&VINTAGE._&product_typ._sen&seniority.;
  167. set Dane.production_vin_sen&seniority.;
  168. where &cond;
  169. run;
  170.  
  171. /* Warunki wstepne dla kategoryzacji metoda drzewa decyzyjnego */
  172.  
  173. %let max_il_podz=2; *maksymalna liczba podzialow;
  174. %let min_percent=3; *minimalna liczba obs w lisciu;
  175. %let zb= Dane.Production_&VINTAGE._&product_typ._sen&seniority.; *zbior wejsciowy;
  176. %let tar=&vintage; *zmienna celu - po niej kategoryzacja;
  177.  
  178. /*************** Kategoryzacja zmiennych numerycznych **************/
  179.  
  180. /* Selekcjonujemy do makrozmiennej &zmienne_int_ord wszystkie numeryczne za wyjatkiem vin */
  181.  
  182. proc sql noprint;
  183. select distinct (upcase(name))into :zmienne_int_ord separated by ' '
  184. from dictionary.columns
  185. where libname = 'DANE' and memname = "PRODUCTION_&VINTAGE._&PRODUCT_TYP._SEN&SENIORITY." and type = 'num'
  186. and name not in ('seniority', 'vin1', 'vin2', 'vin3', 'vin1_kwotowy', 'vin2_kwotowy', 'vin3_kwotowy' );
  187. quit;
  188.  
  189.  
  190. %let il_zm = &sqlobs.; * ile zmiennych zgromadzilismy;
  191.  
  192. /* Sprawdzić WTF */
  193. %put ***il_zm***&zmienne_int_ord;
  194.  
  195.  
  196. /* Odpalenie kodu napisanego przez dra Przanowskiego kategoryzujacy zmienne - z kazda makropetla dla danego vin, produktu, ew. seniority */
  197.  
  198. %include "&dir.Tree\tree.sas" / source2;
  199.  
  200. /*************** Zaladowanie zmiennych nominalnych **************/
  201.  
  202. /* Selekcjonujemy do makrozmiennej &zmienne_int_ord wszystkie numeryczne za wyjatkiem vin */
  203.  
  204.  
  205. proc sql noprint;
  206. select name into :zm_do_sklejenia separated by ' '
  207. from dictionary.columns
  208. where libname = 'DANE' and memname = "PRODUCTION_&VINTAGE._&PRODUCT_TYP._SEN&SENIORITY." and type = 'char'
  209. and name not in('cid','aid', 'product', 'period', 'fin_period');
  210. quit;
  211.  
  212.  
  213. %let il_zm=&sqlobs; * ile zmiennych zgromadzilismy;
  214. %put ***&il_zm***&zm_do_sklejenia;
  215.  
  216.  
  217. *7;
  218. *APP_CHAR_BRANCH APP_CHAR_CARS APP_CHAR_CITY APP_CHAR_GENDER APP_CHAR_HOME_STATUS APP_CHAR_JOB_CODE APP_CHAR_MARITAL_STATUS;
  219.  
  220.  
  221.  
  222. /* Odpalenie kodu napisanego przez dra Przanowskiego sklejajacego zmienne jakosciowe - z kazda makropetla dla danego vin, produktu, ew. seniority */
  223.  
  224. %include "&dir.sklejanie_jakosciowych.sas" / source2;
  225.  
  226. /* Wywolane pliki z kodami kreuja nam tabele z warunkami na kategorie zmiennych: podzialy_int_niem i podzialny_int_niem_sklejane w bibliotece T*/
  227.  
  228. /* Odpalenie kodu napisanego przez dra Przanowskiego - "kodowanie" */
  229.  
  230. %let inset = t.podzialy_int_niem;
  231. %let jakie_podzialy_nominalne = t.podzialy_nom_sklejane;
  232. %let porz_tar = descending;
  233.  
  234. %include "&dir.kodowanie.sas" / source2;
  235.  
  236. * /wyj/ PODZIALY_INT_NIEM, PODZIALY_INTERWALOWE - pokazuja, jak kazda zmienna interwalowa zostala podzielona na (max) 3 kategorie;
  237. * /wyj/ PODZIALY_NOM_SKLEJANE, PODZIALY NOMINALNE - pokazuja, jak kazda zmienna nominalna jest podzielona
  238. * /wyj/ PODZIALY - wszystkie zmienne podzielone na kategorie w jednej tabeli
  239. * /dane/ PRODUCTION_VIN1_ALL_SEN12_GRP - dla tabeli zlaczonych vin i transakcji (production_vin_sen&seniority) dla danego produktu dolacza zmienne
  240. informujace, do ktorej z grup w danej kategorii dana obserwacja wpada (np. 2 w zmiennej Cars, czyli tu GrpCars oznacza posiadanie auta);
  241.  
  242.  
  243.  
  244. %mend;
  245.  
  246. %kategoryzuj(vintage=VIN1, seniority = 12, product_typ=ALL,level=);
  247. %kategoryzuj(vintage=VIN2, seniority = 12, product_typ=ALL,level=);
  248. %kategoryzuj(vintage=VIN3, seniority = 12, product_typ=ALL,level=);
  249. /**/
  250. %kategoryzuj(vintage=VIN1, seniority = 12, product_typ=CSS,level=Y);
  251. %kategoryzuj(vintage=VIN1, seniority = 12, product_typ=INS,level=Y);
  252. /**/
  253. %kategoryzuj(vintage=VIN2, seniority = 12, product_typ=CSS,level=Y);
  254. %kategoryzuj(vintage=VIN2, seniority = 12, product_typ=INS,level=Y);
  255.  
  256. %kategoryzuj(vintage=VIN3, seniority = 12, product_typ=CSS,level=Y);
  257. %kategoryzuj(vintage=VIN3, seniority = 12, product_typ=INS, level=Y);
  258.  
  259.  
  260.  
  261.  
  262.  
  263.  
  264.  
  265.  
  266.  
  267. %macro m_variable(vintage=, seniority=, product_typ=, level=);
  268.  
  269.  
  270. /**************** Korelacja Spearmana ****************************************/
  271.  
  272. proc corr data=Dane.Production_&VINTAGE._&product_typ._sen&seniority._grp outs=Dane.corr_&VINTAGE._&product_typ._sen&seniority. noprint;
  273. with &VINTAGE;
  274. var GRP:;
  275. run;
  276.  
  277. /* Transpozycja, zostawiamy tylko wartosc corr */
  278.  
  279. proc transpose data=Dane.corr_&VINTAGE._&product_typ._sen&seniority. out=Dane.corr_&VINTAGE._&product_typ._sen&seniority._t;
  280. run;
  281.  
  282.  
  283. /* Zostawiamy wartosc bezwzgledna z corr */
  284.  
  285. data Dane.corr_&VINTAGE._&product_typ._sen&seniority._t;
  286. set Dane.corr_&VINTAGE._&product_typ._sen&seniority._t;
  287. abs_corr_&VINTAGE = abs(&VINTAGE);
  288. rename &VINTAGE = corr_&VINTAGE;
  289. run;
  290.  
  291. /* I sortujemy wg absolute [corr] */
  292.  
  293. proc sort data=Dane.corr_&VINTAGE._&product_typ._sen&seniority._t;
  294. by descending abs_corr_&VINTAGE;
  295. run;
  296.  
  297. /* Dzielimy nasza tabele na 4 kategorie zmiennych */
  298.  
  299. data Dane.corr_&VINTAGE._&product_typ._sen&seniority._app Dane.corr_&VINTAGE._&product_typ._sen&seniority._act Dane.corr_&VINTAGE._&product_typ._sen&seniority._agr
  300. Dane.corr_&VINTAGE._&product_typ._sen&seniority._ags;
  301.  
  302. set Dane.corr_&VINTAGE._&product_typ._sen&seniority._t;
  303.  
  304. if substr(_NAME_,5,3)="ACT" then output Dane.corr_&VINTAGE._&product_typ._sen&seniority._act;
  305. if substr(_NAME_,5,3)="AGR" then output Dane.corr_&VINTAGE._&product_typ._sen&seniority._agr;
  306. if substr(_NAME_,5,3)="AGS" then output Dane.corr_&VINTAGE._&product_typ._sen&seniority._ags;
  307. if substr(_NAME_,5,3)="APP" then output Dane.corr_&VINTAGE._&product_typ._sen&seniority._app;
  308. run;
  309.  
  310. /* Tworzymy tabele zawierajaca po 5 najlepiej korelujacych zmiennych z kazdej kategorii i nazywamy ja np. corr_vin1_ins_sen12_best */
  311.  
  312. data Dane.corr_&VINTAGE._&product_typ._sen&seniority._best;
  313. set Dane.corr_&VINTAGE._&product_typ._sen&seniority._app (firstobs=1 obs=5)
  314. Dane.corr_&VINTAGE._&product_typ._sen&seniority._act (firstobs=1 obs=5)
  315. Dane.corr_&VINTAGE._&product_typ._sen&seniority._agr (firstobs=1 obs=5)
  316. Dane.corr_&VINTAGE._&product_typ._sen&seniority._ags (firstobs=1 obs=5);
  317. run;
  318.  
  319. /* Zbieramy do makrozmiennej liste po 5 najlepszych zmiennych z kategorii */
  320.  
  321. proc sql noprint;
  322. select distinct(_name_) into : list_corr separated by ' '
  323. from Dane.corr_&VINTAGE._&product_typ._sen&seniority._best;
  324. quit;
  325.  
  326. %put &list_corr;
  327.  
  328.  
  329. /* powstaje tabela, w ktorej sa dani klienci, viny i przygrupowanie tylko do wybranych juz kategorii */
  330.  
  331. data Dane.Prod_&VINTAGE._&product_typ._sen&seniority._grp_best_cor;
  332. set Dane.Production_&VINTAGE._&product_typ._sen&seniority._grp;
  333. keep aid cid app_installment product period &vintage &vintage._kwotowy app_loan_amount &list_corr;
  334. run;
  335.  
  336. proc sort data = Dane.Prod_&VINTAGE._&product_typ._sen&seniority._grp_best_cor nodupkey;
  337. by aid cid app_installment product period &vintage &list_corr;
  338. run;
  339.  
  340. %mend;
  341.  
  342.  
  343.  
  344.  
  345. %m_variable(vintage=VIN1, seniority = 12, product_typ=ALL,level=);
  346. %m_variable(vintage=VIN2, seniority = 12, product_typ=ALL,level=);
  347. %m_variable(vintage=VIN3, seniority = 12, product_typ=ALL,level=);
  348.  
  349. %m_variable(vintage=VIN1, seniority = 12, product_typ=CSS,level=Y);
  350. %m_variable(vintage=VIN1, seniority = 12, product_typ=INS,level=Y);
  351.  
  352. %m_variable(vintage=VIN2, seniority = 12, product_typ=CSS,level=Y);
  353. %m_variable(vintage=VIN2, seniority = 12, product_typ=INS,level=Y);
  354.  
  355. %m_variable(vintage=VIN3, seniority = 12, product_typ=CSS,level=Y);
  356. %m_variable(vintage=VIN3, seniority = 12, product_typ=INS, level=Y);
  357.  
  358.  
  359.  
  360.  
  361.  
  362.  
  363. %macro macierz(product);
  364. ods listing close;
  365. ods pdf file="&dir.raporty\vin_&product..pdf";
  366.  
  367.  
  368. %do i=1 %to 3;
  369. title "&PRODUCT: Vintage dla due= &i";
  370. proc print data=daneplot.vinttrans_&product._vin&i;
  371. options orientation= portrait;
  372. run;
  373. %end;
  374.  
  375. ods pdf close;
  376. ods listing;
  377. %mend;
  378.  
  379.  
  380. %macierz(css);
  381. %macierz(ins);
  382.  
  383.  
  384.  
  385.  
  386. %macro corr (vintage=, product=, seniority=);
  387.  
  388. /* PDF dla korelacji Spearmana */
  389.  
  390. ods listing close;
  391. ods pdf file="&dir.raporty\corr_&vintage._&product._sen&seniority..pdf";
  392.  
  393. title "Seniority=&seniority., &product.: Bezwzgledna wartosc korelacji dla zmiennych
  394. oraz &vintage. Grupa APP";
  395.  
  396. proc print data= Dane.corr_&VINTAGE._&product._sen&seniority._app;
  397. var _NAME_ abs_corr_&vintage.;
  398. run;
  399.  
  400. title "Zmienne z grupy ACT i &vintage.";
  401. proc print data= Dane.corr_&VINTAGE._&product._sen&seniority._act;
  402. var _NAME_ abs_corr_&vintage.;
  403. run;
  404.  
  405. title "Zmienne z grupy AGR i &vintage.";
  406. proc print data= Dane.corr_&VINTAGE._&product._sen&seniority._agr;
  407. var _NAME_ abs_corr_&vintage.;
  408. run;
  409.  
  410. title "Zmienne z grupy AGS i &vintage.";
  411. proc print data= Dane.corr_&VINTAGE._&product._sen&seniority._agS;
  412. var _NAME_ abs_corr_&vintage.;
  413. run;
  414.  
  415.  
  416. title "Wybrane 5 najlepszych zmiennych z 4 kategorii";
  417. proc print data= Dane.corr_&vintage._&product._sen&seniority._best;
  418. var _NAME_ abs_corr_&vintage.;
  419. run;
  420.  
  421. ods pdf close;
  422. ods listing;
  423.  
  424. %mend;
  425.  
  426.  
  427. %corr(vintage = vin1, product = all, seniority = 12);
  428. %corr(vintage = vin2, product = all, seniority = 12);
  429. %corr(vintage = vin3, product = all, seniority = 12);
  430.  
  431. %corr(vintage = vin1, product = ins, seniority = 12);
  432. %corr(vintage = vin1, product = css, seniority = 12);
  433.  
  434. %corr(vintage = vin2, product = ins, seniority = 12);
  435. %corr(vintage = vin2, product = css, seniority = 12);
  436.  
  437. %corr(vintage = vin3, product = ins, seniority = 12);
  438. %corr(vintage = vin3, product = css, seniority = 12);
  439.  
  440.  
  441.  
  442.  
  443.  
  444.  
  445.  
  446.  
  447. %macro asymptota(vin=, product=);
  448.  
  449.  
  450. %if &vin=vin1 %then %do;
  451. proc transpose
  452. data= Daneplot.vinttrans_&product._&vin
  453. out= Daneplot.asymptoty&vin.&product.(rename=(Col1= vin1))
  454. name= Miesiac;
  455. by seniority;
  456. var M200601 M200602 M200603 M200604 M200605 M200606 M200607 M200608 M200609 M200610 M200611 M200612 M200701 M200702 M200703 M200704
  457. M200705 M200706 M200707 M200708 M200709 M200710 M200711 M200712 M200801 M200802 M200803 M200804 M200805 M200806 M200807 M200808
  458. M200809 M200810 M200811;
  459. run;
  460. %end;
  461.  
  462. %if &vin=vin2 %then %do;
  463. proc transpose
  464. data= Daneplot.vinttrans_&product._&vin
  465. out= Daneplot.asymptoty&vin.&product.(rename=(Col1= vin2))
  466. name= Miesiac;
  467. by seniority;
  468. var M200601 M200602 M200603 M200604 M200605 M200606 M200607 M200608 M200609 M200610 M200611 M200612 M200701 M200702 M200703 M200704
  469. M200705 M200706 M200707 M200708 M200709 M200710 M200711 M200712 M200801 M200802 M200803 M200804 M200805 M200806 M200807 M200808
  470. M200809 M200810;
  471. run;
  472. %end;
  473.  
  474. %if &vin=vin3 %then %do;
  475. proc transpose
  476. data= Daneplot.vinttrans_&product._&vin
  477. out= Daneplot.asymptoty&vin.&product.(rename=(Col1= vin3))
  478. name= Miesiac;
  479. by seniority;
  480. var M200601 M200602 M200603 M200604 M200605 M200606 M200607 M200608 M200609 M200610 M200611 M200612 M200701 M200702 M200703 M200704
  481. M200705 M200706 M200707 M200708 M200709 M200710 M200711 M200712 M200801 M200802 M200803 M200804 M200805 M200806 M200807 M200808
  482. M200809;
  483. run;
  484.  
  485. %end;
  486.  
  487. %mend;
  488.  
  489. %asymptota(vin=vin1, product=css);
  490. %asymptota(vin=vin2, product=css);
  491. %asymptota(vin=vin3, product=css);
  492.  
  493. %asymptota(vin=vin1, product=ins);
  494. %asymptota(vin=vin2, product=ins);
  495. %asymptota(vin=vin3, product=ins);
  496.  
  497.  
  498. %macro wykres_1(product=);
  499.  
  500. ods listing close;
  501. ods pdf file="&dir.raporty\wykresy_asymptotyczne_&product..pdf";
  502.  
  503. %do i=1 %to 3;
  504. proc sgplot data= Daneplot.asymptotyvin&i.&product.;
  505.  
  506. title "vin&i, Produkt = &product ";
  507. series x= seniority y= vin&i / group=Miesiac;
  508. yaxis label="Wartosc statystyki vin&i." ;
  509. xaxis grid values= (0 to 35 by 1);
  510.  
  511. run;
  512. %end;
  513. ods pdf close;
  514. ods listing;
  515.  
  516. %mend;
  517.  
  518. %wykres_1(product=css);
  519. %wykres_1(product=ins);
  520.  
  521.  
  522.  
  523.  
  524.  
  525.  
  526.  
  527.  
  528. dm 'clear log';
  529.  
  530.  
  531.  
  532.  
  533. /*przypisanie najlepszych zmiennych i podzial na grupy*/
  534. %macro create_graph(level=, vintage=, seniority=, product_typ=, typ=);
  535.  
  536. %let cond=%str(upcase(product)="&product_typ");
  537.  
  538. proc sql noprint;
  539. select distinct(name) into :var1-:var20
  540. from dictionary.columns
  541. where libname='DANE' and memname="PROD_&VINTAGE._&PRODUCT_TYP._SEN&SENIORITY._GRP_BEST_COR" and name like 'GRP%';
  542.  
  543. %do i = 1 %to 20;
  544. %put ***&&var&i***;
  545. %end;
  546.  
  547. %do i=1 %to 20;
  548. %global max&i &&var&i;
  549. select max(&&var&i) into : max&i
  550. from DANE.PROD_&VINTAGE._&PRODUCT_TYP._SEN&SENIORITY._GRP_BEST_cor;
  551. %put *** &&max&i ***;
  552. %end;
  553. quit;
  554.  
  555.  
  556. /* Analiza VIN dla danego produktu, dla danego seniority, dla danej zmiennej */
  557.  
  558.  
  559.  
  560. %if &level = 2 %then %do;
  561.  
  562. %let cond=%str(upcase(product)="&product_typ");
  563.  
  564. %do j=1 %to 20;
  565. %do k=1 %to &&max&j;
  566.  
  567. proc means data=dane.prod_&VINTAGE._&product_typ._sen&seniority._grp_best_cor noprint nway;
  568. class period;
  569. var &vintage;
  570. output out=wykres_&level._&VINTAGE._&product_typ._sen&seniority._v&j._&k(drop=_freq_ _type_)
  571. n()=production
  572. mean()=pct;
  573. Where &cond and &&var&j=&k;
  574. run;
  575.  
  576.  
  577. data wykres.wykres_&level._&VINTAGE._&product_typ._sen&seniority._v&j._&k;
  578. length zm_kat $100;
  579. set wykres_&level._&VINTAGE._&product_typ._sen&seniority._v&j._&k;
  580. format pct nlpct12.2;
  581. date_=input(period,yymmn6.);
  582. format date_ yymon7. ;
  583. zm_kat="&&var&j=&k";
  584. run;
  585.  
  586. /* Zastaw danych do vin kwotowy analizy*/
  587.  
  588. proc sql;
  589. create table wykreskw.wykres_&level._&VINTAGE._&product_typ._sen&seniority._v&j._&k as
  590. select period, sum(&VINTAGE._kwotowy) as zadluzone, sum(app_loan_amount) as total
  591. from dane.prod_&VINTAGE._&product_typ._sen&seniority._grp_best_cor where &cond and &&var&j=&k
  592. group by period;
  593. quit;
  594.  
  595.  
  596. data wykreskw.wykres_&level._&VINTAGE._&product_typ._sen&seniority._v&j._&k;
  597. set wykreskw.wykres_&level._&VINTAGE._&product_typ._sen&seniority._v&j._&k;
  598. pct=zadluzone/total;
  599. format pct nlpct12.2;
  600. zm_kat="&&var&j=&k";
  601. date_=input(period,yymmn6.);
  602. format date_ yymon7. ;
  603. run;
  604.  
  605.  
  606. %end;
  607. %end;
  608.  
  609.  
  610.  
  611. %do i=1 %to 20;
  612. /* Zastaw danych do vin ilosciowy analizy*/
  613.  
  614. data wykres.appended_&level._&VINTAGE._&product_typ._sen&seniority._v&i;
  615. set
  616. %do k=1 %to &&max&i;
  617. wykres.wykres_&level._&VINTAGE._&product_typ._sen&seniority._v&i._&k
  618. %end;
  619. ;
  620. run;
  621.  
  622.  
  623.  
  624. /* Zastaw danych do vin kwotowy analizy - wszystkie kategorie zmiennej razem */
  625.  
  626. data wykreskw.appended_&level._&VINTAGE._&product_typ._sen&seniority._v&i;
  627. set
  628. %do k=1 %to &&max&i;
  629. wykreskw.wykres_&level._&VINTAGE._&product_typ._sen&seniority._v&i._&k
  630. %end;
  631. ;
  632. run;
  633.  
  634. %let delay = %sysfunc(substr(&Vintage,4,1));
  635. %let stopien=1;
  636.  
  637.  
  638. /* Raport - vin ilosciowy */
  639.  
  640. ods listing close;
  641. %if &typ='HTML' %then %do;
  642. ods HTML path="&dir.wykresy_html" gpath="&dir.wykresy_png" body="appended_&level._&VINTAGE._&product_typ._sen&seniority._v&i..html";
  643. %end;
  644. %else %if &typ='PDF' %then %do;
  645. ods pdf file="&dir.wykresy_pdf\appended_&level._&VINTAGE.&product_typ._sen&seniority._v&i..pdf";
  646. %end;
  647.  
  648. /* Wykres vin ilosciowy - wszystkie kategorie zmiennej */
  649.  
  650. proc sgplot data=wykres.appended_&level._&VINTAGE._&product_typ._sen&seniority._v&i;
  651. vbar date_ / response=production group=zm_kat name="production" legendlabel="Liczba udzielonych kredytow" transparency=0.2;
  652. vline date_ / response=pct break group=zm_kat y2axis name="pct" /*legendlabel="Opoznienie >= &delay [w miesiacach] dla XXX"*/;
  653. xaxis fitpolicy=rotate tickvalueformat=monname. grid label='Miesiac';
  654. yaxis display=(nolabel) grid;
  655. y2axis display=(nolabel) values=(0.00 to 0.70 by 0.1);
  656. title "&VINTAGE (ilosciowo), Produkt = &product_typ ";
  657. keylegend "production" "pct";
  658. run;
  659.  
  660.  
  661. /* Tabela wykres vin ilosciowy - wszystkie kategorie zmiennej */
  662.  
  663. proc report data=wykres.appended_&level._&VINTAGE._&product_typ._sen&seniority._v&i;
  664. column date_ production pct zm_kat;
  665. define date_ / display width=30 'Okres' center;
  666. define production / display width=30 'Liczba udzielonych kredytow' center;
  667. define pct / display width=30 "Opoznienie >= &delay [w miesiacach]" center;
  668. define zm_kat / display width=50 "Szczegolowa klasa obserwacji" center;
  669. title;
  670. footnote;
  671. compute after _page_ ;
  672. line @10 "<a href='&dir.wykresy_html\1_&vintage._&product_typ._sen&seniority..html'
  673. >Wroc do poprzedniego raportu</a>";
  674. endcomp;
  675. run;
  676. %if &typ='HTML' %then %do;
  677. ods HTML close;
  678. %end;
  679. %else %if &typ='PDF' %then %do;
  680. ods PDF close;
  681. %end;
  682.  
  683. /* Raport - vin kwotowy */
  684.  
  685. ods listing close;
  686. %if &typ='HTML' %then %do;
  687. ods HTML path="&dir.wykresy_kwot_html" gpath="&dir.wykresy_kwot_png" body="appended_&level._&VINTAGE._kwot_&product_typ._sen&seniority._v&i..html";
  688. %end;
  689. %else %if &typ='PDF' %then %do;
  690. ods pdf file="&dir.wykresy_kwot_pdf\appended_&level._&VINTAGE._kwot_&product_typ._sen&seniority._v&i..pdf";
  691. %end;
  692. /* Wykres vin kwotowy - wszystkie kategorie zmiennej */
  693.  
  694. proc sgplot data=wykreskw.appended_&level._&VINTAGE._&product_typ._sen&seniority._v&i;
  695. vbar date_ / response=total group=zm_kat name="production" legendlabel="Suma naleznosci" transparency=0.2;
  696. vline date_ / response=pct break group=zm_kat y2axis name="pct" /*legendlabel="Opoznienie >= &delay [w miesiacach] dla XXX"*/;
  697. xaxis fitpolicy=rotate tickvalueformat=monname. grid label='Miesiac';
  698. yaxis display=(nolabel) grid;
  699. y2axis display=(nolabel) values=(0.00 to 0.70 by 0.1);
  700. title "&VINTAGE (kwotowo), seniority = &seniority.. Produkt = &product_typ ";
  701. keylegend "production" "pct";
  702. run;
  703.  
  704.  
  705. /* Tabela wykres vin kwotowy - wszystkie kategorie zmiennej */
  706.  
  707. proc report data=wykreskw.appended_&level._&VINTAGE._&product_typ._sen&seniority._v&i;
  708. column date_ total pct zm_kat;
  709. define date_ / display width=30 'Okres' center;
  710. define total / display width=30 'Suma naleznosci' center;
  711. define pct / display width=30 "Opoznienie >= &delay [w miesiacach]" center;
  712. define zm_kat / display width=50 "Szczegolowa klasa obserwacji" center;
  713. title;
  714. footnote;
  715.  
  716. run;
  717.  
  718. %if &typ='HTML' %then %do;
  719. ods HTML close;
  720. %end;
  721. %else %if &typ='PDF' %then %do;
  722. ods PDF close;
  723. %end;
  724.  
  725. %end;
  726. %end;
  727.  
  728.  
  729. * Koniec analizy;
  730.  
  731. %if &level ne 2 %then %do;
  732.  
  733. %if &level = 0 %then %do;
  734. %let cond=%str(upcase(product) ne '');
  735. %end;
  736.  
  737. %if &level = 1 %then %do;
  738. %let cond=%str(upcase(product)="&product_typ");
  739. %end;
  740.  
  741.  
  742. proc means data=dane.prod_&VINTAGE._&product_typ._sen&seniority._grp_best_cor noprint nway;
  743. class period;
  744. var &vintage;
  745. output out=wykres_&level._&VINTAGE._&product_typ._sen&seniority (drop=_freq_ _type_)
  746. n()=production
  747. mean()=pct;
  748. Where &cond;
  749. run;
  750.  
  751. /* Zestaw danych pod vin ilosciowy*/
  752.  
  753.  
  754. data wykres.wykres_&level._&VINTAGE._&product_typ._sen&seniority ;
  755. set wykres_&level._&VINTAGE._&product_typ._sen&seniority ;
  756. format pct nlpct12.2;
  757. date_= input(period,yymmn6.);
  758. format date_ yymon7. ;
  759. run;
  760.  
  761.  
  762. /* Zestaw danych pod vin kwotowy*/
  763.  
  764. proc sql;
  765. create table wykreskw.wykres_&level._&VINTAGE._&product_typ._sen&seniority as
  766. select period, sum(&VINTAGE._kwotowy) as zadluzone, sum(app_loan_amount) as total
  767. from dane.prod_&VINTAGE._&product_typ._sen&seniority._grp_best_cor where &cond
  768. group by period;
  769. quit;
  770.  
  771. data wykreskw.wykres_&level._&VINTAGE._&product_typ._sen&seniority;
  772. set wykreskw.wykres_&level._&VINTAGE._&product_typ._sen&seniority;
  773. pct=zadluzone/total;
  774. format pct nlpct12.2;
  775. date_=input(period,yymmn6.);
  776. format date_ yymon7. ;
  777. run;
  778.  
  779. %let delay = %sysfunc(substr(&Vintage,4,1)); *makrozmienna otrzymuje nr vinu, czyli due;
  780.  
  781.  
  782. /* Raport - vin ilosciowy */
  783.  
  784. ods listing close;
  785. %if &typ='HTML' %then %do;
  786. ods HTML path="&dir.wykresy_html" gpath="&dir.wykresy_png" body="&level._&VINTAGE._&product_typ._sen&seniority..html";
  787. %end;
  788. %else %if &typ='PDF' %then %do;
  789. ods pdf file="&dir.wykresy_pdf\&level._&VINTAGE._&product_typ._sen&seniority..pdf";
  790. %end;
  791. /* Wykres vin ilosciowy - dla produktu (level 1) lub obu (level 0) */
  792.  
  793. proc sgplot data=wykres.wykres_&level._&VINTAGE._&product_typ._sen&seniority;
  794. vbar date_ /response= production name="production" legendlabel="Liczba udzielonych kredytow";
  795. vline date_ / response= pct y2axis name="pct" legendlabel="Opoznienie >= &delay [w miesiacach]";
  796. xaxis fitpolicy=rotate tickvalueformat=monname. grid label='Miesiac';
  797. yaxis display= (nolabel) grid;
  798. y2axis display= (nolabel) values=(0.00 to 0.40 by 0.05);
  799. title "&VINTAGE (ilosciowo), Produkt = &product_typ ";
  800. keylegend "production" "pct";
  801. run;
  802.  
  803. /* Tabela wykres vin ilosciowy - dla produktu (level 1) lub obu (level 0) */
  804.  
  805. proc report data=wykres.wykres_&level._&VINTAGE._&product_typ._sen&seniority;
  806. column date_ production pct;
  807. define date_ / display width=30 'Okres' center;
  808. define production / display width=30 'Liczba udzielonych kredytow' center;
  809. define pct / display width=30 "Opoznienie >= &delay [w miesiacach]" center;
  810. title;
  811. footnote;
  812.  
  813.  
  814. run;
  815.  
  816. %if &typ='HTML' %then %do;
  817. ods HTML close;
  818. %end;
  819. %else %if &typ='PDF' %then %do;
  820. ods PDF close;
  821. %end;
  822.  
  823. /* Raport - vin kwotowy */
  824.  
  825. ods listing close;
  826. %if &typ='HTML' %then %do;
  827. ods HTML path="&dir.wykresy_kwot_html" gpath="&dir.wykresy_kwot_png" body="&level._&VINTAGE._kwot_&product_typ._sen&seniority..html";
  828. %end;
  829. %else %if &typ='PDF' %then %do;
  830. ods pdf file="&dir.wykresy_kwot_pdf\&level._&VINTAGE._kwot_&product_typ._sen&seniority..pdf";
  831. %end;
  832. /* Wykres vin kwotowy - dla produktu (level 1) lub obu (level 0) */
  833.  
  834. proc sgplot data=wykreskw.wykres_&level._&VINTAGE._&product_typ._sen&seniority;
  835. vbar date_ /response=total name="production" legendlabel="Suma naleznosci";
  836. vline date_ / response=pct y2axis name="pct" legendlabel="Opoznienie >= &delay [w miesiacach]";
  837. xaxis fitpolicy=rotate tickvalueformat=monname. grid label='Miesiac';
  838. yaxis display=(nolabel) grid;
  839. y2axis display=(nolabel) values=(0.00 to 0.40 by 0.05);
  840. title "&VINTAGE (kwotowo), Produkt = &product_typ ";
  841. keylegend "production" "pct";
  842. run;
  843.  
  844. /* Tabela vin kwotowy - dla produktu (level 1) lub obu (level 0) */
  845.  
  846. proc report data=wykreskw.wykres_&level._&VINTAGE._&product_typ._sen&seniority;
  847. column date_ total pct;
  848. define date_ / display width=30 'Okres' center;
  849. define total / display width=30 'Suma naleznosci' center;
  850. define pct / display width=30 "Opoznienie >= &delay [w miesiacach]" center;
  851. title;
  852. footnote;
  853.  
  854. run;
  855.  
  856. %if &typ='HTML' %then %do;
  857. ods HTML close;
  858. %end;
  859. %else %if &typ='PDF' %then %do;
  860. ods PDF close;
  861. %end;
  862.  
  863. %end;
  864.  
  865.  
  866. %mend;
  867.  
  868.  
  869.  
  870. /*HTML*/
  871.  
  872. %create_graph(level=2, vintage=VIN1, seniority=12, product_typ=INS, typ='HTML')
  873. %create_graph(level=1, vintage=VIN1, seniority=12, product_typ=INS, typ='HTML')
  874.  
  875. %create_graph(level=2, vintage=VIN1, seniority=12, product_typ=CSS, typ='HTML');
  876. %create_graph(level=1, vintage=VIN1, seniority=12, product_typ=CSS, typ='HTML');
  877.  
  878. %create_graph(level=0, vintage=VIN1, seniority=12, product_typ=ALL, typ='HTML');
  879.  
  880.  
  881.  
  882. %create_graph(level=2, vintage=VIN2, seniority=12, product_typ=INS, typ='HTML')
  883. %create_graph(level=1, vintage=VIN2, seniority=12, product_typ=INS, typ='HTML')
  884.  
  885. %create_graph(level=2, vintage=VIN2, seniority=12, product_typ=CSS, typ='HTML');
  886. %create_graph(level=1, vintage=VIN2, seniority=12, product_typ=CSS, typ='HTML');
  887.  
  888. %create_graph(level=0, vintage=VIN2, seniority=12, product_typ=ALL, typ='HTML');
  889.  
  890.  
  891.  
  892.  
  893. %create_graph(level=2, vintage=VIN3, seniority=12, product_typ=INS, typ='HTML')
  894. %create_graph(level=1, vintage=VIN3, seniority=12, product_typ=INS, typ='HTML')
  895.  
  896. %create_graph(level=2, vintage=VIN3, seniority=12, product_typ=CSS, typ='HTML');
  897. %create_graph(level=1, vintage=VIN3, seniority=12, product_typ=CSS, typ='HTML');
  898.  
  899. %create_graph(level=0, vintage=VIN3, seniority=12, product_typ=ALL, typ='HTML');
  900.  
  901.  
  902.  
  903. /*PDF*/
  904.  
  905. %create_graph(level=2, vintage=VIN1, seniority=12, product_typ=INS, typ='PDF')
  906. %create_graph(level=1, vintage=VIN1, seniority=12, product_typ=INS, typ='PDF')
  907.  
  908. %create_graph(level=2, vintage=VIN1, seniority=12, product_typ=CSS, typ='PDF');
  909. %create_graph(level=1, vintage=VIN1, seniority=12, product_typ=CSS, typ='PDF');
  910.  
  911. %create_graph(level=0, vintage=VIN1, seniority=12, product_typ=ALL, typ='PDF');
  912.  
  913.  
  914.  
  915. %create_graph(level=2, vintage=VIN2, seniority=12, product_typ=INS, typ='PDF')
  916. %create_graph(level=1, vintage=VIN2, seniority=12, product_typ=INS, typ='PDF')
  917.  
  918. %create_graph(level=2, vintage=VIN2, seniority=12, product_typ=CSS, typ='PDF');
  919. %create_graph(level=1, vintage=VIN2, seniority=12, product_typ=CSS, typ='PDF');
  920.  
  921. %create_graph(level=0, vintage=VIN2, seniority=12, product_typ=ALL, typ='PDF');
  922.  
  923.  
  924.  
  925.  
  926. %create_graph(level=2, vintage=VIN3, seniority=12, product_typ=INS, typ='PDF')
  927. %create_graph(level=1, vintage=VIN3, seniority=12, product_typ=INS, typ='PDF')
  928.  
  929. %create_graph(level=2, vintage=VIN3, seniority=12, product_typ=CSS, typ='PDF');
  930. %create_graph(level=1, vintage=VIN3, seniority=12, product_typ=CSS, typ='PDF');
  931.  
  932. %create_graph(level=0, vintage=VIN3, seniority=12, product_typ=ALL, typ='PDF');
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement