Today I Learned

[내일배움캠프 QA/QC 트랙 6기 본캠프] TIL #011

JiJi0406 2026. 5. 26. 21:15

 

 

 

001

오늘의 키워드: 프로그래밍 기초 마무리...?

파이썬의 기본적인 내용들은 저번주에 다 배웠던 것 같다. 오늘은 앞으로 프로젝트를 하며 쓰게 될 수도 있는 추가적인 문법들과, 만나게 될지도 모르는(이미 만나기도 했던...) 에러들의 대처법 등등을 배웠다.

 

라이브 세션과 VOD 강의를 연달아 들으면서 데코레이터니 람다니 하는 낯선 개념들이 휘몰아치는데 😵 배운 내용들에 겨우 익숙해질 차에 새로운 내용들이 들어오니 좀 어질어질~... 공부라는 걸 너무 오랜만에 해서 그래요...

 

그래도 일단은 이 내용들을 하나하나 다 외워서 직접 칠 정도가 될 필요는 없다고 하시니까, 너무 쫄지 말고 천천히 눈에 익혀봐야겠다는 생각으로 보자.

 


 

002

오늘 배운 내용

 

[라이브 세션] : 허진성 튜터님  Python 실력 쑥쑥 심화 세 2회차

 

1. try / except 

코드 실행 중에 에러가 발생해도 프로그램이 끊기지 않고 계속 흘러가도록 예외로 처리하는 함수

except 뒤에 에러 종류(ValueError, IndexError 등등)를 명시하면 해당 에러가 날 때만 처리할 수도 있다.

# 로그 데이터에서 에러 코드가 숫자가 아닐 때 예외 처리하는 함수
def clean_error_code(code_str):
    try:
        return int(code_str)
    except ValueError:
        print(f"[경고] 유효하지 않은 에러 코드 형식: '{code_str}'")
        return 9999  # 예외 발생 시 디폴트 코드로 반환

print(clean_error_code("404"))   # 출력: 404
print(clean_error_code("ERR_01")) # 출력: [경고] 유효하지 않은 에러 코드 형식: 'ERR_01' -> 9999

 

2. 리스트 컴프리헨션

for문 + 조건문으로 리스트 만드는 걸 한 줄로 압축하는 문법

코드가 훨씬 짧아진다.

# [표현식 for 항목 in iterable if 조건]

# 정상 수치 목록에서 높은 수치만 걸러내기
wbc_list = [6000, 11500, 8200, 13000, 7400]
high_wbc = [v for v in wbc_list if v > 10000]
print(high_wbc)  # 출력: [11500, 13000]

 

근데 나는 아직 이렇게 fancy하게 코드를 짤 정도로 숙련되진 않아서... 그냥 풀어서 쓰게 됨...

 

3. 딕셔너리 컴프리헨션

중괄호 {} 사용, 결과물이 리스트가 아닌 Key-Value 쌍을 가진 딕셔너리 형태로 나옴

# {키: 값 for 항목 in 이터러블}

items = ["WBC", "RBC", "HGB", "PLT"]
status = {item: "정상" for item in items}
print(status)
# {'WBC': '정상', 'RBC': '정상', 'HGB': '정상', 'PLT': '정상'}

 

4. map() & filter()

람다랑 세트로 자주 쓰이는 내장 함수. 둘 다 결과가 바로 리스트가 아니라 이터레이터로 반환되어서 list()로 감싸줘야 한다.

  • map() :  iterable의 각 요소에 함수를 적용. 컨베이어 벨트처럼 전체를 같은 처리 과정에 태운다.
  • filter() :  조건이 True인 요소만 남긴다. 품질 검사대처럼 기준 미달은 걸러낸다.

 

이 함수를 이용해서 코드를 직접 짤 수 있을 정도로 공부는 안 해도 되고, 남의 코드에서 봤을 때 읽을 수 있을 정도로만 공부!

# map — 장비 온도 리스트 전체에 문자열 단위(°C) 붙이기
temp_records = [22.5, 19.8, 31.2, 25.0]
formatted_temps = list(map(lambda t: f"{t}°C", temp_records))
print(formatted_temps)
# 출력: ['22.5°C', '19.8°C', '31.2°C', '25.0°C']

# filter — 불량률 임계치(5.0)를 초과한 위험 수치만 걸러내기
defect_rates = [1.2, 5.8, 3.4, 8.1, 0.5]
danger_rates = list(filter(lambda d: d > 5.0, defect_rates))
print(danger_rates)  # 출력: [5.8, 8.1]

 

 

5. 파일 입출력 기본

프로그램이 종료되면 메모리(RAM)의 내용은 사라짐. 데이터를 유지하려면 파일로 저장해야 한다.

with open()을 쓰면 파일을 자동으로 닫아줘서 안전하다.

문법 다 외울 필요 없고, 필요할 때 찾아서 복붙하면 된다.

# 쓰기
with open("result.txt", "w", encoding="utf-8") as f:
    f.write("WBC: 8500\n")
    f.write("판정: 정상\n")

# 읽기
with open("result.txt", "r", encoding="utf-8") as f:
    content = f.read()
    print(content)

