2023.03.25 - [IT/Data 분석] - [우주선 생존] 분석 2회차
문자 자체를 연산할 수 있는지 기술적으론 모르겠지만 수학적인 분석이 이루어지기 위해서는 숫자가 유리하다.
앞전에 했던 예시 중에 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회차에서도 이야기했지만 이제 결측치와의 싸움이 시작될 것 같다.
느낌이 좋다.
'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 |