Today I Learned

[내일배움캠프 QA/QC 6기] TIL #032

JiJi0406 2026. 6. 25. 21:02

001

오늘의 코드카타

42. 삼총사

 


문제 설명

한국중학교에 다니는 학생들은 각자 정수 번호를 갖고 있습니다. 이 학교 학생 3명의 정수 번호를 더했을 때 0이 되면 3명의 학생은 삼총사라고 합니다. 예를 들어, 5명의 학생이 있고, 각각의 정수 번호가 순서대로 -2, 3, 0, 2, -5일 때, 첫 번째, 세 번째, 네 번째 학생의 정수 번호를 더하면 0이므로 세 학생은 삼총사입니다. 또한, 두 번째, 네 번째, 다섯 번째 학생의 정수 번호를 더해도 0이므로 세 학생도 삼총사입니다. 따라서 이 경우 한국중학교에서는 두 가지 방법으로 삼총사를 만들 수 있습니다.

한국중학교 학생들의 번호를 나타내는 정수 배열 number 매개변수로 주어질 , 학생들 삼총사를 만들 있는 방법의 수를 return 하도록 solution 함수를 완성하세요.

 

제한사항

  • 3 ≤ number의 길이 ≤ 13
  • -1,000 ≤ number의 각 원소 ≤ 1,000
  •  서로 다른 학생의 정수 번호가 같을 수 있습니다.

 

입출력 예

number result
[-2, 3, 0, 2, -5] 2
[-3, -2, -1, 0, 1, 2, 3] 5
[-1, 1, -1, 1] 0

 

 

더보기
def solution(number):
    answer = 0
    n = len(number)
    
    for i in range(n): # 첫 번째 학생 고르기
        for j in range(i + 1, n): # 두 번째 학생은 첫 번째 학생 다음부터
            for k in range(j + 1, n): # 세 번째 학생은 두 번째 학생 다음부터
                if number[i] + number[j] + number[k] == 0:
                    answer += 1 # 세 학생의 번호 합이 0이면 삼총사로 카운트
    return answer

 

 


 

 

002

오늘 학습한 내용

 

 

[ 머신러닝의 이해와 라이브러리 활용 기초 ]

로지스틱 회귀 - 타이타닉 생존자 예측

 

1. 가설 세우고 확인하기

  • "비상상황 특성상 여성을 배려해서 많이 생존했을 것이다"
  • 피벗테이블로 먼저 확인하고, 그 다음 그래프로도 확인
import pandas as pd

titanic_df = pd.read_csv("/content/train.csv", encoding='utf-8')
#숫자: Age, SibSp, Parch, Fare
#범주형 : Pclass, Sex, Cabin, Embarked

pd.pivot_table(titanic_df, index = "Sex", columns = 'Survived', aggfunc = 'size')

import seaborn as sns
sns.countplot(titanic_df, x = 'Sex', hue = 'Survived')

 

 

2. 로지스틱 회귀가 왜 필요??

선형회귀로는 안 되는 이유 

  • Y가 "특정 값이 될 확률"이면 0~1 사이여야 하는데, 선형회귀로 예측하면 그 범위를 넘어갈 수 있음
  • 그래서 S자 형태 함수(로지스틱 함수)를 써서 무조건 0~1 사이로 결과가 나오게 만든 게 로지스틱 회귀

로짓 / 오즈비

  • 오즈비(승산비)실패확률 대비 성공확률, P(확률)가 증가할수록 오즈비가 급격히 커져서 선형성이 깨짐
  • → 로그를 씌워서(로짓) 완만하게 만들어줌
  • 보통 확률 0.5를 임계값(threshold)으로 잡고, 그 이상이면 1(생존)로 판단!

 

3. 분류 모델 평가는 정확도만 보면 XXX

1) 정확도의 함정

  • (예시) 100명 중 95명 정상, 5명 암환자인데 모델이 "다 정상"이라고만 찍어도 정확도 95%가 나옴
  • 근데 진짜 중요한 암환자는 하나도 못 맞춘 것 → 정확도만 보면 이런 사기 모델을 못 걸러냄!!
  • Y값이 불균형(unbalance)할 때 특히 이런 문제 발생

