본문 바로가기
AI/데이터 사이언스

[AI 부트캠프] DAY 28 - 파이썬 EDA 8

by HOHHOH 2023. 8. 25.

[오늘의 일지]

파이썬 EDA 실시간 강의 - 타이타닉 데이터로 EDA 해보기, 데이터분석을 위한 선형대수학 강의

[상세 내용]

파이썬 EDA

타이타닉 데이터로 EDA 해보기

- 어제는 타이타닉 데이터를 이용해서 생존자와 상관관계가 높은 요소 찾기를 했었습니다. 근데 어제 일지의 앞부분에서 말했던 보통 데이터 분석을 하면 디폴트값처럼 이행해야 하는 3가지 전처리 과정이 있었지만 소개만 하고 할 필요성이 없어서 그냥 넘어갔는데 오늘은 그 전처리 과정 3가지를 자세하게 알아보겠습니다. 

  1.  결측치가 존재하는지
  2.  dtype이 object인 column이 있는지
  3.  target value(예측 대상)의 distribution(분포)이 어떻게 되는지

그리고 이번 데이터를 EDA 하는 주제는 그냥 전처리 과정만 하고 넘어갈 수 없었기 때문에 강사님이 아직 배우지는 않았지만 간단한 머신러닝의 예시를 보여준다고 했습니다. 

  • EDA 주제 : 간단한 머신러닝 과정을 위한 전처리

-  기본적인 전처리 과정 3단계 : 첫 번째 단계는 isnull() 함수를 이용해서 결측치가 가장 많은 칼럼인 'cabin'을 확인합니다. 두 번째 단계는 info() 사용해서 확인이 가능합니다. 그리고 세 번째 단계인 예측값들의 분포 파악은 결측치가 있는 데이터와 없는 데이터로 나눠서 자료를 확인해 보았습니다.(두 개의 자료를 비교해 보면 캐비닛을 가지고 있는 사람들이 생존율이 높았던 것으로 분석할 수 있습니다.) 또 dtype이 object인 값들은 describe()를 사용하면 보이지 않기 때문에 추가적인 전처리가 필요합니다.

# 결측치에 대한 EDA
# titanic[titanic.isnull().any(axis=1)]
cabin = titanic.loc[titanic['Cabin'].isnull()]
cabin_nan = titanic.loc[titanic['Cabin'].notnull()]#cabin = titanic.loc[~titanic['Cabin'].isnull()]
display(cabin.describe())
cabin_nan.describe()
>>>
	PassengerId	Survived	Pclass		Age		SibSp		Parch		Fare
count	687.000000	687.000000	687.000000	529.000000	687.000000	687.000000	687.000000
mean	443.208151	0.299854	2.639010	27.555293	0.547307	0.365357	19.157325
std	259.215905	0.458528	0.589602	13.472634	1.207492	0.827106	28.663343
min	1.000000	0.000000	1.000000	0.420000	0.000000	0.000000	0.000000
25%	214.500000	0.000000	2.000000	19.000000	0.000000	0.000000	7.877100
50%	441.000000	0.000000	3.000000	26.000000	0.000000	0.000000	10.500000
75%	664.500000	1.000000	3.000000	35.000000	1.000000	0.000000	23.000000
max	891.000000	1.000000	3.000000	74.000000	8.000000	6.000000	512.329200

	PassengerId	Survived	Pclass		Age		SibSp		Parch		Fare
count	204.000000	204.000000	204.000000	185.000000	204.000000	204.000000	204.000000
mean	455.401961	0.666667	1.196078	35.829297	0.441176	0.436275	76.141504
std	251.379279	0.472564	0.525961	15.679356	0.628918	0.729976	74.391749
min	2.000000	0.000000	1.000000	0.920000	0.000000	0.000000	0.000000
25%	261.750000	0.000000	1.000000	24.000000	0.000000	0.000000	29.453125
50%	457.500000	1.000000	1.000000	36.000000	0.000000	0.000000	55.220850
75%	684.000000	1.000000	1.000000	48.000000	1.000000	1.000000	89.328150
max	890.000000	1.000000	3.000000	80.000000	3.000000	4.000000	512.329200

 

- 결측치를 대체값으로 대체 혹은 제거 : 결측치 확인 결과 'cabin'과 'age'에서 결측치가 많이 나왔습니다. 'cabin'의 경우에는 원래 캐비닛의 특정 번호값을 가지거나 결측치가 존재했는데 그냥 'is_cabin'이라는 칼럼을 만들어 줘서 캐비닛을 가지고 있다면 1을 결측치를 가지고 있다면 0으로 새로운 데이터를 첨가시켜 줬습니다. 그리고 'age'의 결측치는 나이의 평균값으로 대체했습니다. 그리고 중간에 2개 정도 결측치가 존재하는 행이 있었는데 2개 정도는 과감하게 drop 시켰습니다.

