[내배캠] 데이터분석 6기/사전캠프 기록

[사전캠프 12일차] 아티클 스터디⑨, 파이썬 공부, SQLD 공부

물맨두 2025. 2. 10. 19:47
준비되지 않은 내게 찾아온
어느덧 사전캠프 마지막 주

 

오늘 한 일은,

  • 아홉 번째 아티클 스터디 진행하기
  • 파이썬 공부
    • 개인 퀘스트(달리기반) - [Python 응용하기] Lv2. 스파르타 자판기
  • SQLD 공부
    • [SQLD 자격증 챌린지] 5주차

 

아티클 스터디 ⑨: 주니어 데이터 사이언티스트에게 하고 싶은 말

오늘 읽은 아티클 : 

 

06화 주니어 데이터사이언티스트에게 하고 싶은 이야기들

커리어 성장을 위한 기회 탐색과 인터뷰 준비하기 | 최근에 채용 관련해서 많은 주니어/시니어 데이터 사이언티스트 / 엔지니어를 만나고 있다. 경험상 팀에 지원을 하기 전에 Hiring Manager와 대화

brunch.co.kr

250210 아티클 스터디를 하며 개인 요약 한 일부

데이터 사이언티스트에 대해 쓴 글이었지만, 오늘의 글을 읽으며 커리어 방향성 설정이 얼마나 중요한지를 새삼 곱씹게 됐다. 사실 경력이 無인 신입에게 이런 점들을 생각하기엔 여유가 없을 수도 있다. 내 경우에도 '이전의 경험이 선택을 좌우한다'는 입장에서 더 나은 선택을 위해선 우선 경험이 있어야 한다고 생각하기에 어디든 들어가서 구르다보면 그때부터 기준이 선다고 생각하기 때문이다. 그리고 우선 생각이 원래도 많은 편인데 생각을 오래하다 보면 대체로 행동으로 이어지는 데 제약들을 좀 느껴서 그 생각의 단계에서 소요되는 시간을 너무 길지 않게 갖도록 신경을 쓰고 있기에 생각의 단계를 간소화하는 데만 신경 썼다. 

그럼에도 오늘 아티클에선 다룬 커리어 설정에서 생각해 볼 지점들은 넘긴다고 해서 자연스레 해소되며 사라지는 질문이 아닌 언젠가 결국 맞닥뜨려야 하는 질문들이고, 또 계속 일을 해나가면서 그 단계마다 다시 생각해보며 수정해야 하는 지점들이었다. 그래서 나도 내가 준비하는 도메인과 직무에 있어서 체크리스트를 세워보고 그에 질문하며 어떤 마케터로서 성장해나갈 것이며 그 과정에서 데이터 분석 능력을 어떻게 활용할 수 있을지 고민해야겠다. 

 


 

파이썬 공부: 개인 퀘스트(달리기반) - [Python 응용하기]

Lv2. 스파르타 자판기

Q1. 사용자가 다음의 메뉴들을 볼 수 있게 실행창에 표시합니다.
       (사이다 1,700원 / 콜라 1,900원 / 식혜 2,500원 / 솔의눈 3,000원)

beverages = {'사이다':1700, '콜라':1900, '식혜':2500, '솔의눈':3000}

for beverage, price in beverages.items():
    print(beverage, price)

 

우선 딕셔너리로 실행창에 표시할 값들을 넣어주고, 또 이들을 출력할 수 있게 for문과 items() 함수를 이용해 작성한다.

 

Q2. 사용자에게 어떤 음료를 살 것인지 입력 받고, 만약 목록에 없는 음료일 시에 실행이 종료됩니다.

힌트를 확인하니 input()을 사용하라고 한다.

[참고] "[Python 내장함수] input() : 입력 값 처리 방법", "[Python] if - else문"

위의 두 글을 참고해서 input() 함수를 통해 입력값을 받는 창을 만들고서 if문을 사용해서 가격을 띄우거나 시스템을 종료하도록 코드를 작성했다.

beverages = {'사이다':1700, '콜라':1900, '식혜':2500, '솔의눈':3000}

