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)으로 봐야 함
'Today I Learned' 카테고리의 다른 글
| [내일배움캠프 QA/QC 6기] TIL #033 (0) | 2026.06.26 |
|---|---|
| [내일배움캠프 QA/QC 6기] TIL #031 (0) | 2026.06.24 |
| [내일배움캠프 QA/QC 6기] TIL #030 (0) | 2026.06.23 |
| [내일배움캠프 QA/QC 6기] TIL #029 (0) | 2026.06.22 |
| [내일배움캠프 QA/QC 6기] TIL #028 (0) | 2026.06.19 |