본문 바로가기
네이버클라우드/AI

AI 5일차 (2023-05-12) 인공지능 기초 - pandas

by prometedor 2023. 5. 14.

pandas

ㄴ 데이터 처리와 분석을 위해 사용되며, 표 형태의 데이터를 다루기에 용이

ㄴ Boston 데이터 다운로드하여 준비 해두기

 

 

tf01_pd01_boston.ipynb

import numpy as np
import pandas as pd
from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score

# 1. 데이터
path = './_data/'
x_train = pd.read_csv(path + 'train-data.csv')	# cvs 파일 불러오는 코드
y_train = pd.read_csv(path + 'train-target.csv')	# cvs 파일 불러오는 코드
x_test = pd.read_csv(path + 'test-data.csv')	# cvs 파일 불러오는 코드
y_test = pd.read_csv(path + 'test-target.csv')	# cvs 파일 불러오는 코드

print(x_train.columns)
print(y_train.columns)
print(x_train.head(7))  # default = 5

 

 

 

tf01_pd02_boston.ipynb

import numpy as np
import pandas as pd
from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score

# 1. 데이터
path = './_data/'
datasets = pd.read_csv(path + 'Boston_house.csv')

print(datasets.columns)
print(datasets.head(7))  # default = 5

x = datasets[['AGE', 'B', 'RM', 'CRIM', 'DIS', 'INDUS', 'LSTAT', 'NOX', 'PTRATIO',
       'RAD', 'ZN', 'TAX', 'CHAS']]
y = datasets[['Target']]

print(x.shape, y.shape)
# (506, 13) (506, 1)


# scikit-learn의 train_test_split() 함수를 이용하여 데이터셋을 train set과 test set으로 분리
x_train, x_test, y_train, y_test = train_test_split(
    x, y, test_size=0.2, shuffle=True, random_state=77
)
print(x_train.shape, y_train.shape)
print(x_test.shape, y_test.shape)
# (404, 13) (404, 1)
# (102, 13) (102, 1)


##### 상관계수 히트 맵 #####
import matplotlib.pyplot as plt
import seaborn as sns

# seaborn 안 되는 경우
# pip install seaborn

sns.set(font_scale = 1.2)
sns.set(rc = {'figure.figsize':(9, 6)})
sns.heatmap(data = datasets.corr(),  # 상관관계
            square = True,
            annot = True,
            cbar = True
           )
plt.show()

 

 

heatmap

ㄴ seaborn 의 heatmap

 

tf01_pd02_boston_heatmap.ipynb

import numpy as np
import pandas as pd
from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score


# 1. 데이터
path = './_data/'
datasets = pd.read_csv(path + 'Boston_house.csv')

print(datasets.columns)
print(datasets.head(7))  # default = 5


x = datasets[['AGE', 'B', 'RM', 'CRIM', 'DIS', 'INDUS', 'LSTAT', 'NOX', 'PTRATIO',
       'RAD', 'ZN', 'TAX', 'CHAS']]
y = datasets[['Target']]

print(x.shape, y.shape)


x_train, x_test, y_train, y_test = train_test_split(
    x, y, test_size=0.2, shuffle=True, random_state=77
)
print(x_train.shape, y_train.shape)
print(x_test.shape, y_test.shape)


##### 상관계수 히트 맵 #####
import matplotlib.pyplot as plt
import seaborn as sns


# seaborn 안 되는 경우
# pip install seaborn


sns.set(font_scale = 1.2)	# 그래프의 글꼴 크기를 설정
sns.set(rc = {'figure.figsize':(9, 6)})	# 그래프의 크기를 설정
sns.heatmap(data = datasets.corr(),  # 상관관계 히트맵을 그립
            square = True,
            annot = True,
            cbar = True
           )
           # data : 데이터셋의 상관관계 행렬을 입력
           # square : 정사각형 모양으로 그릴 것인지를 설정
           # annot : 각 셀에 숫자를 표시할지를 설정
           # cbar : 컬러바를 그릴 것인지를 설정
plt.show()	# 그래프 출력


x_train = x_train.drop(['TAX', 'RAD'], axis=1)
x_test = x_test.drop(['TAX', 'RAD'], axis=1)

print(x_train.shape, x_test.shape)

ㄴ  scikit-learn에서 제공하는 train_test_split 함수를 이용하여 데이터를 train set과 test set으로 나눈 뒤, 각각의 set에서 drop 함수 이용하여 'TAX'와 'RAD' 열을 삭제

 

= > x_train과 x_test에서 'TAX'와 'RAD' 열을 삭제한 이유

ㄴ 이 두 열이 데이터 분포와 상관 없이 각각의 값이 지역별로 고정되어 있는 값이기 때문

