지난 시간 데이터 전처리의 전체적인 개요에 대해 설명드렸습니다.
데이터 전처리는 크게 구조에 대한 전처리와 내용에 대한 전처리로 나눠지게 됩니다.
그중 구조에 대한 전처리는 주로 전체 전처리 과정 중 비교적 빠른 단계에 진행되게 됩니다.
오늘은 구조 전처리 중 추출에 대한 이야기를 해보려 합니다.
추출
적절한 데이터 추출 작업은 불필요한 처리를 없애줄 뿐만 아니라 다루어야 할 데이터의 크기도 줄여주는 중요한 과정입니다.
크게 네 종류로 나누어서 알아보겠습니다.
데이터 열을 지정한 추출
레코드 데이터는 다양한 열을 갖지만 모든 열을 분석에 이용하는 경우는 드뭅니다.
예를 들어 고객의 경향을 파악할때 고객명은 도움이 되지 않습니다. 또한 보안 문제로 마스킹되어 있는 경우에도 데이터를 사용할 수 없을 것입니다.
이때 필요한 열만 남겨두어 데이터 크기를 줄이고, 뒤에 이어질 데이터 분석을 쉽게 하는 것이 데이터 추출의 역할입니다.
이를 파이썬 코드로 나타내면 두가지로 나타낼 수 있습니다.
※ 이때, drop이나 인덱스로 나타내는 코드는 가독성이 떨어지므로 추천하지 않습니다.
df[["reserve_id", "hotel_id", "customer_id", "reserve_datetime", "checkin_date", "checkin_time", "checkout_date"]]
df.loc[:, ["reserve_id", "hotel_id", "customer_id", "reserve_datetime", "checkin_date", "checkin_time", "checkout_date"]]
조건에 따른 데이터 행 추출
분석에 따라 필요한 데이터의 조건이나 수가 다르기 때문에 거대한 데이터를 그대로 사용하는 경우는 흔치 않습니다.
보통 필요한 데이터를 추출하려면 열값에 조건을 지정하여 데이터를 추출합니다.
필요한 데이터의 수는 후속 처리에 따라서 달라질 수도 있습니다.
따라서 조건 설정은 쉽게 변경할 수 있어야 합니다.
df[(df["checkout_date"] >= "2016-10-13") &
(df["checkout_date"] <= "2016-10-14")]
기본적으로 위와 같이 코드를 작성할 것입니다.
하지만 가독성이 좋지 않아 query 함수를 사용하여 작성할 것을 추천 드립니다.
df.query('"2016-10-13" <= checkout_date <= "2016-10-14"')
데이터 값을 고려하지 않는 샘플링
데이터를 분석할 때 추출할 데이터 수가 너무 많아 다루기 어려운 경우가 있습니다.
이런 상황에선 샘플링으로 데이터 수를 줄일 수 있습니다.
- 자의적 샘플링: 스스로 샘플링할 조건을 정하는 방법(조건에 따른 데이터 행 추출)
- 랜덤 샘플링: 조건 없이 랜덤으로 샘플링
df.sample(frac = 0.5) # 50%의 행을 추출
df.sample(n = 100) # 100건을 샘플링
집약 ID에 기반한 샘플링
샘플링할 때는 공평한 샘플링 구현이 가장 중요합니다.
예를 들어 1행에 1회의 숙박 예약을 나타내는 데이터를 50% 샘플링했다고 가정해 봅시다.
만약 예약 인원수별 예약 건수 데이터 비율을 분석하고자 하면 샘플링 전후의 분석결과는 크게 다르지 않습니다.
하지만 연간 예약 횟수별 고객 수의 비율에 대해 분석하고자 하면 샘플링 전후의 분석결과는 달라집니다.
왜냐하면 분석 단위가 다르기 때문입니다.
처음 데이터에서 샘플링할 때는 예약한 건을 단위로 했지만, 분석 단위는 연간 예약이기 때문입니다.
이로 인해 편향된 분석 결과가 발생할 수 있습니다.
따라서 분석 단위와 샘플링 단위를 맞추는 것이 매우 중요합니다.
이를 해결하기 위해서는 크게 두 가지 방법이 있습니다
- 고객 단위로 집약 후 샘플링
- 샘플링을 제외될 고객 데이터에도 집약 처리가 발생하다 보니 불필요한 처리가 발생하게 됩니다.
- 고객 ID를 대상으로 랜덤 샘플링을 실행, 샘플링한 고객 ID의 데이터만을 추출
- 분석 대상의 단위와 샘플링 단위 모두 고객 단위이므로 공평하게 진행할 수 있습니다.
2번을 이용한 코드를 알아보겠습니다.
target = pd.Series(df["customer_id"].unique()).sample(frac = 0.5)
df[df["customer_id"].isin(target)]
지금까지 데이터 구조 전처리 중 추출에 대해 알아보았습니다.
현재 많은 데이터가 생성되고 있어 앞으로 다루어야 할 데이터의 크기는 매우 클 것이라고 예상할 수 있습니다.
따라서 효율적인 분석을 위해 필요한 부분만 추출할 수 있는 기술을 습득하시는 것이 매우 중요합니다.
다음 포스팅에서는 데이터의 전체적인 경향 파악을 위해 사용되는 집약에 대해 알아보겠습니다.
포스팅 내용 중 다른 생각이 있는 분 혹은 수정해야 할 부분이 있으시면 댓글을 통해 그 의견을 나눠보면 너무 좋을 것 같습니다.
※ 본 포스팅의 내용은 데이터 전처리 대전을 참고하였습니다.
'Data preprocessing' 카테고리의 다른 글
[데이터 전처리#6] 데이터 구조 전처리 - 전개 (0) | 2023.07.10 |
---|---|
[데이터 전처리#5] 데이터 구조 전처리 - 생성 (1) | 2023.07.10 |
[데이터 전처리#4] 데이터 구조 전처리 - 결합 (0) | 2023.07.04 |
[데이터 전처리#3] 데이터 구조 전처리 - 집약 (0) | 2023.07.04 |
[데이터 전처리#1] 데이터 전처리 개요 (0) | 2023.06.29 |