이번 게시글은 [ SAS 활용 노하우 ] 데이터 분석 1-2 ] 의 이어지는 게시글 입니다.
타이타닉에 탑승한 승객의 정보(나이, 성별, 객실 등급 등)를 사용하여 사망/생존자를 머신러닝 모델을 적용한 분석을 진행하고자 합니다.
proc import를 사용하여 train데이터와 test데이터를 불러옵니다.
FILENAME REFFILE '/folders/myfolders/sasuser.v94/train.csv';
PROC IMPORT DATAFILE=REFFILE
DBMS=CSV
OUT=WORK.test1;
RUN;
/*test데이터터 불러오기*/
FILENAME REFFILE '/folders/myfolders/sasuser.v94/test.csv';
PROC IMPORT DATAFILE=REFFILE
DBMS=CSV
OUT=WORK.train1;
RUN;
train데이터에서 Name에는 탑승자의 이름과 함께 Mr, Mrs, Miss, Master, 등이 적혀 있습니다.
IF문을 활용하여 New Name이라는 새로운 변수를 생성할 수 있습니다.
Data work.train1_name;
set work.train1;
if index(name,'Mr.') > 0 then new_name = '1';
else if index(name, 'Mrs.') > 0 then new_name = '2';
else if index(name, 'Miss.') > 0 then new_name = '3';
else if index(name, 'Master') then new_name = '4';
else new_name = '5';
run;
age의 결측치를 제거하기 위해 평균값으로 결측치를 채우고자 합니다. age의 평균값을 29.6으로 반올림하여 30세로 채워넣도록 하였습니다.
data work.train1_age_1;
set work.train1_name;
if age ='.' then new_age = 30;
else new_age = age;
run;
또한,탑승자의 age에 따라 그룹화된 new_age_group변수를 새로 생성하였습니다.
data work.train1_age_2;
set work.train1_age_1;
if new_age <= 15 then new_age_group = 1;
else if 16 <= new_age <= 31 then new_age_group = 2;
else if 32 <= new_age <= 47 then new_age_group = 3;
else if 48 <= new_age <= 64 then new_age_group = 4;
else if 64 <= new_age then new_age_group = 5;
run;
운임요금의 구간을 임으로 나눠 연속형 변수를 범주형 변수로 변경합니다.
DATA work.train1_fare;
set work.train1_fare;
if fare < 8 then new_fare_group = 1 ;
else if 8 <= fare < 14.5 then new_fare_group = 2;
else if 14.5 <= fare < 30 then new_fare_group = 3;
else if 30 <= fare then new_fare_group = 4;
run;
family는 Sibsp와 Parch와 자기자신을 포함하여 new_family라는 새로운 변수를 생성합니다.
Embarked변수는 승선항으로 결측치를 최빈값인 'S'로 대체합니다.
data work.train1_family;
set work.train1_fare;
new_family = SibSp + Parch +1 ;
run;
data work.train1_embarked;
set work.train1_family;
if embarked = ' ' then embarked = 'S';
run;
Embarked/ Sex는 문자형으로 되어있는 것을 숫자형으로 변경하고 Pclass는 이름을 new_Pclass로 변경합니다.
data work.train1_other;
set work.train1_embarked;
if embarked = 'S' then new_embarked = 1;
else if embarked = 'C' then new_embarked = 2;
else if embarked = 'Q' then new_embarked = 3;
if sex = 'male' then new_sex = 1;
else new_sex = 2;
new_pclass = pclass;
run;
이렇게 train데이터를 전처리를 완료하였습니다. 테스트 데이터도 동일하게 처리합니다.
모델을 만들 준비가 완료되었습니다.
Decision Tree, SVM, RandomForest 모델을 이용하여 분석을 진행하려 합니다.
proc hpsplit data = work.train1 seed = 123;
class new_sex new_pclas new_name new_age_group new_fare_group new_embarked;
model survived = new_sex new_pclass new_name new_age_group new_fare_group new_family new_embarked'
output out = test;
code file = "/Users/amy/Desktop/sas/타이타닉/model_DT.sas";
run;
proc hpsplit을 이용하여 로지스틱 모델을 만듭니다.
data에는 분석 데이터 이름을 넣고 seed는 123으로 지정했습니다. class 변수에는 범주형 변수들을 넣고 model에는 타겟 변수 = 변수1 변수2 변수3 ... 변수n 형식으로 작성했습니다.
code file은 scoring에 필요합니다.
data scored_DT;
set work.new_test1;
%include "/Users/amy/Desktop/sas/타이타닉/model_DT.sas";
run;
앞에서 작성한 model_DT.sas를 사용하기 위해 test데이터를 만든 모델에 적합시킵니다.
data work.test1_scored_dt;
set scored_DT;
if p_survived >0.5 then survived = 1;
else survived = 0;
keep passengerid survived;
run;
로지스틱 회귀분석처럼 일정 확률값 이상을 생존(1) / 사망(0)으로 지정합니다. 그리고 Passenger와 survived만 남깁니다.
확인 결과 기존모델보다 0.77511로 기존 모델보다 성능이 향상된 것을 볼 수 있습니다.
SVM모델을 만들기 위해 proc hpsvm을 이용합니다. Data에는 분석 데이터 이름을 넣고 method는 activest로 지정합니다. kernel , rbf, k_par옵션을 지정한 뒤 변수의 속성에 맞게 변수를 정의합니다. target에는 타겟 변수인 survived 를 입력하고 마지막으로 output을 지정합니다.
proc hpsvm data= titan.new_train method = activest ;
kernel rbf / k_par = 3 ;
input new_family new_pclass new_Age_group new_fare_group / level = ordinal;
input new_name new_sex new_embareked / leve = nominal;
target survived;
output outclass = outclass outfit = outfit outset = outset;
run;
SVM은 svmscore을 사용하여 스코어링을 진행합니다. data에 테스트 데이터를 입력한 뒤에 out을 지정하고, 아까 생성했던 outlcass/outfit/ outtest를 다음과 같이 입력합니다.
proc svmscore data = titan.new_test out = score_svm
inclass = outclass infit = outfit inest = outest;
run;
그 결과, 0.77990으로 Decition tree보다 성능이 향상된 것을 확인할 수 있습니다.
좋은 내용 감사합니다 🙂
Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9. Sign up by March 14 for just $795.