데이터 분석

데이터 전처리 python 코드

lhg010524 2024. 11. 14. 20:12

 

푸~하! 담배 한 모금 하고 데이터 분석!

 

(비흡연자입니다.)

1. 데이터 분석

# 라이브러리 로드
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

#경고 메시지 무시
import warnings
warnings.filterwarnings("ignore", category=FutureWarning)
#데이터 로드
odf = pd.read_csv('titanic.csv') #쥬피터 노트북과 같은 위치일 경우
# odf = pd.read_csv('./data/titanic.csv') #.은 현재위치
# odf = pd.read_csv('./data/titanic_sep.csv')
# odf = pd.read_csv('./data/titanic_sep.csv',sep="|") #구분자 지정
# odf = pd.read_csv('./data/titanic_cp949.csv')          
# odf = pd.read_csv('./data/titanic_cp949.csv',encoding='cp949') #인코딩 지정
odf.head(2)



##### 주의
# 이하의 단계에서는 제일 처음 코드 이외의 코드는 주석처리 할 것!!

 

보통은 복사해서 사용한다.

#데이터 프레임 복사
df = odf.copy()

# 일반적인 정보 파악
df.info()
'''
1. 관측치 갯수, 데이터 수, 행 수, 인스턴스 수?
2. 피쳐 수, 변수 개수, 컬럼 수?
3. 결측치 유무와 결측치 컬럼은?
4. 데이터 타입 적절성?
'''


# 요약 통계 정보 파악
'''
각 피쳐별 데이터 개수, 평균, 표준편차, 최소, 25%, 50%(중앙값), 75%, 최대
'''
df.describe()

 

데이터를 추출하는 법. loc과 iloc 등

# 데이터 추출 - 컬럼
# 컬럼 한개
df[['Age']]

# # 컬럼 여러개
df[['Age','Survived']]

# 데이터 추출 - 행
df.loc[0,['Survived','Sex','Name']] #Series 추출
df.loc[ [0] ,['Survived','Sex','Name']] #데이터 프레임 추출
# df.loc[ [3,9] ,['Survived','Sex','Name']]

# df.iloc[0,[1,4,3]]
# df.iloc[[0],[1,4,3]]
# df.iloc[[3,9],[1,4,3]]

# #데이터 추출 - 조건
# ## 성별(sex)가 여성인 데이터 추출
cond = df['Sex'] == 'female'
df[cond]

# ## 나이(age)가 10세 미만이거나 60이상인 사람들
cond = (df['Age'] < 10) | (df['Age'] >= 60)
df.loc[cond]
df.loc[cond,:]
df.loc[cond,['Survived','Sex']]


# ### 나이(age)가 10세 미만이거나 60이상인 사람들 중에서 생존한 사람만 추출(survived=1)
cond_1 = (df['Age'] < 10) | (df['Age'] >= 60)
cond_2 = df['Survived'] == 1
df.loc[cond_1 & cond_2,:]

 

# 문제 : Female 고객 중, 월 사용액이 가장 큰 고객 ID?
cond = df['gender']=='Female'
df[cond].sort_values('MonthlyCharges',ascending=False).iloc[0,0]

 

 

정렬하는 법 : sort_values()

#정렬 - 컬럼 하나 기준
df.sort_values('Age',ascending=True) #오름차순
# df.sort_values('Age',ascending=False) #내림차순

# #정렬 - 컬럼 여러개 기준
df.sort_values(['Age','Fare'],ascending=False) #내림차순

 

group별 구하는 법 : group_by()

# groupby
#항구별 탑승자 수(데이터 건수, 관측치 갯수)
df.groupby('Embarked').count() # 결측치 포함 x
df.groupby('Embarked').size()  # 결측치 포함 o
df.groupby('Embarked').size().to_frame('탑승자수')

# #항구별 탑승자의 평균 연령은?
df.groupby('Embarked')['Age'].mean()
df.groupby('Embarked')['Age'].mean().to_frame('평균연령')

 

