관리 메뉴

DeseoDeSeo

[Machine Learning] ex05_titanic 실습. part 02 본문

Python

[Machine Learning] ex05_titanic 실습. part 02

deseodeseo 2023. 9. 1. 17:33
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관계 확인