본문 바로가기

All73

[SAS] 코드를 줄여주는 기능 정리 들어가는 말 자주 사용하는 기본적인 기능을 정리한 글에 이어, 이번 글에서는 보다 심화된 내용으로 준비했습니다. 알고 있으면 편리하고 효율적으로 코드를 작성할 수 있는 기능 위주로 소개하고자 합니다. [DATA STEP] 1. IF - OUTPUT - IF ~ OUTPUT 은 DATA STEP에서 조건에 맞는 새로운 데이터 셋을 생성할 때 사용합니다. - 데이터를 다룰 때 전체 데이터 셋에서 IF 또는 WHERE구문으로 특정 조건에 맞는 데이터만 추출하여 테이블을 생성하곤 합니다. 만약 조건이 다른 2개의 데이터 셋을 만든다면 각 조건을 반영한 DATA STEP을 2번 반복하여 만들 수도 있지만 IF ~ OUTPUT 으로 1개의 DATA STEP에서 2개의 새로운 데이터 셋을 만드는 것이 효율적입니다. .. 2021. 9. 9.
[SAS] 자주 쓰는 기능 정리 들어가는 말 CSS 컨설팅 프로젝트로 SAS를 처음 접하는 팀원 분들이 많으실 듯합니다. 개인적으로는 SAS라는 프로그램이 최근 널리 사용되는 오픈소스 Python이나 R에 비해 생소할뿐더러, 인터넷에 관련 정보도 적어 공부하기 쉽지 않았습니다. 그리고 프로젝트 투입 전에는 프로젝트에 필요한 SAS 공부의 범위와 깊이를 가늠하지 못해 막막하기도 했습니다. 이후, 프로젝트를 하면서 '자주 쓰는 기능을 미리 알고 집중적으로 공부했더라면' 하는 아쉬움이 들었고, 이러한 부분을 정리하여 공유한다면 첫 프로젝트를 앞둔 컨설팅 팀원분들께 도움이 되지 않을까 하는 생각으로 글을 쓰게 되었습니다. 이번 글에서는 프로젝트에서 자주 쓰는 기능에 대한 간략한 설명과 함께, 프로젝트에서 언제, 어떻게 주로 사용하는지 덧붙였습.. 2021. 9. 8.
[SAS] RETAIN 이번 포스팅에서는 RETAIN 기능을 활용하여 데이터를 다룬 사례를 정리합니다. [문제] 데이터에는 ID별로 SIGN 등급(A > B > C > D 순서대로 점수가 높음 > 낮음)이 데일리로 적재되어 있습니다. 이 데이터에서 기준일자를 기준으로 특정한 기간 내에 고객 별로 가장 나쁜 점수, D를 연속적으로 받은 최대 일수를 구하는 문제입니다. 아래 이미지와 같이 기준일자 15일 내 D가 연속적으로 등장하는 최대 일수는 2일이고, 기준일자 30일 내 최대 일수는 8일입니다. [해결 방법] 다음과 같이 문제를 해결했습니다. 1. 데이터를 날짜순으로 정렬 2. SIGNAL 컬럼을 한 행씩 내려오면서 D가 연속되는 횟수를 MAX_15D 열에 누적 3. MAX_15D, MAX_30D 열의 최댓값 계산 1. 날짜 .. 2021. 4. 19.
[Spark] Window 함수 [window 함수] - 특정 윈도우를 대상으로 고유의 집계 연산을 수행합니다. - 윈도우는 현재 데이터에 대한 참조를 사용해 정의하고,윈도우 명세는 함수에 전달될 로우를 결정합니다. - groupBy 함수를 사용하면 모든 로우 레코드가 단일 그룹으로만 이동하는 반면, 윈도우 함수는 프레임(로우 그룹 기반의 테이블)에 입력되는 모든 로우에 대해 결괏값을 계산합니다. 코드 예제를 통해 window 함수를 살펴보겠습니다. - 데이터 셋팅 // 데이터 셋팅 val retail=spark.read.format("csv") .option("header","true") .option("inferSchema","true") .load("C:/data/retail-data/by-day/2011-01-30.csv") r.. 2021. 3. 11.
[Spark] 그룹화 [그룹화] - 데이터 그룹 기반의 집계는 단일 컬럼의 데이터를 그룹화하고, 해당 그룹의 다른 여러 컬럼을 사용해서 계산하기 위해 카테고리형 데이터를 사용합니다. - 그룹화 작업은 아래와 같은 단계로 이뤄집니다. (1) 하나 이상의 컬럼을 그룹화 (Relational Grouped Dataset 반환) (2) 집계 연산을 수행 (DataFrame 반환) - 그룹화 코드 (1) 기본적인 그룹화 // 그룹화 retail_all.groupBy("InvoiceNo","CustomerId").count().show() (2) 표현식을 활용한 그룹화 retail_all.groupBy("InvoiceNo").agg( //agg 메서드로 여러 집계 처리를 한 번에 지정 count("Quantity").alias("qua.. 2021. 3. 9.
[Spark] 집계 연산 [집계 함수] 스파크는 모든 데이터 타입을 다루는 것 외에도 그룹화 데이터 타입 생성도 가능합니다. 그룹화된 결과는 지정된 집계 함수에 따라 Relational Grouped Dataset을 반환합니다. 1. count / countDistinct / approx_count_distinct 2. first / last / min / max 3. sum / sumDistinct 4. 평균 / 분산 / 표준편차 / 왜도 / 첨도 / 공분산 / 상관관계 5. 복합 데이터 타입 (collect_list, collect_set) 먼저 예시로 사용할 데이터 셋을 불러옵니다. // 데이터 셋팅 val retail_all=spark.read.format("csv") .option("header","true") .opt.. 2021. 3. 7.
[SAS] 반복문 활용 업무 중 2억 행이 넘는 자료를 처리할 때가 있습니다. 파일이 상당히 크다 보니 가장 오래된 날짜, 가장 최근 날짜를 확인하는 간단한 작업도 한 번에 처리할 수 없다고 뜨기도 합니다. 그래서 파일을 행별로 분할하여 동일한 작업을 처리하도록 했습니다. 이 과정에서 제가 사용했던 방법을 소개하고자 합니다. 더 좋은 방법이 있다면 댓글로 추천 부탁드립니다. 아래 예제 코드는 데이터에서 날짜의 최대/최솟값 탐색을 목적으로 작성했습니다. 1. 데이터 셋 한번에 사용 1) 데이터 셋을 한번에 불러들여 2) 테이블의 인덱스로 최소/최대 날짜 확인하는 방법입니다. 스크롤을 내려가며 결과를 직접 확인해야 한다는 점에서 세련되지 못하다고 생각할 수 있지만, 처리되는 속도가 빠르고 코드가 가장 짧고 단순합니다. 단지 데이터.. 2021. 2. 27.