본문 바로가기
IT,SW,Data,Cloud,코딩/Python

2023년6월7일 파이썬공부 - 데이터전처리

by 착실하게 2023. 6. 7.
반응형
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) 제외
반응형

댓글