
오늘은 오전에 Atani와 코드카타를 풀고, 라이브세션 1회차부터 다시 코드를 돌려보면서 복습을 했다. 대충 넘기다가 놓쳤던 value_counts(normalize=True) 함수랑 errors='coerce' 함수의 개념을 다시 기억할 수 있었다.
Atani 머신러닝쪽은 제대로 공부를 안해서 그런가 잘 몰라서 틀렸다. 오답노트 쓰면서 절대 기억해!!! 코드카타도 확실히 레벨이 올라가서 그런가 한문제 한문제 푸는데 시간이 걸리기 시작했다. 하지만 오래 걸려도 하루에 5문제는 절대 풀어야 감을 안까먹을거 같다..
오후에는 멋쟁이 튜터님과 함께 1회차부터 5회차까지 내용을 다시 돌아가서 회상했다. (오전에 한번 복습하고 들으니까 확실히 잘 따라갈 수 있었다.) 개인 과제와 튜터님의 해설을 들으면서 달랐던 코드나 내가 잘못 작성한게 있는지 비교하면서 정리했다.
🤖 Atani

⭐ 정답 : A
시계열 분해 모델 : 가법 모델(additive)과 승법 모델(multiplicative)
| 가법 모델 | 승법 모델 |
| Trend + Seasonality + Residual 로 분해 | Trend x Seasonality x Residual 로 분해 |
| 계절 변동의 크기가 일정할 때 사용 | 계절 변동의 크기가 Trend에 비례할 때 사용 |
C : linear : seasonal_decompose( ) 의 model 옵션에 존재하지 않음.
D : exponential : model 옵션으로 사용할 수 없음.

⭐ 정답 : B
학습 데이터는 모델이 입력과 출력 간의 패턴을 학습하고, 가중치와 같은 파라미터를 최적화하는데 사용됨.
A : 테스트 데이터의 역할
C : 검증 데이터에 대한 설명
D : 실제 운영 데이터에 대한 설명

❌ 오답!!!
⭐ 정답 : C
테스트 데이터는 모델 학습 과정에서 사용되지 않으며, 파라미터 업데이트에 관여하지 않음.
테스트 데이터를 학습에 사용하면 과적합이 발생하고 실제 성능을 정확히 평가할 수 없게 됨.

❌ 오답!!!
⭐ 정답 : B
학습데이터와 테스트 데이터를 분리하는 가장 중요한 이유는 모델의 일반화 성능을 객관적으로 평가하기 위함.
학습에 사용되지 않은 독립적인 테스트 데이터로 평가해야만 모델이 새로운 데이터에 대해 얼마나 잘 작동하는지 알 수 있음.

⭐ 정답 : B
train_test_split 함수의 test_size 매개변수는 테스트 데이터의 비율을 0과 1 사이의 실수로 지정함.
20%를 테스트 데이터로 사용하려면 0.2를 입력해야함.
20 or 80 은 비율이 아닌 절대값이며, 0.8은 80%를 의미하므로 학습 데이터의 비율임.
🤔
오답을 정리하면서 학습 데이터와 테스트 데이터의 차이점을 확실히 구분할 수 있게 되었다. "학습에 사용하지 않은 독립적인 테스트 데이터로 평가해야만 모델이 새로운 데이터에 대해 얼마나 잘 작동하는지 알수 있다"를 통해서 왜 테스트 데이터가 필요한지 이유를 알게 되었다.
⌨️ 코드카타
46번. 숫자 문자열과 영단어


def solution(s):
dic = {'zero':0, 'one':1, 'two':2, 'three':3, 'four':4,
'five':5, 'six':6, 'seven':7, 'eight':8, 'nine':9} # 딕셔너리
for key, value in dic.items(): # 딕셔너리의(키,값)쌍을 하나씩 꺼내줌.
s = s.replace(key, str(value)) # replace()는 문자열에서 특정 문자를 다른 문자로 바꿔줌.
# str(value)를 쓰는 이유 : replace()는 문자열끼리만 교체할 수 있기 때문임.
return int(s)
solution("one4seveneight")
# 출력 : 1478
47번. 문자열 내 마음대로 정렬하기

def solution(strings, n):
keys = [(i[n], i) for i in strings] # 각 문자열에 대해 (n번째 문자, 원래 문자열) 형태의 튜플을 만듬.
# "sun" → ('u', 'sun')
sorted_key = sorted(keys)
# 튜플은 첫번째 요소를 기준으로 자동 정렬된다.(오름차순)
result = [j[1] for j in sorted_key] # 원래 문자열만 추출
# 반복문은 내부적으로는 아래와 완전히 같다.
# result[]
# for j in sorted_key :
# result.append(j[1])
# j[1]인 이유 : 튜플은 인덱스가 0부터 시작. j[0] = 'a', j[1] = 'car'
# 처음에 key를 만들 때 : (i[n], i)순서로 저장 → 0번 : 정렬 기준 문자, 1번 : 원래 문자열
return result
print(solution(["sun", "bed", "car"], 1))
# 출력 : ['car', 'bed', 'sun']
+ char를 활용한 코드
def solution(strings, n):
# (n번째 문자, 원래 문자열) 형태의 튜플 생성
keys = [(i[n], i) for i in strings]
# 튜플의 첫 번째 요소(n번째 문자)를 기준으로 정렬
sorted_key = sorted(keys)
result = []
# 정렬된 튜플에서 원래 문자열만 추출
for char, word in sorted_key: # char : j[0], word : j[1]에 해당
result.append(word)
return result
print(solution(["sun", "bed", "car"], 1))
48번. K번째수

