[프로그래밍 팁] 엑셀 데이터 가져오기, 전치하기, 플롯 만들기!

0

그래프를 만들 때 가장 어려운 작업은 무엇일까요? 바로 데이터를 준비하는 것인데요. 오늘은 엑셀 데이터를 SAS로 가져오고, 전치하고, 첫 열의 값을 데이터 값으로 사용하고, 플롯으로 요약하는 방법을 차례대로 소개해드리고자 합니다.

오늘 예시에서는 학생 대출 채무에 관한 데이터가 사용되는데요. 몇 년 전, 학생 대출 채무가 급증하면서 큰 이슈가 됐었고, 아래는 관련 기사에서 쓰인 그래프입니다.

이 그래프의 데이터는 newyorkfe.org 웹사이트에서 찾을 수 있었는데요. 엑셀 스프레드시트를 다운받은 후 해당 정보를 ‘Page 3 Data’ 탭에서 찾았습니다. 아래와 같이 기사에서 쓰인 데이터보다 업데이트된 최신 데이터가 포함되어 있는데요.

그리고 아래의 코드를 사용해 이 데이터를 SAS로 가져왔습니다.

proc import datafile="HHD_C_Report_2018Q1.xlsx" dbms=xlsx out=raw_data replace;
range="Page 3 Data$A3:BL9";
getnames=yes;
run;

스프레드시트의 것과 매우 비슷한 SAS 데이터세트가 생겼는데요.

이렇게 SAS로 데이터를 옮겼지만, 이 상태로 그래프를 만들 수는 없습니다. 왜냐하면 연도와 분기, 즉 날짜가 변수의 값이 아닌 변수 이름의 일부분으로 암호화되어 있기 때문인데요. 이는 데이터를 저장하는 효율적이며 정규화된 방법일 수 있지만, 프로그래밍 방식으로 데이터를 분석하거나 그래프화하는 데에는 적합하지 않습니다.

SAS는 데이터세트를 뒤바꿈으로써 이러한 문제를 해결합니다. 아래의 코드를 사용해 우선 변수의 이름을 정리하고, 변수의 이름을 값으로 바꾸기 위해 데이터세트를 전치시키겠습니다. 이 전치 과정을 반복하면 기존 6개의 데이터 라인 대신 366개의 라인이 생깁니다. 최소한의 공간에 데이터를 저장하기에는 효율적이지 않지만, 분석하고 플롯을 만들기에는 훨씬 쉽습니다.

아래는 그 코드와 데이터세트 결과의 일부분입니다. 붉은색 동그라미로 표시된 부분을 보면 이전 SAS 데이터세트에서 변수 이름과 레이블이었던 것들이 값으로 바뀐 것을 볼 수 있습니다.

data raw_data; set raw_data (rename=(a=category) drop = b c);
run;

proc transpose data=raw_data out=tran_data;
by category notsorted;
run;

이렇게 프로그래밍 작업을 할 수 있는 값의 형태로 연도:분기 데이터를 얻었는데요. 이제 이 데이터를 실제 날짜 값으로 바꿔볼까요? 아래의 코드는 연도와 분기를 파싱하고, 그 값을 사용해 분기의 중간쯤으로 SAS 날짜 값을 생성합니다.

data tran_data; set tran_data (rename=(col1=debt));
year=.; year=substr(_label_,1,2)+2000;
qtr=.; qtr=substr(_label_,5,1);
if qtr=1 then monstr='feb';
if qtr=2 then monstr='may';
if qtr=3 then monstr='aug';
if qtr=4 then monstr='nov';
format plot_date date9.;
plot_date=input('15'||monstr||trim(left(year)),date9.);
run;

이제 아래와 같은 간단한 코드를 사용해 시간 경과에 따른 학생 대출 채무에 대한 그래프를 만들 수 있습니다.

symbol2 value=circle h=1.9 interpol=join color=red;