ㄴ 따라서 모델이 이 열을 이용해서 지역 정보를 학습하면 예측 성능이 저하될 수 있음

ㄴ 이러한 열을 삭제하여 모델이 데이터의 실제 분포와 상관 있는 정보를 학습하도록 함

 

** 참고

상관관계(correlation)란?

ㄴ 두 변수 간의 관련성을 나타내는 지표

ㄴ 두 변수가 어떤 선형적인 관계를 갖는지를 파악할 수 있으며, 상관계수(correlation coefficient)라는 값으로 표현됨

ㄴ 상관계수는 -1에서 1까지의 값을 가지며, 1에 가까울수록 양의 상관관계, -1에 가까울수록 음의 상관관계, 0에 가까울수록 무상관ㄴ 상관관계는 두 변수 간의 인과관계를 나타내지는 않지만, 두 변수 사이에 어떤 관련성이 있는지를 파악하는 데 유용

 

 

labeling

ㄴ sklearn.preprocessing 의 labelEncoder

 

tf01_pd02_boston_labeling.ipynb

import numpy as np
import pandas as pd
from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score

# 1. 데이터
path = './_data/'
datasets = pd.read_csv(path + 'Boston_house.csv')

print(datasets.columns)
print(datasets.head(7))  # default = 5

 

 

x = datasets[['AGE', 'B', 'RM', 'CRIM', 'DIS', 'INDUS', 'LSTAT', 'NOX', 'PTRATIO',
       'RAD', 'ZN', 'TAX', 'CHAS']]
y = datasets[['Target']]

print(x.shape, y.shape)
# (506, 13) (506, 1)	--> 데이터셋의 x 와 y 의 크기 확인


print(x.info())   # info() : 컬럼명, null값, 데이터타입 확인

 

ㄴ 모두 506 으로 null 값 존재하지 않음을 알 수 있음

 

x.describe()

# 문자를 숫자로 변경 (LabelEncoder)

from sklearn.preprocessing import LabelEncoder
ob_col = list(x.dtypes[x.dtypes=='object'].index)  # object 컬럼 리스트 추출 (index 를 가지고옴)

# 라벨링 (object 'string -> int, float')
for col in ob_col:
    x[col] = LabelEncoder().fit_transform(x[col].values)

 

** 참고

LabelEncoder().fit_transform() : 주어진 데이터에 대해 레이블 인코딩을 수행하는 메소드

<예시>

from sklearn.preprocessing import LabelEncoder

# 샘플 데이터
data = ['cat', 'dog', 'cat', 'bird', 'cat', 'dog']

# LabelEncoder로 레이블 인코딩
encoder = LabelEncoder()
encoded_data = encoder.fit_transform(data)

print(encoded_data)  # 출력: [0 1 0 2 0 1]

 

 

NAN

tf01_pd02_boston_NaN.ipynb

import numpy as np
import pandas as pd
from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score

# 1. 데이터
path = './_data/'
datasets = pd.read_csv(path + 'Boston_house.csv')

print(datasets.columns)
print(datasets.head(7))  # default = 5

 

 

x = datasets[['AGE', 'B', 'RM', 'CRIM', 'DIS', 'INDUS', 'LSTAT', 'NOX', 'PTRATIO',
       'RAD', 'ZN', 'TAX', 'CHAS']]
y = datasets[['Target']]

print(x.shape, y.shape)
# (506, 13) (506, 1)


print(x.info())   # info() 컬럼명, null값, 데이터타입 확인

 

 

print(x.describe())

 

 

x['NAN'] = np.nan

print(x)

ㄴ 해당 데이터프레임에 'NAN' 이라는 이름을 가진 새로운 열을 추가하고 그 값을 np.nan 으로 설정한 뒤, 전체 데이터프레임 x를 출력하는 코드

 

 

# NaN 처리하기
# x = x.fillna(0)  # 0으로 채우기
# x = x.fillna(x.mean())   # 해당 컬럼의 mean 값(평균), mode, min, max 값은 컬럼별로 채우기
# x = x.fillna(method='ffill')   # 해당 컬럼의 바로 앞 데이터의 값으로 채우기 (front fill)
x = x.fillna(method='bfill')   # 해당 컬럼의 바로 뒤의 데이터 값으로 채우기 (back fill)

print(x)

 

 

x_train, x_test, y_train, y_test = train_test_split(
    x, y, test_size=0.2, shuffle=True, random_state=77
)
print(x_train.shape, y_train.shape)
print(x_test.shape, y_test.shape)
# (404, 14) (404, 1)
# (102, 14) (102, 1)