반응형
import pandas as pd
import numpy as np
X_train = pd.read_csv('data_atype/X_train.csv')
y_train = pd.read_csv('data_atype/y_train.csv')
X_test = pd.read_csv('data_atype/X_test.csv')
# 결측치 확인
print(X_train.isnull().sum())
print(X_test.isnull().sum())
# x_t = pd.DataFrame(X_train)
# print(x_t.isnull().sum())
# 이렇게 데이터프레임 씌운거랑 위에 안 씌운거랑 동일한 결과임. 차이가 뭔지 모르겠음
print("=")
# 데이터 타입 확인
print(X_train.info())
# 컬럼 고유 값 개수
# print("==")
# print(X_train['workclass'].value_counts()) #최빈값이 압도적으로 많음 2등대비 10배이상
# print(X_train['occupation'].value_counts()) #비등비등함 #최빈값으로 채우기에는 애매함
# print(X_train['native.country'].value_counts()) #최빈값이 압도적인 1등임
#범주형 변수 결측치
print("===")
#데이터 크기 확인
print(X_train.shape)
print(X_test.shape)
print("====")
#결측치 제거
df = X_train.dropna() # axis=0 #행이 사라짐 #df = X_train.dropna(axis=0) #모든 컬럼에 대하여 수행됨
print(df.isnull().sum())
print(df.shape)
print("=====")
#결측치 제거 # 특정 컬럼에 결측치 있으면 데이터 행 삭제
df = X_train.dropna(subset=['native.country'])
print(df.isnull().sum())
print(df.shape)
df = X_train.dropna(subset=['native.country','workclass'])
print(df.isnull().sum())
print(df.shape)
print("======")
df = X_train.dropna(axis=1) #결측치가 있는 컬럼이 삭제되는 코드
print(df.isnull().sum())
# 일반적으로는 결측치가 50% 이상이거나 엄청 많은 특정 컬럼에 대해 삭제
df = X_train.drop(['workclass'],axis=1)
print(df.isnull().sum() )
# axis = 0 이면 행 삭제, axis = 1 이면 열 삭제
print("======")
print(X_train.shape)
df = X_train.drop_duplicates()
print(df.shape)
# print("=======")
# df.drop_duplicates(subset=['A'])
# df.drop_duplicates(subset=['A','B'])
# df.drop_duplicates(subset=['A','B'],keep='last')
# keep='last' 하면, 먼저 나오는 것을 삭제 하고 뒤에 나오는 것을 keep 한다
# keep= 안써주면 먼저 나오는 것을 keep 하고 뒤에 나오는 중복 값을 제거 한다.
print("========")
md = X_train['workclass'].mode()[0]
print(md)
X_train['workclass'] = X_train['workclass'].fillna(md)
print(X_train.isnull().sum())
print("=========")
#최빈값이 월등히많은 데이터가 아니므로 그냥 새로운 값으로 채우는 케이스
X_train['occupation']=X_train['occupation'].fillna('X')
print(X_train.isnull().sum())
# 결측치 채워줄 때 train 데이터만 할게 아니라 test 데이터도 해줘야 한다
# 같이 해주기!
X_train['workclass'] = X_train['workclass'].fillna(
X_train['workclass'].mode()[0]
)
X_train['native.country'] = X_train['native.country'].fillna(
X_train['native.country'].mode()[0]
)
X_train['occupation'] = X_train['occupation'].fillna('X')
X_test['workclass'] = X_test['workclass'].fillna(
X_test['workclass'].mode()[0]
)
X_test['native.country'] = X_test['native.country'].fillna(
X_test['native.country'].mode()[0]
)
X_test['occupation'] = X_test['occupation'].fillna('X')
print("==========")
# 수치형 변수 결측치 처리
print(X_train.isnull().sum())
print("===========")
print(X_train['age'].mean())
print(X_train['hours.per.week'].median())
print(X_train['hours.per.week'].max())
print(X_train['hours.per.week'].min())
print("===========")
# 어떻게 채울지?
# 평균, 중앙값 많이 씀
value = int(X_train['age'].mean()) #train의 평균값으로 train과 test를 채움
print(value)
X_train['age'] = X_train['age'].fillna(value)
X_test['age'] = X_test['age'].fillna(value)
value = int(X_train['hours.per.week'].median())
print(value)
X_train['hours.per.week'] = X_train['hours.per.week'].fillna(value)
X_test['hours.per.week'] = X_test['hours.per.week'].fillna(value)
print("=============")
print(X_train.describe())
print(X_train[X_train['age'] <0])
print(X_train.shape)
X_train = X_train[X_train['age'] >0]
print(X_train.shape)
# IQR 로 확인
cols = ['age','fnlwgt','education.num','capital.gain','capital.loss','hours.per.week']
for col in cols:
Q1 = X_train[col].quantile(0.25)
Q3 = X_train[col].quantile(0.75)
IQR = Q3-Q1
min_iqr = Q1 - 1.5 * IQR
max_iqr = Q3 + 1.5 * IQR
cnt = sum( (X_train[col]<min_iqr) | ( max_iqr < X_train[col] ) )
print(f'{col}의 이상치 갯수: {cnt} 입니다.')
# train 데이터셋: 소수의 행은 삭제 가능함.
# test 데이터셋: 이상치,결측치 처리 시 test 데이터 행은 절대 삭제 하면 안된다. 예측해야하는 데이터 이므로!
# 그러면 결측치가 많으면 어떻게 할 것인지?
# 컬럼은 삭제 가능함.
#다만 train 데이터와 test 데이터의 컬럼수와 컬럼명이 일치해야함. y(target) 제외
반응형
'IT,SW,Data,Cloud,코딩 > Python' 카테고리의 다른 글
20230610 파이썬 공부 - 작업형1 (0) | 2023.06.10 |
---|---|
2023년6월9일 머신러닝-Regression (0) | 2023.06.10 |
2023년6월8일 파이썬공부 - 머신러닝 기초 프로세스 (0) | 2023.06.08 |
2023년6월7일 파이썬공부 - 피쳐엔지니어링 (0) | 2023.06.07 |
2023년6월6일 EDA 공부 (0) | 2023.06.06 |
2023년6월6일 머신러닝 요약 (0) | 2023.06.06 |
2023년6월6일 판다스공부 (0) | 2023.06.06 |
2023년6월5일 판다스공부 (0) | 2023.06.06 |
댓글