데이터 전처리

이번 포스팅에서는 데이터 분석 프로세스의 네 번째 단계인 데이터 전처리 에 대해서 알아 보겠습니다. 데이터 전처리는 데이터 분석 전 목적에 맞게 데이터를 깨끗하게 정제하는 과정입니다.

분석 데이터 로드

데이터 탐색 포스팅에서 사용한 데이터를 그대로 활용하겠습니다.

# 데이터 분석을 위해 필요한 라이브러리 임포트
import pandas as pd

# CSV 파일을 데이터프레임으로 로드
irisData = pd.read_csv('D:/iris.csv', index_col = 'Id')


데이터 전처리

데이터에 대한 대략적인 요약통계량 수치를 확인했습니다. 이제 본격적으로 데이터 전처리에 대해서 알아 보겠습니다. 일반적으로 수행하는 데이터 전처리는 아래와 같습니다.

  • 결측치 처리
  • 중복 처리
  • 데이터 유형 변환
  • 열 이름 바꾸기
  • 새 열 만들기
  • 이상치 처리


결측치 처리

.describe() 함수를 통해 데이터에 null 또는 누락된 값이 없다는 것을 확인했습니다. 누락된 값만 확인하려면, .describe() 함수 이외에 다음 코드를 사용할 수 있습니다.

# 데이터 세트에서 결측치 개수 확인하기
irisData.isnull().sum()
--------------------------------------------
Id               0
SepalLengthCm    0
SepalWidthCm     0
PetalLengthCm    0
PetalWidthCm     0
Species          0
dtype: int64

이 경우에는 모든 데이터에 가치가 모두 존재하기 때문에 아무것도 할 필요가 없으며 아래 단계를 건너뛸 수 있습니다. 그러나 데이터 세트에 값이 누락된 경우 다음 코드를 사용하여 영향을 받은 행을 자세히 살펴볼 수 있습니다.

# 어떤 열에 결측치가 존재하는지 검토하기
irisData.loc[irisData.isnull().any(axis=1)]
--------------------------------------------------------

Id	SepalLengthCm	SepalWidthCm	PetalLengthCm	PetalWidthCm	Species

결측치가 존재하지 않기 때문에 어떠한 행도 출력되지 않았습니다.


결측치 제거하기

결측치가 존재한다면, 결측치를 제거하거나 선택한 숫자로 누락된 값을 채워 해결할 수 있습니다.
결측치를 제거하려면 dropna() 함수를 사용합니다.

# 결측치가 존재하는 모든 행 제거하기
irisData = irisData.dropna()

이렇게 하면 누락된 값이 있는 모든 데이터 행을 제거합니다. 일반적으로 특정 열이나 행에 누락된 값이 많은 경우에 적합한 방법입니다.


결측치 채우기

fillna() 함수를 사용하여 결측치를 채울 수 있습니다. 결측치를 채우는 방법은 여러 가지가 있습니다.

결측치를 재우는 방법은 매우 다양합니다. 여기서는 일반적인 방법에 대해서 알아보겠습니다. 결측값을 채우는 가장 일반적인 방법 중 하나는 각 열의 평균값을 사용하는 것입니다.

# 누락된 값이 있는 행을 각 열의 평균값으로 채우기  
irisData = irisData.fillna(irisData.mean())


중복 처리

결측치를 처리한 후에는 중복된 값이 있는지 확인합니다. 중복 값은 데이터 세트의 모든 열에 대해 동일한 데이터 값을 갖는 데이터 행을 의미합니다. 제거하는 과정에서 데이터 왜곡이 발생할 가능성이 있으므로 피해야 합니다.

중복된 값을 처리하기 위해 아래와 같이 수행할 수 있습니다. 중복된 값의 규모 및 수준을 이해하려면 중복된 항목의 수를 세어봐야 합니다.

# 중복값 계산하기
irisData.duplicated().sum()
-------------------------------
3

영향을 받은 행을 검사하여 중복 값이 실제로 중복인지 또는 다른 설명이 있는지 확인합니다.

irisData.loc[irisData.duplicated()]
------------------------------------------------------------------------------------
    SepalLengthCm	SepalWidthCm	PetalLengthCm	PetalWidthCm	Species
Id					
35	4.9            	3.1            	1.5           	0.1           	Iris-setosa
38	4.9            	3.1           	1.5           	0.1           	Iris-setosa
143	5.8            	2.7           	5.1           	1.9           	Iris-virginica

데이터에 대한 지식을 바탕으로 값을 삭제해야 한다면 중복 값을 삭제해야 합니다. 여기에서 데이터에 대한 도메인 지식이 많은 도움이 됩니다.

붓꽃 데이터에서는 (i) 값이 많지 않고 (ii) 꽃이 동일한 특성을 가질 수 있으므로 중복 값을 삭제하지 않는 것이 좋습니다. 즉, 키와 몸무게가 같은 여러 사람이 있는 것과 같습니다.

만약, 중복 값을 삭제하고 싶다면, 아래 코드를 사용하시면 됩니다.

# 중복 값 삭제
irisData.drop_duplicates(inplace=True)


데이터 유형 변환

데이터 전처리 과정에서 가끔씩 일부 열의 데이터 유형을 변환해야 할 수도 있습니다. 어떤 데이터 유형을 가지고 있는지 확인하려면 info() 함수를 사용하시면 됩니다.

# 데이터 열의 유형 체크하기
irisData.info()
-----------------------------------------
<class 'pandas.core.frame.DataFrame'>
Int64Index: 150 entries, 1 to 150
Data columns (total 5 columns):
 #   Column         Non-Null Count  Dtype  
