* 출처 : Mamdouh Refaat (https://medium.com/@Mamdouh.Refaat)
지난 10년 동안 Python(파이썬)은 데이터 사이언스의 대명사가 되었습니다.
모든 데이터 분석가, 엔지니어들은 Python을 가장 우선적으로 배우며, 파이썬을 통해 모든 프로그래밍을 할 수 있을 것을 기대합니다.
하지만 이전부터 SAS 언어 와 R등은 꾸준히 사용되어고, 여전히 SAS 언어로 작성된 프로그램을 사용하는 조직도 많습니다.
데이터 분석가들은 단순히 Python으로 이를 대체하고 코드를 다시 작성하는 것이 아니라 SAS 언어를 Pyhton과 상호보완적으로 사용할 수 있습니다.
SAS가 제공하는 이점과 기존에 배포된 SAS 언어 코드를 Python으로 번역하는 방법에 대해 다뤄보겠습니다.
SAS 언어의 장점은 무엇일까요?
SAS 언어의 장점은 무엇일까요? SAS 언어가 여러 영역에서 분석 언어로 사용되었고 현재도 사용되고 있는 데에는 많은 이유가 있습니다:
- 언어의 단순성
SAS 프로그래밍은 사실 간단합니다. 다른 프로그래밍 언어와는 다른 개념들이 있지만, 언어 구조는 매우 단순하고 표준 구문에서 벗어나는 것에 대해 관대합니다.
사실 SAS 언어는 데이터 Step과 PROC Step 그리고 매크로로 이루어져 있습니다.
데이터 스텝은 데이터를 읽고, 쓰고, 처리하는 데 사용됩니다. PROC는 통계 및 머신러닝 모델을 캡슐화한 프로시저입니다. 매크로(정확히는 매크로 언어)는 스크립트 자체를 프로그래밍 가능하게 함으로써 자동화하는 SAS 방식입니다. 즉, 코드를 작성하는 코드입니다.
SAS를 사용해보지 않은 독자에게 SAS 언어가 얼마나 관대한지 보여드리기 위해 예시를 들어보겠습니다. proc print는 데이터를 출력 장치(화면 등)에 나열(또는 인쇄)하는 데 사용됩니다. 보통 모든 PROC 문이 해당 “run” 문으로 닫힐 때 실행될 것으로 예상합니다. 따라서 “MyData” 데이터 세트의 내용을 다음과 같이 간단한 코드로 표시할 수 있습니다.
데이터 세트 이름 주위에 따옴표가 없고 모든 문이 세미콜론으로 끝난다는 점에 주목하세요. 마지막 “run” 문을 생략하더라도 코드는 여전히 실행되며 문제없이 다음 부분으로 넘어갑니다. 다른 언어에서 이런 시도를 해보세요! 또한 run 앞에 공백을 추가했다는 점도 주목하세요. 우리는 Python 코드에서 이것이 어떤 결과를 낳을지 알고 있습니다. SAS 언어는 공백에 신경 쓰지 않습니다.
SAS 언어의 단순성을 보여주는 또 다른 예로, SAS 언어는 “숫자형”과 “문자형”의 두 가지 데이터 유형만 지원합니다. 데이터는 정수, 날짜, 날짜/시간 데이터 유형 등 다양한 유형으로 포맷될 수 있습니다. 하지만 이들은 모두 숫자형 또는 문자형 변수로 저장되고 처리됩니다.
- 완전한 SQL 엔진 포함
SAS 언어는 proc sql을 통해 SQL의 모든 기능을 완벽하게 구현합니다. proc sql 내에서 모든 SQL 구문이 지원됩니다. 많은 테이블에 대한 연산과 이들 테이블에서의 행 선택을 포함하는 데이터 프렙를 위한 코드를 작성할 때, 분석가와 데이터 과학자들은 종종 SQL로 생각하는 것이 더 쉽다는 것을 알게 됩니다.
SQL 블록 시작 부분의 proc sql 문을 제외하고는 SAS 언어에서 SQL 코드를 실행하기 위해 특별한 수정이 필요하지 않습니다. 또한 SAS 언어가 거의 모든 관계형 데이터베이스에 대한 연결을 제공하기 때문에, SAS 내에서 SQL을 사용하면 이러한 데이터베이스와 함께 제공되는 특수 SQL 실행 유틸리티 소프트웨어를 사용하지 않고도 이러한 데이터베이스에 저장된 데이터에 쉽게 액세스하고 조작할 수 있습니다.
- 성능
SAS 프로그램은 실행 중에 해석되므로 “인터프리터 언어”로써 느리게 실행될 것으로 예상되지만, 실제로는 그렇지 않습니다. 실행 환경은 컴파일된 프로그램에 필적하거나 심지어 능가하는 성능을 제공하도록 설계되어 있습니다.
예를 들어, 정렬은 대용량 데이터 세트의 경우 보통 오래 걸립니다. 표준 비즈니스 노트북에서 proc sort를 사용하여 100개의 변수와 1000만 개의 행이 있는 데이터 세트를 몇 초 만에 정렬할 수 있습니다.
SAS 언어의 높은 성능에 대한 또 다른 이유는 데이터를 처리하는 방식입니다. 모든 데이터를 메모리에 로드하는 것이 아니라 청크 단위로 읽고 처리한 다음 다시 저장소에 씁니다. 그렇기 때문에 일반 노트북에서 수백만 건의 레코드를 처리하여 새 변수를 만들고, 조건문을 실행하고, 수백만 건의 레코드가 포함된 데이터 세트의 필드를 결합하는 데 몇 초밖에 걸리지 않습니다.
최근 한 동료가 전산유체역학(CFD) 시뮬레이션 결과를 처리하는 최선의 도구에 대해 물었습니다. CFD 시뮬레이션 결과에는 일반적으로 수억 건의 데이터 레코드가 포함됩니다. 문제는 값비싼 컴퓨팅 자원 없이 이러한 매우 큰 데이터 파일을 읽고 CFD 계산의 특수한 후처리를 수행하는 것이었습니다. 제 조언은 Altair Analytics Workbench를 사용하여 SAS 스크립트를 실행하라는 것이었습니다.
- 견고성(Robustness)
SAS 언어는 50년 이상 존재해 왔습니다. 이 긴 기간 동안 데이터 과학자와 분석가의 모든 요구 사항을 아우르는 많은 기능과 모델을 다루게 되었습니다.
Python에서는 필요한 기능을 수행하는 패키지를 항상 찾을 수 있습니다. SAS 언어에서도 마찬가지입니다. 우리는 항상 우리가 필요로 하는 작업을 수행하는 언어 요소나 PROC를 찾을 수 있습니다. 새로운 기능을 발명하고 싶을 때도 SAS 언어는 확장 및 매크로 작성을 허용합니다.
- 특정 산업에서의 지배력
SAS 언어가 오랫동안 최고의 분석 언어로 존재해 왔기 때문에 은행, 금융, 보험, 제약 등 많은 산업에서 주요 분석 플랫폼으로 간주됩니다. 예를 들어, 대부분의 신용 위험 스코어카드 모델에 필요한 데이터 준비는 SAS에서 이루어집니다. 그렇기 때문에 많은 은행과 금융 기관에서 SAS를 미션 크리티컬 도구로 여깁니다.
- 긴 수명의 코드
Python이 버전 2.x에서 3.x로 발전하면서 거의 새로운 언어가 되었다는 것은 비밀이 아닙니다. 버전 3은 의도적으로 이전 버전과 호환되지 않도록 설계되었습니다. 하지만 SAS는 그렇지 않습니다. 지난 50년 동안 SAS 언어는 항상 이전 버전과 호환되어 왔습니다. 1970년대에 작성된 SAS 코드도 오늘날 여전히 실행될 수 있습니다. 따라서 오늘날 SAS로 작성하는 모든 코드는 아마도 우리보다 오래 살아남을 것입니다!
SAS 코드를 Python으로 변환하는 것은 어떨까요?
많은 조직에서 미션 크리티컬한 방대한 양의 SAS 코드가 있기 때문에, 최근 이 코드의 전부(또는 일부)를 Python으로 변환하려는 경향이 있었습니다.
이는 두 가지 동기에서 비롯되었습니다.
- 첫째, Python은 모든 라이브러리와 함께 오픈 소스이므로 조직에서 라이선스 비용을 절감할 수 있습니다.
- 둘째, 많은 데이터 과학자와 분석가들이 Python 교육을 받고 직장에 옵니다. 따라서 현재의 SAS 코드 인벤토리를 유지 관리하려면 인력을 SAS 언어로 교육해야 합니다.
코드 번역 전략은 단순히 코드를 다시 작성하는 것부터 자동화 소프트웨어를 사용하여 코드를 자동으로 번역하려는 시도, 또는 이 두 접근 방식의 조합에 이르기까지 다양합니다. 저는 이 접근 방식이 약속된 결과를 제공하지 않을 것이라고 솔직히 믿습니다. 성공 사례는 SAS 코드가 데이터베이스에서 데이터를 다운로드하거나 다른 소스의 테이블을 병합하는 등 단순한 작업을 수행하는 경우로 제한될 것입니다. 그러나 SAS 코드가 상세한 데이터 준비와 복잡한 모델링을 수행할 때는 Python으로의 자동 변환이 실패할 가능성이 높고, Python으로 다시 작성하는 것은 현재 코드를 유지 관리하는 것보다 비용이 더 많이 들 것입니다.
이러한 번역 전략에 직면한 또 다른 과제는 SAS의 많은 분석 기능에 Python에 해당하는 기능이 없거나 다른 표기법과 용어를 사용하는 Python 패키지에서 제공되어 번역 또는 재작성 작업을 더 어렵게 만든다는 것입니다.
다른 사람이 작성한 복잡한 코드를 디버깅해 본 사람은 누구나 첫 번째 작업이 코드가 무엇을 하려고 하는지 이해하는 것임을 알고 있습니다. SAS 코드를 Python으로 변환하는 작업에는 코드가 목표로 했던 바를 이해하고 Python에서 동일한 기능을 다시 작성하는 것이 포함됩니다. 대부분의 자동화 도구는 읽기 어렵거나 유지 관리하기 어려운 코드를 생성합니다. 자동화 도구의 목표는 일반적으로 실행되는 코드를 생성하는 것이며, 때로는 효율적입니다.
변수 이름 선택, 코딩 스타일 및 패턴은 결과 코드가 실행되고 동일한 출력을 생성하는지 확인하는 것보다 부차적입니다.
SAS에서 Python으로 번역하는 또 다른 도전적인 문제는 SAS의 구문이 기계 번역을 허용하는 엄격하게 준수되고 따라야 하는 형식으로 구조화되어 있지 않다는 것입니다. 앞서 “run;” 문이 많은 상황에서 생략될 수 있다고 언급했습니다. 또 다른 예로, proc 문 블록을 run으로 닫는 동안 때로는 선행 문과 프로시저의 컨텍스트에 따라 “quit;” 문을 삽입해야 합니다.
아마도 SAS 언어를 Python으로 번역하는 가장 도전적인 측면은 매크로 언어일 것입니다. 매크로 언어는 코드를 작성하고 실행하기 때문에 자동 번역이 매우 어렵거나 불가능합니다.
SAS와 Python을 모두 사용하는 것은 어떨까요?
이것이 제가 모든 데이터 과학자나 분석가에게 진지하게 고려해 볼 것을 권장하는 최선의 옵션이라고 생각합니다. 각각에는 훌륭한 기능이 있어 서로 보완할 수 있습니다. 우리가 서로 다른 환경에서 두 세트의 코드를 실행할 필요가 없다는 점에 유의하는 것이 중요합니다.
SAS 언어에는 SAS 코드와 함께 Python 코드를 실행하는 프로시저인 proc python이 있습니다. SAS 환경 내에서 SAS 코드를 실행하는 것도 가능합니다.
Altair RapidMiner와 같은 많은 머신러닝 및 데이터 과학 소프트웨어 도구들도 시각적 워크플로에서 이러한 언어로 작성된 코드 노드를 만들어 SAS와 Python(및 R) 코드를 원활하게 실행하는 작업을 쉽게 만듭니다. 이를 통해 데이터 사이언스 언어 장벽을 극복할 수 있습니다.
결론 Python(및 R)을 대체하거나 보완하기 위해 SAS 언어를 사용할 많은 좋은 이유가 있습니다. SAS 언어와 Python의 현재 기능은 이러한 언어로 작성된 코드 간의 쉬운 상호 작용을 허용합니다. 더욱이 알테어는 이러한 언어로 작성된 코드의 실행과 통합을 포인트 앤 클릭 문제로 만드는 시각적 워크플로 플랫폼을 제공합니다.
결론
Python(및 R)을 대체하거나 보완하기 위해 SAS 언어를 사용할 이유는 충분합니다. SAS 언어와 Python의 현재 기능은 이러한 언어로 작성된 코드 간의 쉬운 상호 작용을 허용합니다. 알테어의 소프트웨어를 통해 SAS 언어와 Python으로 함께 작성된 코드의 실행과 통합을 포인트 앤 클릭 문제로 만드는 시각적 워크플로 플랫폼을 제공합니다.
SAS 언어 환경 현대화 방법
Altair SLC™는 이런 현대화 흐름에 정확히 필요한 옵션, 대체 SAS 언어 환경을 제공합니다.
미래 지향적인 데이터 분석 전략을 구축하고자 하는 SAS 언어 사용자의 전망을 변화시킵니다. 조직은 동일한 SAS 언어 애플리케이션을 저렴한 비용으로 실행하는 Altair SLC로 마이그레이션할 수 있으며, Python, R 및 클라우드 플랫폼을 비롯한 기타 기술을 유연하게 수용할 수 있습니다. Altair SLC로 마이그레이션하는 방법은 간단합니다:
다른 기술로 전환할 때와 비교해 재교육, 업무 중단, 리스크가 최소화되며, 대규모 컴퓨팅을 활용하여 성능 문제를 해결하는 다른 대체 기술에 비해 훨씬 적은 리소스를 소비하므로 효율성이 높습니다.Altair Units을 포함한 유연한 Altair 라이선스 조건은 안심하고 유연하게 사용할 수 있습니다.