import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import LabelEncoder
'''탐색적 데이터 분석
pclass 별로 성별에 따른 생존율의 차이가 있는지 확인
sns.barplot(x='Pclass',y='Survived',hue='Sex',data=df1)
'''
df1 = sns.load_dataset('titanic')
'''
어떤 변수들이 문자 혹은 카테고리 타입인지 확인
df1.dtypes
숫자데이터로 변경 필요
sex, embarked , deck 변수를 숫자로 바꾸기 위해 어떻게 해야 할까
각 변수의 유니크 항목들을 확인한 후, 임의의 숫자로 변경
시리즈.unique
'''
# print(df1.dtypes)
# print(df1.sex.unique)
df1.groupby(['sex', 'pclass']).age.agg(['median'])
#Age결측치를 성별,pclass에 따른 중앙값 채우기
m1_med=df1.loc[(df1.sex=='male') &(df1.pclass== 1),'age'].median()
m2_med=df1.loc[(df1.sex=='male') &(df1.pclass== 2),'age'].median()
m3_med=df1.loc[(df1.sex=='male') &(df1.pclass== 3),'age'].median()
f1_med=df1.loc[(df1.sex=='female') &(df1.pclass== 1),'age'].median()
f2_med=df1.loc[(df1.sex=='female') &(df1.pclass== 2),'age'].median()
f3_med=df1.loc[(df1.sex=='female') &(df1.pclass== 3),'age'].median()
df1.loc[(df1.sex=='male')&(df1.pclass==1)&(df1.age.isna()),'age']=m1_med
df1.loc[(df1.sex=='male')&(df1.pclass==2)&(df1.age.isna()),'age']=m2_med
df1.loc[(df1.sex=='male')&(df1.pclass==3)&(df1.age.isna()),'age']=m3_med
df1.loc[(df1.sex=='female')&(df1.pclass==1)&(df1.age.isna()),'age']=f1_med
df1.loc[(df1.sex=='female')&(df1.pclass==2)&(df1.age.isna()),'age']=f2_med
df1.loc[(df1.sex=='female')&(df1.pclass==3)&(df1.age.isna()),'age']=f3_med
df1.isna().sum()
df1.age_new = 0
#노인의 생존율(50세 이상)
#유아의 생존율(10세 미만)
df1.loc[df1.age >=50, 'age_new'] = 'old'
df1.loc[(df1.age <50) & (df1.age >10), 'age_new'] = 'young'
df1.loc[df1.age <=10, 'age_new'] = 'baby'
df1.age.fillna('N', inplace=True)
df1.isna().sum()
df1.embarked.fillna('S', inplace=True)
df1.deck = df1.deck.astype('object')
df1.deck.fillna('N',inplace=True)
#유니크 데이터 바꾸기
for columns in ['sex','embarked','age_new','deck']:
datas = df1[columns].unique()
for no, data in enumerate(datas):
df1[columns].replace(data, no,inplace=True)
#컬럼 유니크 값 확인
for columns in ['sex','embarked','age_new','deck']:
print(df1[columns].unique())
'''데이터 인코딩
문자열로 숫자로 바꾸는 2가지 방법
'''
#객체 생성
tiencoder = LabelEncoder()
df2 =df1.copy()
tiencoder.fit(df2['sex'])
labels = tiencoder.transform(df2['sex'])
print(df2.dtypes)
df1.isna().sum()
df = df1.drop(['class', 'alive', 'embark_town', 'who', 'adult_male', 'alone','age_new'], axis=1)
df1 = df.copy()
df2 = df.copy()
df1
df1.std()
df1.mean()
# 전체 변수의 최소, 최대값 확인
# 전체 변수 min max 피처 스케일링 진행
# 변경 후 각 변수의 최소, 최대값 등 분포 확인
# 각 변수의 그래프 확인
df1_fs = (df1 - df1.mean())/df1.std()
print('mean: ')
print(df1_fs.mean())
print('std : ')
print(df1_fs.std())
fig = plt.figure(figsize=(10, 10))
for no, i in enumerate(df1_fs.columns):
globals()[f'ax{no+1}'] = fig.add_subplot(3,3,no+1)
sns.distplot(df1_fs[i], ax=globals()[f'ax{no+1}'])
# plt.show()
globals()
df1_fs
from sklearn.preprocessing import StandardScaler, MinMaxScaler, MaxAbsScaler
scaler = StandardScaler()
scaler.fit()