for beverage, price in beverages.items():
    print(beverage, price)

user_choice = input("음료를 선택해주세요: ")

if user_choice in beverages.keys():
    print(f'{user_choice}는 {price}원 입니다')
else:
    print("해당 음료는 없습니다. 시스템을 종료합니다.")

이렇게 작성하면 

...음? 목록에 없는 음료일 때는 시스템 종료를 시킨 대로 잘하는데, 이상하게 입력한 음료의 가격을 제대로 출력하지 못한다.

그래서 "파이썬 딕셔너리 value 출력"으로 구글링 하여서 함수 get()을 사용해 코드를 수정해줬더니 원하는 대로 잘 출력한다.

beverages = {'사이다':1700, '콜라':1900, '식혜':2500, '솔의눈':3000}

for beverage, price in beverages.items():
    print(beverage, price)

user_choice = input("음료를 선택해주세요: ")

if user_choice in beverages.keys():
    print(f'{user_choice} 음료는 {beverages.get(user_choice)}원 입니다')
else:
    print("해당 음료는 없습니다. 시스템을 종료합니다.")

 

 

Q3. 사용자에게 지불할 금액을 입력 받고, 만약 선택한 음료의 비용보다 작다면 "돈이 부족합니다"를 출력하기

beverages = {'사이다':1700, '콜라':1900, '식혜':2500, '솔의눈':3000}

for beverage, price in beverages.items():
    print(beverage, price)

user_choice = input("음료를 선택해주세요: ")

if user_choice in beverages.keys():
    print(f'{user_choice} 음료는 {beverages.get(user_choice)}원 입니다')
    coin = input("지불할 금액을 입력해주세요: ")
    coin = int(coin)

    if coin >= int(price):
        print(f'{coin}원 받았습니다.')
    else:
        print("돈이 부족합니다.")
else:
    print("해당 음료는 없습니다. 시스템을 종료합니다.")

목록 속 음료를 제대로 입력했을 시에 지불할 금액을 입력할 창이 함께 뜨도록 추가적으로 입력하고,
입력한 금액이 음료 금액보다 크거나 같은 경우엔 얼마 받았는지를, 그렇지 않은 경우엔 돈이 부족하다는 문구를 띄우도록 코드를 작성했다.

입력한 금액에 따라 다른 메시지를 출력하는 모습

 

Q4. 사용자가 음료를 구매하고 남은 잔액을 화면에 표시합니다.

beverages = {'사이다':1700, '콜라':1900, '식혜':2500, '솔의눈':3000}

for beverage, price in beverages.items():
    print(beverage, price)

user_choice = input("음료를 선택해주세요: ")

if user_choice in beverages.keys():
    print(f'{user_choice} 음료는 {beverages.get(user_choice)}원 입니다')

    coin = input("지불할 금액을 입력해주세요: ")
    coin = int(coin)
    price = int(beverages.get(user_choice))

    if coin >= price:
        print(f'{coin}원 받았습니다.')
        print(f'거스름돈은 {coin-price}원입니다.')
    else:
        print("돈이 부족합니다.")
else:
    print("해당 음료는 없습니다. 시스템을 종료합니다.")

얼마 받았는지 띄우는 문구와 함께 잔액 역시 출력하도록 코드를 추가했다.

 

그리고 다시 몇 번 실행해보니 중간에 음료 가격보다 큰 지불 금액을 입력해도 "돈이 부족합니다." 메시지가 뜨길래, 중간에 price를 다시 한 번 선언하는 코드도 추가해줬더니 그런 에러가 발생하지 않게 됐다.

오늘의 파이썬 과제는 이렇게 종료~!

 


 

SQLD 공부: [SQLD 자격증 챌린지] 수강하기

JOIN