---  ------         --------------  -----  
 0   SepalLengthCm  150 non-null    float64
 1   SepalWidthCm   150 non-null    float64
 2   PetalLengthCm  150 non-null    float64
 3   PetalWidthCm   150 non-null    float64
 4   Species        150 non-null    object 
dtypes: float64(4), object(1)
memory usage: 7.0+ KB

붓꽃 데이터의 경우 데이터 유형(Dtype)에 큰 문제가 없어 보입니다.

  • 수치 데이터에 소수점이 있으므로 숫자 값은 부동 소수점(float64)입니다. 이는 매우 적합한 데이터 유형입니다.
  • Species 열은 일반적으로 텍스트 기반 데이터에 사용되는 개체(object)입니다.

열의 데이터 유형을 변경하려면 아래와 같이 astype() 함수를 사용할 수 있습니다.

아래 코드는 “SepalLengthCm” 라는 새로운 열을 생성합니다(또는 “sepal length” 라는 기존 열이 있으면 덮어씁니다). 이 새 열의 값은 “SepalLengthCm“라는 현재 열을 사용하지만 값은 float 데이터 유형으로 사용됩니다.”

# 열의 데이터 유형 변환하기
irisData['SepalLengthCm'] = irisData['SepalLengthCm'].astype(float)



열이름 바꾸기

때에 따라서는 데이터의 열이름을 변경해야 하는 상황을 고려해야 합니다. 열 이름을 바꾸려면 아래코드를 참고하면 됩니다.

# 데이터 열이름 바꾸기

irisData.rename(columns = {'기존데이터열이름': '신규데이터열이름'}, inplace=True)

가장 일반적인 방법은 데이터 열 이름을 소문자로 지정하고, 단어가 여러 개인 경우 각 단어를 밑줄로 연결하는 것입니다. (Ex. sepal_length)


데이터 변환

데이터 분석 목적에 따라 범주형 변수 인코딩, 수치형 변수의 크기 조정, 새로운 변수 생성 등 다양한 데이터 변환을 수행해야 할 수도 있습니다. 붓꽃 데이터에서는 데이터 변환을 수행할 필요가 없습니다. 만약, ‘sepal_length’ 와 ‘petal_length’의 갑을 합하여 새로운 변수 ‘sum_lengths’라는 새 열을 생성하고자 한다면, 아래의 코드를 이용할 수 있습니다.

# 새로운 열 'sumLengths' 생성
## 'sepal_length' + 'petal_length'

irisData['sumLengths'] = irisData['sepal_length'] + irisData['petal_length']

그런 다음 head() 함수를 사용하여 새로 생성한 열을 확인할 수 있습니다.

irisData.head()
--------------------------------------
	SepalLengthCm	SepalWidthCm	PetalLengthCm	PetalWidthCm	Species	sumLengths
Id						
1	5.1         	3.5         	1.4         	0.2         	Iris-setosa	6.5
2	4.9         	3.0         	1.4         	0.2         	Iris-setosa	6.3
3	4.7         	3.2         	1.3         	0.2         	Iris-setosa	6.0
4	4.6         	3.1         	1.5         	0.2         	Iris-setosa	6.1
5	5.0         	3.6         	1.4         	0.2         	Iris-setosa	6.4


이상값 감지 및 처리

마지막으로 데이터 세트에 있을 수 있는 이상값을 확인합니다. 데이터 세트의 이상값은 대부분의 다른 데이터 포인트에서 크게 벗어나는 데이터 포인트 또는 관측값입니다.

이는 데이터세트의 일반적인 패턴이나 분포와는 비정상적으로 극단적이거나 다른 데이터 값입니다. 이상값은 결과에 큰 영향을 미칠 수 있습니다.

이상치를 탐지하는 한 가지 방법은 “z-score”와 같은 통계적 방법을 사용하는 것입니다.

# 'sepal_length' 열의 z-score 생성하기

from scipy import stats

zScores = stats.zscore(irisData['SepalLengthCm'])

# z-scores 출력
zScores
------------------------------------------------------------------------------------
Id
1     -0.900681
2     -1.143017
3     -1.385353
4     -1.506521
5     -1.021849
         ...   
146    1.038005
147    0.553333
148    0.795669
149    0.432165
150    0.068662
Name: SepalLengthCm, Length: 150, dtype: float64
# 3보다 큰 z-score 존재여부 확인

irisData[zScores > 3]
------------------------------------------------------------------------------------

SepalLengthCm	SepalWidthCm	PetalLengthCm	PetalWidthCm	Species	sumLengths
Id						

붓꽃 데이터에는 z-score수가 3 이상인 행이 없습니다. 만약, 존재한다면, 다음 코드를 실행하여 제거할 수 있습니다.

# z-score가 3보다 큰 데이터 제거하기

irisData= irisData[(zScores < 3)]


전처리 완료된 데이터세트 저장

데이터 전처리이후 작업한 내용을 반드시 저장해야 합니다. 정리된 데이터를 저장할 새로운 파일을 생성할 수 있습니다.

# 전처리 완료된 데이터를 컴퓨터 D드라이브에 CSV 파일로 저장하기

irisData.to_csv('D:/cleaned_iris.csv', index=False)


결론

붓꽃 데이터를 가이드로 사용하여 Python 및 Pandas를 사용한 데이터 전처리에 대해 알아보았습니다. 다음 포스팅에서는 전처리된 데이터를 시각화하여 패턴과 통찰력을 찾는 방법에 대해서 알아보겠습니다.

감사합니다.


답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다