axis1 label=(j=c 'Debt' j=c '(trillion $)') minor=none offset=(0,0);
axis2 label=none minor=none offset=(0,0);

title1 ls=1.5 "Student Loan Debt in the U.S.";

proc gplot data=tran_data (where=(category='Student Loan'));
format plot_date year4.;
format debt comma5.1;
plot debt*plot_date /
vaxis=axis1 haxis=axis2 vzero
autovref cvref=graydd
autohref chref=graydd;
run;

물론 이 그래프도 나쁘지 않지만, 단순히 분기별 대출 채무를 보여주는 것에서 나아가 그래프의 첫 번째 연도인 2003년과 비교했을 때 증가 또는 감소를 %로 보여주면 어떨까요? 이를 위해서는 데이터 요약이 필요합니다. 먼저 학생 대출과 다른 유형의 대출을 위한 맞춤형 카테고리를 만들어보겠습니다.

data tran_data; set tran_data;
length my_category $20;
if category='Student Loan' then my_category='Student Loan';
else my_category='Other';
run;

그리고 이 두 카테고리별로 데이터를 요약하고, 2003년의 요약 값을 ‘학생과 기타(student and other)’라는 매크로 변수로 저장합니다:

proc sql noprint;

create table summarized_data as
select unique my_category, plot_date, year, qtr, sum(debt) as debt
from tran_data
group by my_category, plot_date, year, qtr;

select debt into :student
from summarized_data where my_category='Student Loan'
and year=2003 and qtr=1;

select debt into :other
from summarized_data where my_category='Other'
and year=2003 and qtr=1;

quit; run;

마지막으로 매크로 변수로 저장한 2003년 값과 비교해 각 분기별 % 증가 또는 감소 값을 계산합니다.

data summarized_data; set summarized_data;
if my_category='Student Loan' then debt_pct=(debt-&student)/&student;
else debt_pct=(debt-&other)/&other;
run;

이제 기존 그래프에서 한층 더 개선된 새로운 그래프를 만들 수 있습니다. 여기서 사용된 SAS 코드에 대해 더 자세히 확인해보세요.

최종으로 완성된 그래프는 하단과 같습니다.

기존 그래프에서 무엇이 바뀌었고 어떻게 개선됐을까요?

  • 기존 그래프 하단의 가로 축에 표시된 분기 값은 읽기 어려웠고, 플롯에 표시된 점들과 관련 짓기도 불편했습니다. 따라서 가로 축에 연도를 표시하고, 각 연도 사이에 기준선을 그렸습니다.
  • 그래프 왼쪽의 세로 축을 따라 눈금을 표시해서 복잡해 보이지 않습니다.
  • 그래프 오른쪽의 세로 축에도 값을 표시해서 왼쪽과 오른쪽 모두에서 편하게 값을 확인할 수 있습니다.
  • 점선이 아닌 실선 모양의 참조선을 사용해 다른 데이터 선이나 표식과 어우러집니다.
  • 복잡하고 어수선해 보이는 이미지 파일의 가장자리와 바깥쪽 테두리를 지웠습니다.
  • 더 명확한 정보를 제공하는 깔끔한 제목을 사용했습니다.

 

이렇게 비교해보니 어떠신가요? 학생 대출 채무가 다른 유형의 채무보다 훨씬 더 크게 증가하고 있음을 한눈에 파악할 수 있는데요. 오늘 과정을 통해 스프레드시트에서 데이터를 가져오고, 분석하고, 플롯을 만드는 데 유용한 프로그래밍 팁을 소개해드렸습니다. 실제 데이터 작업에서 유용하게 활용하실 수 있을 것입니다.

SAS 블로그에서 더 많은 프로그래밍 팁을 확인해보세요!


해당 기사는 Robert Allison의 기사를 일부 편집한 내용입니다.
Tags
Share

About Author

SAS Korea

Related Posts

Leave A Reply

Back to Top