2. 데이터 전처리

2.1 컬럼 추가/삭제, 이름 수정 : rename과 drop 사용

#컬럼 추가/파생변수 생성
df['familysize'] = df['SibSp'] + df['Parch']

# #컬럼 이름 변경
df.rename(columns={'familysize':'FamilySize'},inplace=True)

# #컬럼 삭제
df.drop('FamilySize',axis=1,inplace=True)

# 여러 칼럼 동시 삭제
df.drop(columns=["url_chinese_present","html_num_tags('applet')"],inplace=True)


# 중복 데이터 삭제
df = df.drop_duplicates()

# #확인
df.head()

 

2.2 형 변환, 문자열 수정

df.info()

# 컬럼 형 변환
#object -> 정수로 변환
#astype()는 inplace=True 옵션 지원하지 않음. 꼭 해당 컬럼에 재 할당해서 변경해라

#컬럼 안에 특수문자,문자 있으면 에러 발생하니 replace를 적용

df['PassengerId'] = df['PassengerId'].replace('_','-1')
df['PassengerId'] = df['PassengerId'].astype('int64')

#이렇게도 가능
df_ex['state'].replace({'CA':'California','NY':'NewYork'}, inplace=True)
# state 컬럼 안에 CA 값을 California로, NY를 NewYork으로

df.info()

 

2.3 결측치

#반드시 나옴

df = odf.copy()

## 결측치 갯수
df.isnull().sum()

## 결측치 포함 데이터 보기 
## Age컬럼에서 null인 데이터 추출
df.loc[df['Age'].isnull(),:]

## 결측치 채우기-특정값으로
fdf = df.fillna({'Age':0}) 
fdf.isnull().sum()
fdf['Age'].mean() #결측치 처리 후 평균나이


## 결측치 채우기-평균값으로
fdf = df.fillna({'Age':df['Age'].mean()}) 
fdf['Age'].mean()

## 결측치 모두 삭제하기
fdf = df.dropna()
fdf.isnull().sum()

## 결측치 삭제-특정컬럼 기준
fdf = df.dropna(subset=['Age']) 
fdf.isnull().sum()

# ~ 아닌 값만 추출. TotalCharges 칼럼 값이 공백 아닌 애들은?
df[df['TotalCharges']!=" "]

# 결측치 제일 많은 값 컬럼 제거하고 나머지 결측치 row 제거
df.drop('DeviceProtection',axis=1,inplace=True)  # axis 명시
df.dropna(inplace=True)

 

2.4 스케일링 : 이상치가 많으면 StandardScaling, 보통은 Min-Max Scaling

boxplot으로 데이터 분포 확인

df = odf.copy()
plt.figure(figsize=(10,4))
df.boxplot(fontsize=5) 
plt.show()
#weight의 값범위가 너무커 상대적으로 다른 피처의 특성을 살펴볼 수 없다. 
#머신러닝,딥러닝 학습시 큰 값을 가지는 변수에 가중치가 부여(변수 영향도가 크다)함
#모든 피처의 영향도를 동등하게 만들어 주기위해 스케일 작업이 필요

 

StandardScaler

## 스케일링:표준화
from sklearn.preprocessing import StandardScaler  # 불러오고
scaler = StandardScaler()  # 객체 생성 후
scaled = scaler.fit_transform(df) fit_transform 해주기


## 스케일 후 확인 코드
ss_df = pd.DataFrame(data=scaled, columns=df.columns)
ss_df.describe()
ss_df.boxplot()
plt.show()

 

MinMaxScaler

## 스케일링:정규화
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaled = scaler.fit_transform(df)

## 스케일 후 확인 코드
mm_df = pd.DataFrame(data=scaled, columns=df.columns)
mm_df.describe()
mm_df.boxplot()
plt.show()

 

2.5 인코딩 : get_dummies()

import pandas as pd

## 인코딩
#pandas에서는 get_dummies함수를 사용하면 쉽게 One-Hot Encording이 가능