▼ 파일 모드 정리

"r" 읽기 (기본값)
"w" 쓰기 (기존 내용 삭제)
"a" 추가 (기존 내용 뒤에 이어쓰기)
"b" 바이너리 모드 (이미지, 엑셀 등)

한글 데이터를 다룰 때는 인코딩 옵션에 encoding="utf-8"을 필수로 넣어 주어야 글자가 깨지지 않는다.


6. 데이터 형태 분류

정형 행/열로 구성된 표 .csv, .xlsx
반정형 키-값 쌍. 구조 있지만 표는 아님 .json, .xml
비정형 구조 없음 .mp3, .mp4, .jpg

반정형 데이터는 전처리를 통해 정형 데이터로 변환해야 분석할 수 있다.

JSON은 딕셔너리/리스트 구조와 동일해서 파이썬이랑 궁합이 잘 맞는다. 

 
 
 
 

[VOD 강의] 데이터 분석 파이썬 종합반 5주차 수강 완료

 

1. 파일 확장자별 불러오기 & 저장하기

pandas를 쓰면 확장자에 따라 함수만 바꿔서 동일한 방식으로 불러오기/저장하기 가능

 

확장자 불러오기 저장하기
.csv pd.read_csv() df.to_csv()
.xlsx pd.read_excel() df.to_excel()
.json pd.read_json() json.dump()
.txt pd.read_csv(delimiter='\t') open() + write()

구글 코랩에서 내 파일을 쓰려면 드라이브 마운트를 먼저 해야 한다!

(코랩은 로그아웃하면 마운트가 초기화돼서 실행할 때마다 다시 해줘야 함)

from google.colab import drive
drive.mount('/content/drive')  # 세션 바뀔 때마다 다시 쳐야 함

import pandas as pd

# 경로 조합해서 불량 데이터 엑셀 파일 로드
data_path = "/content/drive/MyDrive/project/file.xlsx"
df_logs = pd.read_excel(data_path)​
 

 

2. 주요 파이썬 패키지 정리

필요한 패키지는 코드 맨 위에 한꺼번에 불러오는 게 좋다! (그래야 사용한 라이브러리가 한눈에 보이니까)

pandas 데이터 조작, 분석. 데이터프레임 다룰 때 핵심
numpy 수치 계산, 다차원 배열, 행렬 연산
matplotlib 데이터 시각화. 그래프/플롯 생성
seaborn matplotlib 기반 통계 시각화. 더 예쁘게 시각화 가능
scikit-learn 머신러닝 (분류, 회귀, 군집화 등)
statsmodels 통계 분석 (회귀, 시계열 등)
scipy 과학기술 수학 연산
tensorflow 딥러닝. 구글 개발. 기업에서 많이 씀
pytorch 딥러닝. Facebook 개발. 연구실에서 많이 씀

 

3. 포맷팅

문자열과 변수를 함께 출력할 때 사용

세 가지 방식이 있는데 요즘은 f-string을 많이 쓴다. (이전 TIL에 방법 작성함)

 

 

4. 람다 함수

이름 없는 익명 함수. 한 줄짜리 간단한 연산에 쓴다.

filter(), map() 같은 함수랑 조합할 때 자주 등장하는데, 복잡한 로직은 그냥 def로 짜는 게 편함 (어려워...........)

# 장비 압력 수치가 임계치 내에 있는지 확인하는 익명 함수
check_pressure = lambda p: 10 <= p <= 30
print(check_pressure(25))  # 출력: True

# 가동 중인 장비 압력 리스트에서 정상 압력만 걸러내기
all_pressures = [8, 15, 32, 24, 11, 40]
normal_pressures = list(filter(lambda p: 10 <= p <= 30, all_pressures))
print(normal_pressures)  # 출력: [15, 24, 11]

 

5. glob & os — 파일 찾기·관리

  • glob: 특정 규칙이나 확장자 패턴(예: *.csv)을 가진 파일들을 시스템에서 긁어모을 때 사용
  • os: 현재 작업 경로를 확인하거나 디렉토리를 생성/수정하는 등 운영체제 기본 기능을 조작할 때 사용
import glob
import os

# 특정 확장자 파일 목록 가져오기
csv_files = glob.glob('/data/*.csv')

# 현재 경로 확인
print(os.getcwd())

# 파일 경로에서 파일명만 추출
file_path = "/content/drive/MyDrive/검사결과.xlsx"
directory, filename = file_path.rsplit('/', 1)
print(filename)  # 검사결과.xlsx

 

 

6. 클래스 (Class)

함수가 많아지면 관리가 힘들어지는데... 이때 사용하는 게 클래스!

관련된 데이터(속성)와 함수(메서드)를 하나로 묶는 설계도? 라고 이해하면 될 듯

프로젝트 규모가 커지고 관리할 대상이 많아지면 필요하겠지만 지금 당장은 완벽하게 이해할 필요는 없으니까 구조만 파악해둡시다 (이해하려고 해도 어려워서 못한다 😅)

