본문 바로가기

Hello python!/Python_DA

파이썬 데이터처리_타이타닉 데이터 실습

20221102

19일차

 


 

 

우선적으로 중요 라이브러리임포트 해준다.

타이타닉호의 데이터셋의 개요는 위와 같다.

 


우선 데이터를 입맛에 맞게 전처리 하기 위해

데이터를 적재 해준다.

 


 

첫 번째로 해볼것은 컬럼 목록을 가져와 보고

map(str.upper)을 이용해 컬럼 목록을 대문자로 만들어보자

 

* 일반적인 파이썬에서 쓰는 map과 DF에서 map은 다르다.

*  .upper()는 앞의 문자열을 대문자로 바꿔주기때문에 str을 넣어줘야한다.

 

두 번재 방법으로는 data.rename(columns = str.upper)가 있다.

 


 

데이터프레임시리즈 데이터 타입에 대해 함수를 적용하고 싶을때

map()apply()를 사용한다.

df.map() or df.apply()pd.map() or pd.apply()

 


 

'Sex' 컬럼에서 현재 남자는 male 여자는 female로 되있는데

이를 숫자타입 범주형 데이터로 변환 시켜보자

- 남자 : 0 ,여자 : 1

 


우선 숫자타입 범주형 데이터를 넣기 위해 컬럼 'sex_num'을 생성해 준다.

data['sex_num'] = -1

 

* -1 을 스칼라 값으로 대입 시키면 자동으로 브로드캐스팅되어 연산된다.

   그래서 같은 배열 -1인 값으로 새로운 컬럼 시리즈가 생성된다.

 

첫 번째 방법으로는 map을 사용해 딕셔너리 형태로 만들어서 대입해주는 방법이 있다.

data['sex_num'] = data['Sex'].map({'male':0, 'female':1})

 

* df, pd에서 map함수는 ()안의 함수의 기능을 담당하는 주소를 쓰게 해준다.

 


 

두 번째 방법은 함수를 선언하는 것이다.

위와 같이 함수를 정의해주고 .apply().map()에 정의한 함수를 실행 시켜주면된다.


 

두 가지 방법을 쓰면

위 사진과 같이 새로운 컬럼 'sex_num' 에 원하는 데이터로 저장된 모습을 볼 수 있다.

 

 


만약 이름의 길이를 데이터 값으로 저장하고 싶다면

위와 같이 함수를 선언해서 만들어도 되지만

 

 

.map()이나 .apply()를 이용해

len 함수를 넣어 간편하게 저장할 수 있다.

 


이렇게 데이터를 숫자타입 범주형 데이터로 저장해 놓으면

상관계수를 구해 컬럼간의 관계를 유추할 수 있다.

 

 

위의 사진에서 성별과 생존여부관계, 이름과 생존여부관계를 알아보기 위해

상관계수를 구해보았다.

 

* .corr()을 쓰면 데이터 간의 상관도를 수치화 해준다. 

 

성별과 생존여부관계상관계수0.543351이 나왔는데

이는 상관도가 조금 있는 수치이다.

 

반대로 이름과 생존여부관계상관계수0.33235가 나왔는데 

이는 상관도가 아주 아주 조금 있다고 볼 수 있다.


* r = X와 Y가 함께 변하는 정도 / X와 Y가 각각 변하는 정도


data의 Age가 소숫점 아래 까지 나와서 값을 측정하기 불편했다.데이터를 소숫점 첫 번째 자리에서 반올림하고 싶다면round() 함수를 쓰면 된다.

 


나이생존 여부의 상관도를 알아보면

나이가 생존에 큰 상관이 없었다는것을 수치 0.077을 통해 알 수 있다.

 

그래서 혹시 연령대 별로 상관도를 보고 싶을때

위와 같이 'Age'컬럼을 인덱싱한 값들범위를 지정해서 확인할 수 있다.

 


 

데이터를 뽑아오다 보면 결측치(NaN)가 있을 수도 있다.data.isnull().sum()의 코드를 해석하자면

 

.isnull() # 결측치의 여부 확인 True,False로 결과를 보여줌 .sum() # 결측치를 수치화 해서 보기위해 총합으로 표현.count() # 결측치를 수치화 해서 보기위해 개수로 표현

 

으로 해석된다.

 

출력에서 어디 컬럼에 결측치가 몇 개가 있는지 확인 가능하다.

 


만약 전체 데이터의 결측치가 차지하는 비중을 보고 싶다면