df = pd.read_csv('./data/titanic.csv')

#원-핫 인코딩
pd.get_dummies(df)

#타입 지정: object 컬럼만 진행
cal_cols = df.select_dtypes('object').columns.values
pd.get_dummies(df,columns=cal_cols)

#다중공선성 문제 해결 -> 이건 문제에서 조건을 줄 때만 표현
pd.get_dummies(df, drop_first=True)

#True/False -> 1,0 정수로 표현
pd.get_dummies(df, dtype='int',drop_first=True)

 

replace 함수로 라벨 인코딩도 가능

# 라벨 인코딩-DataFrame replace함수
df = pd.read_csv('./data/titanic2.csv')

df['Survived'].value_counts()  # 값 확인

df['Survived'] = df['Survived'].replace(['Dead','Survived'],[0,1])

df['Survived'].value_counts()

 

아니면 사이킷 런 LabelEncoder 클래스 사용

# 라벨 인코딩-사이킷런 LabelEncoder 클래스 사용

from sklearn.preprocessing import LabelEncoder

df = pd.read_csv('./data/titanic2.csv')

le = LabelEncoder()  # 객체 생성

df['Survived'] = le.fit_transform(df['Survived'])   # fit_transform 하기
df['Survived'].value_counts()

 

3. 모델링

패턴 사용하기.

단, 다음과 같은 사항을 고려한다.

 

1. 데이터가 분류인가? 회귀인가? -> 범주면 분류 / 숫자면 회귀

2. 평가 지표 해석 (mse, R-square...)

3. 특정 알고리즘 언급 없으면 RandomForest가 ㄱㅊ

 

회귀부터 한번 봐 보자

 

3-1-1. 머신러닝_회귀

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

#데이터 분할
from sklearn.model_selection import train_test_split

#회귀 알고리즘. 알맞게 골라 쓰자
from sklearn.linear_model import LinearRegression
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor


#회귀 평가지표
from sklearn.metrics import r2_score
from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_absolute_error

# 경고메세지 끄기
import warnings
warnings.filterwarnings(action='ignore')
##########데이터 로드

df = pd.read_csv('./data/auto-mpg.csv')

##########데이터 분석 및 전처리

#결측치,이상치
#형변환
#Feature enginearing(파생변수 생성,스케일링,구간화,피쳐 셀렉션)
#인코딩

##########데이터 분리

#피쳐와 레이블 분리
y_data = df['mpg'] #레이블
x_data = df.drop(['mpg'],axis=1) #피쳐
print(y_data.shape,x_data.shape)

#훈련용과 테스트용 분리
#학습:테스트=7:3
#random_state=777
x_train, x_test, y_train, y_test = train_test_split(x_data, y_data, test_size=0.3, random_state=777)

##########모델 생성

model = LinearRegression() # 피쳐와 타깃과의 선형관계 학습
model = DecisionTreeRegressor(max_depth=5, min_samples_split=4,random_state=42) #의사결정 
model = RandomForestRegressor(n_estimators=10, max_depth=10,random_state=42) #앙상블 알고리즘

##########모델 학습

model.fit(x_train, y_train)

##########모델 성능 평가

y_predict = model.predict(x_test)

R2 = r2_score(y_test,y_predict)
MSE = mean_squared_error(y_test,y_predict,squared=True)
RMSE = mean_squared_error(y_test,y_predict,squared=False)
MAE = mean_absolute_error(y_test,y_predict)

print(f' R^2_1근접: {R2:.3F}, MSE_저: {MSE:.3f}, RMSE_저: {RMSE:.3F}, MAE_저: {MAE:.3F}')

 

3-1-2. 머신러닝_이진 분류

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

#데이터 분할
from sklearn.model_selection import train_test_split   

#분류 알고리즘. 회귀와 다른 점은 회귀는 Regressor이고 분류는 Classifier다.
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier


#분류 평가지표
from sklearn.metrics import accuracy_score, precision_score , recall_score, f1_score
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report

