TIL/내일배움캠프

파이썬 시작하기 Ⅰ

Kou_ 2026. 4. 30. 20:17

[내일배움캠프] QA/QC_6기 - 사전캠프 8일차

  • TIL
    • 파이썬 시작하기
    • SQL로 분석 실습해보기
  • To-Do List
    1. 파이썬 (~ Chap1-8)
    2. 퀘스트 진행
    3. STEP 4-2 실습
    4. 이전 ADsP 학습 내용 정리

파이썬

파이썬 시작하기

    • 파이썬 문법을 시작하기 앞서
      모든 것을 암기하려고 하지 말 것 → 이해정도만 하고 이후 인터넷에 찾아가면서 코딩하는 것이 기본
    • 변수 선언
      • a=3 #3을 a에 넣는다.
        print(a) #3
      • b=a #a에 들어있는 값 3을 b에 넣는다
        print(b) #3
      • a=5 #a에 5라는 새로운 값을 넣는다.
        print(a,b) #5,3
    • 숫자형 자료형
      • 자료형이란 프로그래밍을 할 때 쓰이는 숫자, 문자열 등 자료 형태로 사용하는 모든 것
      • 숫자형 : a=32, b=2.3과 같은 숫자 (사칙연산, 몫과 나머지 구할 수 있음)
        + (더하기),- (빼기), * (곱하기), / (나누기), // (몫), % (나머지), ** (거듭제곱)
    • Bool 자료형
      • 특별한 자료형으로 참/거짓을 나타내는 불(Boolean) 자료형이 있음
      • a=True #참
        b=False #거짓
        • 소문자로 작성하면 자료형으로 인식하지 않고 변수명이라 생각하여 에러 발생
        • True/False는 변수명으로 쓸 수 없음
      • 비교연산자의 결과를 나타낼 때 사용
      • a=4>2 #True
      • not a #False (NOT 연산자로 참/거짓을 바꿀 수 있음)
      • a and b #False (AND 연산자로 모두 참이어야 참을 반환)
      • a or b #True (OR 연산자로 둘 중 하나만 참이어도 참)
    • 문자열
      • 텍스트를 데이터로 사용하는 것
      • a='aa' 또는 a="aa"
      • a=3
        b=str(a) #숫자 3을 문자열 데이터로 바꿔 b에 저장
        print(b) #3
      • 문자열 간의 더하기는 두 문자열을 이어붙인 문자열을 반환
      • 문자열과 정수의 더하기는 에러 발생
      • 문자열의 길이는 len() 함수로 구할 수 있음
        print(len("hello, my name is kou.") #21 (띄어쓰기, 쉼표, 마침표 등 포함)
    • 메소드(method)
      • 특정 자료형 뒤에 . 를 붙이고 쓰는 내장 함수
      • 모든 알파벳 대/소문자 바꾸기
        sent='Python'
        sent.upper() #PYTHON
        sent.lower() #python
         
      • 특정 문자 기준으로 문자열 나누기
        # 이메일 주소에서 도메인만 추출하기
        email='test@naver.com'
        result=email.split('@')[1].split('.')[0]
        print(result)
      • 특정 문자를 다른 문자로 바꾸기
        txt='부산시-남구-대연동'
        print(txt.replace('-','>'))
    • 인덱싱과 슬라이싱
      • 문자열에서 일부를 따로 떼어 부르는 방법
      • 인덱싱 : 한 글자 씩 부를 때는 몇 번째인지 '인덱스'를 넣어 불러서 인덱싱
        alph='ABCDEFGHIJKLMNOPQRSTUVWXYZ' print(alph[3]) #D (phython은 숫자를 0부터 셈)
      •  슬라이싱 : 문자열의 일부를 잘라낼 때
        alph='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
        print(alph[3:7]) #DEFG (4~8번째 문자열)
        print(alph[:2]) #AB (3번째 이전)
        print(alph[22:]) #WXYZ (23번째 이후)
         
      •  특정 문자열로 자르고 싶을 땐 앞에서 설명한 .split('문자열') 사용
    • 리스트 (list)
      • 순서가 있는, 다른 자료형들의 집합
      • 리스트의 요소로 리스트 중첩 가능
        a=[1,3,[2,4],0]
        print(a[2]) #[2,4]
         
      •  덧붙이기
        a=[1,3,4]
        a.append(5) #[1,3,4,5]
        a+=[7,9] #[1,3,4,5,7,9]
        a+=[[10]] #[1,3,4,5,7,9,[10]]
        print(a)
         
      •  정렬하기
        a=[9,1,5,3,6,4,8]
        a.sort() #[1,3,4,5,6,8,9]
        a.sort(reverse=True) #[9, 8, 6, 5, 4, 3, 1]
        print(a)
        
         
      • 요소가 리스트 안에 있는지 알아보기 
      • a=[9,1,5,3,6,4,8] print(1 in a) #True print(2 in a) #False print(0 not in a) #True
    • 딕셔너리 (dictionary)
      • 딕셔너리는 키(key)와 벨류(value)의 한 쌍으로 이루어진 자료의 모임
      • a={ } 또는 a=dict() 를 사용하여 딕셔너리 만들 수 있음 
      • 딕셔너리의 요소에는 순서가 없어 인덱싱 사용 불가
      • 딕셔너리의 값을 업데이트 하거나 새로운 쌍의 자료 추가 가능
        person = {"name":"John", "age":35}
        person["name"]="Dan" #John을 Dan으로 업데이트
        person["city"]="Busan" #새로운 city 자료 추가
        print(person) #{'name': 'Dan', 'age': 35, 'city': 'Busan'}
         
    •  조건문
      • if 문 : 조건을 만족했을 때만 특정 코드를 실행하도록 하는 문법
        money=3500
        if money>3700:
            print('택시')
        elif money>1100:
            print('지하철 또는 버스')
        else:
            print('walk')
         
  • 반복문
    • for 문
      people = [
        {'name': 'bob', 'age': 20},
        {'name': 'carry', 'age': 38},
        {'name': 'john', 'age': 7},
        {'name': 'smith', 'age': 17},
        {'name': 'ben', 'age': 27},
        {'name': 'bobby', 'age': 57},
        {'name': 'red', 'age': 32},
        {'name': 'queen', 'age': 25}
       ]
      for person in people:
          if person['age']>25:
              print(person['name']) #carry / ben / bobby / red
       
    •  for 문 - enumerate, break
      fruits = ["apple", "banana", "cherry", "mango"]
      for i, fruit in enumerate(fruits):
          print(i, fruit)
          if i==4: #i가 4인 값만 반환
              break #반복구문 종료
       

반복문 연습 part 1

  • 주어진 리스트와 찾고자 하는 값을 입력받아, 해당 값이 리스트에서 몇 번 등장하는지 출력 
  •  코딩
    numbers = [1, 2, 3, 4, 2, 2, 5, 2]
    value_to_find=2
    count=0
    for number in numbers:
        if number==value_to_find:
            count+=1
    print(f"리스트에서 {value_to_find}은 {count}회 등장합니다.")
     

SQL 실전

조건을 WHERE과 SELECT, 어디에 써야 하나요?

  • WHERE과 SELECT의 용도
    위치
    용도 설명
    예시
    어떤 경우 사용하나요? (질문)
    답변 / 선택 기준
    WHERE
    테이블에서 조건 필터링조건에 맞지 않는 행(row)을 아예 제거함 → 결과에 포함되지 않음
    WHERE score > 60
    조건 불충족한 행을 없애고 싶을 때
    WHERE 절에 조건을 씁니다.
    SELECT
    출력할 컬럼 처리
    남은 행에서 출력할 값이나 형식 계산/가공 → 출력 형태를 바꿈
    SELECT IF(score > 60, 'Pass', 'Fail')SELECT CASE WHEN score > 60 THEN 'P' ELSE 'F' END
    조건에 따라 표시되는 값을 다르게 하고 싶을 때
    SELECT 절에 조건을 씁니다.(CASE, IF, 계산식 등) 등

FILTER() 사용 오류

  • PostgreSQL에서 지원하는 문법
    COUNT(*) FILTER (WHERE 조건)
  • MySQL 등에서 지원하는 문법
    SUM(CASE WHEN 조건 THEN 1 ELSE 0 END)

 ' vs " 차이

  • ' (작은 따옴표) : 문자열을 나타냄 (DBMS 공통으로 항상 사용)
  • " (큰 따옴표) : 컬럼명, 별칭 등 식별자에 사용 (DBMS 마다 다르기 때문에 혼용 금지)
  • 식별자(Identifier) : DB에서 무언가를 구분하고 부르는 이름
    → 즉, 데이터, 컬럼, 뷰, 인덱스, 별칭 등을 식별하기 위해 붙이는 이름

LEFT JOIN vs INNER JOIN

  • 두 JOIN 문의 차이
    항목
    LEFT JOIN
    INNER JOIN
    기본 개념
    왼쪽 테이블의 모든 행을 포함하고, 오른쪽 테이블에서 일치하는 값이 있을 때만 결합
    양쪽 테이블에서 일치하는 행만 결합
    일치하지 않는 경우
    오른쪽에 일치하는 값이 없으면, 해당 컬럼은 NULL로 채워짐
    일치하지 않으면 그 행은 제외됨
    주 용도
    왼쪽 기준 전체를 유지하면서, 오른쪽 정보가 있으면 결합, 없으면 NULL
    두 테이블의 공통된 데이터만 추출할 때
    필터 조건 활용 예시
    WHERE 오른쪽테이블.컬럼 IS NULL
    → 오른쪽 테이블에 없는 값 찾기
    특정 조건에 맞는 공통 데이터만 필터링
    결과 행 수
    왼쪽 테이블 기준으로 행 수가 유지되거나 늘어남
    두 테이블의 공통된 행만 나옴
    (줄어들 수 있음)
    예시
    정비 이력이 없는 차량 찾기
    정비 이력이 있는 차량만 찾기

SQL 실전 학습 '실습'

배터리 셀 품질 모니터링 분석

  • 불량 기준
    • 전압 voltage < 3.0V or > 4.3V → 불량
    • 온도 temperature < 10℃ or > 50℃ → 불량
    • 내부저항 internal_resistance > 200mΩ → 불량
  • 문제
    • Q1. 전체 셀 중 불량 셀의 비율(%) 계산하시오.
    • Q2. 품질 항목별 불량 건수를 구하시오.
    • Q3. 로트(lot_no)별 불량률(%)를 구하시오.
    • Q4. 3개 항목 모두 기준 초과한 셀 수를 구하시오.

미션 4 : 샘플 데이터 + GPT로 인사이트 뽑기

GPT로 코딩한 Python
[ 미션 4 데이터 분석 인사이트 정리 ]
  • 데이터 개요 (어떤 데이터였는지 1~2줄)
    • 자동차 부품 생산 공정에서 날짜, 라인, 근무조, 설비, 작업자별로 총 생산량과 불량 수를 기록한 품질 데이터
    • 그래프에서는 각 날짜마다 라인별 총 불량 수 / 총 생산량 × 100으로 불량률을 계산해 비교
  • 주요 발견 (3가지)
    1. 2024-01-08에 전체적으로 불량률이 높아짐
      특히 1라인은 약 3.52%로 전체 기간 중 가장 높은 불량률을 보였고, 2라인과 3라인도 각각 약 2.96%, 2.72%로 비교적 높은 편
    2. 2라인은 초반부터 상대적으로 높은 불량률을 보였다.
      2024-01-02와 2024-01-03에 2라인의 불량률은 각각 약 3.09%, 3.05%로 높아, 2라인은 특정 기간 동안 설비 조건, 작업 조건, 검사 기준 등을 우선 확인할 필요가 있음
    3. 3라인은 전반적으로 가장 안정적인 흐름을 보였다.
      3라인은 대부분 날짜에서 약 1.7~2.7% 범위로 움직이며, 1라인이나 2라인처럼 급격한 상승폭은 상대적으로 작음
  • 가장 이상해 보이는 패턴
    • 2024-01-08에 1라인 불량률이 급격히 상승한 것이 주말 이후 첫 생산일이라면, 설비 재가동 조건, 금형 상태, 원재료 LOT 변경, 작업자 교대, 세팅값 변경 등을 확인해볼 필요가 있다.
    • 2024-01-11의 1라인 불량률이 약 0.72%로 매우 낮게 보이지만, 이 날짜는 현재 데이터상 1라인 주간 데이터 1개만 존재→ 50행 데이터를 넣어 이후 다른 라인의 데이터가 기입되지 않은 것으로 보임 (그럼에도 매우 낮은 수치)
  • 이 데이터로 더 분석해보고 싶은 것
    단순한 날짜별 라인 비교에 더해 불량률 상승 원인을 좁히는 분석.
    • 근무조별 분석: 주간과 야간 중 어느 조에서 불량률이 더 높은지 확인
    • 불량유형별 분석: 치수불량, 표면불량, 기타 중 어떤 불량이 가장 많이 발생하는지 확인
    • 설비별 분석: 특정 설비, 예를 들어 M03, M04, M05 등에서 불량률이 높게 나타나는지 확인
    • 작업자별 분석: 특정 작업자와 높은 불량률이 반복적으로 연결되는지 확인
    • 2024-01-08 집중 분석: 해당 날짜의 라인, 근무조, 설비, 작업자, 불량유형을 세부적으로 비교
  • 오늘 처음 써본 파이썬 코드 중 기억에 남는 것
    • groupby를 이용해 날짜별·라인별로 데이터를 묶고, 총 생산량과 총 불량 수를 합산한 부분
      daily_line = (
          df.groupby(["date", "line"], as_index=False)
            .agg(
                total_produced=("total_produced", "sum"),
                defect_count=("defect_count", "sum")
            )
      )


출처

전용문, 박현민 지음, 2026 ADsP 데이터분석 준전문가, 위키북스

내일배움캠프 교육 자료