관계

  • 관계의 정의
    • 테이블 간의 연결
    • 엔터티와 엔터티가 존재의 형태나 행위로서 서로에게 영향을 주는 형태
  • 관계의 유형
    • 일대일(One-to-One) : 한 테이블의 레코드가 다른 테이블의 단 하나의 레코드와만 연결
    • 일대다(One-to-Many) : 한 테이블의 레코드가 다른 테이블의 여러 레코드와 연결
                                             가장 흔한 관계 유형
    • 다대다(Many-to-Many) : 한 테이블의 여러 레코드가 다른 테이블의 여러 레코드와 연결
                                             일반적으로 별도의 연결 테이블을 통해 구현됨

조인(Join)

  • 조인 : 두 개 이상의 테이블을 연결하여 데이터를 검색하는 데 사용하는 방법
    • 엔티티 간의 관계를 매핑하기 위해 매핑키를 사용하여 두 엔티티의 데이터를 연결하고, 관련된 정보를 함께 조회할 수 있게 함
  • 조인의 유형
    • 내부 조인(Inner Join) : 두 테이블의 교집합을 반환
    • ②왼쪽 외부 조인(Left Outer Join)  가장 많이 사용하는 조인
    • ③오른쪽 외부 조인(Right Outer Join)
    • 전체 외부 조인(Full Outer Join): 두 데이블의 합집합을 반환 같은 데이터면 한 번만 출력함
    • 교차 조인(Cross Join) : 한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인
    • 셀프 조인(Self Join) : 자신과 자신이 조인한다는 의미로 1개의 테이블을 사용

계층형 데이터 모델과 상호배타적 관계

계층형 데이터 모델

  • 계층형 데이터 모델 : 데이터를 트리 구조로 표현하는 방식으로 동일한 데이터에서 상하 구조가 있는 것
    • 각 계층은 다른 계층과 부모-자식 관계를 가짐
    • 한 레코드가 자기 자신에 대한 관계를 가질 수 있는데 이를 순환 관계 혹은 자기 참조관계라 함
    • 계층형 데이터 모델의 다른 점은 자기 자신을 조인했다는 것인데 이를 셀프조인(Self-Join)이라고 함

상호배타적 관계

  • 상호배타적 관계 : 한 요소 또는 그룹이 다른 요소 또는 그룹과 동시에 속할 수 없는 관계

트랜잭션

트랜잭션

  • 트랜잭션 : 데이터베이스의 논리적 연산 단위  트랜잭션 단위로 데이터베이스는 동작함
    • 시작(Begin) : 어떤 일련의 작업을 나타내기 시작할 때를 의미
    • 작업 수행 : 트랜잭션은 하나 이상의 작업으로 이뤄짐
    • 확인(Commit) : 모든 작업이 성공적으로 수행됐을 때 트랜잭션 완료를 위해 확인 단계로 넘어가는 것
    • 롤백(Rollback) : 중간에 문제가 발생했을 시, 트랜잭션을 롤백하여 모든 작업을 취소하고 처음 상태로 돌아감
    • 끝 (End) : 트랜잭션이 커밋되거나 롤백되면 해당 트랜잭션은 종료됨

트랜잭션의 특징 (ACID 속성)

  • 원자성 : 트랜잭션은 원자적인 작업 단위로 간주함
                   더 이상 쪼갤 수 없다는 뜻. 그래서 커밋되거나 롤백하여 처음으로 되돌아가거나.
  • 일관성 : 트랜잭션이 완료된 후에는 데이터베이스가 일관된 상태여야 함
  • 고립성 : 각각의 트랜잭션이 다른 트랜잭션에 영향을 미치지 않도록 함
  • 지속성 : 트랜잭션이 성공적으로 완료된 경우, 해당 트랜잭션에서 변경된 사항은 영구적으로 데이터베이스에 반영돼야 함

Null 속성

Null

  • 데이터베이스에서 특정 필드 또는 칼럼에 값이 없음을 나타내는 특별한(중요한)
  • '알 수 없음', '아직 정의되지 않음(미정)', '데이터 없음' 등으로 해석
  • ‘공백이나 숫자 0’과는 전혀 다른 의미

Null의 특징

  • 미정 상태
  • 데이터의 부재
  • 값의 비교 불가능