def solution(array, commands):
answer = []
for i, j, k in commands:
temp = array[i-1:j] # i번째(i-1 : 인덱스는 0부터 시작함)부터 j번째(슬라이싱에서 끝 인덱스 포함x, 그대로 사용)까지 자르기
temp = sorted(temp) # 정렬하기 (오름차순)
answer.append(temp[k-1]) # k번째 숫자 추가 (1부터 시작하므로 k-1 인덱스를 사용)
return answer
print(solution([1, 5, 2, 6, 3, 7, 4], [[2, 5, 3], [4, 4, 1], [1, 7, 3]]))
# 출력 : [5, 6, 3]
49번. 두개 뽑아서 더하기

def solution(numbers):
answer = set() # 중복 제거를 위해 집합[ set() ] 사용 : 합이 여러번 나올수 있음.
for i in range(len(numbers)):
# 첫번쨰 숫자의 위치를 선택
# numbers = [2,1,3,4,1] → i = 0,1,2,3,4
for j in range(i + 1, len(numbers)):
# 두번째 숫자는 항상 i보다 뒤에서 선택
# i = 0, j = 1,2,3,4
# (2,1),(2,3),(2,4),(2,1)를 구할수 있고 (1,2)는 다시 구하지 않으므로 중복 계산이 없다.
answer.add(numbers[i] + numbers[j])
return sorted(answer) # 정렬하기
print(solution([2,1,3,4,1]))
# 출력 : [2, 3, 4, 5, 6, 7]
50번. 가장 가까운 같은 글자

def solution(s):
answer = [] # 최종결과를 저장할 빈 리스트
dic = {} # 빈 딕셔너리, 각 문자가 마지막으로 등장한 위치를 저장
for i in range(len(s)): # 문자열의 처음부터 끝까지 하나씩 확인
if s[i] in dic: # 현재 문자가 이전에 나온 적이 있는지 확인
answer.append(i - dic[s[i]]) # 현재위치 - 이전에 나온 위치를 계산해서 저장
else:
answer.append(-1) # 현재 문자가 처음 나온 문자라면 (-1)을 저장
dic[s[i]] = i # 현재 문자의 가장 최근 위치를 계속 업데이트 (a : 1 → 3 → 5)
return answer
print(solution("banana"))
# 출력 : [-1, -1, 1, 2, 2, 2]
📝아티클 스터디
주제 : 양질의 데이터를 판별하는 5가지 방법 : 1. 데이터 양은 충분한가?
https://yozm.wishket.com/magazine/detail/1070/
양질의 데이터를 판별하는 5가지 방법 : 1 데이터 양은 충분한가? | 요즘IT
양질의 데이터 조건 첫 번째는 ‘충분한 양의 데이터’입니다. 최근 빅데이터라는 단어가 기승을 부리고 있으며 빅데이터는 기본적으로 방대한 양의 데이터를 의미합니다. 하지만 현실적으로
yozm.wishket.com
● 요약
데이터 양이 부족하면 분석 결과의 신뢰성이 떨어지고, 특히 머신러닝·딥러닝 적용 시 심각한 정확도 저하로 이어진다. 따라서 데이터 수집·분석 전에 먼저 데이터 양의 충분성을 판단하는 것이 효율적인 데이터 활용이 된다.
● 주요 포인트
- 저품질 데이터가 생각보다 훨씬 많으며, 무작정 데이터를 많이 모으는 것은 비용·시간 효율 측면에서 비효율적이다.
- 데이터 양이 부족하면 표본이 모집단을 대표하지 못해 분석 결과 자체를 신뢰할 수 없게 된다.
- 딥러닝 알고리즘은 데이터 양이 많을수록 정확도가 높아지는 구조적 특성을 가진다.
- 충분한 데이터 양의 기준은 절대적이지 않으며, 분석 목적과 방법에 따라 달라진다.
● 핵심 개념
- 데이터 수가 많을수록 분석 결과의 통계적 신뢰성이 높아진다.
- 수집한 표본 데이터가 모집단 전체의 특성을 얼마나 잘 반영하는가
- 분석 결과를 통계적으로 신뢰할 수 있는지 나타내는 지표. 보통 300~500개 이상의 데이터에서 안정적으로 산출된다.
- 통계 분석: 최소 500개 이상 / 머신러닝: 변수 수 × 100 이상
이건 오늘 라이브 세션을 수강하다가 그래프를 사진으로 저장하는 방법을 배웠다. (소소하지만 확실한 행복)
plt.savefig ('진영님 인사이트.png') 를 사용하면 아래처럼 사진이 나온다.