# 경고메세지 끄기
import warnings
warnings.filterwarnings(action='ignore')

##########데이터 로드

df = pd.read_csv('./data/titanic_pre.csv')

# labels = ['사망', '생존']

##########데이터 분석 및 전처리
#결측치 제거
#형변환
#Feature enginearing(파생변수,스케일링,구간화,피쳐 셀렉션)
#인코딩
##########데이터 분리

#피쳐와 레이블 분리
y_data = df['Survived'] # 레이블
x_data = df.drop(['Survived'],axis=1) # 피쳐
print(y_data.shape,x_data.shape)

#훈련용과 테스트용 분리
#학습:테스트=7:3
#random_state=777
#stratify=y_data 레이블 균형적으로 분할되도록--->!!!!!중요!!!!

x_train, x_test, y_train, y_test = train_test_split(x_data, y_data, test_size=0.3, random_state=777,stratify=y_data)

##########모델 생성

model = LogisticRegression()
model = KNeighborsClassifier(n_neighbors=5)
model = DecisionTreeClassifier(max_depth=3,min_samples_split=2,random_state=42)
model = RandomForestClassifier(n_estimators=3, max_depth=3,random_state=42)



##########모델 학습

model.fit(x_train, y_train)

##########모델 성능 평가

y_predict = model.predict(x_test)

confusion = confusion_matrix( y_test, y_predict)
accuracy = accuracy_score(y_test , y_predict) #정확도
precision = precision_score(y_test , y_predict) #정밀도
recall = recall_score(y_test , y_predict)  #재현율
f1score = f1_score(y_test , y_predict)   #정밀도,재현율 균형

print('오차행렬')
print(confusion)

print(f'정확도: {accuracy:.4f}, 정밀도: {precision:.4f}, 재현율: {recall:.4f}, F1score: {f1score:.4f}')
print(classification_report(y_test,y_predict))

 

3-1-3. 머신러닝_다중 분류

import pandas as pd
import numpy as np

#데이터 분할
from sklearn.model_selection import train_test_split   

#분류 알고리즘
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier

#분류 평가지표
from sklearn.metrics import accuracy_score, precision_score , recall_score, f1_score
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report

# 경고메세지 끄기
import warnings
warnings.filterwarnings(action='ignore')

##########데이터 로드

df = pd.read_csv('./data/iris_pre.csv')

# labels = ['setosa','versicolor','virginica']

##########데이터 분석 및 전처리
#결측치 제거
#형변환
#Feature enginearing(파생변수,스케일링,구간화,피쳐 셀렉션)
#인코딩
##########데이터 분리

#피쳐와 레이블 분리
y_data = df['species'] # 레이블
x_data = df.drop(['species'],axis=1) # 피쳐
print(y_data.shape,x_data.shape)

#훈련용과 테스트용 분리
#학습:테스트=7:3
#random_state=777
#stratify=y_data 레이블 균형적으로 분할되도록
x_train, x_test, y_train, y_test = train_test_split(x_data, y_data, test_size=0.3, random_state=777,stratify=y_data)

##########모델 생성

model = LogisticRegression()
model = KNeighborsClassifier(n_neighbors=5)
model = DecisionTreeClassifier(max_depth=3,min_samples_split=2,random_state=42)
model = RandomForestClassifier(n_estimators=3, max_depth=3,random_state=42)


##########모델 학습

model.fit(x_train, y_train)

##########모델 성능 평가

y_predict = model.predict(x_test)

confusion = confusion_matrix( y_test, y_predict)
accuracy = accuracy_score(y_test , y_predict) #정확도
precision = precision_score(y_test , y_predict, average='macro') #정밀도
recall = recall_score(y_test , y_predict,average='macro')       #재현율
f1score = f1_score(y_test , y_predict,average='macro')          #정밀도,재현율 균형

print('오차행렬')
print(confusion)

