Daily plan
๐์ค์
- SQL ์ฝ๋์นดํ 89, 90 ,91 + QCC 4๋ฒ ๋ฌธ์
- ํต๊ณ ๊ฐ์ 3์ฃผ์ฐจ
๐ฅ ์คํ
- 13์ ์ํฐํด ์คํฐ๋
- ํต๊ณ ๊ฐ์ ๋ด์ฉ ์ ๋ฆฌ
- 15์ ํ์ด์ฌ ์คํ ๋ค๋๋ฐ ์ด๋ก ๊ฐ์ + ๋ฐ๋ก ์ ๋ฆฌ ๋ณต์ต
๐ ์ ๋
- 19์ ํ์ด์ฌ ์คํ ๋ค๋๋ฐ ์ค์ต ๊ฐ์
- ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ&์๊ฐํ 3์ฃผ์ฐจ ๋ค์ ๋ณต์ต
To Do
- โ
SQL ์ฝ๋์นดํ 89~91
- โ
์ํฐํด ์คํฐ๋
- โ
ํต๊ณ ๊ฐ์ 3์ฃผ์ฐจ
- ์คํ ๋ค๋๋ฐ ์ด๋ก &์ค์ต ๊ฐ์ -> ์ ๋ฆฌ ๋ณต์ต
- ๊ฐ์ธ๊ณผ์ ํผ๋๋ฐฑ ํํฐ๋๊ป ์ง๋ฌธํ๊ธฐ
์ด๋ฒ์ฃผ ๋ชฉํ
SQL ์ฝ๋์นดํ
Q89 - Managers with at Least 5 Direct Reports
select name
from employee
where id in (select managerId
from employee
group by managerId
having count(id)>=5)
- where์ ์์ ๋ฑํธ(=)๋ฅผ ์ผ๋๋ฐ, ์งํผํฐ ์ ์๋๊ป์ ๊ทธ๋ ๊ฒํ๋ฉด ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ์ด ์ฌ๋ฌ๊ฐ์ผ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค๊ณ ๋ง์ํด์ฃผ์
จ๋ค.
- ๊ทธ๋์ in์ผ๋ก ๋ฐ๊ฟ
Q90 - Confirmation Rate
select s.user_id,
coalesce(round(cnt_confirmed/cnt_total,2), 0) confirmation_rate
from signups s
left join(
select user_id,
count(1) cnt_total,
count(case when action='confirmed' then 1 end) cnt_confirmed
from confirmations
group by user_id
) c
on s.user_id = c.user_id
- ์๋ธ์ฟผ๋ฆฌ๋ ์กฐ์ธ์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ ์์ง ๋๋ฌด ์ด๋ ต๋ค
- ์ด์ ์๋ก ๋ฐฐ์ด coalesceํจ์๋ฅผ ์ด์ฉํด์ confirmation_rate๊ฐ null์ธ ๊ฒฝ์ฐ์๋ 0์ผ๋ก ๋ฐ๊พธ์ด์คฌ๋ค
- case when์ผ๋ก ์กฐ๊ฑด์ ๊ฑธ์ด์ ๊ฐ์๋ฅผ ์
๋์๋ count() ํจ์ ์์ case when ๊ตฌ๋ฌธ์ ๋ฃ์ด์ผ ํ๋ค!!
Q91 - Not Boring Movies
select *
from cinema
where id%2<>0
and description<>'boring'
order by rating desc
ํต๊ณํ ๊ฐ์ 3์ฃผ์ฐจ
์ ์์ฑ ๊ฒ์
A/B test
- ๋ ๋ฒ์ ์ค ์ด๋ ๊ฒ์ด ๋ ํจ๊ณผ์ ์ธ์ง ํ๊ฐํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๊ฒ์ ๋ฐฉ๋ฒ
- ์ ํ๋ฅ , ํด๋ฆญ๋ฅ , ๊ตฌ๋งค์, ๋ฐฉ๋ฌธ ๊ธฐ๊ฐ, ๋ฐฉ๋ฌธํ ํ์ด์ง ์, ํน์ ํ์ด์ง ๋ฐฉ๋ฌธ ์ฌ๋ถ, ๋งค์ถ ๋ฑ์ ์งํ๋ฅผ ๋น๊ต
- ๋ ๊ทธ๋ฃน ๊ฐ ๋ณํ๊ฐ ์ฐ์ฐ์ด ์๋๋ผ ํต๊ณ์ ์ผ๋ก ์ ์๋ฏธํ์ง ํ์ธ
- ํ์ด์ฌ ์ค์ต
import numpy as np
import scipy.stats as stats
group_a = np.random.binomial(1, 0.3, 100)
group_b = np.random.binomial(1, 0.45, 100)
t_stat, p_val = stats.ttest_ind(group_a, group_b)
- scipy.stats.ttest_ind
- ๋
๋ฆฝํ๋ณธ t-๊ฒ์ ์ ์ํํ์ฌ ๋ ๊ฐ์ ๋
๋ฆฝ๋ ์ง๋จ ๊ฐ ํ๊ท ์ฐจ์ด๊ฐ ์ ์๋ฏธํ์ง ํ๊ฐํ๋ ํจ์
- ๋ ์ง๋จ์ ๋ฐ์ดํฐ ๋ฐฐ์ด์ ์
๋ ฅ์ผ๋ก ๋ฐ์์ t-ํต๊ณ๋๊ณผ p-๊ฐ์ ๋ฐํํจ
- t-statistic: ๋ ์ง๋จ ๊ฐ ํ๊ท ์ฐจ์ด์ ํฌ๊ธฐ์ ๋ฐฉํฅ์ ๋ํ๋ด๋ t-๊ฒ์ ํต๊ณ๋
- p-value: ๊ท๋ฌด๊ฐ์ค์ด ์ฐธ์ผ ๋ ํ์ฌ ๋ฐ์ดํฐ๋ณด๋ค ๊ทน๋จ์ ์ธ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ํ๋ฅ ๋ก, ์ด ๊ฐ์ด ์ ์์์ค๋ณด๋ค ์์ผ๋ฉด ๊ท๋ฌด๊ฐ์ค์ ๊ธฐ๊ฐํ๊ณ ์ ์์์ค๋ณด๋ค ํฌ๋ฉด ๊ท๋ฌด๊ฐ์ค์ ๊ธฐ๊ฐํ์ง ์์
๊ฐ์ค๊ฒ์
- ํ๋ณธ ๋ฐ์ดํฐ๋ฅผ ํตํด ๋ชจ์ง๋จ์ ๊ฐ์ค์ ๊ฒ์ฆํ๋ ๊ณผ์
- ๋ฐ์ดํฐ๊ฐ ํน์ ๊ฐ์ค์ ์ง์งํ๋์ง ํ๊ฐํ๋ ๊ณผ์
- ๊ท๋ฌด๊ฐ์ค(H0)๊ณผ ๋๋ฆฝ๊ฐ์ค(H1)์ ์ค์ ํ๊ณ ๊ท๋ฌด๊ฐ์ค์ ๊ธฐ๊ฐํ ์ง ์ฌ๋ถ ๊ฒฐ์
- ๋ฐ์ดํฐ ๋ถ์์ ๋๊ฐ์ง ์ ๋ต์ ์ทจํ ์ ์์
- ํ์ฆ์ ์๋ฃ๋ถ์: ๋ฏธ๋ฆฌ ๊ฐ์ค์ ์ธ์ด ํ ๊ฐ์ค์ ๊ฒ์ฆํ๋ ๊ฒ
- ํ์์ ์๋ฃ๋ถ์(EDA): ๊ฐ์ค์ ๋จผ์ ์ ํ์ง ์๊ณ ๋ฐ์ดํฐ๋ฅผ ํ์ํด๋ณด๋ฉด์ ๊ฐ์ค ํ๋ณด๋ค์ ์ฐพ๊ณ ๋ฐ์ดํฐ์ ํน์ง์ ์ฐพ๋ ๊ฒ
- ๋จ๊ณ
- ๊ท๋ฌด๊ฐ์ค, ๋๋ฆฝ๊ฐ์ค ์ค์
- ์ ์์์ค ๊ฒฐ์
- ๊ฒ์ ํต๊ณ๋ ๊ณ์ฐ
- p๊ฐ๊ณผ ์ ์์์ค ๋น๊ต
- ๊ฒฐ๋ก ๋์ถ
- ํต๊ณ์ ์ ์์ฑ
- ๊ฒฐ๊ณผ๊ฐ ์ฐ์ฐํ ๋ฐ์ํ ๊ฒ์ด ์๋๋ผ ์ด๋ค ํจ๊ณผ๊ฐ ์ค์ ๋ก ์กด์ฌํจ์ ๋ํ๋ด๋ ์งํ
- p๊ฐ
- ๊ท๋ฌด๊ฐ์ค์ด ์ฐธ์ผ ๋ ๊ด์ฐฐ๋ ๊ฒฐ๊ณผ ์ด์์ผ๋ก ๊ทน๋จ์ ์ธ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ํ๋ฅ
- p๊ฐ์ด ์ ์์์ค๋ณด๋ค ์์ผ๋ฉด ๊ท๋ฌด๊ฐ์ค์ ๊ธฐ๊ฐ
- ์ ๋ขฐ๊ตฌ๊ฐ
- ํน์ ๋ชจ์๊ฐ ํฌํจ๋ ๋ฒ์ ์ ๊ณต
- ๋ชจ์ง๋จ์ ํ๊ท ์ด ํน์ ๋ฒ์ ๋ด์ ์์ ๊ฒ์ด๋ผ๋ ํ๋ฅ ์ ๋ํ๋
- ๊ฐ์ค๊ฒ์ : ๋ชจ์๊ฐ ํน์ ๊ฐ๊ณผ ๊ฐ์์ง ๋ค๋ฅธ์ง
t๊ฒ์
- t๊ฒ์ ์ ๋ ์ง๋จ ๊ฐ์ ํ๊ท ์ฐจ์ด๊ฐ ํต๊ณ์ ์ผ๋ก ์ ์๋ฏธํ์ง ํ์ธํ๋ ๊ฒ์ ๋ฐฉ๋ฒ
- ๋
๋ฆฝํ๋ณธ t๊ฒ์ ๊ณผ ๋์ํ๋ณธ t๊ฒ์ ์ผ๋ก ๋๋จ
- ๋
๋ฆฝํ๋ณธ t๊ฒ์ : ๋ ๋
๋ฆฝ๋ ๊ทธ๋ฃน์ ํ๊ท ์ ๋น๊ต ex)
- ๋์ํ๋ณธ t๊ฒ์ : ๋์ผํ ๊ทธ๋ฃน์ ์ฌ์ /์ฌํ ํ๊ท ์ ๋น๊ต
scores_method1 - np.random.normal(70,10,30)
scores_method2 = np.random.normal(75,10,30)
t_stat, p_val = stats.ttest_ind(scores_method1, scores_method2)
๋ค์ค๊ฒ์
- ์ฌ๋ฌ ๊ฐ์ค์ ๋์์ ๊ฒ์ ํ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์
- ๊ฐ ๊ฒ์ ๋ง๋ค ์ ์์์ค์ ์กฐ์ ํ์ง ์์ผ๋ฉด 1์ข
์ค๋ฅ ๋ฐ์ ํ๋ฅ ์ด ์ฆ๊ฐํจ
- ๋ณธํ๋ก๋ ๋ณด์ , ํํค ๋ณด์ , ๋๋ท ๋ณด์ , ์๋ฆฌ์์ค ๋ณด์ ๋ฑ์ด ์์
import numpy as np
import scipy.stats as stats
np.random.seed(42)
a = np.random.normal(10,2,30)
b = np.random.normal(12,2,30)
c = np.random.normal(11,2,30)
p_values = []
p_values.append(stats.ttest_ind(a,b).pvalue)
p_values.append(stats.ttest_ind(a,c).pvalue)
p_values.append(stats.ttest_ind(b,c).pvalue)
alpha = 0.05
adjusted_alpha = alpha/len(p_values)
์นด์ด์ ๊ณฑ๊ฒ์
- ์ ํฉ๋ ๊ฒ์ : ๋ฒ์ฃผํ ๋ฐ์ดํฐ์ ํ๋ณธ ๋ถํฌ๊ฐ ๋ชจ์ง๋จ ๋ถํฌ์ ์ผ์นํ๋์ง ๊ฒ์
- ๊ด์ฐฐ๋ ๋ถํฌ์ ๊ธฐ๋๋ ๋ถ
- ๋
๋ฆฝ์ฑ ๊ฒ์ : ๋ ๋ฒ์ฃผํ ๋ณ์ ๊ฐ์ ๋
๋ฆฝ์ฑ ๊ฒ์
์ 1์ข
์ค๋ฅ & ์ 2์ข
์ค๋ฅ
์ํฐํด ์คํฐ๋
๋ฐ์ดํฐ ์๊ฐํ๋ ์ ์ค์ํ ๊น?
- ์์ฝ : ๋ฐ์ดํฐ ์ดํด ๋ฐ ์์ฌ๊ฒฐ์ ์์ ์๊ฐํ์ ์ค์์ฑ
- ์ฃผ์ ํฌ์ธํธ :
์๊ฐํ์ ์ค์์ฑ
- ์๊ฐ์ ๋ค๋ฅธ ์ธ์ฒด ๊ฐ๊ฐ์ ๋นํด ํ๋ฒ์ ์ฒ๋ฆฌํ ์ ์๋ ์ ๋ณด์ ์์ด ์๋ฑํ ๋ง์ โ ์๊ฐ์ ํตํด ๋น ๋ฅด๊ฒ ์ธ์ฌ์ดํธ๋ฅผ ๋ฐ๊ฒฌํ ์ ์์
- ํ๋์ ์จ์ ์ ๋ณด๋ฅผ ํ์
ํ๊ธฐ ์ด๋ ค์ด ๋ฐ์ดํฐ ํ
์ด๋ธ๊ณผ ๋ฌ๋ฆฌ, ์๊ฐํ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ง๊ด์ ์ผ๋ก ์ดํดํ๊ณ ํจํด์ ์ฐพ์ ์ ์๊ฒ ๋์
- ๋ณ์ ๊ฐ ์๊ด๊ด๊ณ๋ฅผ ํ์
, ์๋ก์ด ์๊ฐ ์ ๊ณต์ ๋์
- ์์ฌ ๊ฒฐ์ ์ ๋์์ ์ค
- ํ๋์ ๋ง์ ์์ ๋ฐ์ดํฐ๋ฅผ ํ์
ํ์ฌ ํฐ ๊ทธ๋ฆผ์ ๊ทธ๋ฆด ์ ์์
- ์๊ฐํ๋ฅผ ์ดํดํ๊ธฐ ์ํด ๊ณผํ, ํต๊ณ ๋ฑ์ ์ง์์ด ์๊ตฌ๋์ง ์์ผ๋ฏ๋ก ์ฝ๊ฒ ์ดํด ๊ฐ๋ฅ
- ์ฐ๋ฆฌ ๋๋ ์๊ฐํ ์ ๋ณด ์ฒ๋ฆฌ์ ํ์ํจ
- ๊ด์ฌ๊ณผ ์ง์ค ์ ์ง๋ฅผ ๋์ โ ์์ฌ๊ฒฐ์ ์๋ค์ ๊ด์ฌ์ด ์ ์ ์ฃผ์ ๋ฅผ ๋ค๋ฃฐ ๋ ๋์์ด ๋จ
์ธ์ฌ์ดํธ
๋ฐ์ดํฐ์์ ์ข์ ์ธ์ฌ์ดํธ๋ฅผ ๋ฐ๊ฒฌํ๋ ๊ฒ๋ ์ค์ํ์ง๋ง, ๋ฐ๊ฒฌํ ๋ด์ฉ์ ์์ฌ๊ฒฐ์ ์์๊ฒ ์ค๋๋ ฅ์๊ฒ ์ ๋ฌํ๋ ๊ฒ๋ ๋งค์ฐ ์ค์ํ๋ค. ์ง๋ ๋ผ์ด๋ธ์ธ์
์์ ํํฐ๋์ด ๋ฐ์ดํฐ๋ถ์๊ฐ์ ํผํฌ๋จผ์ค๋ ๊ฒฐ๊ตญ ์์ ์ด ๋ถ์ํ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์์ด๋์ด๋ฅผ ์ ๋ฌํ๊ณ , ๊ทธ๊ฒ์ด ์คํ๋์ด ์ข์ ์ฑ๊ณผ๋ฅผ ๋ด๊ฒ ๋ง๋๋ ๊ฒ์ด๋ผ๊ณ ๋ง์ํ์
จ๋ ๊ธฐ์ต์ด ์๋ค. ์คํ์ผ๋ก ์ด์ด์ง์ง ์์ผ๋ฉด ์๋ฌด๋ฆฌ ์ข์ ๋ถ์์ ํด๋ ์๋ฏธ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ข์ ์ ๋ฌ๋ ฅ๊ณผ ์ค๋๋ ฅ์ด ํ์ํ๊ณ , ์ด๋ฅผ ์ํด ์๊ฐํ๋ฅผ ์ ํ์ฉํ ์ ์์ด์ผ ํ๋ค.
๊ณตํต ์ธ์ฌ์ดํธ
๋ฐ์ดํฐ ๋ถ์๊ฐ๋ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ ํ ์ต์ข
์ ์ผ๋ก ์ด๋ฅผ ํ์ธ์ ์ค๋ํ๋ ๋ชฉ์ ์ผ๋ก ํ์ฉํ๋ค. ์ด๋ ๋ฐ์ดํฐ์ ์๊ฐํ๋ ํจ์จ์ ์ด๋ฉฐ ์ง๊ด์ ์ผ๋ก ์ ๋ณด๋ฅผ ์ ๋ฌํ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ ๊ทน ํ์ฉํ ํ์๊ฐ ์๋ค.