집계 함수와 Null 처리

  • SUM 함수 : Null 값을 0으로 처리, Null 값을 제외하고 나머지 값들의 합을 계산
  • AVG 함수 : Null 값을 제외하고 나머지 값들의 평균을 계산 
  • COUNT 함수 : 일반적으로 Null 값을 제외하고 유효한 값들의 개수를
                           단, COUNT(*)는 NULL을 포함한 모든 행의 수를 리턴함
  • MIN/MAX 함수 : Null 값을 무시하고 나머지 값 중에서 최소값과 최대값을 찾음

본질식별자 vs 인조식별자

본질식별자

  • 본질식별자 : 업무에 의해 만들어진 식별자
    • 자연스럽게 존재하는 속성이나 조합 데이터 자체에 들어있는 식별자
    • 엔터티가 갖고 있는 자연스러운 속성을 활용하여 식별자로 사용
  • 본질식별자의 장점
    • 인간이 읽고 이해하기 쉬움
    • 데이터 일치성이 높음
  • 본질식별자의 단점
    • 복합 본질식별자의 경우 복잡성이 증가할 수 있음

인조식별자

  • 인조식별자 : 업무적으로 만들어지지는 않지만 본질식별자가 복잡한 구성을 갖고 있으므로 인위적으로 만든 식별자
    • 의도적으로 만들어진, 데이터와 무관한 특별한 식별자
    • 엔터티를 고유하게 식별하기 위한 보조적인 역할
  • 인조식별자의 장점
    • 데이터 일관성이 유지되며, 데이터 변화에 대한 영향이 적음
    • 복합 본질식별자의 복잡성을 피할 수 있음
  • 인조식별자의 단점
    • 사용자가 직접 읽고 이해하기 어려울 수 있음
    • 중복되지 않도록 일련번호 등을 생성하기 위해 추가적인 관리가 필요

문제 1) 중복 데이터로 인한 품질 문제

  • 외부식별자를 사용해도 중복 데이터를 막을 수 없음
    (∵해당 엔터티의 속성과는 무관하게 외부적으로 제공되는 값이기에)
    • 데이터 일관성 문제
    • 데이터 정확성 문제
    • 검색 및 분석의 어려움
    • 자원 낭비
    • 오류 가능성 증가
  • 해결책
    • 고유 식별자 사용
    • 데이터 정규화
    • 중복 체크 제약 추가
    • 주기적인 데이터 클렌징

문제 2) 불필요한 인덱스 생성

  • 인덱스 : 데이터베이스가 데이터를 빠르게 찾기위해 순서를 유지하고 있는 데이터
  • 본질식별자의 단점
    • 본질식별자가 길고 복잡한 경우 인덱스의 크기가 증가하고 이로 인해 저장 공간을 불필요하게 차지하고 검색 성능이 저하되는 문제가 발생함
    • 식별자가 변경될 경우 해당 키를 사용하는 모든 외래키(Foreign Key)와 관련된 레코드를 업데이트 해야 하는데 이로 인해 갱신 연산에 부하를 주고 일관성을 유지하기 어려울 수도 있음
  • 인조식별자의 단점
    • 인조식별자는 의미 없는 값으로, 데이터의 비즈니스 의미를 표현하지 않음
    • 추가적인 인덱스 관리가 필요할 수도 있음
    • 불필요하게 많은 인덱스를 생성할 시 저장 공간 낭비, 갱신 연산에 부하 등 문제를 초래함

 


 

드디어 오늘로 SQLD 이론 강의를 끝냈다. 강사님의 말씀처럼 시험 문제를 많이 풀면서 문제 속에 등장하는 표현들에 익숙해지는 게 중요할 거 같은데 이는 시험을 앞두고 하면 좋을 것 같다.

 

이번 주가 사전캠프의 마지막 주인 만큼 아티클 스터디도, 개인 퀘스트도 모두 끝날 것 같은데 SQLD 강의까지 다 들을 수 있을지는 잘 모르겠다. 하지만 목표는 원래 원대하게 세워야 못해도 그 근처까지 갈 수 있는 거랬으니까 우선은 완강을 목표로 남은 기간 동안 열심히 들어보기로 한다. 아자!