IT/Data 분석

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

송시 2023. 3. 26. 22:20
728x90

2023.03.25 - [IT/Data 분석] - [우주선 생존] 분석 2회차

 

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

2023.03.23 - [IT/Data 분석] - [우주선 생존] 분석 1회차 [우주선 생존] 분석 1회차 https://www.kaggle.com/competitions/spaceship-titanic Spaceship Titanic | Kaggle www.kaggle.com 우주선에서 시공간 이상으로 승객이 다른 차

songsiaix.tistory.com

 

문자 자체를 연산할 수 있는지 기술적으론 모르겠지만 수학적인 분석이 이루어지기 위해서는 숫자가 유리하다.

 

앞전에 했던 예시 중에 Transported 는 참 거짓의 논리 타입이라 True, False 를 그대로 사용해도 무관하겠지만 이를 숫자로 1, 0 으로 치환 하여 사용할 수도 있다.

 

상관관계를 확인하고자 하였으나 PassengerId 가 object 타입이라 상관관계를 확인할 수 없었다.

 

df2.PassengerId.head()

0    0001_01
1    0002_01
2    0003_01
3    0003_02
4    0004_01
Name: PassengerId, dtype: object

그냥 대충 눈대중으로 보면 _ 앞의 숫자는 가족, 가구 단위일 것 같고 _ 뒤에는 가족, 가구 단위 내의 집계 숫자 같다.

 

뭐 그게 중요하냐, _ 때문에 object 형태로 보여진다는 것과 만약 _ 가 없어서 숫자 형태였다 라고 치더라도 해당 숫자는

 

숫자 자체가 의미를 가지는 수치형 데이터는 아닐 것 이라는 생각이든다.

 

다른 말로 사칙연산이 가능한 데이터의 집합이 아닌, 분류를 위한 범주형 데이터가 된다는 것을 의미한다.

 

그렇다면 학점이나 순위와 같은 순서형 일까? 우편번호와 같은 명목형 일까?

 

숫자 자체에 큰 의미가 존재하지 않을 것 같기에 명목형에 가깝다고 생각이든다.

 

어쨌든 분석 2회차에서는 오브젝트를 특별히 문자를 숫자로 변환하여 연산을 할 수 있도록 하는 방법인 원 핫 인코딩 방식에 대해서 생각을 해보았고 한번 츄라이 해봤다.

 

pd.get_dummies(df.PassengerId).info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 8693 entries, 0 to 8692
Columns: 8693 entries, 0001_01 to 9280_02
dtypes: uint8(8693)
memory usage: 72.1 MB

원 핫 인코딩은 총 갯수 마다 고유의 1 값을 넣음으로써 오브젝트를 대표하게 된다.

 

말이 좀 이상한데 예를 들어 아래와 같이 3개의 시리즈 데이터가 있다고 가정해보자.

animals = pd.Series(['cat','dog','duck'])
print(type(animals))
animals

 
<class 'pandas.core.series.Series'>
0     cat
1     dog
2    duck
dtype: object

이 문자 오브젝트를 숫자로 짝을 맞추기 위해 1로 표현한다

 

총 3개의 행이 있기 때문에 서로가 독립적인 1을 갖기 위해서는 

 

총 3개의 행이 동일하게 필요하다

cat == 1, 0, 0

dog == 0, 1, 0

duck == 0, 0, 1

 

이렇게 고유한 1의 값을 각 데이터와 짝을 이루는 방식을 one hot encoding  이라고 한다.

 

팬더스에는 원 핫 인코딩을 쉽게 할 수 있도록 get_dummies 라는 메소드를 제공하고 있다.

pd.get_dummies(animals)

  cat dog duck
0 1 0 0
1 0 1 0
2 0 0 1

다시 pd.get_dummies(df.PassengerId).info() 앞으로 돌아가보면 

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 8693 entries, 0 to 8692
Columns: 8693 entries, 0001_01 to 9280_02
dtypes: uint8(8693)
memory usage: 72.1 MB

총 8693개의 원 핫 인코딩이 준비되었다.

 

그저 8693개의 오브젝트를 원 핫 인코딩으로 만들어보고 상관관계를 구해보려고 했던 것 뿐인데 72MB를 사용하면서 만들어 냈다.

 

이게 정말 잘한 것인가 맞는 것인가 싶지만 어쨌든 만들어 봤으니 어디 한번 상관관계를 구해보고자 하였으나 어떻게 하는지 몰라서 포기해보고 다음회차를 기약해 본다.

 

겸사겸사 PassengerId 를 명목형 데이터로 변환해보고 상관관계를 구해보자.

 

df2['PassengerId2'] = df2.PassengerId.apply(lambda x: x.replace('_',''))

df2.head()

PassengerIdTransportedPassengerId201234

PassengerId Transported PassengerId2
0001_01 False 000101
0002_01 True 000201
0003_01 False 000301
0003_02 False 000302
0004_01 True 000401

df2.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 8693 entries, 0 to 8692
Data columns (total 3 columns):
 #   Column        Non-Null Count  Dtype 
---  ------        --------------  ----- 
 0   PassengerId   8693 non-null   object
 1   Transported   8693 non-null   bool  
 2   PassengerId2  8693 non-null   object
dtypes: bool(1), object(2)
memory usage: 144.4+ KB

앞에 0 이 붙는 것 때문에 오브젝트로 여전히 인식한다

 

이쯤 되니 명목형데이터가 상관관계를 연산할 수 있는 녀석일까? 하는 의문이 남는다.

 

어쨌든 실수형으로 변경하여 다시 한번 가보자고.

df2 = df2.astype({'PassengerId2':'float64'})

PassengerId Transported PassengerId2
0001_01 False 101.0
0002_01 True 201.0
0003_01 False 301.0
0003_02 False 302.0
0004_01 True 401.0
... ... ...
9276_01 False 927601.0
9278_01 False 927801.0
9279_01 True 927901.0
9280_01 False 928001.0
9280_02 True 928002.0

8693 rows × 3 columns

 

df2.corr()

  Transported PassengerId2
Transported 1.000000 0.021491
PassengerId2 0.021491 1.000000

상관계수는 1에 가까울 수록 매우 확고한 상관 관계가 있다고 말한다.

 

자기 자신에 대한 상관 관계가 1이 나온 이유이기도 하다.

 

명목형 데이터를 억지로 실수로 변환해보고 상관계수를 보니 0.02 그냥 남 만도 못한 관계라고 한다.

 

PassengerId 의 오브젝트를 어떻게 가공하여 활용할 것인지 알지 못하는 상황에서 나의 츄라이를 통해 승객계정과 시공간을 이동한 것과는 관계가 없다는 결론이 나왔다.

 

그러면 다른 녀석들과의 관계를 확인해봐야겠다.

 

2회차에서도 이야기했지만 이제 결측치와의 싸움이 시작될 것 같다. 

 

느낌이 좋다.

728x90

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

[우주선 생존] 분석 5회차  (0) 2023.04.02
[우주선 생존] 분석 4회차  (0) 2023.03.28
[우주선 생존] 분석 2회차  (0) 2023.03.25
[우주선 생존] 분석 1회차  (0) 2023.03.23
[용인시 종량제봉투]분석 1회차  (0) 2023.03.12