푸~하! 담배 한 모금 하고 데이터 분석!
(비흡연자입니다.)
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 |