class Equipment:
    def __init__(self, eq_name, run_hour):  # 객체 초기화 세팅
        self.eq_name = eq_name
        self.run_hour = run_hour

    def check_maintenance(self):            # 정비 대상 판정 메서드
        if self.run_hour >= 1000:
            return "정비 필요"
        return "가동 가능"

# 클래스로 장비 객체 찍어내기
pump_01 = Equipment("메인 펌프", 1250)
print(f"{pump_01.eq_name} 상태: {pump_01.check_maintenance()}")  # 출력: 메인 펌프 상태: 정비 필요

 


7. 불리언 인덱싱

조건을 만족하는 요소만 골라내는 방식. numpy에서도 쓰고, pandas에서 데이터 필터링할 때 특히 많이 쓴다.

import numpy as np

values = np.array([3200, 8500, 11000, 6700, 500])

# 조건으로 바로 필터링
normal = values[(values >= 4000) & (values <= 10000)]
print(normal)  # [8500 6700]
 
 

8. 데코레이터

기존 함수를 직접 수정하지 않고도 함수 외부에 간단한 명령어 (@데코레이터명)를 작성해서 기능을 확장하거나 수정할 수 있게 도와준다. (함수를 통째로 다른 함수로 감싸서 알맹이 앞뒤로 추가 작업을 붙여주는 역할)

# 데코레이터 기본 정의
def log_decorator(func):
    def wrapper():
        print("[로그] 작업 시작 시간 기록")
        func()  # 원본 함수 실행
        print("[로그] 작업 종료 시간 기록")
    return wrapper

# 데코레이터 적용
@log_decorator
def run_test_case():
    print("-> QA 테스트 케이스 실행 중...")

run_test_case()

 

 

9. 파이썬 에러 읽는 법

▼에러 종류 정리

SyntaxError 문법 오류.
IndentationError 들여쓰기 불일치
NameError 정의되지 않은 변수나 함수 사용
TypeError 자료형 불일치 (예: 문자열 + 정수)
IndexError 존재하지 않는 인덱스 접근
KeyError 딕셔너리에 없는 키 접근
FileNotFoundError 파일 경로 오류 또는 파일 없음

예시에도 없는 듣도 보도 못한 에러가 떴다면...?

고민하는 시간도 아까우니까 에러 메시지를 구글링해보자~

만약 검색했는데도 아무것도 안 나온다면...

코드를 하나씩 뜯어보거나,

최후의 보루인 튜터님 찬스를 쓰러 가자...^^

 

 

[아티클 스터디]

데이터 신뢰성이란 데이터가 실제 정보를 얼마나 정확하게 담고 있는가에 관한 개념이다.

신뢰성 있는 데이터를 판별하려면

  1. 데이터 오류와 결측 데이터(오류는 자동으로 잡아내기 어려움 / 결측 데이터는 삭제하거나 대체값으로 처리할 수 있지만 완전한 해결책은 X)
  2. 데이터 가공 정도(원천 데이터는 사람의 손이 덜 탄 만큼 오류가 적음. 그러나 가공 데이터가 무조건 낮은 품질인 것도 아님.)

두 가지를 봐야 한다.

중요한 것은 원천 데이터(데이터의 신뢰성)와 가공 데이터(데이터의 활용성) 사이의 균형을 잘 잡는 것이며, 허용 가능한 오류 수준을 먼저 정한 뒤 데이터를 선택해야 한다.

 

  • 주요 포인트 :
  1. 데이터 오류는 자동 탐지가 어렵기 때문에 분석 초기에 수집 방법과 데이터 내용을 꼼꼼히 확인하는 과정이 선행되어야 한다.
  2. 결측 데이터는 단순 누락일 수도 있지만 그 자체에 의미가 있는 경우도 있어, 무조건 대체하거나 삭제하면 분석 결과가 왜곡될 수 있다.
  3. 빅데이터 분석 시에는 결측 데이터가 없거나 최소한인 데이터를 처음부터 선택하는 것이 신뢰성을 확보하는 현실적인 방법이다.
  4. 원천 데이터라고 해서 오류가 전혀 없는 것은 아니며, 수집 당시 발생한 오류와 이후 조작 과정에서 생기는 오류가 존재할 수 있다.
  5. 가공 데이터는 신뢰성이 낮아질 수 있지만, 가공 자체가 문제가 아니라 신뢰성과 활용성 간의 균형을 얼마나 잘 잡는가가 중요하다.

003

오늘의 시행착오

*** 과제 스포 주의 ***

레벨 3 문제 풀다가, 줄글로 된 코드만 쭈욱 써내려가니 이게 맞나...?? 싶어서

튜터님께서 라이브세션 때 알려주신 코드 시각화 사이트를 이용해보았다

 

 

코드의 작동 단계를 하나하나씩 순서대로 볼 수 있음 👍


 

004

내일 학습할 것

  • 과제 다시 풀어보기
  • 프로그래밍 기초 내용 처음부터 끝까지 복습
 
 
+++...
팀 컨셉을 맞추었습니다 ^^ 팀장님께서 팀 노션 커버도 아주 귀여운 걸로 만들어오심 😻😻