
데이터 분석을 위한 Python
✔️ 종속변수에 영향을 주는 컬럼 확인
✔️연관 있는 컬럼과 생존율 관계 파악
✔️ 종속변수에 영향을 주는 컬럼 확인
각 컬럼별 생존율(Survived) 확인
# 각 컬럼별 생존율 확인
# 의미 있는 영향을 주는 컬럼을 important_cols에 추가
important_cols = []
for col in data.columns:
# print(col)
print('='*30, col,'='*30 )
# 각 컬럼별 생존율 확인
print(data.groupby(col)['Survived'].mean().sort_values(ascending=False), end='\n\n')
result = data.groupby(col)['Survived'].mean().sort_values(ascending=False)
# 40% 이상 영향(유의미한 영향)을 주는 그룹 판별 및 컬럼 추가
if result[result > 0.4].any():
important_cols.append(col)
print(important_cols)

✔️ 연관 있는 컬럼과 생존율 관계 파악
연관 없는 컬럼 확인
의미 없는 컬럼 확인
PassengerId : 고유식별자이므로 패턴을 학습할 필요 없음
Survived : 종속변수로 사용하기 위해서 필요 없음
Name : 고유문자열이므로 패턴을 학습할 필요 없음
# 제거헤야 할 컬럼 확인
# PassengerId : 고유식별자이므로 패턴을 학습할 필요 없으므로 제거
# Survived : 종속변수로 사용하기 위해서 제거
# Name : 고유문자열이므로 패턴을 학습할 필요 없으므로 제거
important_cols
important_cols.remove('PassengerId')
important_cols.remove('Survived')
important_cols.remove('Name')
print(important_cols)

Pcalss(선실 등급)와 생존율과의 관계 파악
Pclass(선실 등급)가 높을수록 생존율이 높다
= 선실 등급이 낮을수록 생존율이 낮음
# Pclass와 생존율과의 관계 파악
data.groupby('Pclass')['Survived'].mean().sort_values(ascending=False)

Sex(성별)와 생존율과의 관계 파악
Sex(성별)이 female(여성)의 생존율이 남성(male)의 생존율보다 높다(약 3.9배)
# Sex와 생존율과의 관계 파악
data.groupby('Sex')['Survived'].mean().sort_values(ascending=False)

Age(나이)와 생존율과의 관계 파악
나이로 구분하기는 너무 세분화되어 있어 나이대로 변환하여 생존율 파악
80세 이상인 경우는 1개의 데이터 존재하여 1명만 생존한 것으로 확인
전체적으로 나이가 어릴수록 생존율이 높다
# Age와 생존율과의 관계 파악
data.groupby('Age')['Survived'].mean().sort_values(ascending=False)

# Age마다 1 또는 0 으로 구분 -> 세분화되어 있다고 생각하며 나이대별로 구분 고려
# 나이대별로 확인해보기
# 나이대별로 나누는 함수 생성
def age_cat(x):
if x< 10:
return 'under10s'
elif 10 <= x < 20:
return '10s'
elif 10 <= x < 20:
return '10s'
elif 20 <= x < 30:
return '20s'
elif 30 <= x < 40:
return '30s'
elif 40 <= x < 50:
return '40s'
elif 50 <= x < 60:
return '50s'
elif 60 <= x < 70:
return '60s'
elif 70 <= x < 80:
return '70s'
elif 80 <= x < 90:
return '80s'
# 나이대별로 구분하여 변환 적용
data['Age_cat'] = data['Age'].apply(age_cat)
# 나이대(Age_cat)별로 생존율 확인
print(data.groupby('Age_cat')['Survived'].mean().sort_values(ascending=False))
print()
# 80s는 얼마나 존재하는지 확인 -> 1개 데이터
data[data['Age_cat'] == '80s']

SibSp(형제/자매의 수)와 생존율과의 관계 파악
형제/자매의 수가 적을수록 생존율이 높다
= 형제가 많을수록 생존하는 게 쉽지 않은 환경임을 확인
# SibSp와 생존율과의 관계 파악
data.groupby('SibSp')['Survived'].mean().sort_values(ascending=False)

Parch(가족 구성원의 수)와 생존율과의 관계 파악
가족 구성원의 수가 3명(부모+자식 1명)인 경우에 생존율이 가장 높고,
혼자이거나 결혼했거나 혹은 부모1명+자식1명인 경우가 생존율이 유의미하게 높다.
위의 형제/자매의 수와도 연관되어 형제/자매의 수가 적은 경우 생존율이 높은 부분과 연결되는 부분이 있다고 생각
# Parch와 생존율과의 관계 파악
data.groupby('Parch')['Survived'].mean().sort_values(ascending=False)

Ticket(티켓 이름)와 생존율과의 관계 파악
Ticket(티켓 이름)에 따라 생존율을 확인하였으나 너무 세분화되어 있어
Ticket 컬럼의 unique(중복X) 값을 확인하여 문자와 숫자가 섞여 있는 경우가 많은 것을 확인하였고,
Ticket 컬럼의 value_counts를 확인하여 같은 이름의 티켓을 가진 사람들이 존재함을 확인하여
이를 컬럼으로 만들어 생존율을 확인해보았으나 큰 의미가 없다는 사실 확인
=> Ticket(티켓 이름)과 생존율은 크게 연관이 없다는 사실 확인
# Ticket와 생존율과의 관계 파악
data.groupby('Ticket')['Survived'].mean().sort_values(ascending=False)

