-
혼자 공부하는 데이터 분석 CH 03 데이터 클렌징Study/Data Analysis 2025. 9. 23. 11:32

목차
들어가며: 야생의 데이터를 길들이다, 판다스 데이터 클렌징
1. 불필요한 데이터 삭제하기 (데이터 클렌징의 첫걸음)
1-1. 데이터 로드 및 초기 확인
1-2. 열(컬럼) 삭제: 데이터의 군살 빼기
1-3. 행(로우) 삭제: 조건에 맞는 데이터만 남기기
1-4. 중복된 행 처리: 데이터의 신뢰성 높이기
1-5. 전처리 과정 함수화: 재사용성을 위한 지혜
2. 잘못된 데이터 수정하기 (데이터의 품질 향상)
2-1. 데이터프레임 정보 확인 및 NaN 처리
2-2. 정규 표현식을 이용한 데이터 정제
2-3. 이상치(Outlier) 처리: 현실적인 데이터 만들기
2-4. 웹 스크래핑으로 누락 정보 채우기 (데이터 인리치먼트)
2-5. 최종 정제 및 함수화
마치며: 깨끗한 데이터, 성공적인 분석의 초석
들어가며: 야생의 데이터를 길들이다, 판다스 데이터 클렌징
안녕하세요!
데이터 분석의 여정은 완벽하게 정돈된 데이터가 아닌,
야생의 원석 같은 데이터를 마주하는 것에서 시작됩니다.
이 데이터에는 불필요한 정보, 중복, 오류, 누락된 값들이 섞여 있기 마련이죠.
오늘은 파이썬의 강력한 라이브러리 Pandas를 사용하여,
남산 도서관 장서 데이터를 바탕으로 이 거친 원석을 빛나는 보석으로 만드는 과정,
즉 데이터 정제(Data Cleansing) 방법을 알아보겠습니다. 데이터를 삭제하고, 수정하고, 심지어 웹에서 정보를 가져와 채우는 과정까지 함께 따라와 보세요!
1. 불필요한 데이터 삭제하기 (데이터 클렌징의 첫걸음)
데이터 정제의 첫 단계는 필요 없는 부분을 과감히 덜어내는 것입니다. 분석에 사용하지 않을 데이터나 중복된 정보를 제거하여 데이터셋을 가볍고 명확하게 만듭니다.
1-1. 데이터 로드 및 초기 확인
먼저, 데이터를 불러와 어떤 모습인지 확인합니다.
read_csv()로 데이터를 로드하고 .head()로 상위 5개 행을 출력해 데이터의 구조를 파악합니다.
import gdown gdown.download('https://bit.ly/3RhoNho', 'ns_202104.csv', quiet=False) import pandas as pd ns_df = pd.read_csv('ns_202104.csv', low_memory=False) ns_df.head()1-2. 열(컬럼) 삭제: 데이터의 군살 빼기
분석에 불필요한 열은 다양한 방법으로 제거할 수 있습니다.
- 슬라이싱 (loc): 필요한 열의 범위를 지정하여 선택합니다.
ns_book = ns_df.loc[:, '번호':'등록일자']
- 조건으로 선택: 특정 조건을 만족하는 열만 남깁니다.
selected_columns = ns_df.columns != 'Unnamed: 13' ns_book = ns_df.loc[:, selected_columns]
- drop() 메서드: 가장 직관적인 방법으로, axis=1 옵션을 주어 열을 직접 삭제합니다.
# 단일 컬럼 삭제 ns_book = ns_df.drop('Unnamed: 13', axis=1) # 여러 컬럼 동시 삭제 ns_book = ns_df.drop(['부가기호','Unnamed: 13'], axis=1)
- dropna() 메서드: NaN (결측치)이 포함된 열을 삭제합니다.
# NaN이 하나라도 있는 열 삭제 ns_book = ns_df.dropna(axis=1) # 모든 값이 NaN인 열만 삭제 ns_book = ns_df.dropna(axis=1, how='all')
1-3. 행(로우) 삭제: 조건에 맞는 데이터만 남기기
불필요한 행 또한 인덱스나 조건을 이용해 쉽게 제거할 수 있습니다.
- 인덱스로 삭제: drop()을 사용하거나, 슬라이싱으로 원하는 범위의 행만 선택합니다.
# 0번, 1번 행 삭제 ns_book2 = ns_book.drop([0,1]) # 2번 행부터 끝까지 선택 (0,1번 행 제외 효과) ns_book2 = ns_book[2:]
- 조건으로 삭제 (불린 인덱싱): 특정 조건을 만족하는 행만 남기는 것은 데이터 필터링의 핵심입니다.
# '한빛미디어' 출판사의 도서만 선택 selected_rows = ns_df['출판사'] == '한빛미디어' ns_book2 = ns_book[selected_rows] # 대출건수가 1000건을 초과하는 도서만 선택 ns_book2 = ns_book[ns_book['대출건수'] > 1000]
1-4. 중복된 행 처리: 데이터의 신뢰성 높이기
동일한 데이터가 여러 번 기록되면 분석 결과를 왜곡할 수 있습니다. 중복 데이터를 찾아 올바르게 처리해야 합니다.
- 중복 행 찾기 (duplicated()):
# 특정 컬럼들을 기준으로 중복된 행의 개수 확인 sum(ns_book.duplicated(subset=['도서명','저자','ISBN']))
- 중복 데이터 집계 (groupby()): 중복된 도서는 대출건수를 합산하여 하나의 데이터로 만들어주는 것이 합리적입니다. groupby()로 기준 컬럼을 묶고 .sum()으로 대출건수를 합산합니다.
count_df = ns_book[['도서명','저자','ISBN','권','대출건수']] loan_count = count_df.groupby(by=['도서명','저자','ISBN','권'], dropna=False).sum() - 중복 제거 및 데이터 병합: 복된 행을 제거한 뒤, 위에서 집계한 대출건수 합계 데이터를 .update() 메서드로 병합합니다
.
# 중복되지 않은 고유한 행만 추출 dup_rows = ns_book.duplicated(subset=['도서명','저자','ISBN','권']) unique_rows = ~dup_rows # ~ 기호로 boolean 값을 반전시킴 ns_book3 = ns_book[unique_rows].copy() # 인덱스를 기준으로 집계 데이터 업데이트 ns_book3.set_index(['도서명','저자','ISBN','권'], inplace=True) ns_book3.update(loan_count) ns_book3.reset_index(inplace=True) # 인덱스 복원
1-5. 전처리 과정 함수화: 재사용성을 위한 지혜
지금까지의 복잡한 과정을 하나의 함수로 만들어두면, 다른 데이터에도 쉽게 재사용할 수 있습니다. ✨
def data_cleaning(filename): """남산 도서관 장서 CSV 데이터 전처리 함수""" # (위에서 실행한 코드들을 함수 내에 정리) # ... return ns_book4
2. 잘못된 데이터 수정하기 (데이터의 품질 향상)
데이터를 삭제하는 것만으로는 부족합니다. 잘못 입력되거나 누락된 값을 올바르게 수정하고 채워 넣는 과정이 필요합니다.
2-1. 데이터프레임 정보 확인 및 NaN 처리
먼저 .info()로 데이터의 타입과 결측치(NaN) 현황을 파악합니다.
import pandas as pd ns_book4 = pd.read_csv('ns_book4.csv', low_memory=False) ns_book4.info()결측치는 fillna()나 replace()를 사용하여 특정 값으로 채울 수 있습니다.
fillna()는 NaN만 대상으로 하고, replace()는 NaN을 포함한 모든 값을 대상으로 치환할 수 있습니다.
# '부가기호' 컬럼의 NaN을 '없음'으로 채우기 ns_book4['부가기호'].fillna('없음', inplace=True) # '세트 ISBN' 컬럼의 NaN을 빈 문자열로 치환하기 set_isbn_na_rows = ns_book4['세트 ISBN'].isna() ns_book4.loc[set_isbn_na_rows, '세트 ISBN'] = ''2-2. 정규 표현식을 이용한 데이터 정제
'발행년도'처럼 일정한 패턴이 있지만 지저분한 문자열 데이터는 정규 표현식으로 깔끔하게 정제할 수 있습니다.
# 문자열 속에서 4자리 숫자(연도)만 추출하고 나머지는 버림 ns_book5 = ns_book4.replace({'발행년도': r'.*(\d{4}).*'}, r'\1', regex=True)2-3. 이상치(Outlier) 처리: 현실적인 데이터 만들기
데이터에는 상식적으로 불가능한 값, 즉 이상치가 존재할 수 있습니다.
예를 들어, 단군기원으로 표기된 연도(4000년 이상)나 너무 오래된 연도는 도메인 지식을 활용하여 수정하거나 제거해야 합니다.
# 4000년 이상인 연도(단군기원)는 2333을 빼서 서기로 변환 dangun_yy_rows = ns_book5['발행년도'].gt(4000) ns_book5.loc[dangun_yy_rows, '발행년도'] -= 2333 # 여전히 비정상적인 연도는 -1로 설정하여 '알 수 없음'으로 표시 dangun_year = ns_book5['발행년도'].gt(4000) ns_book5.loc[dangun_year, '발행년도'] = -12-4. 웹 스크래핑으로 누락 정보 채우기 (데이터 인리치먼트)
NaN이나 -1처럼 알 수 없는 값들은 웹 스크래핑을 통해 외부 소스에서 정보를 가져와 채울 수 있습니다!
이는 데이터를 더욱 풍부하게 만드는 데이터 인리치먼트(Data Enrichment) 과정입니다. ISBN 정보를 활용해 Yes24 웹사이트에서 누락된 도서명, 저자, 출판사, 발행년도를 가져오는 함수를 만듭니다.
import requests from bs4 import BeautifulSoup import re def get_book_info(row): # (ISBN으로 웹페이지 요청 후 BeautifulSoup으로 파싱하여 정보 추출) # ... return title, author, pub, year이 함수를 .apply()를 통해 누락된 정보가 있는 행에 일괄 적용합니다.
(※ 실제 적용 시 시간이 오래 걸릴 수 있습니다.)# 누락된 정보가 있는 행 식별 na_rows = ns_book5['도서명'].isna() | ns_book5['저자'].isna() \ | ns_book5['출판사'].isna() | ns_book5['발행년도'].eq(-1) # 함수를 적용하여 누락 정보 채우기 updated_sample = ns_book5[na_rows].head(2).apply(get_book_info, axis=1, result_type='expand') # update() 메서드로 기존 데이터프레임에 반영 ns_book5.update(updated_sample)2-5. 최종 정제 및 함수화
모든 수정이 끝난 후, 여전히 정보가 불완전한 행은 dropna()로 제거하여 최종적으로 깨끗한 데이터셋을 완성합니다. 이 모든 과정 또한 재사용을 위해 함수로 만들어 줍니다.
def data_fixing(ns_book4): """잘못된 값을 수정하거나 NaN 값을 채우는 함수""" # (위에서 실행한 수정 및 스크래핑 코드들을 함수 내에 정리) # ... return ns_book6
마치며: 깨끗한 데이터, 성공적인 분석의 초석
오늘은 Pandas를 활용하여 데이터를 정제하는 두 가지 큰 축,
불필요한 데이터 삭제와 잘못된 데이터 수정에 대해 깊이 있게 알아보았습니다.
.drop(), .duplicated(), .groupby() 같은 메서드로 데이터를 정리하고,
정규 표현식과 웹 스크래핑을 통해 데이터의 품질을 한 단계 끌어올리는 과정까지 실습했습니다.
데이터 클렌징은 고된 작업일 수 있지만, 분석의 정확성과 신뢰도를 결정하는 가장 중요한 첫걸음입니다.
이제 여러분은 어떤 데이터가 주어져도 자신 있게 분석 가능한 형태로 만들 수 있는 강력한 무기를 갖게 되었습니다.
오늘 배운 내용을 바탕으로 여러분만의 데이터 클렌징 파이프라인을 구축해 보세요!
코드 출처
https://colab.research.google.com/github/rickiepark/hg-da/blob/main/03-1.ipynb#scrollTo=7dcb407c
03-1.ipynb
Run, share, and edit Python notebooks
colab.research.google.com
https://colab.research.google.com/github/rickiepark/hg-da/blob/main/03-2.ipynb#scrollTo=7dcb407c
03-2.ipynb
Run, share, and edit Python notebooks
colab.research.google.com
강의 출처
https://www.youtube.com/watch?v=CE3_InvbmLY&list=PLVsNizTWUw7FGzSRCkQrPEEe-ljVXgS7k&index=7
'Study > Data Analysis' 카테고리의 다른 글
혼자 공부하는 데이터 분석 CH 06 복잡한 데이터 표현하기 (0) 2025.09.26 혼자 공부하는 데이터 분석 CH 05 데이터 시각화 (3) 2025.09.25 혼자 공부하는 데이터 분석 CH 04 통계와 분포 (0) 2025.09.24 혼자 공부하는 데이터 분석 CH 02 웹 스크래핑 (0) 2025.09.22 혼자 공부하는 데이터 분석 CH 01 데이터 분석 (0) 2025.09.21 - 슬라이싱 (loc): 필요한 열의 범위를 지정하여 선택합니다.