[8주차 - Day3] 케글 경진대회 - Spaceship Titanic

2023. 6. 23. 14:00BOOTCAMP/프로그래머스 인공지능 데브코스

케글 데이터 소개

Spaceship Titanic

 

Spaceship Titanic | Kaggle

 

www.kaggle.com

"Spaceship Titanic" 데이터 셋은 2912년에 일어난 가상의 우주 사고를 기반으로 합니다. 이 데이터 셋은 거의 13,000명의 승객을 운송하던 우주선 'Spaceship Titanic'이 우주 먼지 구름 안에 숨겨진 시공간 이상 현상과 충돌한 사건을 다룹니다.

 

이 사건으로 인해 승객들의 절반 가량이 다른 차원으로 이동했으며, 구조팀을 도와 승객들을 찾기 위해 우주선의 손상된 컴퓨터 시스템에서 복구된 기록을 사용하여 어떤 승객들이 이상 현상에 의해 이동되었는지 예측해야 합니다.

 

파일 및 데이터 필드 설명

 

train.csv - 약 2/3 (~8700명)의 승객에 대한 개인 기록으로, 훈련 데이터로 사용

PassengerId - 각 승객에 대한 고유 ID. 각 ID는 gggg_pp 형태를 가지며, 여기서 gggg는 승객이 함께 여행하는 그룹을 나타냄. pp는 그룹 내에서의 번호이며, 그룹에 있는 사람들은 대부분 가족으로 구성

HomePlanet - 승객이 출발한 행성으로, 일반적으로 그들의 영구 거주 행성

CryoSleep - 승객이 여행 기간 동안 중단된 애니메이션 상태에 놓이기로 선택했는지 여부를 나타냄.  CryoSleep 상태의 승객들은 객실에 제한

Cabin - 승객이 머무르는 객실 번호. deck/num/side 형태를 가지며, 여기서 side는 Port를 나타내는 P 또는 Starboard를 나타내는 S가 됨

Destination - 승객이 하차할 행성

Age - 승객의 나이

VIP - 승객이 여행 동안 특별한 VIP 서비스를 이용했는지 여부

RoomService, FoodCourt, ShoppingMall, Spa, VRDeck - 승객이 타이타닉 우주선의 다양한 고급 편의 시설에서 청구한 금액

Name - 승객의 이름

Transported - 승객이 다른 차원으로 이동했는지 여부. 이것이 목표로, 예측하려는 열

test.csv - 나머지 1/3 (~4300명)의 승객에 대한 개인 기록으로, 테스트 데이터로 사용되며 이 세트의 승객에 대해 Transported 값을 예측하는 것이 작업

sample_submission.csv - 올바른 형식의 제출 파일

PassengerId - 테스트 세트의 각 승객에 대한 ID

Transported - 목표로 각 데이터셋 설명

 

코드

 

# 라이브러리 불러오기
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import LabelEncoder
from sklearn.impute import SimpleImputer
# 데이터 미리보기
print(train_data.head())
print(test_data.head())

 

PassengerId HomePlanet CryoSleep  Cabin  Destination  Age VIP  \

0     0001_01     Europa     False  B/0/P  TRAPPIST-1e  39.0  False   
1     0002_01      Earth     False  F/0/S  TRAPPIST-1e  24.0  False   
2     0003_01     Europa     False  A/0/S  TRAPPIST-1e  58.0   True   
3     0003_02     Europa     False  A/0/S  TRAPPIST-1e  33.0  False   
4     0004_01      Earth     False  F/1/S  TRAPPIST-1e  16.0  False   

   RoomService  FoodCourt  ShoppingMall     Spa  VRDeck  Name  \

0          0.0        0.0           0.0     0.0     0.0    Maham Ofracculy   
1        109.0        9.0          25.0   549.0    44.0       Juanna Vines   
2         43.0     3576.0           0.0  6715.0    49.0      Altark Susent   
3          0.0     1283.0         371.0  3329.0   193.0       Solam Susent   
4        303.0       70.0         151.0   565.0     2.0  Willy Santantines   

Transported  

0        False  
1         True  
2        False  
3        False  
4         True  

PassengerId HomePlanet CryoSleep  Cabin  Destination   Age    VIP  \

0     0013_01      Earth      True  G/3/S  TRAPPIST-1e  27.0  False   
1     0018_01      Earth     False  F/4/S  TRAPPIST-1e  19.0  False   
2     0019_01     Europa      True  C/0/S  55 Cancri e  31.0  False   
3     0021_01     Europa     False  C/1/S  TRAPPIST-1e  38.0  False   
4     0023_01      Earth     False  F/5/S  TRAPPIST-1e  20.0  False   

RoomService  FoodCourt  ShoppingMall   Spa  VRDeck   Name  

