본문 바로가기
Naver Clould with BitCamp/Aartificial Intelligence

Pandas Package and Missing Value Handling

by HJ0216 2023. 1. 21.

기본 환경: 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

 

소스 코드

🔗 HJ0216/TIL

 

참고 자료

📑 서울시 따릉이 대여량 예측 경진대회

📑 [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