print(f'정확도: {accuracy:.4f}, 정밀도: {precision:.4f}, 재현율: {recall:.4f}, F1score: {f1score:.4f}')
print(classification_report(y_test,y_predict))

 

이제부터 딥러닝.

 

3-2-1. 딥러닝_회귀

#기본 라이브러리
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

#데이터 분할
from sklearn.model_selection import train_test_split   

#딥러닝용 라이브러리
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint

# 경고메세지 끄기
import warnings
warnings.filterwarnings(action='ignore')

# 시드고정
tf.random.set_seed(100)

########데이터 로드

df = pd.read_csv('./data/auto-mpg.csv')


##########데이터 분석 및 전처리
#결측치 제거
#형변환
#Feature enginearing(파생변수,스케일링,구간화,피쳐 셀렉션)
#인코딩

##########데이터 분리
#피쳐와 레이블 분리
y_data = df['mpg'] #타깃
x_data = df.drop(['mpg'],axis=1) #피쳐
print(y_data.shape,x_data.shape)

#훈련용과 테스트용 분리
#학습:테스트=7:3
#random_state=777

x_train, x_test, y_train, y_test = train_test_split(x_data, y_data, test_size=0.3, random_state=777)

########모델 (model) 구축

# 여기까지는 머신 러닝과 똑같음

model = Sequential() 

model.add(Dense(units=16, activation='relu',input_shape=(x_train.shape[1],)))  
model.add(Dropout(0.3)) #과적합방지
model.add(Dense(units=8, activation='relu'))
model.add(Dropout(0.3)) #과적합방지
model.add(Dense(units=1, activation='linear')) #------->회귀 이건 고정


########모델 (model) 컴파일 및 summary

model.compile(loss='mse',optimizer=Adam(),metrics=['mae'])#------->회귀 
model.summary()

########모델 학습

hist = model.fit(x_train, y_train, epochs=50 ,batch_size=15, validation_data=(x_test, y_test))

######################   조기종료, 모델 저장, 과적합 방지 언급시 사용 ####################
######################   아래의 코드를 실행할 시, fit() 코드는 주석처리 필요 #############
# early_stop = EarlyStopping(monitor='val_loss', patience=5)
# check_point = ModelCheckpoint('best_model.h5', monitor='val_loss',save_best_only=True)

# hist = model.fit(x_train, y_train, epochs=50, batch_size=15, 
#                     validation_data=(x_test, y_test),
#                     callbacks=[early_stop,check_point])

########모델 평가
loss, mae = model.evaluate(x_test, y_test, verbose=0)
print(f'MSE:{loss:.3f} MAE:{mae:.3f}')

 

차트 그리기

import matplotlib.pyplot as plt
# 차트 영역 설정
plt.figure(figsize=(15,6))
plt.subplot(1,2,1) #1행 2열에서 1번째

plt.plot(hist.history['loss'],label='train loss')
plt.plot(hist.history['val_loss'],label='validation loss')
plt.title('Loss')
plt.xlabel('epochs')
plt.ylabel('loss')
plt.legend()

plt.subplot(1,2,2)#1행 2열에서 2번째
plt.plot(hist.history['mae'],label='mae')
plt.plot(hist.history['val_mae'],label='validation mae')
plt.title('MAE')
plt.xlabel('epochs')
plt.ylabel('mae')
plt.legend()

plt.show()

 

3-2-2. 딥러닝_이진분류

#기본 라이브러리
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

#데이터 분할
from sklearn.model_selection import train_test_split   

#딥러닝용 라이브러리
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint

# 경고메세지 끄기
import warnings
warnings.filterwarnings(action='ignore')

########데이터 로드

df = pd.read_csv('./data/titanic_pre.csv')
labels = ['사망', '생존']

##########데이터 분석 및 전처리
#결측치 제거
#형변환
#Feature enginearing(파생변수,스케일링,구간화,피쳐 셀렉션)
#인코딩
##########데이터 분리

#피쳐와 레이블 분리
y_data = df['Survived'] #레이블
x_data = df.drop(['Survived'],axis=1) #피쳐
print(y_data.shape,x_data.shape)

