Skip to main content

특성 생성

수식을 사용하여 새로운 열을 생성하는 노드입니다.


설명

특성 생성 노드는 기존 데이터를 기반으로 수식을 사용하여 새로운 열을 생성합니다.

@ 기호를 사용하여 기존 열을 참조하고, 다양한 연산자와 함수를 사용하여 새로운 특성을 만들 수 있습니다.


포트 구성

입력 포트

  • 데이터셋

출력 포트

  • 데이터셋: 새로운 특성이 생성된 데이터셋

속성

새 열 이름

생성될 특성의 이름을 입력합니다.

수식

특성 생성 시 사용할 수식을 입력합니다.

@열이름 형식으로 기존 열을 참조할 수 있습니다.

예시:

  • @나이 * 2: 나이 열의 값을 2배로
  • @가격 * 1.1: 가격 열의 값에 10% 추가
  • @국어 + @영어 + @수학: 세 과목 점수의 합

수식 문법

지원하는 연산자

사칙연산:

  • +: 덧셈 (문자열에 사용하면 문자열 연결)
  • -: 뺄셈 (단항으로 사용 시 부호 반전: -@값)
  • *: 곱셈
  • /: 나눗셈

비교 연산: (결과: True / False)

  • >: 크다
  • >=: 크거나 같다
  • <: 작다
  • <=: 작거나 같다
  • ==: 같다
  • !=: 다르다

비트 연산: 비교 결과(True/False)들을 결합할 때 사용합니다.

  • &: AND (그리고)
  • |: OR (또는)
  • ~: NOT (부정)
tip

복합 조건을 만들 때 각 조건은 반드시 괄호로 감싸야 합니다.

  • (@나이 >= 19) & (@나이 < 65): 성인이고 65세 미만
  • (@점수 >= 90) | (@출석 == 'A'): 점수 90 이상 또는 출석 A
  • ~(@상태 == 'inactive'): 비활성 상태가 아님

수학 함수

  • abs(x): 절댓값
  • pow(x, y): 제곱 (x의 y승)
  • sqrt(x): 제곱근
  • mod(x, y): 나머지 (x를 y로 나눈 나머지)
  • ln(x): 자연로그 (밑이 e)
  • log(x): ln과 동일
  • log2(x): 이진 로그 (밑이 2)
  • log10(x): 상용 로그 (밑이 10)
  • exp(x): 지수 함수 (e의 x승)
  • ceil(x): 올림
  • floor(x): 버림
  • round(x): 반올림

문자열 함수

  • len(str): 문자열 길이
  • upper(str): 모두 대문자로
  • lower(str): 모두 소문자로
  • substr(str, start, end): start번째 글자부터 end - 1번째 글자까지 잘라냅니다 (Python slice 방식, 0부터 시작하며 end는 포함하지 않음)
  • replace(str, old, new): oldnew로 치환
  • contains(str, pattern): pattern이 포함되어 있는지 (True/False)
  • startswith(str, pattern): pattern으로 시작하는지 (True/False)
  • endswith(str, pattern): pattern으로 끝나는지 (True/False)
  • in(target, val1, val2, ...): target 값이 나열된 값들 중 하나와 일치하는지 (True/False)
substr 예시

substr('Hello', 0, 3)'Hel' (0, 1, 2번째 글자, 3번째는 포함하지 않음)

조건문

[True일 때 값] if [조건] else [False일 때 값]

예시:

  • 'pass' if @점수 >= 60 else 'fail': 60점 이상이면 'pass', 아니면 'fail'
  • 'yes' if 2 > 1 else 'no': 결과는 'yes'

조건문은 중첩해서 등급을 나누는 데에도 사용할 수 있습니다.

'A' if @점수 >= 90 else ('B' if @점수 >= 80 else ('C' if @점수 >= 70 else 'F'))
여러 줄로 가독성 높이기

조건이 많을 때는 줄바꿈을 넣어 가독성을 높일 수 있습니다. 줄바꿈은 공백으로 처리되므로 동작에 영향이 없습니다.

'A' if @점수 >= 90
else 'B' if @점수 >= 80
else 'C' if @점수 >= 70
else 'F'

⚠️ 마지막 조건이 거짓일 때의 값(else …)을 반드시 포함해야 합니다. 누락 시 수식 오류가 발생합니다.

