[데이터 전처리] 데이터 정렬(sorting) 및 정제(cleaning)

정의


  • 데이터 정렬(sorting)은 데이터를 값의 크기나 알파벳순으로 순서대로 배치하는 것
  • 데이터 정제(cleaning)는 데이터셋에서 잘못되거나 불필요한 부분을 손보고 깨끗하게 만드는 작업입니다.

 

 

데이터 정렬 ( sort_values 와 sort_index )


값을 기준으로 정렬

  • DataFrame이나 Series 객체에는 sort_values() 메서드가 있어서 하나 이상의 컬럼 값을 기준으로 행을 정렬할 수 있습니다.
  • 기본은 오름차순(ascending=True)이며, 내림차순은 ascending=False 옵션을 줍니다.
  • 또한 by 파라미터에 컬럼명을 지정하여 정렬 기준 컬럼을 설정합니다 (Series에는 by 없이 자기 자신의 값 기준으로 정렬).
  • by 파라미터를 사용해서 여러 컬럼을 기준으로 정렬도 가능하고 ascending=[False, True] 처럼 각기 다른 정렬을 줄 수 있습니다.

예제: 팁 데이터에서 팁 금액이 큰 순서대로 상위 몇 개 행을 보고 싶다면:

sorted_tips = tips.sort_values(by='tip', ascending=False)   # 내림차순
print(sorted_tips[['total_bill','tip','size']].head(5))
     total_bill    tip  size
170       50.81  10.00     3
212       48.33   9.00     4
23        39.42   7.58     4
59        48.27   6.73     4
141       34.30   6.70     6

위 출력에서 팁(tip)이 가장 큰 상위 5건을 볼 수 있습니다.

만약 동일한 팁 금액에서는 다른 컬럼을 기준으로 정렬하고 싶다면 by에 리스트를 주어 다중 기준 정렬도 가능합니다. 예: tips.sort_values(by=['day','total_bill'])먼저 요일별로 정렬한 뒤, 그 안에서 total_bill 순으로 정렬합니다.

  • 인덱스를 기준으로 정렬
    • sort_index() 메서드는 행 인덱스 라벨을 기준으로 정렬합니다.
    • 예를 들어 날짜 인덱스가 뒤죽박죽인 시계열 데이터가 있다면 df.sort_index()로 정렬할 수 있습니다.
    • 기본 오름차순이며, ascending=False로 내림차순 정렬도 가능합니다.

 

 

데이터 정제 (Data Cleaning)


데이터 정제란, 데이터셋에서 잘못되거나 불필요한 데이터를 수정 또는 제거하는 모든 작업을 포괄합니다.

컬럼명 정리

  • 판다스의 DataFrame.rename() 메서드를 사용하면 컬럼명을 일괄 변경할 수 있습니다.
  • 예를 들어 Superstore 데이터의 컬럼 'Order Date'를 'Order_Date'로 바꾸고 싶다면:
orders = orders.rename(columns={'Order Date': 'Order_Date'})   🔥🔥🔥🔥🔥

이렇게 하면 공백 대신 언더스코어가 들어간 컬럼명으로 변경됩니다.

여러 컬럼도 딕셔너리로 한 번에 변경 가능합니다. 또orders.columns = [col.lower() for col in orders.columns]식으로 컬럼명을 전부 소문자로 바꾸는 식의 처리도 할 수 있습니다.

불필요한 컬럼 제거

  • DataFrame.drop() 메서드를 사용하며, 컬럼을 제거할 때는 axis=1 또는 columns= 파라미터를 사용합니다.
  • 예컨대 Superstore 데이터에는 행별 식별자인 'Row ID' 컬럼이 있는데, 이건 단순히 행 번호이므로 분석에는 불필요하다고 가정하고 제거해보겠습니다:
orders = orders.drop(columns=['Row ID'])

이제 orders 데이터프레임에는 'Row ID' 컬럼이 사라지게 됩니다.
(inplace=True 옵션을 쓰면 바로 자기 자신에서 제거하지만, 여기서는 새로운 객체에 받는 형태로 썼습니다.)

 

데이터 값 정리 (이상치, 잘못된 값 : 수정 or 제거)

  • 문자열에 불필요한 공백이 있다면 ✅ Series.str.strip()으로 좌우 공백 제거
  • 대소문자 섞인 값을 통일하려면 ✅ Series.str.lower() 또는 upper()를 사용할 수 있습니다.
  • 카테고리 값이 잘못 입력된 경우 (예: 'male' vs 'Male') 대소문자를 맞추거나 철자를 통일하는 작업도 필요합니다.
  • 예시: 간단한 데이터 정제 예로, 도시명 데이터에 대소문자가 섞여 있고 앞뒤로 공백이 있는 경우를 정리해보겠습니다:
cities = pd.Series([' new york', 'Los Angeles ', 'Chicago', ' new york'])
cleaned = cities.str.strip().str.title()
print(cleaned.unique())
['New York' 'Los Angeles' 'Chicago']

여기서 .str.strip()으로 앞뒤 공백을 제거하고  🔥🔥🔥
.str.title()로 각 단어의 첫 문자만 대문자로 표기해 통일했습니다.  🔥🔥🔥

 

 

정렬과 정제 종합 예시

  • Superstore 판매 데이터에서 이익(Sales)이 가장 낮은 주문 Top10을 찾아보고, 그 중 이상치가 있는지 확인한다고 해봅시다.
  • 정렬로 Sales 오름차순 정렬 후 상위 10개를 보고, 필요하다면 해당 주문을 자세히 조사하는 식입니다.
worst_profits = orders.sort_values('Sales').head(10)
print(worst_profits[['Order ID','Product Name','Sales']])

이 결과에서 Sales이 비정상적으로 큰 음수값이 있다면 (예: -$2000 같은), 아마 데이터 입력 오류이거나 특별한 경우일 수 있으므로, 해당 행을 제거하거나 별도 처리해야 할 수 있습니다. 이런 과정을 통해 데이터 정제는 이루어집니다.