#훈련용과 테스트용 분리
#학습:테스트=7:3
#random_state=777
#stratify=y_data 레이블 균형적으로 분할되도록
x_train, x_test, y_train, y_test = train_test_split(x_data, y_data, test_size=0.3, random_state=777,stratify=y_data)


########모델 (model) 구축

model = Sequential()   

model.add(Dense(units=12, activation='relu',input_shape=(x_train.shape[1], )))
model.add(Dropout(0.3))#과적합방지
model.add(Dense(units=4,activation='relu'))  
model.add(Dropout(0.3))#과적합방지
model.add(Dense(units=1,activation='sigmoid')) #------->이진 분류 이것만 다름



########모델 (model) 컴파일 및 summary

model.compile(loss='binary_crossentropy',optimizer=Adam(),metrics=['accuracy'])#------------>이진분류
model.summary()

########모델 학습

hist = model.fit(x_train, y_train, epochs=50 ,batch_size=15, validation_data=(x_test, y_test))

######################   조기종료, 모델 저장, 과적합 방지 언급시 사용 ####################
######################   아래의 코드를 실행할 시, fit() 코드는 주석처리 필요 #############

# early_stop = EarlyStopping(monitor='val_loss', patience=5)
# check_point = ModelCheckpoint('best_model.h5', monitor='val_loss',save_best_only=True)

# hist = model.fit(x_train, y_train, epochs=50, batch_size=15, 
#                     validation_data=(x_test, y_test),
#                     callbacks=[early_stop,check_point])


#######모델 평가
loss,acc = model.evaluate(x_test, y_test)
print(f'정확도: {acc:.3f}')

 

3-2-3. 딥러닝_다중 분류

#기본 라이브러리
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

#데이터 분할
from sklearn.model_selection import train_test_split   

#딥러닝용 라이브러리
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint

# 경고메세지 끄기
import warnings
warnings.filterwarnings(action='ignore')

########데이터 로드

df = pd.read_csv('./data/iris_pre.csv')

labels = ['setosa', 'versicolor','virginica']

##########데이터 분석 및 전처리
#결측치 제거
#형변환
#Feature enginearing(파생변수,스케일링,구간화,피쳐 셀렉션)
#인코딩
##########데이터 분리
#피쳐와 레이블 분리
y_data = df['species'] #레이블
x_data = df.drop(['species'],axis=1) #피쳐
print(y_data.shape,x_data.shape)

#훈련용과 테스트용 분리
#학습:테스트=7:3
#random_state=777
#stratify=y_data 레이블 균형적으로 분할되도록

x_train, x_test, y_train, y_test = train_test_split(x_data, y_data, test_size=0.3, random_state=777,stratify=y_data)

########모델 (model) 구축

model = Sequential()   

model.add(Dense(units=8, activation='relu',input_shape=(x_train.shape[1], ))) #입력/히든 
model.add(Dropout(0.3))#과적합방지
model.add(Dense(units=4,activation='relu'))  
model.add(Dropout(0.3))#과적합방지
model.add(Dense(units=3,activation='softmax')) #------->다중 분류 

########모델 (model) 컴파일 및 summary

# 다중분류:레이블에 라벨 인코딩 적용시 사용
model.compile(loss='sparse_categorical_crossentropy',optimizer=Adam(),metrics=['accuracy'])#---->

# 다중분류:레이블에 원핫인코딩 적용시 사용
model.compile(loss='categorical_crossentropy',optimizer=Adam(),metrics=['accuracy'])
model.summary()

########모델 학습

hist = model.fit(x_train, y_train, epochs=50 ,batch_size=15, validation_data=(x_test, y_test))

######################   조기종료, 모델 저장, 과적합 방지 언급시 사용 ####################
######################   아래의 코드를 실행할 시, fit() 코드는 주석처리 필요 #############
# early_stop = EarlyStopping(monitor='val_loss', patience=5)
# check_point = ModelCheckpoint('best_model.h5', monitor='val_loss',save_best_only=True)