문자열 연결

+ 연산자로 문자열을 이어 붙일 수 있습니다. 문자열과 숫자가 함께 있어도 자동으로 문자열로 변환되어 연결됩니다.

  • @성 + @이름: 성과 이름을 이어 붙임
  • @이름 + '님': 이름 뒤에 '님' 붙이기
  • '코드-' + @id: 숫자 id 앞에 접두어 붙이기 (예: '코드-' + 100'코드-100')

사용 방법

  1. 노드를 캔버스에 추가합니다
  2. 데이터셋을 입력 포트에 연결합니다
  3. 속성에서 새 열 이름을 입력합니다
  4. 속성에서 수식을 작성합니다 (@ 기호로 기존 열 참조)
  5. 노드를 실행하면 새로운 열이 추가됩니다

수식 예시:

목적수식
총점 계산@국어 + @영어 + @수학
평균 계산(@국어 + @영어 + @수학) / 3
할인가 계산@가격 * 0.9
성인 여부'성인' if @나이 >= 19 else '미성년'
BMI 계산@몸무게 / pow(@키, 2)
절댓값 차이abs(@예측 - @실제)
로그 변환log(@매출 + 1)
반올림round(@평균)

활용 예시

1. 점수 등급화 (중첩 조건문)

학생들의 점수를 A/B/C/D/F 등급으로 변환합니다.

  • 새 열 이름: 등급

  • 수식 (여러 줄로 작성):

    'A' if @점수 >= 90
    else 'B' if @점수 >= 80
    else 'C' if @점수 >= 70
    else 'D' if @점수 >= 60
    else 'F'

2. 복합 조건으로 타겟 고객 분류

20대~30대이면서 구매 횟수가 5회 이상인 고객을 '타겟'으로 분류합니다.

  • 새 열 이름: 타겟여부

  • 수식:

    '타겟' if (@나이 >= 20) & (@나이 < 40) & (@구매횟수 >= 5) else '비타겟'

3. 이메일 도메인 분류

이메일 주소가 특정 도메인으로 끝나는지 확인하여 분류합니다.

  • 새 열 이름: 소속

  • 수식:

    '회사' if endswith(@이메일, '@company.com') else ('학교' if endswith(@이메일, '.ac.kr') else '기타')

    또는 도메인 부분만 통째로 치환해서 ID만 추출할 수도 있습니다.

    replace(@이메일, '@company.com', '')

4. 이름과 직함 결합 (문자열 연결)

이름 뒤에 직함을 붙여 표시용 라벨을 만듭니다.

  • 새 열 이름: 호칭

  • 수식:

    @이름 + ' ' + @직함 + '님'

5. 카테고리 일치 여부 확인 (in 함수)

직업이 전문직(교사, 의사, 변호사) 중 하나인지 확인합니다.

  • 새 열 이름: 전문직여부

  • 수식:

    '전문직' if in(@직업, '교사', '의사', '변호사') else '일반'

6. 표준화된 텍스트 정규화

대소문자가 섞인 데이터를 소문자로 통일하고 공백을 제거합니다.

  • 새 열 이름: 정규화_이메일

  • 수식:

    lower(replace(@이메일, ' ', ''))

7. 이상치 클리핑 (조건문)

값이 100을 초과하면 100으로, 0 미만이면 0으로 잘라냅니다.

  • 새 열 이름: 정규점수

  • 수식:

    100 if @점수 > 100 else (0 if @점수 < 0 else @점수)

8. 결측치 대체 (특정 값 확인)

값이 비어 있거나 특정 문자열인 경우 기본값으로 대체합니다.

  • 새 열 이름: 정리된_도시

  • 수식:

    '미상' if (@도시 == '') | (@도시 == 'N/A') else @도시

9. 카테고리 → 그룹 매핑

분류 값을 더 큰 그룹으로 묶습니다. 같은 결과가 여러 카테고리에 매핑되는 경우 in() 함수로 묶으면 간결해집니다.

  • 새 열 이름: 상품_대분류

  • 수식:

    '의류' if in(@상품_소분류, '셔츠', '바지', '재킷')
    else '신발' if @상품_소분류 == '운동화'
    else '가방' if @상품_소분류 == '백팩'
    else '액세서리' if in(@상품_소분류, '시계', '벨트', '모자')
    else '기타'