본문 바로가기
IT 자격증/AICE Associate

AICE Associate - 데이터 전처리

by ootd_info 2024. 6. 19.
반응형

1. 결측치 처리

 1-1)  결측치 확인하기

df.isnull().sum()

df.info() #탐색적으로 결측치 유무 확인 가능

 

1-2)       데이터 확인하기 – 대체하려고 하는 값 확인용

#중앙값 
df[‘칼럼명’].median()

#최빈값
df[‘칼럼명’].mode()[0]

#평균값
df[‘칼럼명’].mean()

#최소값
df[‘칼럼명’].min()

#최대값
df[‘칼럼명’].max()

#합
df[‘칼럼명’].sum()

 

 

1-3)       결측치 채우기

#(값채우기
df.fillna(값)

#칼럼별 다른 값 채우기
df.fillna( {‘칼럼명1’: 값1, ‘칼럼명2’:값2} )

#특정 칼럼의 값 채우기
df[‘칼럼명’].fillna(대체할값, inplace = True)

#평균으로 채우기
df[‘칼럼명’].fillna( df[‘칼럼명’].mean(), inplace = True )

#최빈값 채우기
df['칼럼명'].fillna(df['칼럼명'].mode()[0], inplace=True)

#인접값채우기
df[‘칼럼명’].fillna(method =’ffill’)  #바로 위값으로 채워짐
df[‘칼럼명’].fillna(method =’bfill’)  #바로 아래값으로 채워짐

 

 

1-4)  결측지 제거하기 : dropna( )

  axis : 0(default)인 경우 행 제거, 1인 경우 열을 제거

  subset : 특정 열을 지정하여 해당 열의 결측치를 제거, 리스트 형태로 복수의 컬럼 조건 지정 가능

  tresh : 임계치를 주어 행에 해당 개수만큼 결측치가 있는 경우 제거

  inplace : 결측치를 제거한 상태를 바로 저장

df = df.dropna()

df= df.dropna(axis=1)   #결측치가 있는 컬럼(열)을 삭제

df = df.dropna(subset=[‘칼럼명’])   #특정 칼럼 중 결측치가 있는 경우에만 행삭제

df = df.dropna(subset=[‘칼럼명1’,’칼럼명2’,’칼럼명3’])

 

 

1-5)  컬럼(행)의 결측치가 n개 초과인 행만 삭제

df = df.dropna(thresh=6)

 

 

2. 이상치 처리

 2-1)  이상치 확인하기

df['컬럼명'].describe()

# 중앙값 계산
Q2 = df['컬럼명'].median()

# 하위 25%, 상위 25% 범위 계산
Q1 = df['컬럼명'].quantile(0.25)
Q3 = df['컬럼명'].quantile(0.75)

IQR = Q3 - Q1

 

 2-2)  이상치 판별

# 이상치 판별
df['IsOutlier_컬럼명'] = (df['컬럼명'] < Q1 - 1.5 * IQR) | (df['컬럼명'] > Q3 + 1.5 * IQR)

 

 2-3)  이상치 처리하기

# 이상치 삭제
df = df[df['IsOutlier_컬럼명'] == False]

  
# 이상치 대체 – 중앙값으로 변경
# df['IsOutlier_칼럼명']가 True인 row만 ‘칼럼명’ 칼럼에 df['칼럼명'].median()을 저장
 
df.loc[df['IsOutlier_칼럼명'], '칼럼명'] = df['칼럼명'].median()

 

3. 레이블 인코딩

 3-1)  범주형 데이터를 숫자로 변환하는 방법으로 각 범주에 고유한 숫자를 할당하는 방식

from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()

data['column'] = le.fit_transform(data['column'])

 

3-2) Pandas의 map() 함수를 사용하여 레이블 인코딩

# 'Occupation' 컬럼의 값들을 lable mapping
label_mapping = { "other" : 0 ,
                  "academic" : 1,
                  "artist" : 2,
                  "doctor" : 3,
		"farmer" : 4 }


# pandas replace() 메소드를 사용해서 값을 대체
df_le['Occupation_Map'] = df['Occupation'].map(label_mapping)

 

3-3) 더미 변수로 변경하기

# 'Occupation' 컬럼의 값들을 새칼럼으로 추가하고 True/False로 표기 함
# 예로 Occupation 값이 doctor, farmer, homemaker가 있었다면 새컬럼에 job_doctor, job_farmer, job_homemaker를 추가하고 Occupation이 doctor였던 row는 job_doctor에 TRUE로 표기됨
# 새로 생성된 컬럼의 이름 앞에는 접두사를 'job'으로 변경하고, 구분자를 '_'로 해줍니다.

df = pd.get_dummies(df, columns=['Occupation'], prefix='job_')

df.head(3)

 

4. 원핫 인코딩

df = pd.get_dummies(data=데이터, columns=['column_1', 'column_2'], drop_first=True)

 

5. X,Y데이터 분리

from sklearn.model_selection import train_test_split

# Label(y)
y = data['컬럼명']                       

# 나머지 컬럼
X = data.drop(['컬럼명'], axis=1)                                

#데이터를 7:3으로 나눌 경우 test_size를 0.3으로 표기
#만약 y가 이중 분류모델인 경우 stratify=y를 넣어야함
X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.3, stratify=y, random_state=42)

 

6. 데이터 정규분포화

from sklearn.preprocessing import StandardScaler

std = StandardScaler()

X_train = std.fit_transform(X_train)    # 훈련데이터셋 정규분포화

X_valid = std.transform(X_valid)        # 검증데이터셋 표준화

 

Min-Max Scaler

# 라이브러리 불러오기
from sklearn.preprocessing import MinMaxScaler
 
# MinMaxScaler 호출하기
min_max_scaler = MinMaxScaler()

X_train = min_max_scaler.fit_transform(X_train)
X_test = min_max_scaler.transform(X_test)


# 'Age', 'Rating' 컬럼의 데이터를 Min Max Scaling 하기
#df_normalized = min_max_scaler.fit_transform(df[['Age', 'Rating']])

#df_normalized

 

RobustScaler: 중앙값 0, 사분위수 IQR기준 정규화 [공식: (데이터값 – Q2) / (Q3-Q1) ]

from sklearn.preprocessing import RobustScaler

scaler = RobustScaler()

X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

 

기타-응용

# 'df' 의 컬럼 중 수치형 특성을 가진 컬럼을 선별하여 df_num에 저장하기
df_num = df.select_dtypes(include=['int64', 'float64'])

df_num.info()

# 스케일링 된 데이터를 기존의 데이터프레임 'df'에 적용
df_obj = df.drop(df.select_dtypes(include=['int64', 'float64']).columns, axis=1)

df = pd.concat([df_obj, df_normalized], axis=1)

 

to_categorical

from keras.utils import to_categorical

labels = [0, 1, 2, 1, 0]
one_hot_labels = to_categorical(labels, num_classes=3)

print(one_hot_labels)
[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]
 [0. 1. 0.]
 [1. 0. 0.]]
728x90

댓글