SQL로 For Loop(For문/반복작업) 구현하기

1.왜 이게 필요했을까?

  • 여러 언어를 오고가면서 분석작업을 진행할 때가 많은데,
  • 가끔은 SQL로만 하고 싶을 때가 있고, 그 때마다 문제가 되었던 부분 중 하나가 For Loop였다. 그래서 찾아보다가 알게 되었다.

2.구현하기

  • presto(0.241)에서 진행하였다.

A.기본 Sequence Table 생성

--Sequence Table 생성
CREATE TABLE temp.sequence AS (
    SELECT 0 AS num
    UNION ALL SELECT 1  AS num
    UNION ALL SELECT 2  AS num
    UNION ALL SELECT 3  AS num
    UNION ALL SELECT 4  AS num
    UNION ALL SELECT 5  AS num
    UNION ALL SELECT 6  AS num
    UNION ALL SELECT 7  AS num
    UNION ALL SELECT 8  AS num
    UNION ALL SELECT 9  AS num
)

Copy

B.필요한 반복수만큼의 Sequence 테이블 생성

-- 시퀀스 테이블의 조합을 통해서 For Loop을 하기 위한 Sequence 생성합니다.
--100번 돌리기 위한 방법

-- CREATE TABLE temp.for_loop AS (
--     SELECT 1 + s1.num + s2.num * 10 AS i
--     FROM temp.sequence s1
--     CROSS JOIN temp.sequence s2
--     ORDER BY i
-- )

-- 1000 번 돌리기 위한 방법
CREATE TABLE temp.for_loop AS (
    SELECT 1 + s1.num + s2.num * 10 + s3.num * 100 AS i
    FROM temp.sequence s1
    CROSS JOIN temp.sequence s2
    CROSS JOIN temp.sequence s3    
    ORDER BY i
)

Copy

C.사용하기

  • 이제 위 for_loop와 반복실행하려는 작업을 cross join으로 묶어 진행하면 된다.

3.예시( 동전 던지기 시뮬레이션)

A.확률 테이블 생성

CREATE TABLE temp.coin
(
      coin_name      varchar(10),
      probability    double
)

Copy

INSERT INTO temp.coin
VALUES ('FairCoin', 0.5),
       ('BiasCoin', 0.9)

Copy

B.For Loop 돌리기

CREATE TABLE temp.experiments AS (       
    SELECT c.coin_name, 
           CASE WHEN random() > c.probability THEN 'head' ELSE 'tail' END AS experiment
FROM temp.coin AS c
CROSS JOIN temp.for_loop AS f
)

Copy

C.결과 요약

SELECT coin_name, 
       COUNT(CASE WHEN experiment = 'head' then 1 end) as n_heads, 
       COUNT(*) as n_flips,  
       cast(COUNT(CASE WHEN experiment = 'head' then 1 end) as double) / COUNT(*) as head_prob
FROM temp.experiments
GROUP BY coin_name

Copy

4.결론

  • Cross Join을 사용하기 때문에 리소스를 엄청 먹기 때문에 주의를 요하지만, 가끔 쓰기에는 아주 좋은 방법이다. ?

5.Footnotes

Read more

다중공선성은 잘못된 인과추론 결과를 만들어낼 수 있습니다.

다중공선성은 잘못된 인과추론 결과를 만들어낼 수 있습니다.

다중공선성(Multi Collinearity) * **Multi-Collinearity(다중공선성)**는 독립 변수들 간의 강한 상관관계가 존재할 때 발생합니다. 즉, 한 독립 변수가 다른 독립 변수에 의해 설명될 수 있을 정도로 상관관계가 높은 상황을 의미합니다. * 이 문제는 주로 회귀 분석에서 나타나며, 변수들 간의 관계를 해석하는 데 있어 큰 장애물이 될 수 있습니다. * 일반적인 회귀식을 $Y=

Bayesian P-Value는 불확실성을 감안하여 모델의 적합도를 평가합니다.

Bayesian P-Value는 불확실성을 감안하여 모델의 적합도를 평가합니다.

Bayesian P- Value * Bayesian P-Value는 **모델의 적합도(goodness-of-fit)**를 평가하는 데 사용됩니다. * 사후 분포(posterior distribution)를 이용하여 실제 데이터와 모델이 생성한 예상 데이터를 비교함으로써, 관측된 데이터가 모델에 의해 얼마나 잘 설명되는지를 평가합니다. * 빈도주의 p-값은 "관찰된 데이터보다 극단적인 데이터가 나올 확률"을 계산하지만, Bayesian P-Value는 "모델이 실제

Non-Identifiability는 Model Parameter를 고유하게 식별할 수 없는 현상입니다.

Non-Identifiability는 Model Parameter를 고유하게 식별할 수 없는 현상입니다.

Non Identifiability * Non-Identifiability는 주어진 데이터와 모델에 대해 특정 파라미터를 고유하게 식별할 수 없는 상황을 의미합니다. 즉, 여러 파라미터 값들이 동일한 데이터를 생성할 수 있으며, 이로 인해 특정 파라미터 값을 확정적으로 추정하기 어렵게 됩니다. * 베이지안 추론에서 Non-Identifiability는 사후 분포가 특정 파라미터 값에 대해 명확하게 수렴하지 않고, 여러 값들에 대해 비슷한 확률을

Rootgram은 큰 분산을 갖거나 비정규 형태의 데이터를 위한 히스토그램입니다.

Rootgram은 큰 분산을 갖거나 비정규 형태의 데이터를 위한 히스토그램입니다.

Rootgram * 히스토그램의 변형으로 데이터가 비정규적이거나 큰 분산을 가지는 경우, 정확한 분포를 파악하기 위해 사용됩니다. * 일반적으로 히스토그램은 데이터의 빈도를 직접적으로 나타내기 때문에, 큰 값이 빈번하게 발생하는 경우 상대적으로 작은 값을 잘 드러내지 못하는 경향이 있습니다. 반면, Rootgram은 빈도를 제곱근 형태로 변환하여, 데이터 분포의 차이를 더 잘 시각화할 수 있도록 돕습니다 * 여기서