1. 세 개의 파일로 시작하는 생존 예측의 첫 걸음#
데이터 과학 동아리 - 첫 번째 모임
프롬: 다안 선배, 동아리 첫 활동인데 이번에 타이타닉 생존자 예측에 도전해보고 싶어요. 캐글에서 데이터 분석 입문으로 가장 유명하다고 들었거든요! 근데 솔직히 어디서부터 시작해야 할지 모르겠어요.
다안: 좋은 주제를 선택했네! 타이타닉 데이터 분석은 데이터 사이언스 입문자들이 가장 많이 시작하는 프로젝트 중 하나야. 실제 역사적 사건을 다루면서도 패턴을 발견하는 재미가 있어서 우리 동아리 활동으로 딱이지. 일단 데이터부터 살펴보는 게 첫 단계야.
코더블: 맞아요, 선배. 제가 지난 주말에 미리 파일들을 다운로드 받았어요. train.csv, test.csv, gender_submission.csv 이렇게 세 개가 있네요. 이걸 먼저 파이썬으로 불러와볼까요?
다안: 그래, 그게 좋겠다. 오늘 동아리 시간에는 이 데이터의 기본 구조를 이해하는 게 목표야. 이 세 파일은 각각 다른 목적이 있어서, 마치 교재, 시험문제, 답안지 같은 역할을 한다고 볼 수 있어.
데이터 파일 이해하기#
다안: 이번 동아리 시간에 분석할 타이타닉 생존자 예측 프로젝트는 세 개의 CSV 파일로 구성되어 있어:
train.csv는 학습용 데이터야. 실제 승객들의 특성과 생존 여부가 기록된 데이터로, 모델이 “어떤 특성을 가진 승객이 생존했는가?”를 학습하는 데 사용돼. 이건 문제랑 답이 같이 있는 교재라고 생각하면 좋겠어.
test.csv는 평가용 데이터야. 승객들의 특성만 제공되고, 생존 여부는 제공되지 않아. 우리가 만들 인공지능 모델이 이 승객들의 생존 여부를 예측해야 해. 이건 마치 배운 내용을 확인하는 시험문제 같은 거지. 시험지에는 답이 없는 것처럼, 여기에는 생존 여부가 적혀있지 않아.
gender_submission.csv는 제출 양식이야. 예측 결과를 제출할 때 사용하는 형식으로, 승객 ID와 예측한 생존 여부를 포함해. 이건 답안지에 해당해.
프롬: 음, 그럼 train 데이터로 공부하고, test 데이터로 시험을 보는 거네요? 우리 동아리 활동으로 딱이겠어요!
다안: 정확히 그렇지! 오늘 동아리 시간에는 이 파일들을 실제로 살펴보면서 데이터가 어떻게 생겼는지 확인해보자.
💡 데이터 파일의 역할 요약
train.csv: 교재 (문제와 답)
test.csv: 시험문제 (문제만)
gender_submission.csv: 답안지 (제출 양식)
데이터 살펴보기#
코더블: 동아리 노트북으로 데이터를 읽어오는 코드부터 작성해볼게요. Pandas 라이브러리를 사용해서 CSV 파일을 읽고 데이터프레임이라는 형태로 저장할 거예요. 이렇게 하면 엑셀처럼 표 형태로 데이터를 다룰 수 있어요.
import pandas as pd
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
submission = pd.read_csv('gender_submission.csv')
프롬: 나는 코딩을 잘 모르니까 프롬프트로 해볼게요! 동아리 활동에서도 이렇게 하면 되는 거죠?
# 프롬프트
우리가 가진 세 개의 파일(train.csv, test.csv, gender_submission.csv)을 읽고,
각각 train, test, submission이라는 이름으로 저장해줘
다안: 훌륭해! 둘 다 잘 불러왔네. 프롬은 프롬프트로, 코더블은 직접 코딩으로 말이야. 우리 동아리에서는 두 가지 방법 모두 배워볼 거야. 각자 자신에게 맞는 방식을 선택하면 돼.
프롬, 네가 시도한 프롬프트 방식은 단순히 코딩을 모르는 사람들을 위한 편의 도구가 아니야. 오히려 질문을 통해 데이터를 탐색하는 새로운 사고방식을 익히게 해줄 거야. 때로는 “이 데이터에서 왜 이런 패턴이 나타날까?”라는 질문이 정확한 코드를 짜는 것보다 더 중요하거든.
이제 데이터를 살펴볼까?
프롬: 데이터의 크기가 궁금한데요, 이것도 프롬프트로 알아볼 수 있을까요?
# 프롬프트
방금 만든 train, test, submission 데이터의 크기를 알려줘
코더블: 저는 직접 코드로 확인해볼게요. shape 속성을 사용하면 데이터프레임의 행과 열의 개수를 튜플 형태로 얻을 수 있어요.
print("train data shape:", train.shape)
print("test data shape:", test.shape)
print("submission data shape:", submission.shape)
train data shape: (891, 12)
test data shape: (418, 11)
submission data shape: (418, 2)
다안: 출력 결과를 보니 흥미로운 패턴이 보이네. train 데이터는 891명의 승객 정보에 특성이 12개, test 데이터는 418명의 승객 정보에 특성이 11개야. test에 하나 적은 이유는 생존 여부(Survived) 컬럼이 없기 때문이지. submission 데이터는 418명의 ID와 우리가 예측할 생존 여부, 이렇게 2개 컬럼으로 구성되어 있어.
프롬: 그럼 실제 데이터는 어떻게 생겼는지 볼 수 있을까요?
# 프롬프트
train 데이터의 내용을 위에서부터 5명만 보여줘
코더블: 저는 head()
메서드를 사용해서 확인해볼게요. 이 메서드는 데이터프레임의 첫 5개 행을 보여주는데, 괄호 안에 숫자를 넣으면 원하는 수만큼 행을 볼 수 있어요.
train.head()
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35.0 | 1 | 0 | 113803 | 53.1000 | C123 | S |
4 | 5 | 0 | 3 | Allen, Mr. William Henry | male | 35.0 | 0 | 0 | 373450 | 8.0500 | NaN | S |
다안: 좋아! 이제 데이터의 구조를 확인할 수 있네. 각 컬럼이 의미하는 바를 간단히 살펴보자:
PassengerId: 승객 고유 번호
Survived: 생존 여부 (1: 생존, 0: 사망)
Pclass: 객실 등급 (1: 1등석, 2: 2등석, 3: 3등석)
Name: 승객 이름
Sex: 성별
Age: 나이
SibSp: 함께 승선한 형제자매, 배우자 수
Parch: 함께 승선한 부모, 자녀 수
Ticket: 티켓 번호
Fare: 요금
Cabin: 객실 번호 (예: ‘C85’처럼 알파벳과 숫자로 구성되어 있어요. 이 알파벳에는 뭔가 의미가 있을지도 모르겠네요!)
Embarked: 승선 항구 (C: Cherbourg 프랑스, Q: Queenstown 아일랜드, S: Southampton 영국)
프롬: test 데이터도 볼 수 있을까요?
# 프롬프트
test 데이터의 첫 5행을 보여줘
코더블: 저도 test 데이터를 확인해볼게요. train과 구조는 비슷하지만 한 가지 중요한 차이가 있을 거예요.
test.head()
PassengerId | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 892 | 3 | Kelly, Mr. James | male | 34.5 | 0 | 0 | 330911 | 7.8292 | NaN | Q |
1 | 893 | 3 | Wilkes, Mrs. James (Ellen Needs) | female | 47.0 | 1 | 0 | 363272 | 7.0000 | NaN | S |
2 | 894 | 2 | Myles, Mr. Thomas Francis | male | 62.0 | 0 | 0 | 240276 | 9.6875 | NaN | Q |
3 | 895 | 3 | Wirz, Mr. Albert | male | 27.0 | 0 | 0 | 315154 | 8.6625 | NaN | S |
4 | 896 | 3 | Hirvonen, Mrs. Alexander (Helga E Lindqvist) | female | 22.0 | 1 | 1 | 3101298 | 12.2875 | NaN | S |
프롬: 아, test 데이터에는 Survived 컬럼이 없네요! 이게 우리가 예측해야 하는 부분이군요.
다안: 눈썰미가 좋네! test 데이터는 마치 시험 문제지와 같아서 답(Survived)이 없어. 우리가 만들 인공지능 모델이 바로 이 test 데이터의 승객들에 대해 생존 여부를 예측하게 될 거야. 이렇게 데이터를 학습용과 평가용으로 나누는 건 머신러닝의 기본 원칙이기도 해.
프롬: 왜 데이터를 나눠야 하는 건가요? 그냥 모든 데이터로 한번에 학습하면 안 되나요?
다안: 정말 좋은 질문이야! 데이터를 나누는 이유는 우리의 모델이 ‘암기’가 아닌 ‘이해’를 했는지 확인하기 위해서야. 만약 학생이 시험 문제를 미리 알고 공부한다면 진짜 실력을 평가할 수 없잖아? 마찬가지로 모델도 처음 보는 데이터(test)에서 얼마나 잘 예측하는지를 봐야 진짜 실력을 알 수 있어.
프롬: 아하! 이제 이해가 됐어요. 마지막으로 submission 파일도 확인해봐야겠네요.
# 프롬프트
submission 파일의 처음 몇 행을 보여줘
코더블: 저도 확인해볼게요. 이 파일은 우리가 최종적으로 제출할 예측 결과의 형식을 보여줄 거예요.
submission.head()
PassengerId | Survived | |
---|---|---|
0 | 892 | 0 |
1 | 893 | 1 |
2 | 894 | 0 |
3 | 895 | 0 |
4 | 896 | 1 |
다안: 이 파일은 우리가 제출할 답안의 형식을 보여줘. PassengerId는 test 데이터와 동일한 승객 번호이고, Survived는 우리가 예측한 생존 여부를 적는 곳이야.
프롬: 그런데 왜 이 파일 이름이 ‘gender_submission.csv’인가요? 뭔가 특별한 의미가 있나요?
다안: 좋은 질문이야! 이 파일 이름에는 재미있는 이유가 있어. 이 파일은 캐글에서 제공하는 간단한 예시 답안이야. 보통 다른 캐글 대회의 제출 양식에는 예측값이 모두 0으로 되어 있는데, 타이타닉 대회에서는 성별에 기반한 예측 결과를 미리 보여주고 있어.
이건 타이타닉 대회가 많은 사람들의 ‘첫 번째 캐글 대회’이기 때문이야. 초보자들이 참고할 수 있도록 간단한 예시 답안을 제공한 거지. 이 예시는 “여성은 생존, 남성은 사망”이라는 단순한 규칙을 적용했어.
결과 제출하기#
프롬: 그럼 우리가 복잡한 모델을 만들기 전에, 일단 이 gender_submission.csv 파일을 그대로 제출해볼 수도 있나요? 다음 주 동아리 시간까지 기다리지 않고요?
다안: 물론이지! 사실 이것도 하나의 좋은 실험이야. 성별만으로 예측한 결과가 얼마나 정확한지 확인하는 건 중요한 기준점(baseline)을 설정하는 거야. 집에서도 따로 캐글에 제출해볼 수 있어. 이런 실험 정신이 데이터 과학에서는 중요하거든.
코더블: 실제로 이 파일을 캐글에 제출하면 0.76555라는 점수를 받게 돼요. 이건 캐글의 공식 점수로, 테스트 데이터 418명 중 약 320명(0.76555 × 418 ≈ 320)의 생존 여부를 정확하게 예측했다는 의미예요. 제가 어제 집에서 한번 제출해봤거든요. 성별이라는 단 하나의 특성만으로도 꽤 높은 정확도를 얻을 수 있다는 게 놀라웠어요.
프롬: 와! 그냥 “여자는 살고 남자는 죽었다”라는 단순한 규칙만으로도 76%나 맞출 수 있다니 놀랍네요.
다안: 그렇지! 이게 바로 데이터에서 패턴을 발견하는 재미야. 타이타닉 침몰 당시 “여성과 아이 먼저(Women and children first)”라는 원칙이 실제로 지켜졌다는 역사적 사실을 데이터가 증명하고 있는 거지. 데이터는 거짓말을 하지 않는다는 말이 있잖아.
캐글에 제출하는 방법
이 책에서 만든 결과를 실제로 캐글에 제출하고 싶다면 다음 절차를 따라하세요:
Kaggle에 가입합니다 (Google 계정으로 가능).
타이타닉 대회 페이지로 이동합니다: Titanic - Machine Learning from Disaster
gender_submission.csv
파일을 업로드합니다.‘Submit Predictions’ 버튼을 눌러 제출하고 점수를 확인합니다.
이 파일은 성별만으로 예측한 결과이며, 기본 제출 기준점(baseline) 역할을 합니다.
다음 단계에서는 자신이 만든 모델 결과를 같은 방식으로 제출해보세요!
프롬: 이제 뭘 해볼 수 있을까요? 이 데이터를 보면서 다른 궁금한 점이 생겼어요. 특히 나이와 생존율 사이에 어떤 관계가 있는지 알아보고 싶어요!
다안: 좋은 질문이야. 이제 기본적인 데이터 구조를 이해했으니, 오늘 동아리 활동의 마지막으로 앞으로 우리가 어떤 방향으로 나아갈지 계획을 세워보자. 데이터를 더 자세히 분석하면서 생존에 영향을 미친 다른 요소들을 찾아볼 거야. 예를 들어, 객실 등급이나 나이, 요금 등이 생존율과 어떤 관계가 있는지 살펴보면 재미있을 것 같아.
코더블: 이번 주에 배운 내용을 복습하고, 다음 주에는 더 심화된 분석을 해보면 좋을 것 같아요. 특히 각 변수들 간의 상관관계를 히트맵으로 시각화해보면 어떤 특성이 생존과 가장 관련이 있는지 한눈에 볼 수 있을 거예요. 그 다음에는 머신러닝 모델로 이런 패턴들을 자동으로 학습시켜서 성별보다 더 정확한 예측을 만들어볼 수 있을 거예요.
프롬: 정말 기대되네요! 오늘 동아리 활동에서 데이터를 들여다보니 타이타닉의 비극 속에서도 어떤 패턴이 있었다는 게 신기해요. 단순히 운이 아니라 데이터에 숨겨진 이야기가 있다는 게 흥미로워요.
다안: 오늘 동아리 활동 시간에는 타이타닉 데이터의 기본 구조를 이해하고, 데이터 분석의 첫 단계를 배웠어. 다음 주 동아리 시간에는 수치형 변수들을 분석하면서 생존율과의 관계를 더 자세히 살펴볼 거야. 모두들 수고했어!
📝 오늘의 핵심 요약
타이타닉 데이터는 train, test, submission 3개 파일로 구성
데이터를 학습용과 평가용으로 나누는 이유 이해
성별만으로도 76.555% 정확도 달성 (여성의 생존율이 높았음)
프롬프트와 코드를 통한 데이터 탐색 방법 학습
프롬: 단순히 운이 아니라 데이터 속에 패턴이 있다는 게 정말 흥미로워요! 프롬프트만으로도 이런 분석을 할 수 있다니 너무 신기해요. 다음 주까지 “객실 등급별 생존율을 계산해줘”라고 프롬프트를 연습해볼게요.
코더블: 저는 집에서 pandas의 groupby 함수를 사용해서 객실 등급별 생존율을 시각화하는 코드를 미리 작성해올게요. 이 함수는 데이터를 그룹으로 나누고 각 그룹에 대한 통계를 계산해주는 강력한 도구거든요. 그럼 다음 주 동아리 활동 때 바로 결과를 공유할 수 있을 것 같아요.
다안: 훌륭해! 두 사람 모두 열정적이네. 이런 적극성이 데이터 사이언스를 배우는 데 큰 도움이 될 거야. 그럼 다음 주 동아리 시간에 만나자!
직접 해보기
오늘 배운 내용을 바탕으로 아래 질문 중 하나를 프롬프트로 탐색해보세요:
나이(Age)와 생존율은 어떤 관계가 있을까요?
# 프롬프트 예시 나이별 생존율을 계산해줘
추가로 이런 질문도 던져볼 수 있어요:
가족과 함께 탄 승객들의 생존율은?
요금이 비쌀수록 생존 확률이 높았을까?
어떤 항구에서 가장 많은 승객이 탑승했을까?
프롬프트를 통한 탐색은 코딩 지식 없이도 데이터 속 패턴을 발견하는 강력한 도구입니다. 여러분만의 질문으로 타이타닉 승객들의 생존 비밀을 해결해보세요!
데이터 속 숨은 이야기
데이터 사이언스의 “Hello World”
캐글에서 가장 유명한 입문용 대회가 바로 이 타이타닉 생존자 예측 대회입니다. 현재까지도 전 세계의 많은 데이터 사이언티스트들이 이 대회로 머신러닝을 시작하고 있죠.
이 대회에서 사용되는 데이터는 실제 타이타닉호의 승객 정보를 바탕으로 교육 목적에 맞게 가공된 것입니다. Age나 Cabin 같은 중요한 정보들의 결측치를 그대로 남겨둔 것도 이러한 교육적 목적 때문이었습니다. 현실 세계의 데이터는 완벽하지 않다는 것을 보여주기 위해서죠.
실제로 많은 데이터 사이언티스트들이 이 대회를 통해 결측치 처리, 범주형 변수 인코딩 등 데이터 전처리의 기초를 배웠다고 합니다. 프로그래밍 입문자들이 “Hello World”로 시작하듯, 데이터 사이언스 입문자들은 타이타닉 대회로 시작합니다. 그래서 이 대회를 “데이터 사이언스의 Hello World”라고 부르기도 합니다.