| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- 깃
- linux
- c
- 코리안챔버오케스트라
- 진입차수
- 악성코드 분석
- 프리코스
- 레나튜토리얼
- 예술의 전당
- 위상 정렬
- 루키즈31기
- 백엔드
- webhacking
- 서울청년문화패스
- Dreamhack
- 우아한테크코스
- 프랑스어 #프랑스어배우기 #프랑스어독학 #델프인강 #시원스쿨프랑스어 #delf독학 #델프 #프랑스어기초 #프랑스어공부
- SK쉴더스
- 동적분석
- 우테코
- React
- sk 쉴더스 루키즈
- 웹개발
- sk쉴더스 루키즈
- Practical Malware Analysis Labs
- SK쉴더스루키즈
- 알고리즘
- 애플리케이션 계층
- 자바
- 루키즈 31기
- Today
- Total
yon11b
[SK 쉴더스 루키즈] 파이썬 데이터 통계2 (전처리) 본문
전처리
데이터를 분석하거나 머신러닝 모델에 사용하기 전에 깨끗하고 유용한 상태로 준비하는 과정
데이터 수집 후,
- 비어 있는 값(누락된 값)
- 엉뚱한 값(오류)
- 필요 없는 값(중복)
이 있다면, 이를 수정하고 정리하는 과정
전처리 단계에서 특수문자와 HTML 태그를 제거하고 텍스트를 정리한다.
데이터 정제 과정에서 비정상적으로 높은 값을 제거하고 음수 값은 적절히 수정 또는 삭제
정형 데이터
행과 열로 구성되어 있는 잘 정리된 데이터(DB나 엑셀파일)
과정
수집(필요한 데이터를 모으는 단계)→정제(데이터를 깨끗하게 만드는 단계)→변환(데이터를 모델링에 적합하게 바꾸는 단계)→통합(여러 데이터를 하나로 합치는 단계)
- 형태 변환: 데이터를 사용 목적에 맞게 바꾸기
- 문자열 데이터를 숫자로 인코딩
- 남성→0
- 여성→1
- 문자열 데이터를 숫자로 인코딩
- 정규화: 데이터 범위를 일정하게 조정
- 가격 데이터를 0~1 사이로 변환하여 비교 가능하게 만듦
- 집계: 데이터를 요약하거나 그룹화
- 일별 데이터를 월별로 집계
- 차원 축소: 불필요한 데이터를 제거하여 데이터 크기를 줄임
- 머신러닝 모델에서 중요하지 않은 열 제거
데이터 통합
밑으로 붙이기 ⇒ pandas의 concat
- merge: 옆으로 붙이기 ⇒ sql의 join(연관 된 것들을 이어줌)
- 형식 통일
- 중복 제거
결측치: 데이터셋에서 특정 값이 누락된 상태
import pandas as pd
data={
'Name': ['Alice', 'Bob', None],
'Age': [25, None, 30],
'Score': [85, 90, None]
}
df=pd.DataFrame(data)
df.dropna(): 결측치가 있는 행을 삭제
df.dropna(axis=1): 결측치가 있는 열을 삭제
결측치를 특정 값으로 치환
1. 평균값으로 치환
df['Age'] = df['Age'].fillna(df['Age'].mean())
2. 중앙값으로 치환
df['Age'] = df['Age'].fillna(df['Age'].median())
3. 최빈값으로 치환
df['Score'] = df['Score'].fillna(df['Score'].mode())
결측치 처리
- 간단한 데이터 셋에서는 제거와 평균, 중간값 대체가 유용
- 하지만 복잡한 데이터에서는 ML 기반 대체를 활용 => 무슨 말???
이상치 처리
이상치: 데이터셋에서 다른 값들과 크게 동떨어져 있는 값
이상치는 분석 결과를 왜곡하거나 모델의 성능을 저하시킬 수 있으므로 적절히 처리해야 함
e.g. 학생의 평균 시험 점수가 70~90점 사이인데 한 학생이 150점을 받은 경우 이상치로 간주
IQR(Interquartile Range) 방법
데이터의 중간 50%를 포함하는 범위를 이용해 이상치를 탐지하는 방법
- 비대칭 분포 데이터에 적합
- 극단값에 영향을 덜 받음
4사분위로 나눠서 함.
Q1(1사분위수): 하위 25%의 값(0.25)
Q3(3사분위수): 상위 25%의 값(0.75)
IQR = Q3-Q1
작은 것보다 더 작으면 이상치 (Q1에서 1.5만큼 더 작으면)
큰 것보다 더 크면 이상치(Q3에서 1.5만큼 더 크면)
import pandas as pd
data = {
'score' : [70,75,80,85,90,150]
}
df = pd.DataFrame(data)
Q1 = df['score'].quantile(0.25) # 하위 25% 위치한 데이터
Q3 = df['score'].quantile(0.75) # 상위 25% 위치한 데이터
IQR = Q3-Q1
print(Q1, Q3, IQR)
# 이상치 데이터를 변경
df['score'] = df['score'].astype(float)
df.loc[df['score'] < low_, 'score'] = low_
df.loc[df['score'] > up_, 'score'] = up_
중복 데이터
데이터셋에서 동일한 행이 반복적으로 나타나는 것
중복 데이터가 있으면 분석 결과가 왜곡될 수 있다. 특히 데이터의 크기가 큰 경우 처리 속도와 메모리 사용량에 영향을 줄 수 있다.
- 완전 중복: 모든 열의 값이 동일한 행
- 부분 중복: 특정 열의 값만 동일한 행
data = {
'Name': ['Alice', 'Bob', 'Alice', 'Charlie', 'Bob'],
'Age': [25, 30, 25, 35, 30],
'Score': [85, 90, 85, 95, 90]
}
df = pd.DataFrame(data)
# df.duplicated() # 중복 찾기
df.duplicated().sum() # 2 => 중복된 행의 개수
중복된 행을 추출 (처음 나온 건 중복이 아니고 두번째 나온 얘부터 중복 처리를 해줌)
print(df[df.duplicated()])
중복된 행을 삭제
df_cleaned =df.drop_duplicates()
print(df_cleaned)
Name 열 기준으로 중복된 행을 제거
df_cleaned3 = df.drop_duplicates(subset=['Name'])
중복된 데이터는 다 삭제하기(keep=False) (원래는 두번째 것만 삭제함)
df_cleaned2 = df.drop_duplicates(keep=False)
'보안 > SK 쉴더스 루키즈' 카테고리의 다른 글
| [SK 쉴더스 루키즈] 머신러닝(지도학습, 회귀/분류 알고리즘) (0) | 2026.03.29 |
|---|---|
| [SK 쉴더스 루키즈] 파이썬 기초 5(상속, 모듈, 라이브러리, pandas, numpy) (0) | 2026.03.17 |
| [SK 쉴더스 루키즈] 파이썬 데이터 통계1 (크롤링, RDBMS) (0) | 2026.03.14 |
| [SK 쉴더스 루키즈] 파이썬 기초 4(함수, lambda, 파일입출력, 클래스) (0) | 2026.03.06 |
| [SK 쉴더스 루키즈] 파이썬 기초 3(조건문, 반복문) (0) | 2026.03.05 |
