mmings_pring_day

[머신러닝] 타이타닉 본문

2024-2학기/머신러닝

[머신러닝] 타이타닉

mming_10 2024. 9. 16. 21:27

1. 데이터 불러오기

import numpy as np
import pandas as pd
df= pd.read_csv('data/train.csv')

df.head(3)


2. 데이터프레임 변환하기

(1) DataFrame 에서 새로운 column 생성 및 수정

 

1. Passenger Class(Pclass) 별로 생존 비율을 구하시오.

-> 각 passenger class 별로 총 탑승객의 수를 구하고, 생존한 탑승객의 수를 구한 뒤 (생존한 탑승객 수)/ (총 탑승객 수)를 passenger class 별로 계산하면 됨

df['survival_rate_per_class'] = df['Pclass_per_Survived']/ df['Pclass_per_Passenger']
print(df['survival_rate_per_class'].dropna())

2. 나이가 10살 미만 (Age <10) 인 승객들 중 생존 비율을 구하시오.
또한, 10살 이상 (Age >= 10) 의 승객들 중 생존 비율을 구하시오.
cond1 = (df['Age'] < 10)   # 10살 미만
cond2 = (df['Age'] >= 10)  # 10살 이상
under10_ratio = df[cond1]['Survived'].mean()
over10_ratio= df[cond2]['Survived'].mean()

# 결과 출력
print(f"10살 미만 승객의 survival ratio: {under10_ratio:.4f}")
print(f"10살 이상 승객의 survival ratio: {over10_ratio:.4f}")

# 조건: 나이가 10살 미만이면서 생존한 승객
cond1 = (df['Age'] < 10) & (df['Survived'] == 1)

# 해당 조건에 맞는 'Survived' 열 선택
df_under_10_survived = df.loc[cond1, 'Survived']

# 생존 비율 계산 (1의 값만 남기므로 생존 비율은 1)
survival_rate_under_10 = df_under_10_survived.mean()

print(f"10살 미만 생존자 중 생존율: {survival_rate_under_10 * 100:.2f}%")

 

-> loc을 사용할 때는 [조건, 열] 형태로 사용해야 합니다. df[cond1].loc[...] 방식보다는 df.loc[...]를 사용하는 것이 정확합니다.


 

-> 조건이 '나이가 10살 미만'이면서 '생존한 (Survived=1)' 인 승객을 구할 때 'df.loc[cond1, 'Survived'] 하는 거 기억하기!

* 이 부분을 더 풀어서 설명하면 *

 

1) 조건 필터링

cond1 = (df['Age'] < 10)
df_under_10 = df[cond1]  # cond1에 맞는 데이터프레임을 필터링

 

2) 필터링한 데이터에서 특정 열만 선택하기

df_under_10_survived = df_under_10['Survived']  # 생존 여부 열만 가져오기

 

-> 이 두 과정을 하나로 합치면 '.loc' 이용하기

df_under_10_survived = df.loc[cond1, 'Survived']

 

3. 생존 비율 계산하기

'Survived' 열은 1(생존), 0(사망)으로 되어 있기 때문에, 이 값들의 평균을 구하면 생존 비율이 됩니다. 따라서 mean()을 사용하면 생존 비율을 구할 수 있음

survival_rate_under_10 = df_under_10_survived.mean()

 

코드 흐름 기억하기:
✅조건을 먼저 만든다.데이터 필터링 (df[cond1] 또는 df.loc[cond1, 'Survived']).
✅필터링한 데이터의 평균을 구한다 (.mean()).
# 조건: 나이가 10살 이상이면서 생존한 승객
cond2 = (df['Age'] >= 10) & (df['Survived'] == 1)

# 해당 조건에 맞는 'Survived' 열 선택
df_over_10_survived = df.loc[cond2, 'Survived']

# 생존 비율 계산
survival_rate_over_10 = df_over_10_survived.mean()

print(f"10살 이상 생존자 중 생존율: {survival_rate_over_10 * 100:.2f}%")

3. 아래 df.info()를 실행한 결과를 보면 Age column에서 714개의 row만 값이 채워져 있고, 나머지 row에는 값이 비어 있는 것을 알 수 있다. 지금부터 Age 변수의 값이 비어져 있는 row들은 버리고, 나머지 row들만 변수 df에 들어있도록 코드를 실행하자. 

 

1) df.info()

 

2) df['Age'].isnull(). sum() -> 177

 

3) df.dropna()

df['Age']= df['Age'].dropna()
df= df.reset_index(drop= True)
df

 

 

df['Age'].isnull().sum()

 

4. 다음과 같은 조건을 만족하는 함수 'get_age_group(x)' 를 작성하시오.
✅ for 문 (반복문, 주어진 범위나 리스트, 배열 같은 데이터를 반복해서 처리할 때 사용)
-> for i in range() =
for 변수 in 반복할_범위:
   print (i) -> 반복할 코드

* 'i'라는 변수를 미리 선언할 필요 없음/ for 문은 i 라는 변수를 자동으로 선언하고 값을 할당해 줌*
fruits = ['apple', 'banana', 'cherry']
for fruit in fruits:
	print(fruit)
