cut은 연속형 변수의 구간 분할을 도와주는 함수입니다. 예를 들어 0~100 까지는 ‘A’그룹, 101~200까지는 ‘B’그룹 같은 방식으로 구간을 나누는 경우 사용합니다.
기본 문법
bins 옵션에서는 구간을 어떻게 나눌지 정합니다. 위에서 든 예시를 표현하자면 bins=[0,100,200]이 되겠습니다. 오른쪽 닫힘 여부를 선택하는 right 옵션이 있는데 이에 대해서는 열린 구간과 닫힌 구간의 개념으로 이해하시면 됩니다. 이상과 이하, 미만과 초과를 구분지어야 하기 때문에 있는 옵션입니다. 최솟값 포함 여부는 bins
시리즈 하나를 예시로 만들어서 cut을 사용해보겠습니다.
2. 그룹 메소드(groupby)
groupby 특정 컬럼의 값 혹은 인덱스를 그룹화하는 메소드입니다. 이미 SQL에서 봤던 GROUP BY 절과 비슷합니다. 단, groupby만 수행시 분리만 수행하고 출력하는 것이 없기 때문에 적용함수를 같이 입력해야합니다.
예시대로 실행해보면 아시겠지만 groupby 메소드에는 항상 그룹 함수가 수반되어야 합니다. 그리고 한 컬럼에만 그룹 함수 사용시, 대괄호 갯수에 따라서 시리즈로 출력될지 데이터 프레임으로 출력될지가 달라지기 때문에 이 부분에서도 주의해야합니다. 다른 함수에 다시 사용해야하는 경우 데이터 구조가 달라서 연산에 오류가 생기는 경우가 있기 때문입니다.
그리고 같은 컬럼에 대해서 함수 여러 개를 동시에 사용할 수도 있습니다. agg 메소드를 이용하는 방법입니다. agg의 괄호 안에 리스트 형태로 그룹 함수를 전달하면 순서대로 그룹 별 함수 결과 값을 출력합니다.
groupby와 같이 사용할 그룹 함수는 앞에서와 비슷하게 사칙연산외에도 적용 메소드(apply)를 이용하여 사용자 정의 함수를 사용할 수도 있습니다.
1) 적용 메소드(apply)
예시 : sum을 적용 메소드를 이용하여 사용자 정의 함수 형태로 groupby에 전달
예시 : 연봉 기준으로 상위 2명 추출
※ group_keys=False 옵션의 사용 목적
groupby 연산 결과와 groupby 컬럼이 중복될 경우에 종종 key 중복으로 groupby 연산 자체가 에러 발생할 수 있습니다. 이런 경우에 이 옵션을 사용하면 groupby 연산 컬럼의 index로의 출력을 방지하여 출력할 수 있습니다.
다음으로는 컬럼 설정 외에 다른 방법으로 그룹화하는 방식에 대해서 설명하겠습니다.
2) 사용자 정의 그룹
groupby의 그룹 전달 방식은 지정한 컬럼에 들어있는 Value를 순서대로 지정하는 방식입니다. 그렇기 때문에 groupby의 괄호 내에 본인이 원하는 방식을 지정한다면 그 방식으로 그룹화를 실행할 수 있습니다. 원하는 방식으로 지정할 때 그 값을 행별로 하나하나 입력하여 리스트로 전달하는 방법도 있지만 가장 위에서 배운 cut 함수를 사용하는 방법도 있습니다. 두 방법 모두 다뤄보겠습니다.
예제 - 리스트로 그룹 전달 후 sum 함수 실행
앞의 두 행(열)은 g1이 부여되고 뒤에 있는 세 행(열)은 g2가 부여되어 두 그룹으로 나누어지고 각 그룹 내에서 함수가 실행된 것을 확인할 수 있습니다.
리스트 방식 외에 딕셔너리 형태로 전달할 수도 있습니다. 리스트 전달과 달리 순서에 상관없이 전달이 가능하다는 이점이 있습니다. 물론 Key-Value 구조로 입력해야하기 때문에 코드 작성 속도는 느려집니다.
다음으로는 cut을 이용하여 만든 cutting object 전달하여 그룹화하는 방법이 있습니다.위에서 다운로드 받은 emp.csv에서 각 연봉의 등급별 연봉의 평균을 출력해봅시다.
단, 연봉의 등급 기준은 3000이상 A, 1500 이상 3000미만 B, 1500미만 C입니다.
3) 트랜스폼(transform)
transform 메소드는 치환 메소드가 아니라 R에서 'plyr' 패키지 내에 함수 'ddply'에 있는 transform 과 기능이 유사합니다. 기존에 사용한 그룹 함수들은 그룹별 함수 실행 결과만 출력하는 반면에 transform을 이용하면 모든 행에 그룹 함수의 결과값을 붙여서 보여줍니다.
3. 날짜 모듈(datetime)
날짜 관련 모듈 datetime은 날짜, 시간 관련 모듈입니다.
1) 현재 날짜 및 시간 확인
2) 형 변환 함수
날짜에서의 형 변환 함수에는 문자를 날짜로, 날짜를 문자로 바꾸는 함수가 있습니다. 데이터 형이 맞지 않으면 연산시 에러가 발생하기 때문에 날짜 데이터를 다룰 경우에 필요한 함수입니다.
1) strptime
문자를 날짜 형식으로 치환하는 함수로 메소드는 존재하지 않습니다. 벡터 연산은 불가능하기 때문에 map 등 벡터 연산 지원 함수를 같이 사용해아합니다.
2) strftime :
날짜 형식을 문자 형식으로 치환하는 기능을 가지고 있으며 메소드, 함수 형식 모두 가능합니다. strptime과 마찬가지로 벡터 연산은 불가능하기 때문에 map 등 벡터 연산 지원 함수를 같이 사용해아합니다.
저번 글에서 다룬 datetime 모듈에 대한 추가 내용입니다. 날짜 관련 연산 및 인덱스 생성에 대해서 작성하고자 합니다.
3) 날짜 연산
(+) 추가 모듈을 사용한 날짜 연산
1) timedelta
datetime 형의 값 끼리는 연산시 문제가 없지만 날짜를 하루 씩 더하거나 하려고 하면 데이터 형 문제로 인해 연산이 바로 수행되지 않습니다. 이를 위해 datetime 내에는 timedelta와 offset이라는 모듈이 들어있습니다. timedelta는 단위 하나가 하루를 의미합니다. 그러므로 7일은 timedelta(7)이 되고 1시간은 timedelta(1/24)가 됩니다.
2) offset
4) 날짜 인덱스
인덱스에 날짜를 입력하는 date_range입니다. 시작 날짜와 끝 날짜를 입력하면 기본적으로 일 단위로 날짜를 입력하며 주 단위로 할지, 년 단위로 할지도 설정할 수 있습니다.
기본 문법
(+) 날짜 인덱스 색인
시리즈나 데이터프레임에서 날짜 인덱스를 지정 후 특정 기간에 대한 간단한 색인이 가능합니다. 예를 들어 시리즈 s1에서 2020년 1월 내에 모든 자료를 보고 싶을 때는 loc를 이용한 범위 설정 필요 없이 s1['2020-01']을 입력하면 됩니다. 아래 예시를 보면서 확인해봅시다.
5) 리샘플링(resample)
resample은 날짜의 빈도수를 변경하는 메소드입니다. 위에서 배운 date_range로 생성된 날짜 인덱스의 단위(freq)를 수정할 수가 있는데요. 기존 날짜 단위보다 더 세밀하게 바꿔주는(갯수 증가) 업 샘플링(upsampling)이 있고 기존 날짜 단위보다 간격이 넓어지는(갯수 감소) 다운 샘플링(downsampling)이 있습니다.
여기서 업 샘플링시 주의할 점이 있습니다. 주 단위에서 일 단위로 수정을 하였는데 1월 1일부터가 아니라 1월 5일부터인 것을 볼 수 있습니다. 처음 날짜 인덱스 생성시 초깃값이 1월 5일이기 때문입니다. 그래서 업 샘플링을 실행한 경우에는 본인이 원하는 형식으로 인덱스가 바뀌었는지 재확인 해볼 필요가 있습니다.
6) 날짜 이동 (shift)
shift는 날짜 인덱스를 고정 후 값만 이동시키는 메소드입니다.
기본 문법
Python에서의 전처리 관련 내용은 다음 글에서 마칠 예정입니다. 추가 문제에 대한 글 또한 예정되어 있습니다만, R에 대한 복습이 필요하여 전처리 외의 추가적인 내용은 R에 대한 내용 이후 다루려고 합니다.