데이터 부트캠프 - Today I Learned

[스파르타 내일배움캠프 / 데이터 분석 트랙] TIL(Today I Learned)_7주차_25.01.08

onion95 2025. 1. 8. 20:47

Today's Goals

1. 다시 학습 주간에 익숙해지기 - 코드카타 SQL & 파이썬

2. 통계학...이걸 내가 또 배울 줄이야

 

 

 

 

 

 

 

 

1. 코드카타

 

SQL


 

[결과가 없을 때 select column과 select max(column)의 차이]

  • select column은 조건에 맞는 행이 없으면 빈테이블을 반환함
  • 하지만 SQL 문제에서 조건이 맞는 행이 없으면 null을 반환하라는 조건이 있었음
  • 집계함수가 추가되면 결과가 없더라도 null을 반환해줌(집계함수의 특징 > 집계 함수가 반환값을 하나의 값으로 압축하려하기 때문에 빈 입력이 들어오면 반환할 값이 없으므로 NULL을 반환하게 됨)
-- 두번째로 높은 급여 구하기

with sub as (select id, salary,
                    dense_rank() over (order by salary desc) as ranking
            from Employee)

select max(salary) as SecondHighestSalary
from sub
where ranking = 2;

-- 다른 답안
select max(salary) as SecondHighestSalary 
from Employee  
Where salary < (select max(salary) from Employee)

 

 

[컬럼값을 모두 합쳐서 하나의 문자열로, group_concat]

select sell_date,
       count(distinct product) as num_sold,
       group_concat(distinct product) as products
from Activities
group by sell_date
  • group_concat(column)은 column의 값들을 모두 합쳐서 하나의 문자열로 반환('a, b, c, d')하는데 기본 구분자는 ,
  • 정렬과 구분자 설정 모두 가능한 함수

https://wnwa.tistory.com/34

 

[MySQL] 조건에 맞는 값들을 묶어서 출력하기 GROUP_CONCAT

1) 예시로 기본 사용법 알아보기 - 'department1' TABLE 기본 형태 - GROUP_CONCAT 함수 적용한 'department1' TABLE 위와 같이 '같은 팀' 조건에 해당하는 값들을 묶어서 출력하는 쿼리는 아래와 같습니다. SELECT t

wnwa.tistory.com

 

 

 

파이썬


 

[n, m의 최대공약수와 최소공배수 구하기]

def solution(n, m):
    for i in range(1, min(n,m)+1) :
        if n%i == 0 and m%i == 0 :
            max_num = i
    for j in range(max(n,m), (n*m)+1) :
        if j%n == 0 and j%m == 0 :
            min_num = j
            break
    answer = [max_num,min_num]
    return answer
  • 최대공약수를 구하는 방법까진 생각났지만 최소공배수에서 막힘(n과 m에 어떤 값을 곱해서 배수가 같아질 때를 구해야지 생각했지만 곱하는 값이 각각 다를 수 있기 때문에 no..)
  • 위에서 최대공약수가 같은 값이므로 i로 통일했으니 최소공배수 또한 같은 값이 최소공배수에 대한 조건을 걸어야 했음
  • 최대공약수 조건은 break를 넣으면 안되는데, break를 넣으면 i에 해당하는 첫번째 값(최소값)이 반환되기 때문이며, 최소공배수를 구하는 반복문에서 break가 들어간 이유기도 함

 

 

[n진법으로 변환하기]

  • 일단 n진법이 뭔지 전혀 기억나지 않았음 ㅎ... 아래 블로그 참고

https://blog.naver.com/noksek0615/223141412248

 

[이산수학 기초] 1. N진법의 계산과 변환방법

이산수학은 컴퓨터 프로그래밍을 배우기 위해 최소한 알아두어야할 내용입니다. 중요하지만 어려우므로 개...

blog.naver.com

def solution(n):
    answer = ''
    while n > 0 :
        n, rest = divmod(n,3)
        answer += str(rest)
    return int(answer, 3)
  • divmod 는 몫과 나머지를 튜플 형식으로 반환함 > (a,b)
  • int(string, base)는 string으로 입력된 숫자를 base진법에서 10진법 정수로 바꿔줌
  • 10진법에서 n진법으로 바꾸는 기본적인 함수는 아래와 같음
def solution(n, q):
    rev_base = ''

    while n > 0:
        n, mod = divmod(n, q) n을 p으로 나눈 몫과 나머지
        rev_base += str(mod)

    return rev_base[::-1]
  • 나머지 값을 rev_base 라는 문자열에 계속 += 해주면 역순으로 문자열이 만들어짐(제일 앞으로 값이 추가됨)
  • 따라서 최종적으로 n진법 수를 반환하려면 reverse가 필요함(위 풀이에서는 n진법 수를 역순으로 뒤집은 결과를 10진법으로 바꾸라고 했기 때문에 reverse 없음) 

https://eesko.tistory.com/150

 

[Python] - 파이썬 진수변환(2진법, 3진법, 5진법, 10진법).. [n진법]

Pyhton 진법 변환 n진수 → 10진수 * 결과값은 모두 string * python에서는 기본적으로 int() 라는 함수를 지원한다 >> int(string, base) 위와 같은 형식으로 사용. base에는 진법을 넣으면 된다. print(int('101',2))

