29일차

Suhyeon Lee·2024년 11월 11일

CodeKata

SQL

95. Queries Quality and Percentage

  • 첫 번째로 시도한 쿼리
SELECT
  query_name
  , ROUND(SUM(rating/position)/COUNT(*), 2) AS quality
  , ROUND((SUM(rating < 3)/COUNT(*))*100, 2) AS poor_query_percentage
FROM
  queries
GROUP BY
  query_name
;

→ Testcase 중에 query_name이 NULL인 경우가 있어서 오답 처리되었음

  • 최종 작성 쿼리
SELECT
  query_name
  , ROUND(SUM(rating/position)/COUNT(*), 2) AS quality
  , ROUND((SUM(rating < 3)/COUNT(*))*100, 2) AS poor_query_percentage
FROM
  queries
WHERE
  query_name IS NOT NULL
GROUP BY
  query_name
;

→ IS NOT NULL 이용하여 해당 내용 수정 후 제출하니 성공함

  • 다른 방법으로 작성한 쿼리
WITH poor_query AS (
    SELECT
      query_name
      , ROUND((SUM(rating < 3)/COUNT(*))*100, 2) AS poor_query_percentage
    FROM
      queries
    GROUP BY
      query_name
  )
SELECT
  query_name
  , ROUND(SUM(rating/position)/COUNT(*), 2) AS quality
  , poor_query_percentage
FROM
  queries
  JOIN poor_query
  USING(query_name)
GROUP BY
  query_name

→ CTE 썼더니 IS NOT NULL 없이도 제출 성공

참고할 만한 다른 풀이

  • IF 활용
SELECT query_name,
       ROUND(AVG(rating / position), 2) AS quality,
       ROUND(AVG(IF(rating < 3, 1, 0)) * 100, 2) AS poor_query_percentage
FROM Queries
WHERE query_name IS NOT NULL
GROUP BY query_name;
  • CASE WHEN 활용
SELECT
  query_name
  , ROUND(AVG(rating / position), 2) AS quality
  , ROUND(SUM(CASE WHEN rating < 3 THEN 1 ELSE 0 END) * 100 / COUNT(*), 2) AS poor_query_percentage
FROM
  queries
WHERE
  query_name is NOT NULL 
GROUP BY 
  query_name
;

97. Immediate Food Delivery II

  • 작성 쿼리
WITH first_order AS (
  SELECT
    RANK() OVER(PARTITION BY customer_id ORDER BY order_date) AS ranking
    , customer_id
    , order_date
    , customer_pref_delivery_date
  FROM
    delivery
 )
SELECT
  ROUND((SUM(order_date = customer_pref_delivery_date)/COUNT(*))*100, 2) AS immediate_percentage
FROM
  first_order
WHERE
  ranking = 1
;

참고할 만한 다른 풀이

  • DATEDIFF 사용
select round(100*avg(datediff(order_date,customer_pref_delivery_date)=0),2) as immediate_percentage
from (
    select customer_id,order_date,customer_pref_delivery_date,rank() over (partition by customer_id order by order_date) as rnk
    from Delivery
)temp
where rnk<=1
  • MIN 사용
SELECT ROUND(AVG(order_date=customer_pref_delivery_date)*100.0,2) AS immediate_percentage
FROM Delivery
WHERE (customer_id, order_date) IN (
    SELECT customer_id, min(order_date)
    FROM Delivery
    GROUP BY customer_id
)

Python

36. 문자열 다루기 기본

  • 작성 코드
def solution(s):
    answer = True
    if len(s) == 4 or len(s) == 6:
        for i in s:
            if i.isdigit():
                pass
            else:
                answer = False
    else:
        answer = False
    return answer
  • 더 간단하게 쓰고 싶음
# 1
def solution(s):
    answer = True
    if (len(s) == 4 or len(s) == 6) and s.isdigit():
        pass
    else:
        answer = False
    return answer

# 2
def solution(s):
    return True if (len(s) == 4 or len(s) == 6) and s.isdigit() == True else False

참고할 만한 다른 풀이

def solution(s):
    return s.isdigit() and len(s) in [4,6]

→ 4와 6이라는 두 개의 값을 가진 list로 문자열 길이가 4,6의 경우에 해당되는지를 확인하고 isdigit()으로 숫자인지를 검증

def solution(s):
    try:
        int(s)
    except:
        return False
    return len(s) == 4 or len(s) == 6

→ try/except문 활용

통계학 기초

1주차
2주차

QnA

