기본 환경: IDE: VS code, Language: Python
⭐ 서울시 따릉이 대여량 예측 경진대회 자료를 통한 Pandas pkg 및 결측치(Missing Value) 처리 방법
# dacon_seoul_ddarung.py
# dacon_seoul_ddarung data: https://dacon.io/competitions/open/235576/data
import numpy as np
import pandas as pd
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
# 1. Data
path = './_data/ddarung/'
# 동일한 경로의 파일을 여러번 당겨올 경우, 변수를 지정해서 사용
# ./ = 현재 폴더
# _data/ = _data 폴더
# ddarung/ = ddarung 폴더
train_csv = pd.read_csv(path+'train.csv', index_col=0)
# path + 'train.csv': ./_data/ddarung/train.csv
# index_col을 입력하지 않을 경우 idx도 데이터로 인식하게 됨 (0번째 column은 data가 아닌 idx임을 안내)
# print(train_csv) [1459 rows x 11 columns] -> [1459 rows x 10 columns]
test_csv = pd.read_csv(path+'test.csv', index_col=0)
submission = pd.read_csv(path+'submission.csv', index_col=0)
print(train_csv.columns) # sklearn.feature_names
print(train_csv.info())
# null 값 제외 출력
# Int64Index: 715 entries, 총 데이터 수
# 결측치: 총 데이터 수 - Non-Null (수집못한 데이터)
print(test_csv.info()) # info -> null이 아닌 값(Non-Null) 출력
print(train_csv.describe()) # sklearn.DESC
# 결측치 처리 - '결측 데이터 제거'
print(train_csv.isnull().sum()) # data_set의 결측치(Null) 값 총계 출력
train_csv = train_csv.dropna() # pandas.dropna(): null 값을 포함한 데이터 행 삭제
x = train_csv.drop(['count'], axis=1)
# count column 삭제
# axis=0: index, axis: columns
print(x.shape) # [1459 rows x 9 columns] -> dropna로 인한 변경
y = train_csv['count']
print(y.shape)
x_train, x_test, y_train, y_test = train_test_split(
x, y,
shuffle=True,
train_size=0.7,
random_state=1234
)
print(x_train.shape, x_test.shape) #(1021, 9) (438, 9)
print(y_train.shape, y_test.shape) #(1021, ) (438, )
# 2. model
model = Sequential()
model.add(Dense(64, input_dim=9)) # input_dim = 9
model.add(Dense(64))
model.add(Dense(32))
model.add(Dense(16))
model.add(Dense(1)) # output_dim = 1
# 3. compile and train
model.compile(loss='mse', optimizer='adam') # RMSE가 평가지표이므로 유사한 mse 사용
model.fit(x_train, y_train, epochs=128, batch_size=32)
# 4. evaluate and predict
loss = model.evaluate(x_test, y_test)
print("Loss: ", loss)
y_predict = model.predict(x_test)
# test는 y값이 없으므로 train의 test dataset 사용
def RMSE (y_test, y_predict):
return np.sqrt(mean_squared_error(y_test, y_predict))
rmse = RMSE(y_test, y_predict)
print("RMSE: ", rmse)
# for submission
y_submit = model.predict(test_csv) # predict() return numpy
submission['count'] = y_submit
# pandas(submission['count'])에 numpy(y_submit)를 직접 대입시키면 numpy가 pandas가 됨
submission.to_csv(path+'submission_230121.csv')
'''
Result
'''
⭐ Python Pandas 관련 유용한 Method 정리
pandas.read_cvs(): cvs file read
pandas.columns: column name
pandas.info(): null이 아닌 값(Non-Null) 출력
pandas.describe(): data description
pandas.isnull(): null 값 출력
pandas.dropna(): null data delete
pandas.drop(): column delete
⭐ Data Missing Value(결측치) 처리 방법
1. 삭제
1.1. 결측치 데이터의 행 삭제
1.2. 결측치 데이터의 열 삭제
2. 대체
2.1. 이전 행 값으로 대체
2.2. 다음 행 값으로 대체
2.3. 원하는 값으로 대체
2.4. 보간법으로 대체
→ method와 limit_direction에 따라 다르게 나타남
→ Data 값을 선형에 비례하는 값으로 결측값을 보간함
2.5. 해당 열의 결측치를 제외한 평균값으로 대체
Pandas Dataset을 활용한 결측치 처리 예제
# missing_value_handling.py
import pandas as pd
dataset = pd.DataFrame([
{'id': 1, 'val': None, 'pw': 2},
{'id': 2, 'val': 21, 'pw': 3},
{'id': 3, 'val': 19, 'pw': 0},
{'id': 4, 'val': 24, 'pw': 1},
{'id': None, 'val': 15, 'pw': 2},
{'id': 5, 'val': 9, 'pw': 2},
{'id': 6, 'val': 33, 'pw': 1},
{'id': None, 'val': 40, 'pw': 2}
])
print(dataset)
'''
id val pw
0 1.0 NaN 2
1 2.0 21.0 3
2 3.0 19.0 0
3 4.0 24.0 1
4 NaN 15.0 2
5 5.0 9.0 2
6 6.0 33.0 1
7 NaN 40.0 2
'''
# 1.1. 행 삭제
dataset_rev1 = dataset.dropna()
print(dataset_rev1)
'''
id val pw
1 2.0 21.0 3
2 3.0 19.0 0
3 4.0 24.0 1
5 5.0 9.0 2
6 6.0 33.0 1
'''
# 1.2. 열 삭제
dataset_rev2 = dataset.dropna(axis='columns')
print(dataset_rev2)
'''
pw
0 2
1 3
2 0
3 1
4 2
5 2
6 1
7 2
'''
# 2.1. 이전 행 값으로 대체
dataset_rev3 = dataset.fillna(method='pad')
print(dataset_rev3)
'''
id val pw
0 1.0 NaN 2
1 2.0 21.0 3
2 3.0 19.0 0
3 4.0 24.0 1
4 4.0 15.0 2
5 5.0 9.0 2
6 6.0 33.0 1
7 6.0 40.0 2
이전 값이 없는 0번째 행은 NaN값 유지
'''
# 2.2. 다음 행 값으로 대체
dataset_rev4 = dataset.fillna(method='bfill')
print(dataset_rev4)
'''
id val pw
0 1.0 21.0 2
1 2.0 21.0 3
2 3.0 19.0 0
3 4.0 24.0 1
4 5.0 15.0 2
5 5.0 9.0 2
6 6.0 33.0 1
7 NaN 40.0 2
다음 값이 없는 7번째 행은 NaN값 유지
'''
# 2.3. 원하는 값으로 대체
dataset_rev5 = dataset.fillna(0) # 0으로 대체
print(dataset_rev5)
'''
id val pw
0 1.0 0.0 2
1 2.0 21.0 3
2 3.0 19.0 0
3 4.0 24.0 1
4 0.0 15.0 2
5 5.0 9.0 2
6 6.0 33.0 1
7 0.0 40.0 2
'''
# 2.4. 보간법으로 대체
dataset_rev6 = dataset.interpolate(method='linear',limit_direction='forward')
# 선형 비례 방법을 위에서부터 아래로 적용하여 NaN 값 채우기(0번째 행 제외)
dataset_rev6 = dataset.interpolate(method='linear',limit_direction='backward')
# 선형 비례 방법을 위에서부터 아래로 적용하여 NaN 값 채우기(7번째 행 제외)
print(dataset_rev6)
'''
forward
id val pw
0 1.0 NaN 2
1 2.0 21.0 3
2 3.0 19.0 0
3 4.0 24.0 1
4 4.5 15.0 2
5 5.0 9.0 2
6 6.0 33.0 1
7 6.0 40.0 2
backward
id val pw
0 1.0 21.0 2
1 2.0 21.0 3
2 3.0 19.0 0
3 4.0 24.0 1
4 4.5 15.0 2
5 5.0 9.0 2
6 6.0 33.0 1
7 NaN 40.0 2
'''
# 2.5. 결측치 값으로 제외한 평균값으로 대체
dataset_rev7 = dataset.fillna(dataset.mean())
print(dataset_rev7)
'''
id val pw
0 1.0 23.0 2
1 2.0 21.0 3
2 3.0 19.0 0
3 4.0 24.0 1
4 3.5 15.0 2
5 5.0 9.0 2
6 6.0 33.0 1
7 3.5 40.0 2
'''
⭐ cvs 파일 관련 유용한 VS Code 확장자
: Excel Viewer, Rainbow CSV
소스 코드
참고 자료
📑 [pandas] 데이터 결측치 존재여부 확인 및 결측치 처리하기
📑 [Python pandas] 결측값 보간하기 (interpolation of missing values)
'Naver Clould with BitCamp > Aartificial Intelligence' 카테고리의 다른 글
Validation Data (0) | 2023.01.22 |
---|---|
Activation Function (0) | 2023.01.22 |
Environment Settings for GPU usage (0) | 2023.01.21 |
Model Performance Indicator (0) | 2023.01.21 |
Matplotlib: Scatter and plot (0) | 2023.01.21 |