eesko.tistory.com

 

 

[함수를 정의할 때, 빈 변수를 정의하는 위치는 중요하다]

def solution(s):
    split_s = s.split(' ')
    new_split_s = []
    for word in split_s :
        new_word = ''
        for i in range(len(word)) :
            if i % 2 == 0 :
                new_word += word[i].upper()
            else :
                new_word += word[i].lower()
        new_split_s.append(new_word)
    
    return ' '.join(new_split_s)

 

  • split은 구분자를 기준으로 단어 혹은 문자를 나눠 리스트로 반환

 

  • 처음 답안에서는 new_split_s = [] 라는 빈 리스트를 첫번째 반복문 밑에 정의해줌
  • 결과 값은 계속 마지막 단어인 world에 대해서만 나옴
  • 빈 리스트를 정의하는 new_split_s가 첫번째 반복문 아래 있어, 분리된 각 단어에 대해 새로운 반복문이 수행될 때마다 새롭게 빈 리스트로 리셋되어 이전에 추가한 단어가 사라졌기 때문
  • 각 변수 지정, 혹은 연산 등의 동작이 어디에 종속되는지 주의해야 함

 

  • 리스트에 처리가 완료된 단어를 담는 것 말고, =''를 통해 문자열 변수로 정의하고, += new_word 와 += ' '를 순서대로 해줘도 되지만, 이렇게 되면 마지막 단어 뒤에도 공백이 추가되어 이걸 삭제해주는 과정 필요(answer[:-1] 처럼)

 

 

 

 

2. 통계학

 

기초강의


[유의성 검정]

① A/B 검정

  • 두 그룹의 비교를 위해 > 두 버정 중 어느 것이 더 효과적인지 평가
  • 두 그룹간의 변화(차이)가 우연한 결과가 아닌 통계적으로 유의미한지 확인

 

②가설 검정

  • 데이터가 특정 가설을 지지하는지 검정
  • 표본 데이터를 통해 모집단의 가설을 검증
  • 귀무가설(H0, 변화/차이/효과 없는 기존 상태)과 대립가설(H1, 변화/차이/효과 있음)을 설정하고 유의수준과 p값을 비교하여 귀무가설 기각 여부 결정
  • p값은 귀무가설이 참일 경우 관찰된 통계치(극단적 결과)가 나올 확률을 의미함 > 통계적 유의성이 있다는 의미
  • 보통 p값이 유의수준보다 작으면 귀무가설을 기각하는데, 일반적으로 이 유의수준을 0.05로 설정
  • 신뢰구간은 특정 모수가 포함될 범위를 제공하는 것으로, 모집단의 평균이 특정 범위 내에 있을것이라는 확률을 나타내는 것이고 가설검정은 모수가 특정 값과 같은지 다른지 테스트 하는 것

 

③t검정

  • 가설검정의 대표적인 방법
  • 두 집단 간의 평균 차이가 통계적으로 유의미한지 확인하는 것
  • 독립표본 t검정은 독립된 그룹의 평균을 비교하는 것임(두 반의 시험 성적 비교)
  • 대응표본 t검정은 동일한 그룹의 전후 평균을 비교하는 것임(다이어트 전 후 체중 비교)

 

④다중검정

  • 여러 가설을 동시에 검정할 수 있지만, 각 검정마다(두가지씩 비교하는) 유의수준을 조정하지 않으면 1종오류 발생 확률이 높아짐
  • 본페로니 보정(대표적), 튜키 보정, 던넷 보정, 윌리엄스 보정 등으로 보정하는 과정 필요

 

⑤카이제곱검정

  • 범주형 데이터 표본 분포가 모집단 분포와 일치하는지 검정(적합도 검정)
    • 관찰 분포와 기대 분포가 일치하는지 검정하는 것으로, p값이 높으면 관찰 데이터와 귀무 가설이 적합
    • p값이 낮으면 귀무 가설 기각이므로 관찰 데이터와 귀무 가설 부적합
  • 두 범주형 변수 간의 독립성 검정
    • p값이 높으면 두 변수 간 연관성이 없는 것이므로 독립성이 있다고 판단
    • p값이 낮으면 두 변수 간 연관성이 있는 것이므로 독립성이 없다고 판단

 

 

[제1종 오류와 제2종 오류]

  • 제1종 오류는 귀무가설이 참인데 기각하는 것
    • 잘못된 긍정(위양성)을 의미하는 것으로, 아무런 영향이 없는데 영향이 있다고 판단하는 것
    • 제1종 오류는 유의수준을 경계로 귀무가설을 기각하는 점을 이용해 유의수준으로 제어함
    • 유의수준을 0.05라고 정하는 것은 5%의 확률로 일어나는 제1종 오류는 감수한다는 의미임
  • 제2종 오류는 귀무가설이 거짓인데 기각하지 않는 것
    • 잘못된 부정(위음성)을 의미하는 것으로, 영향이 있는데도 영향이 없다고 판단하는 것
    • 제2종 오류를 통제하는 방법은 따로 없고 표본 크기를 키우거나, 유의수준을 너무 낮추면 제2종 오류가 일어날 확률이 높아지는 상충관계를 이용하는 것