결측치를 전체 데이터 개수로 나누고 곱하기 100을 하면 퍼센트 수치가 나온다.

 


 

불필요한 변수 제거가 필요할때가 있다.

그런 상황에선 .drop('컬럼명', axis=1, inplace =True )  # 만약 저장을 하고 싶다면 inplace = True

을 이용해 삭제해 주면 된다.

 

'컬럼명' in df.columns를 사용해서 마지막으로 확인한다.


 

 

'cabin' 컬럼을 보면결측치도 있고 좌석번호도 있다.내가 원하는 비교를 하기 위해서는 정리가 필요한데

 

결측치는 그렇다 쳐도 좌석번호양식(문자 + 숫자)을 통일할 필요성이 느껴진다.

 

결측치'Unknown'좌석번호는 '맨 앞 대문자 알파벳'으로양식을 통일해보자.

 


우선 'deck'라는 컬럼을 만들어주고

 

위의 사진과 같이 cabin_to_deck 함수를 선언했다.

data['cabin']의 데이터들을 보면

데이터 타입이 두 가지이다.

좌석번호 ex) B43(str)  NaN(float)

 

# NaN(결측치)의 데이터 타입은 float 이다.

 

그 결과 조건문을 타입별로 나누어

str 이면 인덱싱한 값float 이면 "unknown" 으로 값을 처리했다.

 


이렇게 선언한 함수를 이용해서 'deck'컬럼에 함수를 적용해서

값이 변환되어 저장된것을 볼 수 있다. 

 


'name'컬럼을 보니 이름이 매우 길고 다양하다.

 

뭔가 하나의 규칙으로 'name' 컬럼을 정리하고 싶을때

 

공통으로 들어있는 Mr. Mrs. 귀족 작위명이 이름에 꼭 들어있다는것을 확인했다.

 

또한 이름문자열로 생각해 구조를 보면,

 

예를 들어 맨 첫 번째 승객 Braund, Mr. Owen Harris 께서는( 실화이기 때문에 실제 인물이시다.. 존칭을 쓰겠다..)

 

성함의 구조를 보면 우선 ', ' 뒤에 Mr. Owen~ 시작되시는것으로 보아

 

슬라이싱을 이용할 수 있다.

 

따라서 ', '로 슬라이싱을 하고 그 다음 배열 Mr.을 얻기 위해 ' '로 슬라이싱 한다면

 

원하는 위치의 문자열을 끄집어 낼 수 있을 것이다.

 

이와 같은 설명을 적용해서 코드를 짜보면

 

 

위와 같이 함수를 정의해서 함수의 정의된 내용은 슬라이싱 부분으로 짜주면

 

값을 자연스럽게 치환해서 저장할 수 있다.

 


 

 

.groupby를 이용해 '  ' 별 '  ' 를 구할 수 있다.


 

 

groupby한 값.transform('연산함수')을 사용하면 집계함수 값으로 대체한다.

 

이제 구한 값들을 age의 결측치에 채워보자.

결측치에 데이터를 넣은 메서드는

.fillna('넣을값') 이기 때문에 위에서 구한 코드를 '넣을값' 자리에 넣어줘서 실행하면 된다.

 

그리고 마지막으로 결측치가 존재하는지 확인하면?

0이 나오므로 없다는것을 확인할 수 있다.

 


 

'Age' 컬럼의 값들을 연령대 별로 구간을 설정해서 저장 해보자.


age_class 함수를 선언해 줘서 대입해 주면?

 

 

위와 같이 나이 마다 범주로 저장해줬다.

그럼 이걸 왜 해줬느냐

바로 시각화를 위해서다.

 

 

.groupby를 이용해 나이 범위생존, 성별을 기준으로 생존데이터프레임으로 보면

나이 범위마다 성별로 몇 분이 살았고 죽으셨는지 알 수 있다.

 

한 가지 놀라웠던점은 .plot()을 임포트를 안해도 바로 쓸 수 있다는 점이다.

위의 bar차트를 좀 더 시각적으로 편하게 보기위해

데이터의 로우인덱스와 컬럼인덱스를 정리 해주면

 

 

위의 코드 처럼 .unstack(0)으로 나이 범위를 올려주고 bar차트는 stacked해주면

bar차트가 좀 더 효율적으로 알 수 있게 변한걸 알 수 있다.

 

이를 인용하여 성별별 생존자, 탑승표 등급별 생존자를 분석해보면

 

위와 같은 코드로 bar차트까지 구현하여 한눈에

 

좋은 객실이 생존에 영향이 있었다라고 알 수 있다.