# hist = model.fit(x_train, y_train, epochs=50, batch_size=15, 
#                     validation_data=(x_test, y_test),
#                     callbacks=[early_stop,check_point])


#######모델 평가
loss,acc = model.evaluate(x_test, y_test)
print(f'정확도: {acc:.3f}')

 

4. Matplotlib 사용법

그래프 그리기

# 수치형 피쳐

plt.hist(df['Age'],bins=10)  # bins : 막대 구간 개수
plt.show()

# boxplt
df.boxplot(['Age'])


# 두 변수와의 관계 : scatter
plt.scatter(x=df['Age'], y=df['Fare'], alpha=0.5, color='blue', edgecolors='w', s=50)


# 클래스 분포
df['Survived'].value_counts().plot(kind='bar')

 

5. Seaborn

# 히트맵 그리기
import seaborn as sns
#python 버전 3.10이상
sns.heatmap(df.corr(numeric_only=True),annot=True, annot_kws={'size':7}, cmap=plt.cm.RdYlBu_r, fmt=".2f", linewidth=.5,vmin=-1.0,square=False)

plt.show()

# 특정 변수 각 카테고리별 빈도 수 시각화
plt.figure(figsize=(4, 3))
sns.countplot(data=df, x='Pclass') # 얘만 쳐도 됌. x는 df의 column 명
plt.show()

# jointplot - 두 변수의 관계를 산점도와 히스토그램으로 시각화
plt.figure()
sns.jointplot(data=df, x='Age', y='Fare', kind='scatter')
plt.suptitle("Jointplot of Age vs Fare", y=1.02)
plt.show()

# boxplot
sns.boxplot(data=df, x='Pclass', y='Age')
plt.title("Boxplot of Age by Passenger Class")
plt.show()

# scatter
sns.scatterplot(data=df, x='sepal_length', y='petal_length', hue='species') # hue는 색상

 


이제 실습 코드 알아보기

 

머신러닝, 딥러닝에서 데이터 셋 스케일링

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()

x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)

 

성능향상

1. 노드 수 추가

2. 히든 레이어 추가

 

corr 상관관계 분석으로 데이터 분석

# Reseult_v1 와 관련 있는 변수들 순서대로
df.corr()['Result_v1'].sort_values(ascending=False)

# scatter 그래프 그리기

import matplotlib.pyplot as plt
# 1 = 'blue',-1 = 'red' 처리
df['color'] = df['Result_v1'].map({1:"blue", -1:"red"})

y_list = df.columns

for i in range(0, len(y_list)):
    df.plot(kind='scatter',x='Result_v1',y=y_list[i],s=30, c=df['color'])
    plt.title('Scatter Benign Malicious', fontsize=20)
    plt.xlabel('Result_v1')
    plt.ylabel(y_list[i])
    plt.show()

 

train_test_split은 이렇게도 사용 가능

df의 마지막 열에 정답 값이 있을 때,
즉 0,1,2,3열이 피처, 4열이 라벨링일 때,

# 모든 행 가지고 온 다음, 0:4 -> 즉 0,1,2,3 까지의 값을 가져와라 
X = df.iloc[:,0:len(df.columns)-1].values

# 모든 행 가지고 온 다음, 4열의 값만 가져와라
y = df.iloc[:,len(df.columns)-1].values

 

인덱스 변경

# 서울/경기/인천으로 데이터 정제

df_total=df_total[(df_total['level1_pnu']=='서울특별시')|(df_total['level1_pnu']=='경기도')|(df_total['level1_pnu']=='인천광역시')]
df_total = df_total.reset_index(drop=True)

'데이터 분석' 카테고리의 다른 글

가입 고객 유형 예측 모델링  (0) 2024.11.15
네비게이션 도착시간 예측 모델링  (0) 2024.11.15
악성 사이트 탐지 모델링  (1) 2024.11.15