서정욱 튜터님께 통계학 기초 관련 질문 보내서 답변 받았음

  • 안녕하세요 튜터님~ 1주차 강의 듣다가 궁금한 점이 생겨서 메시지 남깁니다! 상관계수 계산할 때 np.corrcoef와 df.corr 둘 다 사용하셨는데 둘 사이에 어떤 차이가 있나요? 경우에 따라 corrcoef를 쓸 때와 corr를 쓸 때가 나눠져 있나요? 찾아보니까 corrcoef가 NaN값에 더 민감하다고 하는데 이게 무슨 뜻인지 혹시 설명해 주실 수 있으신가요...
    전달드린 링크

  • 답변 온 내용

    • 사실 그 두 개는 큰 차이는 없고 numpy에서 지원하는 함수냐? pandas에서 지원하는 함수냐? 정도만 있지 기본적으로 수행하는 기능은 동일합니다ㅎㅎ
      • np.corrcoef: numpy 지원. Return Pearson product-moment correlation coefficients.
      • df.corr: pandas 지원. Compute pairwise correlation of columns, excluding NA/null values. method= 매개변수로 피어슨, 켄달-타우, 스피어먼 등을 적용할 수 있음
      • corr 코드
      • 상관계수 종류
    • 보내주신 링크는 pandas의 corr를 사용할 경우에는 혹여나 데이터에 결측값(nan)이 있더라도 상관관계 계산을 해줄 수 있다는 얘기를 하고 있는거네요 ㅎㅎ 반대로 numpy는 그런 기능이 따로 없기 때문에 따로 마스크를 만들어서 corr를 계산하고 있구요
    • 결측값이 있는 상황까지 염두해두고 있다면 더더욱 pandas의 corr를 사용하면 되겠네요 ㅎㅎ

7시 반 튜터님 방에서 QnA

  • 2주차 연습문제 2번

    • 1.96*표본 평균오차 이렇게 하면 튜터님이 적으신 것처럼 나오고 함수 쓰면 튜터님이 써 주신 정답과 다른 답이 나와요
      • 신뢰구간 구하는 함수 코드마다 계산하는 방식이 큰 틀은 같지만 세부 내용이 조금씩 달라서 값이 다르게 나올 수 있다고 하셨음
  • 분포를 구분하는 이유는 뒤에 사용하는 검정이 달라지기 때문인가요? 스튜던트 t 랑 정규분포는 표본수의 차이 외에는 다른 차이는 없다고 보면 될까요?
    → 음 저는 저거 픽셀수 200개랑 10개로보는 차이로 생각했어요 픽셀 수많으면 고화질(동민님 의견)

  • 랜덤성: 컴퓨터로 랜덤한 숫자를 뽑을 때 완전한 랜덤이라고 할 수 있나요?

    • 컴퓨터에서는 엄밀히 말하면 랜덤 정확하게 구현 X
    • 통계물리학 박사과정에서 해당 문제 깊게 다룸
      • 관심 있으면… 대학원으로… 😉
    • random을 만들 때 seed(난수) number
      재현을 위해서 seed를 고정해서 랜덤을 만들기도 함
      머신러닝 다룰 때 'random state'를 정하기도 함
  • pairplot 그릴 때 diag_kind = False 하면 자기 자신 히스토그램 없앨 수 있음

  • 분포를 볼 때 어느 정도 개수가 정규분포라고 할 수 있을까요?

    • 이상적인 건 "무한개"
    • 가능한 많이 데이터가 존재하면 정규 분포에 가깝다
    • 30개 밑으로: Student 분포
  • 자유도

    • 일반적으로 많은 분포에서 데이터 개수(N) - 1
    • 변수들이 얼마나 제한 없이 자유롭나?
  • 카이제곱 → 감마함수(팩토리얼 계산할 때 정수 범위 -> 복소수 범위까지 확장): 팩토리얼 상위호환

  • 푸아송 → 정규분포 근접 n이 커야 하냐 람다가 커야 하냐

    • 자료를 찾아보니 람다가 커야 하더라구요~(기본정의상)
    • np = lambda 니까 n이 커지면 람다가 커지는 것도 맞지 않나요?
      → 저도 저걸 보니 상세한 의미는 다른데 거시적으론 람다의 빈도 = 데이터 수가 되는 경우가 있어서 그런 거라고 넘어갔어요 전기쪽으로 치면 k상수에 비례란의미 n에 비례처럼 쓰신것같네요 p를 조절하는게 통제가 안되는 부분인가봅니다(동민님 의견)
  • 여기서 람다는 발생률을 의미하는건가요…?

    • 람다는 시간, 공간의 어떤 단위에 대해 얼마나 사건이 벌어졌냐? 입니다.
    • 일종의 빈도라 볼 수 있을 것 같아요
      e.g. 콜센터 1시간에 10번정도 전화가 온다
      -> 기준이 시간이면 람다는 10
      -> 기준이 분이면 람다는 10/60
  • 빈도 에 구간이 더해지면 람다라고 이해하면 될까요?

    • 구간도 됩니다~
      e.g. 경부고속도로 특정 구간에 사고가 몇 번 일어남
      "특정 시공간의 사건 발생률"

회고

  • 새로 짜여진 팀의 팀원이 나만 빼고 모두 MBTI 앞자리가 E라 신기했음
    • 네 명 모두 T라는 것도 놀라움!
  • 다양한 경험을 한 사람들이 모여 있어 배워갈 점이 많다는 생각이 들었음
  • 다들 성격도 좋고 친절하셔서 이번 팀도 지난 팀들처럼 잘 지낼 수 있을 것 같음
  • 상관계수는 단위가 없어서 단위가 다른 여러 쌍의 변수에서 직선관계의 정도를 비교할 수 있다고 함
profile
2 B R 0 2 B

0개의 댓글