5단 분석법
순서 | 분석 | 단어 | 내용 |
1 | 일반 명사 | 데이터 | 자료,
문자, 숫자, 소리, 그림, 영상, 단어 등의 형태로 된 의미 단위 |
전처리 | 다루기 쉬운 형태로 변환시키는 과정 | ||
데이터
전처리 | 자료를 다루기 쉬운 형태로 변환시키는 과정 | ||
2 | 고유 명사 | 데이터
전처리 | 데이터를 분석하기 전에 데이터를 조작, 필터링 또는 변환하여 분석에 적합하게 만드는 과정 |
3 | 사용 이유 | 데이터
전처리 | 모델의 성능을 향상시키고, 신뢰할 수 있는 예측을 위해 데이터를 정리하고, 결측값 처리, 이상치 제거, 스케일링 등의 작업을 통해 데이터를 최적화하기 위해서 |
4 | 사용 방법 | 데이터
전처리 | 1. 데이터 수집
2. 결측값 처리
3. 이상치 제거
4. 데이터 정규화
5. 데이터 변환
6. 데이터 분할 |
5 | 다른 기술과의 비교 | 데이터
전처리 | - |
정의
일반 명사
데이터 | 자료,
문자, 숫자, 소리, 그림, 영상, 단어 등의 형태로 된 의미 단위 |
전처리 | 다루기 쉬운 형태로 변환시키는 과정 |
데이터
전처리 | 자료를 다루기 쉬운 형태로 변환시키는 과정 |
데이터는 자료 즉, 문자, 숫자, 소리, 그림, 영상, 단어 등의 형태로 된 의미 단위를 말합니다.
전처리는 다루기 쉬운 형태로 변환시키는 과정을 뜻합니다.
데이터 전처리라는 단어는, 자료를 다루기 쉬운 형태로 변환시키는 과정이라고 생각해 볼 수 있습니다.
정말 그런지, 고유 명사를 한 번 살펴볼까요?
고유 명사
데이터
전처리 | 데이터를 분석하기 전에 데이터를 조작, 필터링 또는 변환하여 분석에 적합하게 만드는 과정 |
데이터 전처리는 데이터를 분석하기 전에 데이터를 조작, 필터링 또는 변환하여 분석에 적합하게 만드는 과정입니다.
데이터 전처리 과정에는 결측값 처리, 이상치 제거, 데이터 정규화, 데이터 변환, 데이터 분할 등이 있습니다.
작업 | 설명 | 해야하는 이유 |
결측값 처리
(Missing Value) | 누락된 데이터를 식별하고 적절한 값으로 대체 | 1. 데이터 수집 과정의 오류
2. 응답자의 누락
3. 데이터 통합 문제
4. 의도적인 누락 (개인정보 등)
5. 시간적 이유 (특정시간대 누락) |
이상치 제거 | 데이터 내 비정상적인 값들을 식별하고 제거 | 1. 데이터 입력 오류
2. 계측기기 오류
3. 특정 이벤트나 상황 |
데이터 정규화 | 데이터값을 일정한 범위로 변환하여 모델의 학습을 용이하게 함
보통 0과 1 사이로 변환하는 것이 일반적 | 1. 데이터 일관성 (데이터 비교를 위해)
2. 알고리즘 성능 |
데이터 변환 | 데이터를 로그 변환, 원-핫 인코딩 등으로 변환 | 1. 정규 분포화
2. 분산 축소
3. 비선형 관계 |
데이터 분할 | 데이터 분할은 주어진 데이터를 학습, 검증, 테스트 세트로 나누는 과정 | 1. 과적합 방지
2. 하이퍼파라미터 튜닝 |
원-핫 인코딩이 무엇인가요?
원-핫 인코딩은 범주형 데이터를 이진 벡터*로 변환하는 기법입니다.
각 범주형 값은 해당 범주를 나타내는 이진 값이 1이고 나머지는 0인 벡터로 변환됩니다.
•
원 (One): 각 범주형 데이터가 벡터에서 하나의 요소만 1(Hot)로 표시된다는 의미입니다.
•
핫 (Hot): 1로 표시된 요소를 의미합니다. 즉, "핫"은 켜져 있다는 뜻으로, 활성화된 상태를 나타냅니다.
•
인코딩 (Encoding): 데이터를 변환하는 과정입니다.
* 이진 벡터란? 이진법으로만 이루어진 벡터
사용이유는 아래에서 후술
이미지는 전처리할 때 어떤 과정을 겪나요?
무조건은 아니지만, 일반적으로 이미지 데이터를 벡터로 변환합니다.
그 이유로는 아래 두 가지와 같습니다.
•
머신 러닝 모델에 입력하기 위해: 대부분의 머신 러닝 알고리즘은 벡터 형태의 입력을 필요로 합니다. 이미지 데이터를 벡터로 변환하면 모델이 이미지를 이해하고 처리할 수 있게 됩니다.
•
특징 추출을 위해: 이미지의 주요 특징을 벡터 형태로 표현하면, 모델이 이미지의 중요한 정보를 학습할 수 있습니다.
사용 이유
데이터
전처리 | 모델의 성능을 향상시키고, 신뢰할 수 있는 예측을 위해 데이터를 정리하고, 결측값 처리, 이상치 제거, 스케일링 등의 작업을 통해 데이터를 최적화하기 위해서 |
즉, 사용 이유는 데이터의 품질을 높여 분석 및 머신러닝 모델의 성능을 향상시키기 위함입니다.
이유 | 설명 |
모델 성능 향상 | 데이터 전처리를 통해 모델의 예측력과 성능을 높일 수 있습니다. |
신뢰성 있는 예측 | 결측값 처리와 이상치 제거를 통해 데이터의 신뢰성을 높입니다. |
데이터 최적화 | 스케일링, 정규화, 변환 등을 통해 데이터를 모델이 잘 이해하고 처리할 수 있게 최적화합니다. |
결측값 처리가 무엇인가요?
"결측값"을 한자로 표현하면 "缺測值"입니다.
•
"결" (缺): 부족할 결
•
"측" (測): 측정할 측
•
"값" (值): 값 치
그래서 결측값 처리란 데이터 내에 빠진 값이나 누락된 값(Missing Value)을 식별하고 이를 적절한 방법으로 대체하거나 제거하는 과정을 말합니다.
결측값은 다양한 이유로 발생할 수 있는데, 예를 들어 데이터 수집 과정의 오류, 응답자의 누락, 데이터 통합 문제, 의도적인 누락(개인정보 등), 시간적 이유(특정시간대 누락) 등이 있습니다. 결측값 처리는 데이터의 품질을 높이고, 신뢰성 있는 분석 결과를 도출하기 위해 필요합니다.
이상치 제거가 무엇인가요?
이상치 제거란 데이터 내에서 정상 범위를 벗어나는 값을 찾아내어 제거하는 과정을 의미합니다.
이상치는 데이터 입력 오류, 계측기기의 오류, 특정 이벤트나 상황 등 다양한 이유로 발생할 수 있습니다.
이상치는 데이터 분석의 정확도를 왜곡시킬 수 있으므로, 데이터 전처리 과정에서 이를 식별하고 제거하는 것이 중요합니다.
스케일링이 무엇인가요?
스케일링은 다양한 수치 데이터가 있을 때 이를 비교, 분석하기 쉽도록 동일한 범위 또는 척도로 변환하는 과정을 의미합니다.
예를 들어, 한 변수의 범위가 0~1이고 다른 변수의 범위가 0~1000000인 경우, 이 두 변수를 동일한 척도로 비교하기 어렵습니다. 이럴 때 스케일링을 통해 두 변수의 범위를 동일하게 맞춰줄 수 있습니다. 일반적으로 스케일링은 데이터를 표준화(평균 0, 표준편차 1인 분포로 변환)하거나 정규화(특정 범위, 예를 들어 0~1 사이로 변환)하는 방법이 있습니다. 이러한 스케일링은 머신러닝 모델의 성능 향상에 중요한 역할을 합니다.
graph LR A[원본 데이터] --> B{스케일링 방법} B -->|표준화| C[표준화 과정] B -->|정규화| D[정규화 과정] C --> E[평균 = 0, 표준편차 = 1] C --> F["(x - 평균) / 표준편차"] D --> G[특정 범위로 변환 ex 0~1] D --> H["(x - min) / (max - min)"] E --> I[표준화된 데이터] F --> I G --> J[정규화된 데이터] H --> J I --> K[스케일링된 데이터] J --> K style A fill:#f9f,stroke:#333,stroke-width:2px style B fill:#bbf,stroke:#333,stroke-width:2px style C fill:#dfd,stroke:#333,stroke-width:2px style D fill:#dfd,stroke:#333,stroke-width:2px style E fill:#afa,stroke:#333,stroke-width:2px style F fill:#afa,stroke:#333,stroke-width:2px style G fill:#fda,stroke:#333,stroke-width:2px style H fill:#fda,stroke:#333,stroke-width:2px style I fill:#aff,stroke:#333,stroke-width:2px style J fill:#aff,stroke:#333,stroke-width:2px style K fill:#f9f,stroke:#333,stroke-width:2px
Mermaid
복사
•
정규분포의 특징
◦
평균을 중심으로 대칭적입니다.
◦
σ는 데이터의 분산 정도를 나타내는 척도입니다. 표준편차가 1이라는 것은 데이터 값들이 평균으로부터 얼마나 떨어져 있는지를 나타내며, 이 값이 1일 때는 데이터 값들이 평균으로부터 평균적으로 1 단위 정도 떨어져 있다는 것을 의미합니다.
•
±1 표준편차 안에 전체 데이터의 약 68.2%가 포함되어 있습니다.
•
±2 표준편차 안에는 약 95.4%, ±3 표준편차 안에는 약 99.7%의 데이터가 포함되어 있습니다.
사용 방법
데이터
전처리 | 1. 데이터 수집
2. 결측값 처리
3. 이상치 제거
4. 데이터 정규화
5. 데이터 변환
6. 데이터 분할 |
1. 데이터 수집
다양한 소스로부터 데이터를 수집합니다.
import pandas as pd
# 가상의 직원 급여 데이터 생성
data = { # 딕셔너리
'직원': ['John', 'Anna', 'Peter', 'Linda', 'James'],
'연봉': [50000, 60000, 55000, None, 65000],
'근속연수': [5, 7, None, 8, 9]
}
df = pd.DataFrame(data) #DataFrame은 테이블 형식의 데이터를 다루는 pandas의 핵심 데이터 구조
print("원본 데이터셋:")
print(df)
Python
복사
2. 결측값 처리
누락된 데이터를 제거하거나 대체합니다.
fillna():
•
정의: fillna()는 pandas에서 결측값(NaN)을 특정 값으로 대체하는 메서드입니다.
◦
형식
df['행컬럼명'].fillna(결측값을 대체할 값, 옵션값)
Python
복사
◦
코드
df['연봉'].fillna(55000, inplace=True)
Python
복사
▪
value: 결측값을 대체할 값. 이 값으로 결측값을 채웁니다.
▪
inplace (기본값은 False): True로 설정하면 원본 데이터프레임을 직접 수정합니다. False로 설정하면 수정된 복사본을 반환합니다.
•
예시
# 결측값 처리 (중앙값으로 대체)
df['연봉'].fillna(df['연봉'].median(), inplace=True)
df['근속연수'].fillna(df['근속연수'].median(), inplace=True)
print("\n결측값 처리 후 데이터셋:")
print(df)
Python
복사
•
결과값
원본 데이터셋:
직원 연봉 근속연수
0 John 50000.0 5.0
1 Anna 60000.0 7.0
2 Peter 55000.0 NaN
3 Linda NaN 8.0
4 James 65000.0 9.0
결측값 처리 후 데이터셋:
직원 연봉 근속연수
0 John 50000.0 5.0
1 Anna 60000.0 7.0
2 Peter 55000.0 7.5
3 Linda 57500.0 8.0
4 James 65000.0 9.0
JavaScript
복사
median()이 뭐예요?
•
정의: median()은 데이터프레임의 열에 대한 중앙값을 계산하는 메서드입니다. 중앙값은 데이터를 오름차순으로 정렬했을 때 중앙에 위치한 값입니다.
•
사용법:
median_salary = df['연봉'].median()
Python
복사
◦
반환 값: 지정된 열의 중앙값을 반환합니다. 만약 데이터가 짝수 개라면 중간에 있는 두 값의 평균을 반환합니다.
3. 이상치 제거
비정상적인 데이터를 식별하고 제거합니다.
df[]:
•
정의: df[]는 pandas 데이터프레임에서 특정 열을 선택하거나 필터링하는 데 사용되는 방법입니다.
•
사용법:
salaries = df['연봉']
Python
복사
◦
열 선택: df['열 이름'] 형식으로 특정 열을 선택할 수 있습니다.
◦
필터링: df[조건] 형식으로 조건에 맞는 행을 필터링할 수 있습니다.
# 이상치 제거 (연봉이 0 이하인 경우 제거)
salaries = df[df['연봉'] > 0]
print("\n이상치 제거 후 데이터셋:")
print(salaries)
Python
복사
4. 데이터 정규화
데이터를 일정한 범위로 스케일링하여 모델 학습을 용이하게 합니다.
fit_transform():
•
정의: fit_transform()은 scikit-learn에서 데이터를 학습(fit)하고, 변환(transform)하여 데이터의 스케일을 조정하는 메서드입니다.
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaled_data = scaler.fit_transform(df[['연봉', '근속연수']])
df[['연봉', '근속연수']] = scaled_data
Python
복사
•
fit(): 데이터를 학습하여, 변환에 필요한 내부 파라미터(예: 최소값과 최대값)를 계산합니다.
•
transform(): 학습된 파라미터를 사용하여 데이터를 변환합니다.
•
결과: 원본 데이터를 학습하여 필요한 파라미터를 계산한 후, 해당 파라미터를 사용하여 데이터를 변환한 결과를 반환합니다.
◦
scaler.fit_transform(df[['연봉', '근속연수']])의 결과값
연봉 근속연수
0 0.000000 0.000
1 0.666667 0.500
2 0.333333 0.625
3 0.500000 0.750
4 1.000000 1.000
Plain Text
복사
from sklearn.preprocessing import MinMaxScaler
# 데이터 정규화 (0과 1 사이 값으로 스케일링)
scaler = MinMaxScaler() # MinMaxScaler()는 주어진 데이터의 최소값과 최대값을 기반으로 각 값을 0과 1 사이로 변환하는 역할
df[['연봉', '근속연수']] = scaler.fit_transform(df[['연봉', '근속연수']])
print("\n데이터 정규화 후 데이터셋:")
print(df)
Python
복사
•
결과값
원본 데이터셋:
직원 연봉 근속연수
0 John 50000.0 5.0
1 Anna 60000.0 7.0
2 Peter 55000.0 7.5
3 Linda 57500.0 8.0
4 James 65000.0 9.0
데이터 정규화 후 데이터셋:
직원 연봉 근속연수
0 John 0.000000 0.000
1 Anna 0.666667 0.500
2 Peter 0.333333 0.625
3 Linda 0.500000 0.750
4 James 1.000000 1.000
JavaScript
복사
5. 데이터 변환
필요한 경우 데이터를 로그 변환, 원-핫 인코딩 등으로 변환합니다.
원-핫 인코딩
•
pd.get_dummies(df, columns=['직원']): '직원' 열을 원-핫 인코딩하여 각 직원 이름을 새로운 이진 열로 변환합니다.
•
columns=['직원']: 원-핫 인코딩할 열을 지정합니다. 여기서는 '직원' 열을 지정합니다.
•
반환된 데이터프레임에는 '직원' 열이 제거되고, 각 직원 이름에 해당하는 새로운 열이 추가됩니다. 각 열의 값은 해당 직원일 경우 1, 아니면 0으로 표시됩니다.
import pandas as pd
# 예제: 원-핫 인코딩 (직원 이름을 카테고리 변수로 변환)
df = pd.get_dummies(df, columns=['직원'])
print("\n데이터 변환 후 데이터셋:")
print(df)
Python
복사
•
결과
데이터 변환 후 데이터셋:
연봉 근속연수 직원_Anna 직원_James 직원_John 직원_Linda 직원_Peter
0 0.000000 0.000 False False True False False
1 0.666667 0.500 True False False False False
2 0.333333 0.625 False False False False True
3 0.500000 0.750 False False False True False
4 1.000000 1.000 False True False False False
JavaScript
복사
원-핫 인코딩을 하는 이유가 무엇인가요?
한줄로 설명하자면, 숫자형 인덱스는 머신 러닝이 이해를 못하기 때문에 변환을 해줘야 합니다.
이 데이터는 사람이 읽기에는 쉽지만, 머신 러닝 모델에게는 문제가 있습니다. 모델은 수치 데이터를 이해합니다.
"John"이나 "Anna" 같은 문자열을 직접 사용하면 모델이 이 정보를 처리할 수 없습니다. 그래서 범주형 데이터를 수치형 데이터로 변환할 필요가 있습니다.
0 John
1 Anna
2 Peter
3 Linda
4 James
JavaScript
복사
숫자로 변환하는 방법 중 하나는 각 범주를 숫자로 매핑하는 것입니다.
예를 들어:
•
John = 0
•
Anna = 1
•
Peter = 2
•
Linda = 3
•
James = 4
이 방법은 순서 정보가 필요 없을 때 잘못된 결과를 초래할 수 있습니다. 모델은 이 숫자들 간에 크기나 순서 관계가 있다고 잘못 해석할 수 있습니다.
예를 들어, 모델은 "John"이 "Anna"보다 작고, "Peter"보다 더 작다고 생각할 수 있습니다.
원-핫 인코딩은 이러한 문제를 해결합니다.
각 범주를 고유한 이진 벡터로 변환하여 모델이 이 범주를 개별적이고 독립적인 것으로 인식하도록 만듭니다.
6. 데이터 분할
데이터를 학습용과 검증용으로 나눕니다.
from sklearn.model_selection import train_test_split
# 데이터 분할 (학습용 80%, 검증용 20%)
train, test = train_test_split(df, test_size=0.2, random_state=42)
print("\n학습용 데이터셋:")
print(train)
print("\n검증용 데이터셋:")
print(test)
Python
복사
•
데이터 분할:
◦
train_test_split(df, test_size=0.2, random_state=42): 데이터프레임 df를 학습용 데이터셋과 검증용 데이터셋으로 분할합니다.
◦
test_size=0.2: 데이터의 20%를 검증용 데이터셋으로 할당하고, 나머지 80%를 학습용 데이터셋으로 할당합니다.
◦
random_state=42: 난수 발생기의 시드를 설정하여, 분할을 재현 가능하게 합니다. 동일한 random_state를 사용하면 언제나 같은 결과를 얻을 수 있습니다.
학습용 데이터셋:
연봉 근속연수 직원_Anna 직원_James 직원_John 직원_Linda 직원_Peter
4 1.000000 1.000 False True False False False
2 0.333333 0.625 False False False False True
0 0.000000 0.000 False False True False False
3 0.500000 0.750 False False False True False
검증용 데이터셋:
연봉 근속연수 직원_Anna 직원_James 직원_John 직원_Linda 직원_Peter
1 0.666667 0.5 True False False False False
JSON
복사
Google Colab
미니퀘스트
numpy가 무엇인가요?
NumPy는 Python에서 다차원 배열을 처리하는 라이브러리입니다.
. NumPy는 파이썬에서 수치 데이터를 처리하고 계산하는 데 매우 유용한 라이브러리입니다. 특히, 다차원 배열 객체인 ndarray를 제공하며, 수학적 함수, 난수 생성, 선형 대수 등의 기능을 포함하고 있습니다.
np.nan이란?
np.nan은 NumPy에서 제공하는 특수한 값으로, "Not a Number"를 의미합니다. 이는 데이터셋에서 결측값(missing value)을 나타내기 위해 자주 사용됩니다. 결측값은 데이터가 누락되었거나 유효하지 않을 때 발생합니다.
1번 미니퀘스트 - 데이터 전처리 실습
간단한 데이터셋을 사용하여 데이터 전처리 과정을 단계별로 실습합니다.
각 단계에서 필요한 코드를 작성하고, 그 결과를 확인합니다.
데이터셋
•
가상의 학생 성적 데이터
•
예시데이터
# 가상의 데이터셋 생성
data = {
'학생': ['A', 'B', 'C', 'D', 'E'],
'수학': [90, np.nan, 85, 88, np.nan],
'영어': [80, 78, np.nan, 90, 85],
'과학': [np.nan, 89, 85, 92, 80]
}
Python
복사
문제 설명
1.
데이터 수집
•
가상의 학생 성적 데이터를 생성합니다.
2.
결측값 처리
•
데이터셋에 누락된 값이 있을 때, 이를 평균값으로 대체합니다.
3.
이상치 제거
•
데이터셋에 이상치가 없는지 확인하고, 필요하면 제거합니다.
4.
데이터 정규화
•
수학, 영어, 과학 점수를 0과 1 사이의 값으로 스케일링합니다.
5.
데이터 분할
•
데이터셋을 학습용과 검증용으로 나눕니다.
정답
2번 미니퀘스트 - 데이터 전처리 과정 구현하기
가상의 데이터셋을 사용하여 전처리 과정을 직접 구현해 봅니다
각 단계에 맞춰 코드를 작성하고, 최종적으로 학습용과 검증용 데이터로 나누는 작업을 합니다.
데이터셋
•
가상의 제품 판매 데이터
문제
1.
결측값을 중앙값으로 대체합니다.
2.
이상치를 제거합니다. (예: 가격이 0 이하인 경우)
3.
데이터를 표준화합니다. (평균 0, 표준편차 1)
4.
데이터를 학습용과 검증용으로 나눕니다. (학습용 70%, 검증용 30%)
문제 설명
1.
데이터 수집
•
가상의 제품 판매 데이터를 생성합니다.
•
예시데이터
# 가상의 데이터셋 생성
data = {
'제품': ['A', 'B', 'C', 'D', 'E'],
'가격': [100, 150, 200, 0, 250],
'판매량': [30, 45, np.nan, 55, 60]
}
Python
복사
2.
결측값 처리
•
데이터셋에 누락된 값이 있을 때, 이를 중앙값으로 대체합니다.
3.
이상치 제거
•
가격이 0 이하인 데이터를 제거합니다.
4.
데이터 표준화
•
가격과 판매량 데이터를 평균 0, 표준편차 1로 변환합니다.
5.
데이터 분할
•
데이터셋을 학습용과 검증용으로 나눕니다.
정답
정답, 코랩으로 보기
ⓒ 2024 startupcode. 모든 권리 보유. 무단 복제 금지.