30일차

Suhyeon Lee·2024년 11월 12일

CodeKata

SQL

98. Game Play Analysis IV

  • 작성한 쿼리
WITH min_date AS (
  SELECT 
    player_id
    , MIN(event_date) AS min_date
  FROM  
    activity
  GROUP BY
    player_id
)
SELECT 
    ROUND(COALESCE(COUNT(a2.player_id), 0) / COUNT(DISTINCT a1.player_id), 2) AS fraction
FROM 
  activity a1
  LEFT JOIN activity a2
	ON a1.player_id = a2.player_id 
	AND DATEDIFF(a2.event_date, a1.event_date) = 1
  JOIN min_date m 
	ON a1.player_id = m.player_id 
	AND a1.event_date = m.min_date
;

참고할 만한 다른 풀이

WITH FirstLogin AS (
    SELECT 
        player_id,
        MIN(event_date) AS first_log
    FROM Activity
    GROUP BY player_id
)

SELECT ROUND(COUNT(a.player_id)/COUNT(f.player_id),2) AS fraction
FROM FirstLogin f
LEFT JOIN Activity a
    ON f.player_id = a.player_id
    AND DATE_ADD(f.first_log, INTERVAL 1 DAY) = a.event_date
  1. JOIN with Runtime 1061ms (Beats 35.78%):
    • Time complexity: O(NlogN)+O(N)≈O(NlogN)
    • Space complexity: O(M)
WITH Min_Date_CTE AS
(
	SELECT 
		player_id,
        MIN(event_date) AS event_date
	FROM activity
	GROUP BY player_id
)
SELECT 
	ROUND(COUNT(*) / (SELECT COUNT(*) FROM Min_Date_CTE), 2) AS fraction
FROM 
	Min_Date_CTE a JOIN Activity b 
ON a.player_id = b.player_id
WHERE DATEDIFF(b.event_date, a.event_date) = 1;
  1. AGG() & Subquery with Runtime 583ms (Beats 76.89%):
    • Time complexity: O(NlogG)
    • Space complexity: O(N)
SELECT 
    ROUND(
        SUM(CASE WHEN DATEDIFF(event_date, min_event_date) = 1 THEN 1 ELSE 0 END) 
        / COUNT(DISTINCT player_id),
        2
    ) AS fraction
FROM (
    SELECT 
        player_id,
        event_date,
        MIN(event_date) OVER (PARTITION BY player_id) AS min_event_date
    FROM activity
) AS activity_with_min_date

python

37. 행렬의 덧셈

  • 작성한 쿼리
def solution(arr1, arr2):
    for i in range(len(arr1)):
        for j in range(len(arr1[0])):
            arr1[i][j] += arr2[i][j]
    return arr1

참고할 만한 다른 풀이

  • zip()
# 1
def solution(A,B):
    answer = [[c + d for c, d in zip(a,b)] for a, b in zip(A,B)]
    return answer

# 2
def sumMatrix(A,B):
    return [list(map(sum, zip(*x))) for x in zip(A, B)]
  • numpy
import numpy as np

def sumMatrix(A,B):
    A_np = np.array(A)
    B_np = np.array(B)
    result = A_np + B_np
    return result.tolist()
  • 기타
def sumMatrix(A,B):
    answer = [[A[i][j] + B[i][j] for j in range(len(A[0]))] for i in range(len(A))]
    return answer

→ [ i for i in range(len(A))] 하면 [0,1]. 앞 i 자리에 [A[i][j] + B[i][j] for j in range(len(A[0]))]가 대신 들어갔으니 i가 사용될수 있겠죠. [j for j in range(len(A[0]))]] 또한 출력하면 [0,1]. A[i][j] + B[i][j]이 계산되면 i가 0 j가 0과 1일때 결과를 리스트에 넣어 반환하고, 바깥 리스트 내부에서 i가 1일때 또한번 반복됩니다.

아티클 스터디

A/B 테스트 제대로 이해하기: ②A/B 테스트를 위한 기초 통계 이해하기

