1つ前の基調講演で「フレームワーク作者の考えを持とう」という @palkan さんの発表から実際に Rails コミッターはどんなことを考えながらコメント・レビューをしているのかという流れで繋がりを感じながら聞いていました。
ユースケースがあるか、という観点においては自身も Real world use case? と聞かれてうまく答えられなかったことがあるため Pull Request の例が出てきたときはヒヤヒヤしながら聞いていました。「誰のどの問題を解決したいのか」「その問題はこの解決方法で解決するのが適切なのか」という観点は普段のプロダクト開発においても重要な観点であり、OSS活動においてもプロダクト開発においても意識し続けたいと思います。
(@euglena1215)
CREATEORREPLACEFUNCTION `YOUR_PROJECT.YOUR_DATASET.ttest_ind`(data ARRAY<FLOAT64>, data2 ARRAY<FLOAT64>)
AS ((
WITH dataset1 AS (
SELECT
d AS A
FROM UNNEST(data) as d
)
,dataset2 AS (
SELECT
d AS B
FROM UNNEST(data2) as d
)
, mean AS (
SELECTAVG(A) AS ma,
AVG(B) AS mb
FROM dataset1, dataset2
)
, lena AS (
SELECTCOUNT(A) AS len_a
FROM dataset1
)
, lenb AS (
SELECTCOUNT(B) AS len_b
FROM dataset2
)
, Ama AS (
SELECT
A,
ma,
A - ma AS A_ma,
FROM dataset1, mean
)
, bmb AS (
SELECT
B,
mb,
B - mb AS B_mb,
FROM dataset2, mean
)
, pow_Ama AS (
SELECTSUM(A_ma * A_ma) AS A_ma_2
FROM Ama
)
, pow_Bmb AS (
SELECTSUM(B_mb * B_mb) AS B_mb_2
FROM bmb
)
, S2 AS (
SELECT
(A_ma_2 + B_mb_2) / (len_a + len_b - 2) AS s_2
FROM pow_Ama, pow_Bmb, lena, lenb
)
, t AS (
SELECT
len_a,
len_b,
(ma - mb) / SQRT((s_2/len_a) + (s_2/len_b)) AS t_value
FROM mean, S2, lena, lenb
)
SELECT
`YOUR_PROJECT.YOUR_DATASET.studentt_cdf`(t_value, len_a + len_b-2) AS p_value
FROM t
))
2. クエリの作成
以下のクエリを実行し、p値を得ることができます。
実際に使用するときは各グループの数値をARRAY_AGG で配列にして扱うことが多いです。
WITH test_data AS (
SELECT
[0.0,5.0,29.0,3.0,4.0,32.5,46.3] AS A,
[9.0,4.0,5.0,6.0,4.0,2.0,3.0,1.0,2.0,4.0] AS B
)
SELECT `YOUR_PROJECT.YOUR_DATASET.ttest_ind`(A, B) AS p_value FROM test_data