DeseoDeSeo
[Machine Learning] ex05_titanic 실습. part 02 본문
test - Fare컬럼에 결측치가 있는 행 정보 출력하기.
test[test['Fare'].isnull()]
fillna()
- Fare 결측치 채워보기( Pclas의 3등급 사람들에게 결측치가 있음)
# 3등급 -> 8.0500로 채우기.
test['Fare'] = test['Fare'].fillna(8.0500)
test[test['Fare'].isnull()]
# 아무것도 출력되지 않으면 잘 처리 된 것임.!
Age 컬럼 결측치 채우기
- 단순 기술 통계로만 채우지 않고, 다른 컬럼과의 상관관계를 이용해서 결측치를 채워보는 방향으로 진행해보자.
- Pclass, Sex와 연관지어서 나이통계 확인해보자.
train age 컬럼 접근해서 기술 통계량 확인하기
train['Age'].describe()
- 가장 어린 나이가 0살, 가장 나이가 많은 사람이 80살.
- 평균, 중앙값의 큰 차이가 없음.
- 평균치로 데이터를 처리해보자.
2개의 그룹으로 묶음( ' Pclass' 와 'Sex' )
# 1등급의 여성의 나이 평균
# 1등급의 남성의 나이 평균
# 2등급의 여성 나이의 평균
# 2등급의 남성 나이의 평균
# 3등급의 여성 나이의 평균
# 3등급의 남성 나이의 평균
# train.loc[:,['Pclass','Sex','Age']]
gb1 = train[['Pclass','Sex','Age']].groupby(['Pclass','Sex']).mean()
gb1
인덱스가 2개 => 멀티 인덱스 (중복 인덱스) ( => 'Pclass', 'Sex')
# 3등석 female 평균 나이 데이터 접근해보기
#gb1.loc[(승객 등급, 성별)]
gb1.loc[(3,'female')]
1등석 male평균 나이 접근해보기
gb1.loc[(1,'male')]
- train, test 결측치 구하기
- train Age컬럼의 결측치가 있는 행 정보 출력해보기
1. Age 접근 2. null 확인 3. 불리언 인덱싱 적용
-> 행정보 출력됨.
train['Age']
train['Age'].isnull()
- train [ train [ ' Age ' ] ] 는 'Age'열의 값을 조건으로 사용하여 선택한 행을 반환
- train [ ' Age ' ] 는 'Age'열의 값을 가지는 시리즈를 반환
train[train['Age'].isnull()]
복잡한 처리를 해줄 수 있는 도구가 있나?
# 사용자 정의 함수 생성 필요 : Pclass, Sex을 확인해서 gb1에 있는 평균 나이로 대체.
이 기능이랑 pandas 데이터랑 연결 - > apply()
# train[ ['Pclass','Sex']].apply(사용자함수, axis=0)
apply ex)
train[ ['Pclass','Sex']]
def test_def(data):
print(data['Pclass'],data['Sex'])
train[ ['Pclass','Sex']].apply(test_def, axis=1)
def test_def(data):
print(data)
train.apply(test_def, axis=1)
- axis= 1 은 한 사람에 대한 정보가 처리 단위로 연결됨.
< 추가적으로 이해하는 코드 >
# numpy에서 null값을 확인하는 함수
Nan
a = np.array([1,2,np.nan])
np.isnan(a[2])
< dtype :object >
=> 여러타입의 데이터가 함께 있으면 object임.
def fill_age(data):
# 만약 나이가 결측치라면 gb1에서 대체할 값을 가져오고 반환
if np.isnan(data['Age']):
gb1_age = gb1.loc[(data['Pclass'],data['Sex'])]
return gb1_age
else:
return data['Age']
# 결측치가 x 원래 나이 값을 반환.
# astype('int64') => integer로 맞춰짐.
train['Age'] = train.apply(fill_age,axis=1).astype('int64')
train.info()
test Age컬럼 결측치 처리하기
test 결측치를 채울 때, train(모델의 일반화 도움을 주는) 데이터를 기준으로 채워줌.
test['Age'] = test.apply(fill_age,axis=1).astype('int64')
test['Age'].isnull().sum()
< cabin 컬럼 결측치 채우기 >
train['Cabin'].unique()
'M' 임의로 Cabin 결측치를 채워보기
train['Cabin'] =train['Cabin'].fillna('M')
test['Cabin'].fillna('M', inplace =True)
train.info()
test.info()
train Cabin 접근해서 살펴보기
train['Cabin'][2][0]
판다스.str 해당 컬럼에 문자열 자료에 접근하는 키워드
train['Deck']=train['Cabin'].str[0] #Deck 이라는 새로운 컬럼명 생성하여 저장
test도 실행해보기
test['Deck']=test['Cabin'].str[0]
cabin컬럼 삭제하기 : df.drop(['대상','대상'])
- axis=1 열의 방향. axis=0 행의방향
- 삭제 2번 하면 오류가 남.
train =train.drop('Cabin',axis=1)
test.drop('Cabin', axis=1, inplace =True)
train.info()
test.info()
데이터 탐색
- train 데이터를 이용해서 탐색 진행함.
- test를 탐색하는 것은 모델의 일반화에 도움 안됨.
- Deck 컬럼이 생존/사망과 얼마나 연관이 있는지 확인해보기
시각화
# x - Deck, y - Survived # hue 가 y 축임.
sns.countplot(data = train, x='Deck', hue ='Survived')
- M에서 상대적으로 사망자 수 多
- Pclass와 Survived 컬럼의 관계확인 필요( 생존/사망과 연관 유무)
plt.figure(figsize=(5,3))
sns.countplot(data=train, x='Pclass', hue ='Survived')
plt.show()
- 승객의 등급이 높을 수 록 비교적 생존율 높음.
- 3등급의 승객들 중에서 사망자 多
- Deck 와 Pclass 시각화
sns.countplot(data = train, x='Deck', hue='Pclass')
plt.show()
- M(결측치)안에는 3등급의 사람들이 많아서 사망율이 높게 출력됨.
- Sex와 Survived 관계 확인해보기
sns.countplot(data = train, x='Sex', hue='Survived')
plt.show()
- male 사망율이 높음, female 비교적 생존율이 높음.
- Embarked와 Survived 관계 확인해보기
sns.countplot(data = train, x='Embarked', hue='Survived')
plt.show()
- Embarked와 Pclass관계 확인
'Python' 카테고리의 다른 글
[ Machine Learning ] ex06_타이타닉실습_앙상블모델 (0) | 2023.09.05 |
---|---|
[ Machine Learning ] Ex05_titanic 실습_part.03 (0) | 2023.09.04 |
[ Machine Learning ] ex05_titanic 분류실습 (0) | 2023.08.31 |
[ Machine Learning ] ex04_mushroom_part.02 (1) | 2023.08.31 |
< Dataframe 인덱싱 > (0) | 2023.08.31 |