IT/Data 분석

[우주선 생존] 분석 4회차

송시 2023. 3. 28. 23:58
728x90

2023.03.26 - [IT/Data 분석] - [우주선 생존] 분석 3회차

 

[우주선 생존] 분석 3회차

2023.03.25 - [IT/Data 분석] - [우주선 생존] 분석 2회차 [우주선 생존] 분석 2회차 2023.03.23 - [IT/Data 분석] - [우주선 생존] 분석 1회차 [우주선 생존] 분석 1회차 https://www.kaggle.com/competitions/spaceship-titanic Sp

songsiaix.tistory.com

일단 현재 데이터프레임의 상관관계를 보자.

 

corr() 를 일단 때리는 형태가 많아서 서점에 있는 책들에 많이 있는데 3회차에서는 그냥 좀 돌아가보았다.

  Age RoomService FoodCourt ShoppingMall Spa VRDeck Transported
Age 1.000000 0.068723 0.130421 0.033133 0.123970 0.101007 -0.075026
RoomService 0.068723 1.000000 -0.015889 0.054480 0.010080 -0.019581 -0.244611
FoodCourt 0.130421 -0.015889 1.000000 -0.014228 0.221891 0.227995 0.046566
ShoppingMall 0.033133 0.054480 -0.014228 1.000000 0.013879 -0.007322 0.010141
Spa 0.123970 0.010080 0.221891 0.013879 1.000000 0.153821 -0.221131
VRDeck 0.101007 -0.019581 0.227995 -0.007322 0.153821 1.000000 -0.207075
Transported -0.075026 -0.244611 0.046566 0.010141 -0.221131 -0.207075 1.000000
 

df.corr() 를 통해서 수치로 확인할 수 있고 이를 바탕으로 heatmap 으로 시각화 하여 좀 더 빠르게 인식할 수 있는데 도움을 받을 수 있다.

 

import seaborn as sns

sns.heatmap(df.corr()) 

밝을수록 상관관계가 높은 것인데 대부분 보라색과 검은색으로 상관관계를 찾기 어렵다.

 

우리가 눈여겨볼 만한 부분은 역시 종속변수인 Transported 인데 수치형데이터들과의 상관관계가 없다.

 

어쩌면 결측치로 인해 더더욱 잘 안나올 것일수도 있지 않을까?

 

결측치를 일단한번 채워보자.

 

일단 수치형 데이터를 갖는(float64) Age, RoomService, FoodCourt, ShoppingMall, Spa, VRDeck 만 채워보자

df3 = df.copy()

df3['Age'].fillna(df3['Age'].mean(),inplace=True)

df3['RoomService'].fillna(df3['RoomService'].mode(), inplace=True)

df3['FoodCourt'].fillna(df3['FoodCourt'].mode(), inplace=True)

df3['ShoppingMall'].fillna(df3['ShoppingMall'].mode(), inplace=True)

df3['Spa'].fillna(df3['Spa'].mode(), inplace=True)

df3['VRDeck'].fillna(df3['VRDeck'].mode(), inplace=True)

df3.isna().sum()

 

라고 하였더니 Age 빼고는 모두 그대로 인것을 발견하게 되었다.

 

원인인 즉슨 mode() 를 통해서 최빈값을 구할 때 결과 값으로 type 까지 나오며 시리즈로의 정보가

 

나온다 이 때문에 의도했던 값이 채워지지 않는데 이때는 [0] 을 통해서 숫자만 따로 사용하면 된다.

0    0.0
dtype: float64

df3['RoomService'].fillna(df3['RoomService'].mode()[0], inplace=True)

df3['FoodCourt'].fillna(df3['FoodCourt'].mode()[0], inplace=True)

df3['ShoppingMall'].fillna(df3['ShoppingMall'].mode()[0], inplace=True)

df3['Spa'].fillna(df3['Spa'].mode()[0], inplace=True)

df3['VRDeck'].fillna(df3['VRDeck'].mode()[0], inplace=True)

df3.isna().sum()

PassengerId       0
HomePlanet      201
CryoSleep       217
Cabin           199
Destination     182
Age               0
VIP             203
RoomService       0
FoodCourt         0
ShoppingMall      0
Spa               0
VRDeck            0
Name            200
Transported       0
dtype: int64

다시 한번 히트맵을 때려보자

df3.corr()

AgeRoomServiceFoodCourtShoppingMallSpaVRDeckTransportedAgeRoomServiceFoodCourtShoppingMallSpaVRDeckTransported

  Age RoomService FoodCourt ShoppingMall Spa VRDeck Transported
Age 1.000000 0.068425 0.127343 0.032846 0.121071 0.099551 -0.074249
RoomService 0.068425 1.000000 -0.015126 0.052337 0.009244 -0.018624 -0.241124
FoodCourt 0.127343 -0.015126 1.000000 -0.013717 0.221468 0.224572 0.045583
ShoppingMall 0.032846 0.052337 -0.013717 1.000000 0.014542 -0.007849 0.009391
Spa 0.121071 0.009244 0.221468 0.014542 1.000000 0.147658 -0.218545
VRDeck 0.099551 -0.018624 0.224572 -0.007849 0.147658 1.000000 -0.204874
Transported -0.074249 -0.241124 0.045583 0.009391 -0.218545 -0.204874 1.000000

sns.heatmap(df3.corr())

거의 차이가 없다.

 

결측치를 채우는 방법을 평균값과 최빈값으로 했는데 Age의 경우는 아주 작은 수치지만 오히려 상관관계가 더 떨어졌다.

 

일단은 오늘은 이정도로 하자.

 

다음은 결측치에 대한 추가 고민을 해보거나 수치데이터인 녀석들이 그냥 종속변수에(Transported)와 관련이 없는 것일 수 있다.

 

1. 결측치에 대한 추가 고민을 해본다

2. 다른 독립변수들을 토대로 종속변수와의 상관을 찾아본다

3. 상관에만 의조할 일이 아닐 수 있다. 다른 방안을 추가 공부해본다

728x90

'IT > Data 분석' 카테고리의 다른 글

[우주선 생존] 분석 6회차  (0) 2023.04.04
[우주선 생존] 분석 5회차  (0) 2023.04.02
[우주선 생존] 분석 3회차  (0) 2023.03.26
[우주선 생존] 분석 2회차  (0) 2023.03.25
[우주선 생존] 분석 1회차  (0) 2023.03.23