통계학 기초

3주차
4주차
5주차
6주차

통계 QnA

7시 반 튜터님 사무실에서

  • 질문자: 이경수
  1. 데이터의 분포: 이항분포
    → 이항분포의 히스토그램을 그리면 0부터 10까지의 값이 분포로 나옴
    하지만 설명에서는 이항분포 선택확률이라서 히스토그램이 연속형 변수처럼 나오지 않을 것 같은데?

ANSWER
데이터 분포, 이항분포 -> 히스토그램, 0~10
처음 이항분포는 0과 1의 선택확률이라서 0의 몇 번 1의 몇 번
동전의 경우 앞면이 나오는 횟수가 x

강의에서는 0~10으로 나오는데 제 생각에는 연속이 안 될 것 같아요.
동전 던져 앞면이 나온 횟수가 x축으로 들어가기 때문에 이진이 아니라 분포가 됩니다.

  1. 회귀 강의
    범주형 모형에서 계수값 어떻게 해석해야 하는가 이해가 잘 안 됨 → 성별은 이항분석처럼 해석하면 되는데 (단순회귀는 해석 되는데)
    범주형 변수의 경우 계수값은 어떻게 해야 하는지?
    계수값 어떻게 해석해야 하는지?

ANSWER
다중회귀모형에서의 계수값 해석 → 보통 회귀는 범주형 변수x(회귀가 가능한지부터 따져봐야 함) 수치형 데이터만 보통 적용합니다

  1. 분산평창계수
    다중공산성 계산하는 방법 설명 없는데 추가 설명?
    다중공선성 문제 해결 위해 분산 팽창 계수 계산해야 한다는데

ANSWER
-> 다중공선성 문제: 변수가 여러 개 앴을 때 변수가 서로 영향을 주는 경우
e.g. 몸무게와 bmi

이런 문제를 해결하기 위해 가장 간단하게 살 수 있는 건
상관관계 계산해서 변수간의 상관성이 높은 걸 제거하는 거

질문자: 송동민
1. 6강 재현가능성 유의수준을 0.005, 데이터 수를 70% 늘려서 보완 → 수학적 기반에 의한 수치인가요?

ANSWER
-> 최근 통계학계 동향에 따르면 0.05도 잘못될 수 있다
-> 최근 0.005가 논의되고 이슈가 되고 있음
-> 데이터 개수를 70% 늘리는 걸로 오류 해결하는데 있어서 합리적
유의수준을 낮춘다고 모두 해결되는 건 아니여서 그래요
1종오류와 2종오류의 중간 지점을 고르기(1종 피하려다 2종 만날 수 있음)

  1. 선택적 보고: 가설 설정 없이 데이터를 보고 가설 설정하는 경우도 해당? EDA는 잘못된 것인가?

ANSWER
-> 가설을 계속 유리한 쪽으로(논문 쓰기 좋은 쪽으로) 의도적으로 바꾸어나가면 안 된다는 의미입니다

  1. 자료수집 중단 시점, 적절한 중단시점 기준이 있나?
    데이터 수집을 한다고 해서 과하다고 할 수 있는 거 아닌가?
    무조건 데이터 수집하는 건 나쁜 것인가?

ANSWER
-> 데이터를 수집할수록 더 결과 신뢰성이 높아짐
-> 하지만 고의적으로 '원하는 결과를 얻었네? 수집 끝내자!'는 안 됨
100개를 수집하겠다고 처음 결정했으면 100개 전부 모아야
-> 데이터 개수를 정하지 않고 일단 더 많이 수집하다가 100개쯤 되었을 때 내가 원하는 결과가 나왔으니 멈추는 행동이 안 된다는 것!

회고

  • python: zip 함수 활용법을 익혀야겠다!
  • 코드카타 할 때 라이브러리를 써도 되니까 좀 더 유연하게 생각하는 게 좋겠다.
profile
2 B R 0 2 B

0개의 댓글