✅ if 문 (조건문, 주어진 조건이 참일 때만 특정 코드를 실행하게 함)
if 조건: (# 조건이 참일 때 실행할 코드)
* 변수를 미리 선언해야 함/ if 문에서 사용하는 변수는 조건문이 실행되기 전에 값을 가지고 있어야 함*
age= 18
if age >= 18:
	print("성인입니다.")
else:
	print("미성년자입니다.")

 

while문 (while 문, 주어진 조건이 참인 동안 계속해서 코드를 반복 실행하는 반복문, 조건이 거짓이 되면 루프를 종료함)
whiile 조건: (# 조건이 참일 때 반복할 코드)
* while 문도 변수를 미리 선언해야 함/ while 문은 변수가 조건에 벗어날 때까지 계속 실행됨 (루프가 한 번 실행될 때마다 변수는 1씩 증가하고, 결국 변수가 5가 되면 루프가 종료됨) *
count = 0
while count < 5:
    print(count)
    count += 1

 

for i in range(10):
	if i % 2 == 0:
    	print(f"{i}는 짝수입니다.")
    else:
    	print(f"{i}는 홀수입니다.")

 

1) def 로 함수 선언하기

def 함수이름 (매개변수1, 매개변수2, ...):
	# 함수 내부에서 실행할 코드
	return 반환값 # 반환할 값이 없으면 생략 가능
def say_hello(name):
	# 'name'이라는 매개변수를 받아서, 'name'을 포함한 인사를 출력함
	print(f"안녕하세요, {name}님")
    # 함수를 호출할 때는 'say_hello('철수')'처럼 사용가능

 

2-1) 함수 안에서 'for'문 사용하기: 문자열 리스트를 처리하는 함수

def choose_color(colors): #colors 는 매개변수
	for color in range(colors):
    	print(f"선택한 색상: {color}")

- 함수 호출

colors= (['red', 'blue', 'green'])
choose_colors(colors)

- 출력

선택한 색상: red
선택한 색상: blue
선택한 색상: green

 

2-2) 함수 안에서 'for'문 사용하기: 숫자 리스트를 처리하는 함수

def sum_numbers(numbers):
	total= 0
    for number in numbers:
    	total += number
    return total

- 함수 호출

sum_numbers([1,2,3,4])

- 출력

결과: 10


def get_age_group(x):
	if x < 10:
    	print('group1')
    elif 10 <= x <30:
    	print('group2')
    elif 30 <= x <50:
    	print('group3')
    else:
    	print('group4')
get_age_group(10,5)

5. 위에서 작성한 함수를 활용하여 age를 그룹화한 column인 age_group column을 생성하시오.
def get_age_group(x):
    print(f"Input value: {x}")  # x 값을 출력
    if x < 10:
        return 'group1'
    elif 10 <= x < 30:
        return 'group2'
    elif 30 <= x < 50:
        return 'group3'
    else:
        return 'group4'

* print()는 오류를 직접적으로 고치지 않지만, 오류의 원인을 찾을 수 있게 도와줍니다. 디버깅을 위해 print()를 사용한 예 *

 

  • df['Age']에 값이 정상적으로 들어가 있는지 확인합니다.
  • get_age_group() 함수에서 조건이 맞지 않으면 반환하지 않도록 되어 있는 경우는 없는지 봅니다.
df['age_group'] = df['Age'].apply(get_age_group)
df['age_group']

 

6. age_group별로 각 그룹에 해당하는 인원수와 평균 Fare를 구하세요.
# age_group별 인원수 구하기
count = df.groupby('age_group').agg('count') #혹은 count()
# 결과 확인
print(count)

avg_fare= df.groupby('age_group')['Fare'].agg('mean')
avg_fare


  • groupby( ) 구조식
df.groupby(['column1', 'column2', ...])['target_column'].agg(function)

 

1) df. groupby( ): 데이터를 그룹화함

2) ['column1', 'column2',...] : 그룹화에 사용할 칼럼(또는 칼럼들)을 지정함

   -> 여러 개의 칼럼 지정: df.groupby(['column1', 'column2',..'])

   -> 하나의 칼럼 지정: df.groupby('column') 

3) ['target_column']: 그룹화 후 집계를 할 대상 칼럼을 지정함

4) .agg(function): 집계 함수로, 평균('mean'), 합계('sum'),최댓값('max'),최소값('min'),인원수('count') 등 다양한 함수 이용 가능

 

df.groupby('age_group')['Fare'].agg('mean')

 

* count( ): 각 그룹에 속한 데이터의 개수를 세는 함수/ 그룹화된 데이터에서 그룹별로 몇 개의 데이터가 있는지 계산 *

df.groupby(['column1', 'column2', ...]).count()
df.groupby('age_group').count() #age_group별로 몇 명이 속해 있는지 계산

 

*여러 집계 함수 사용*

df.groupby('group_column').agg({'target_column1': 'mean', 'target_column2': 'sum'})

 

  • groupby( ) 와 pivot_table( ) 비교

1) groupby( ): 데이터프레임을 하나 이상의 컬럼을 기준으로 그룹화하여 집계할 때 사용

-> 그룹별로 집계 함수를 적용

df.groupby(['column1', 'column2'])['target_column'].agg('mean')

 

2) pivot_table( ) : 데이터를 피벗 테이블 형태로 변환하여 여러 집계 함수와 다양한 집계 옵션을 지원

-> 데이터를 행, 열, 값으로 나누어 집계할 수 있으며, 여러 집계 함수와 필터를 동시에 사용 가능

df.pivot_table(
    values='target_column', #values: 집계할 데이터 컬럼 지정
    index='row_index_column', #index: 결과의 행 인덱스가 될 칼럼 지정
    columns='column_index_column', #column: 결과의 열 인덱스가 될 칼럼 지정
    aggfunc='mean' #aggfunc: 집계 함수를 지정
)
# pivot_table 사용
pivot_table_result = df.pivot_table(values='Fare',index='age_group', aggfunc='mean')
#그룹별 평균 요금 계산

'2024-2학기 > 머신러닝' 카테고리의 다른 글

[머신러닝]  (1) 2024.11.10
[머신러닝] California Housing dataset (week03- pracitce)  (0) 2024.09.19