# 결측치에 댕한 전처리 :Cabin -> in_cabin // Age -> Age의 평균값으로 대체 
titanic['is_cabin'] = ~titanic.Cabin.isnull()*1
titanic.Age = titanic.Age.fillna(titanic.Age.mean())
titanic
>>>

PassengerId	Survived	Pclass	Name	Sex	Age	SibSp	Parch	Ticket	Fare	Cabin	Embarked	is_cabin
0	1	0	3	Braund, Mr. Owen Harris	male	22.000000	1	0	A/5 21171	7.2500	NaN	S	0
1	2	1	1	Cumings, Mrs. John Bradley (Florence Briggs Th...	female	38.000000	1	0	PC 17599	71.2833	C85	C	1
2	3	1	3	Heikkinen, Miss. Laina	female	26.000000	0	0	STON/O2. 3101282	7.9250	NaN	S	0
3	4	1	1	Futrelle, Mrs. Jacques Heath (Lily May Peel)	female	35.000000	1	0	113803	53.1000	C123	S	1
4	5	0	3	Allen, Mr. William Henry	male	35.000000	0	0	373450	8.0500	NaN	S	0
...	...	...	...	...	...	...	...	...	...	...	...	...	...
886	887	0	2	Montvila, Rev. Juozas	male	27.000000	0	0	211536	13.0000	NaN	S	0
887	888	1	1	Graham, Miss. Margaret Edith	female	19.000000	0	0	112053	30.0000	B42	S	1
888	889	0	3	Johnston, Miss. Catherine Helen "Carrie"	female	29.699118	1	2	W./C. 6607	23.4500	NaN	S	0
889	890	1	1	Behr, Mr. Karl Howell	male	26.000000	0	0	111369	30.0000	C148	C	1
890	891	0	3	Dooley, Mr. Patrick	male	32.000000	0	0	370376	7.7500	NaN	Q	0
891 rows × 13 columns

 

- 추가적으로 dtype이 object인 column들에 대한 전처리 (Ordinal Enconding : 숫자로 변환) : object 값을 가지고 있는 'sex'와 'embarked' 칼럼들은 숫자로 대체하는 과정을 진행했습니다. object값들은 0부터 n의 값까지 대체되었습니다. 그리고 간단한 머신러닝에 필요 없는 칼럽들은 제거시켜 줬습니다.

titanic= titanic.drop(columns=['PassengerId','Name','Ticket','Cabin'])
titanic= titanic.dropna()
titanic.Sex = pd.factorize(titanic.Sex)[0]
titanic.Embarked = pd.factorize(titanic.Embarked)[0]

titanic
>>>
	Survived	Pclass	Sex	Age	SibSp	Parch	Fare	Embarked	is_cabin
0	0	3	0	22.000000	1	0	7.2500	0	0
1	1	1	1	38.000000	1	0	71.2833	1	1
2	1	3	1	26.000000	0	0	7.9250	0	0
3	1	1	1	35.000000	1	0	53.1000	0	1
4	0	3	0	35.000000	0	0	8.0500	0	0
...	...	...	...	...	...	...	...	...	...
886	0	2	0	27.000000	0	0	13.0000	0	0
887	1	1	1	19.000000	0	0	30.0000	0	1
888	0	3	1	29.699118	1	2	23.4500	0	0
889	1	1	0	26.000000	0	0	30.0000	1	1
890	0	3	0	32.000000	0	0	7.7500	2	0
889 rows × 9 columns

 

- 간단한 머신러닝 돌리고 값 얻기(여긴 그냥 예시입니다.)

! pip install scikit-learn
# training
from sklearn.linear_model import LogisticRegression

x = titanic.drop(columns=['Survived'])
y = titanic.Survived

clf = LogisticRegression()
clf.fit(x,y)
clf.score(x,y)
>>>
0.8042744656917885

 

데이터분석을 위한 선형대수학

- 오늘은 시간 관계상 백터란 무엇인가에 대한 내용만 학습했습니다. 자세한 내용은 아래의 유튜브에 있는 강의 내용을 참고해서 진행되었습니다.

 

[마무리]

 오늘은 전처리 과정을 자세하게 배웠습니다. 실제 데이터에서는 결측치가 차치하는 비율이 꽤 많다고 들었는데 그냥 생각 없이 버릴 수 없는 값이기 때문에 결측치를 대체하는 과정을 시간이 걸리더라도 진행하는 것 같았습니다. 내일이면 데이터분석을 위한 선형대수학 파트를 마무리하고 본격적으로 EDA 프로젝트가 진행될 것으로 보입니다. 부족한 부분이 많지만 프로젝트 과정에서 다른 사람들한테 피해가 가지 않게 최선을 다해야 될 거 같습니다.

반응형

댓글