2) 혼동 행렬 (Confusion Matrix)

  • 실제값/예측값 조합을 2x2로 표현한 것
  • TP(양성을 양성으로 맞춤), FP(음성인데 양성으로 잘못 예측), FN(양성인데 음성으로 잘못 예측), TN(음성을 음성으로 맞춤)

3) 평가지표

  • 정밀도(Precision): 모델이 양성이라고 예측한 것 중 진짜 양성인 비율
  • 재현율(Recall): 실제 양성모델이 양성으로 맞춘 비율 
  • F1-Score: 정밀도와 재현율의 조화평균 → (정밀도×재현율)/(정밀도+재현율) → 위의 "다 정상이라고 찍는 모델"은 정밀도 계산 자체가 안 되고(0으로 나누기), 재현율도 0이라서 F1-Score도 0이 됨 → 이래서 불균형 데이터에는 정확도 대신 F1-score를 쓰는 것

 

4. 실습 - 타이타닉 데이터로 로지스틱 회귀

데이터 불러오고 변수 타입(숫자형/범주형) 확인,

X는 Fare, Y는 Survived로 설정해서 분석 시작함

 

1) LogisticRegression 모델 만들고 학습시킴

from sklearn.linear_model import LogisticRegression

model_lor = LogisticRegression()
model_lor.fit(X_1, y_true)

 

2) 모델 학습 후 속성들 함수로 확인

def get_att(x):
  print('클래스 종류', x.classes_)
  print('독립변수 개수', x.n_features_in_)
  print('들어간 독립변수(x)의 이름', x.feature_names_in_)
  print('가중치', x.coef_)
  print('바이러스', x.intercept_)

get_att(model_lor)

 

클래스 종류 [0 1]
독립변수 개수 1
들어간 독립변수(x)의 이름 ['Fare']
가중치 [[0.01519617]]
바이러스 [-0.94129222]

 

3) predict로 예측값 뽑고, 정확도(accuracy_score)와 F1-score(f1_score)로 평가

from sklearn.metrics import accuracy_score, f1_score
def get_metrics(true, pred):
  print('정확도', accuracy_score(true, pred))
  print('f1_score', f1_score(true, pred))

y_pred_1 = model_lor.predict(X_1)

get_metrics(y_true, y_pred_1)

정확도 0.6655443322109988
f1_score 0.354978354978355

 

→ 정확도는 0.66인데 F1-score는 0.35로 꽤 낮음 

Fare 하나로만 예측하기엔 부족하다는 신호인듯 (생존 여부가 불균형 or Fare만으론 설명력이 부족)

 

 

 

선형회귀 vs 로지스틱회귀 평가지표 비교

구분 선형회귀 (회귀) 로지스틱회귀 (분류)
무엇을 예측? 연속적인 숫자값 특정 클래스(0 or 1)
평가 지표 1 MSE (평균제곱오차)
: 예측-실제 차이 제곱해서 평균낸 값
정확도(Accuracy)
: 전체 중 맞춘 비율
평가 지표 2 R² (결정계수)
: 모델이 데이터를 얼마나 잘 설명하는지
F-1 Score
: 정밀도 & 재현율의 조화평균
값의 범위 MSE : 0 이상 (단위 의존적)
R² : 0~1
0~1
좋은 방향 MSE ↓ 낮을수록 좋음
R² ↑ 높을수록 좋음
둘 다 ↑ 높을수록 좋음
주의할 점 MSE는 단위에 따라 절대값 해석 달라짐 정확도는 Y가 불균형할 때 믿을 수 없음
→ 이럴 땐 F-1 Score

 

 

한 줄로 요약하면...

  • 선형회귀(숫자 예측)는 "오차가 얼마나 작은지"(MSE) + "설명력이 얼마나 높은지"(R²)로 평가
  • 로지스틱회귀(분류)는 "맞춘 비율"(정확도)만 보면 위험, 데이터 불균형하면 "정밀도·재현율 균형"(F1-Score)으로 봐야 함