0          0.0        0.0           0.0     0.0     0.0   Nelly Carsoning  
1          0.0        9.0           0.0  2823.0     0.0    Lerome Peckers  
2          0.0        0.0           0.0     0.0     0.0   Sabih Unhearfus  
3          0.0     6652.0           0.0   181.0   585.0  Meratz Caltilter  
4         10.0        0.0         635.0     0.0     0.0   Brence Harperez 
# 결측치 확인
print(train_data.isnull().sum())
print(test_data.isnull().sum())
PassengerId       0
HomePlanet      201
CryoSleep       217
Cabin           199
Destination     182
Age             179
VIP             203
RoomService     181
FoodCourt       183
ShoppingMall    208
Spa             183
VRDeck          188
Name            200
Transported       0
dtype: int64
PassengerId       0
HomePlanet       87
CryoSleep        93
Cabin           100
Destination      92
Age              91
VIP              93
RoomService      82
FoodCourt       106
ShoppingMall     98
Spa             101
VRDeck           80
Name             94
dtype: int64
# 데이터 요약하기
train_data.describe()

# 데이터 정보 확인
print(train_data.info())
print(test_data.info())
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 8693 entries, 0 to 8692
Data columns (total 14 columns):
 #   Column        Non-Null Count  Dtype  
---  ------        --------------  -----  
0   PassengerId   8693 non-null   object 
1   HomePlanet    8492 non-null   object 
2   CryoSleep     8476 non-null   object 
3   Cabin         8494 non-null   object 
4   Destination   8511 non-null   object 
5   Age           8514 non-null   float64
6   VIP           8490 non-null   object 
7   RoomService   8512 non-null   float64
8   FoodCourt     8510 non-null   float64
9   ShoppingMall  8485 non-null   float64
10  Spa           8510 non-null   float64
11  VRDeck        8505 non-null   float64
12  Name          8493 non-null   object 
13  Transported   8693 non-null   bool   
dtypes: bool(1), float64(6), object(7)
memory usage: 891.5+ KB
None
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4277 entries, 0 to 4276
Data columns (total 13 columns):
#   Column        Non-Null Count  Dtype  
---  ------        --------------  -----  
0   PassengerId   4277 non-null   object 
1   HomePlanet    4190 non-null   object 
2   CryoSleep     4184 non-null   object 
3   Cabin         4177 non-null   object 
4   Destination   4185 non-null   object 
5   Age           4186 non-null   float64
6   VIP           4184 non-null   object 
7   RoomService   4195 non-null   float64
8   FoodCourt     4171 non-null   float64
9   ShoppingMall  4179 non-null   float64
10  Spa           4176 non-null   float64
11  VRDeck        4197 non-null   float64
12  Name          4183 non-null   object 
dtypes: float64(6), object(7)
memory usage: 434.5+ KB
None
# 타겟 변수 분포 확인
sns.countplot(x='Transported', data=train_data)
plt.show()

# 수치형 변수 분포 확인
train_data.hist(figsize=(10, 10))
plt.tight_layout()
plt.show()

# 범주형 변수 분포 확인
categorical_features = ['HomePlanet', 'CryoSleep', 'Cabin', 'Destination', 'VIP']
for feature in categorical_features:
    sns.countplot(x=feature, data=train_data)
    plt.show()

# 훈련 데이터와 테스트 데이터 합치기
all_data = pd.concat([train_data, test_data], axis=0)

 

# 레이블 인코딩
le = LabelEncoder()
categorical_features = ['HomePlanet', 'CryoSleep', 'Cabin', 'Destination', 'VIP']
for feature in categorical_features:
    all_data[feature] = le.fit_transform(all_data[feature].astype(str))
# 결측치 처리
imputer = SimpleImputer(strategy='most_frequent')

train_data_without_target = train_data.drop(['Transported'], axis=1)

imputer.fit(train_data_without_target)

train_data_imputed = pd.DataFrame(imputer.transform(train_data_without_target))
test_data_imputed = pd.DataFrame(imputer.transform(test_data))

train_data_imputed.columns = train_data_without_target.columns
test_data_imputed.columns = train_data_without_target.columns

train_data_imputed['Transported'] = train_data['Transported']
# 'PassengerId'와 'Name' 열 제거
train_data_imputed = train_data_imputed.drop(['PassengerId', 'Name'], axis=1)
test_data_imputed = test_data_imputed.drop(['PassengerId', 'Name'], axis=1)
# 범주형 변수를 수치형으로 변환
ohe = OneHotEncoder(handle_unknown='ignore')

train_data_without_target_encoded = ohe.fit_transform(train_data_imputed.drop(['Transported'], axis=1))
test_data_encoded = ohe.transform(test_data_imputed)
# 데이터 분할
X_train = train_data_without_target_encoded
y_train = train_data_imputed['Transported']

X_test = test_data_encoded
# 모델 학습
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)

# 예측
predictions = rf.predict(X_test)
# 결과 출력
print(predictions)

 

[ True False True... True False False]
# 예측 결과를 DataFrame으로 변환
predictions_df = pd.DataFrame(predictions, columns=['Transported'])
# PassengerId 열 추가
predictions_df['PassengerId'] = test_data['PassengerId']
# 'PassengerId'를 첫 번째 열로 이동
cols = predictions_df.columns.tolist()
cols = cols[-1:] + cols[:-1]
predictions_df = predictions_df[cols]
# 예측 결과를 CSV 파일로 저장
predictions_df.to_csv('submission.csv', index=False)

 

 

Submission