# Ticket의 unique값 확인
# 문자와 숫자가 섞여 있는 경우가 많음을 확인
print(data['Ticket'].unique())
# Ticket의 value_counts() 확인
# 같은 이름의 티켓을 가진 사람들이 존재한다는 것을 확인
data['Ticket'].value_counts()
# data를 copy 진행
data2 = data.copy()
# 1) 티켓 문자열에서 숫자/문자 접두어 분리
data2['TicketPrefix'] = data2['Ticket'].str.extract(r'([A-Za-z./]+)')
data2['TicketPrefix'].fillna('NONE', inplace=True)
# 2) 같은 티켓을 가진 사람들이 몇 명인지 계산
ticket_counts = data2['Ticket'].value_counts()
data2['TicketGroupSize'] = data2['Ticket'].map(ticket_counts)
# 파생 변수로 다시 그룹별 생존율 확인
print(data2.groupby('TicketPrefix')['Survived'].mean().sort_values(ascending=False).head(20))
print()
print(data2.groupby('TicketGroupSize')['Survived'].mean().sort_values(ascending=False))
# 크게 의미 있는 컬럼이 아니라는 것을 알 수 잇음

Fare(티켓 요금)과 생존율과의 관계 파악
Fare(티켓 요금)에 따라 생존율을 확인하였으나 너무 세분화되어 있어
요금대별로 구분하여 생존율을 확인하였으나 유의미한 결과가 나오지 않아
요금대별과 관련도가 높은 Pcalss(선실 등급) 컬럼과 같이 생존율 관계 파악
=> 선실등급이 1등급이면서 요금이 높은 을 지급한 사람의 생존율이 가장 높고
저요금과 3등급의 선실을 이용하는 사람들의 생존율이 20% 내외로 낮은 것을 확인
# Fare과 생존율과의 관계 파악
data.groupby('Fare')['Survived'].mean().sort_values(ascending=False)

# 구간별로 자르기 : pd.cut(data['컬럼명'], bins=[구간], labels['구간의 이름'])
# 새로운 data 생성
data3 = data.copy()
# Fare을 구분
data3['Fare_cut'] = pd.cut(data3['Fare'], bins=[0,10,20,30,40,50,60,70], labels=['under10', '10s', '20s', '30s', '40s', '50s', '60s'])
# 요금대(Fare_cut)와 생존율의 관계 확인
data3.groupby('Fare_cut')['Survived'].mean().sort_values(ascending=False)

# Fare와 연관 있는 컬럼 확인
# Pclass와 강한 음의 상관 관계가 있는 것을 확인
import seaborn as sns
import matplotlib.pyplot as plt
sns.heatmap(data3[data3.describe().columns].corr(), annot=True,cmap="coolwarm")
plt.show()

# 요금대(Fare_cut)와 Pclass을 통한 생존율의 관계 확인(0 이상인 경우만 확인)
result = data3[['Fare_cut', 'Pclass', 'Survived']].groupby(['Fare_cut', 'Pclass']).mean().sort_values(by='Survived', ascending=False)
result[result['Survived'] > 0]

Embarked(탑승 항구)와 생존율과의 관계 파악
Embarked(탐승 항구) 중 C항구에서 탑승한 사람들이 절반 이상의 생존율을 가진다
# Embarked 생존율의 관계 확인
data3.groupby('Embarked')['Survived'].mean().sort_values(ascending=False)

연관 있는 컬럼 확인
생존(Survived)와 연관 있는 컬럼 : Pclass, Sex, Age, SibSp, Parch, Fare, Embarked
생존(Survived)와 연관이 있어 확인하였지만 큰 연관이 없었던 컬럼 : Ticket
이번 내용에서는 타이타닉 데이터셋 EDA(연관 있는 컬럼과 생존율 관계 파악)에 대해 알아보았습니다.
데이터 분석을 하기 위해서는 가장 꾸준히 공부해야 하는 언어는 파이썬(Python)이라고 생각합니다.
앞으로 꾸준히 파이썬(Python) 내용을 공부하고 정리할테니 파이썬 코딩에 도움이 되었으면 좋겠습니다.
데이터 분석과 관련된 다양한 정보들이 확인하고 싶다면
관심 있는 분들은 방문해서 좋은 정보 얻어가시길 바랍니다.
ECODATALIST
데이터 분석 공부 열심히 하는 중😁
everyonelove.tistory.com
반응형
'Python > 데이터 분석을 위한 Python' 카테고리의 다른 글
| [Python] 파이썬_타이타닉 데이터셋 EDA(Feature Engineering) 및 모델 적용하여 성능 확인 (0) | 2025.05.03 |
|---|---|
| [Python] 파이썬_타이타닉 데이터셋 EDA(결측치 / 이상치 탐색 및 처리) (0) | 2025.05.03 |
| [Python] 파이썬_파이썬의 데이터의 종류와 이상치(outlier) 탐지 및 처리 (5) | 2025.04.30 |
| [Python] 파이썬_중앙값과 최빈값을 활용한 결측치 대체 및 scikit-learn 활용 결측치 대체 (0) | 2025.04.24 |
| [Python] 파이썬_데이터 분석 과정의 결측치 처리 (0) | 2025.04.22 |