[데이터 전처리] 결측치
Y
Yerim
- ML
- DataAnalysis
import pandas as pd
import numpy as np
from sklearn.datasets import fetch_california_housing
# 데이터셋 불러오기
california = fetch_california_housing()
X, y = california.data, california.target
# 결측치를 추가할 특성 선택
np.random.seed(42)
missing_percentage = 0.1 # 결측치 비율
n_missing_samples = int(missing_percentage * X.shape[0])
missing_samples = np.random.choice(X.shape[0], n_missing_samples, replace=False)
missing_features = np.random.choice(X.shape[1], n_missing_samples, replace=True)
# 결측치 추가
X_with_missing = X.copy()
X_with_missing[missing_samples, missing_features] = np.nan
# 데이터프레임 만들기
df = pd.DataFrame(X_with_missing, columns=california.feature_names)
df['target'] = y
df.head()DataFrame.isna() # 결측치 True/False 반환
DataFrame.isna().sum() # 열별 결측치 개수import missingno as msno
import matplotlib.pyplot as plt
%matplotlib inline
msno.bar(df)# matrix
import missingno as msno
import matplotlib.pyplot as plt
%matplotlib inline
msno.matrix(df)# heatmap
import missingno as msno
import matplotlib.pyplot as plt
%matplotlib inline
msno.heatmap(df)# dendrogram
import missingno as msno
import matplotlib.pyplot as plt
%matplotlib inline
msno.dendrogram(df)import seaborn as sns
sns.heatmap(df.isnull(), cbar=False)DataFrame.dropna(*, axis=0, how=_NoDefault.no_default,
thresh=_NoDefault.no_default, subset=None, inplace=False, ignore_index=False)# 결측치가 존재하는 행을 모두 제거
df.dropna(axis=0, how='any') # index 20640 rows -> 18576 rows
# 결측치가 존재하는 열을 모두 제거
df.dropna(axis=1, how='any') # column은 target만 남음DataFrame.fillna(value=None, *, method=None, axis=None,
inplace=False, limit=None, downcast=_NoDefault.no_default)df['Latitude'].plot()df['Latitude'].fillna(df['Latitude'].median()).plot()df['Latitude'].fillna(df['Latitude'].mean()).plot()df['Latitude'].fillna(method='ffill').plot()df['Latitude'].fillna(method='bfill').plot()DataFrame.interpolate(method='linear', , axis=0, limit=None,
inplace=False, limit_direction=None, limit_area=None,
downcast=_NoDefault.no_default, *kwargs)df['Latitude'].interpolate(method='linear').plot()df['Latitude'].interpolate(method='slinear').plot()df['Latitude'].interpolate(method='cubic').plot()df['Latitude'].interpolate(method='spline', order=2).plot()sklearn.impute.SimpleImputer(*, missing_values=nan, strategy='mean',
fill_value=None, copy=True, add_indicator=False, keep_empty_features=False)missing_values | int, float, str, np.nan(default), None or pandas.NA | 결측값을 나타내는 데이터 타입 또는 값 |
strategy | str, default=’mean’ ’mean’: 평균 ‘median’: 중앙값 ‘most_frequent’: 최빈값 ‘constant’: 고정값 | 결측값 대체 방법 선택 |
fill_value | str or numerical value, default = None | strategy가 constant일 때 채울 값 |
copy | bool, default=True | 입력 데이터(X)의 복사본 생성 여부 |
add_indicator | bool, default=False | 대체된 결측값을 나타내는 지표 추가 여부 |
keep_empty_features | bool, default=False | 입력 데이터에서 결측값이 없는 열 유지 여부 |
indicator | MissingIndicator | 결측값의 위치를 나타내는 지표에 대한 정보 |
n_features_in | int | 입력된 특성(열)의 개수 |
feature_names_in_ | ndarray of shape (n_features_in_,) | 입력된 특성(열)의 이름 배열 |
imputer_mean = SimpleImputer(strategy='mean')
df_imputed = imputer_mean.fit_transform(df)
df_imputed = pd.DataFrame(df_imputed, columns=df.columns)
df_imputed['Latitude'].plot()imputer_mean = SimpleImputer(strategy='median')
df_imputed = imputer_mean.fit_transform(df)
df_imputed = pd.DataFrame(df_imputed, columns=df.columns)
df_imputed['Latitude'].plot()imputer_mean = SimpleImputer(strategy='most_frequent')
df_imputed = imputer_mean.fit_transform(df)
df_imputed = pd.DataFrame(df_imputed, columns=df.columns)
df_imputed['Latitude'].plot()sklearn.impute.IterativeImputer(estimator=None, *,
missing_values=nan, sample_posterior=False, max_iter=10, tol=0.001,
n_nearest_features=None, initial_strategy='mean', fill_value=None,
imputation_order='ascending', skip_complete=False, min_value=-inf, max_value=inf,
verbose=0, random_state=None, add_indicator=False, keep_empty_features=False)mice(data, m = 5, method = NULL, predictorMatrix, where = NULL, blocks,
visitSequence = NULL, formulas, blots = NULL, post = NULL,
defaultMethod = c("pmm", "logreg", "polyreg", "polr"), maxit = 5,
printFlag = TRUE, seed = NA, data.init = NULL, ...)from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
imputer_mice = IterativeImputer(random_state=111)
df_imputed = imputer_mice.fit_transform(df)
df_imputed = pd.DataFrame(df_imputed, columns=df.columns)
df_imputed['Latitude'].plot()from impyute.imputation.cs import mice
np_imputed=mice(df.values)
df_imputed = pd.DataFrame(np_imputed, columns=df.columns)
df_imputed['Latitude'].plot()impute.KNNImputer(*, missing_values=nan, n_neighbors=5, weights='uniform',
metric='nan_euclidean', copy=True, add_indicator=False,
keep_empty_features=False)[source]