Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Hypothesis Testing With Python

Mosky Liu
July 09, 2018

Hypothesis Testing With Python

In an experiment, the averages of the control group and the experimental group are 0.72 and 0.76. Is the experimental group better than the control group? Or is the difference just due to the noise?

In this talk, I will introduce how to calculate the p-value in Python by examples, the common misunderstandings of p-values, how to calculate the power and the sample size, the relationships among α, power, confidence level, β, the common tests, and finally an overall guide to do a hypothesis test.

Also, the second part includes the notebooks to explain the theories lively, which covers p-value, α, raw effect size, β, sample size, actual negative rate, inverse α (like false discovery rate), and inverse β (like false omission rate).

The notebooks are available on https://github.com/moskytw/hypothesis-testing-with-python .

Mosky Liu

July 09, 2018
Tweet

More Decks by Mosky Liu

Other Decks in Research

Transcript

  1. Mosky ➤ Python Charmer at Pinkoi. ➤ Has spoken at:

    PyCons in 
 TW, MY, KR, JP , SG, HK,
 COSCUPs, and TEDx, etc. ➤ Countless hours 
 on teaching Python. ➤ Own the Python packages like ZIPCodeTW. ➤ http://mosky.tw/ 7
  2. Outline ➤ Welch's t-test ➤ Chi-squared test ➤ Power analysis

    ➤ More tests ➤ Complete steps ➤ Theory ➤ P-value & α ➤ Raw effect size, 
 β, sample Size ➤ Actual negative rate, inverse α, inverse β 8
  3. The PDF, Notebooks, and Packages ➤ The PDF and notebooks

    are available on https://github.com/ moskytw/hypothesis-testing-with-python . ➤ The packages: ➤ $ pip3 install jupyter numpy scipy sympy matplotlib ipython pandas seaborn statsmodels scikit-learn Or: ➤ > conda install jupyter numpy scipy sympy matplotlib ipython pandas seaborn statsmodels scikit-learn 9
  4. To buy, or not to buy ➤ Going to buy

    a bulb on an online store. ➤ If see 10/100 bad reviews? Hmm ... ➤ If see 5/100 bad reviews? Good to buy. ➤ If see 1/100 bad reviews? Good to buy. 10
  5. ➤ Going to buy a notebook computer on an online

    store. ➤ If see 10/100 bad reviews? Hmm ... ➤ If see 5/100 bad reviews? Hmm ... ➤ If see 1/100 bad reviews? Maybe good enough. ➤ Context matters. 11
  6. Build our “bad reviews” in statistics ➤ Build a statistical

    model by a hypothesis. ➤ “The means of two populations are equal.” ➤ ≡ E[X] = E[Y] ➤ Put the data into the model, get a probability, p-value. ➤ “Given the model, the probability to observe the data.” ➤ If see p-value = 0.10? ➤ If see p-value = 0.05? ➤ If see p-value = 0.01? ➤ Decide by your context. 12
  7. Equal or not ➤ If the hypothesis contains “equal”: ➤

    Can build a model directly, like the previous slide. ➤ Called a null hypothesis. ➤ If the hypothesis contains “not equal”: ➤ Can build a model by negating it. ➤ Called an alternative hypothesis. ➤ P-value: given a null, the probability to observe the data. 13
  8. The threshold ➤ α: significance level, 0.05 usually, or decided

    by context. ➤ If p-value < α: ➤ Can reject the null, i.e., can reject the equal. ➤ Can accept the alternative, i.e., can accept the not-equal. ➤ If p-value ≥ α: ➤ Can accept the null, i.e., can accept the equal. ➤ “Given the null, the probability of the data is 6%.” ➤ Can't reject the null. ➤ Can't accept the alternative. ➤ We may investigate further. 14
  9. Formats suggested by APA and NEJM p-value & α Wording

    Summary p-value < 0.001 Very significant *** p-value < 0.01 Very significant ** p-value < 0.05 Significant * p-value ≥ 0.05 Not significant ns 15
  10. ➤ Many researchers suggest to report without formatting. ➤ Since

    the largely misunderstandings: ➤ Misunderstandings of p-values – Wikipedia ➤ Scientists rise up against statistical significance – Natural ➤ “We are not calling for a ban on P values. Nor are we saying they cannot be used as a decision criterion in certain specialized applications.” ➤ “We are calling for a stop to the use of P values in the conventional, dichotomous way — to decide whether a result refutes or supports a scientific hypothesis.” 16
  11. Define assumptions ➤ The hypothesis testing: ➤ Suitable to answer

    a yes–no question: ➤ “Means or medians of two populations are equal?” ➤ E.g., “The order counts of A and B are equal?” ➤ “Proportions of two populations are equal?” ➤ E.g., “The conversion rates of A and B are equal?” 17
  12. ➤ “Poor or non-poor marriage has different affair times?” ➤

    “Poor or non-poor marriage has different affair proportion?” ➤ “Occupations have different affair times?” ➤ “Occupations have different affair proportion?” 18
  13. Validate assumptions ➤ Collect data ... ➤ The “Fair” dataset:

    ➤ Fair, Ray. 1978. “A Theory of Extramarital Affairs,” 
 Journal of Political Economy, February, 45-61. ➤ A dataset from 1970s. ➤ Rows: 6,366 ➤ Columns: (next slide) ➤ The full version of the analysis steps: 
 http://bit.ly/analysis-steps . 19
  14. 1. rate_marriage: 1~5; very poor, poor, fair, good, very good.

    2. age 3. yrs_married 4. children: number of children. 5. religious: 1~4; not, mildly, fairly, strongly. 6. educ: 9, 12, 14, 16, 17, 20; grade school, some college, college graduate, some graduate school, advanced degree. 7. occupation: 1, 2, 3, 4, 5, 6; student, farming-like, white- colloar, teacher-like, business- like, professional with advanced degree. 8. occupation_husb 9. affairs: n times of extramarital affairs per year since marriage. 20
  15. Summary of the tests today 22 Non-poor Poor Uplift P-value

    Times 0.64 1.52 +138% < 0.001 *** #1 Prop. 30% 66% +120% < 0.001 *** #2 Farming-like White-colloar Uplift P-value Times 0.72 0.76 +6% 0.698 ns #3 Prop. 29% 35% +21% 0.004 ** #4
  16. #1 Welch's t-test ➤ Preprocess: ➤ Group into poor or

    not. ➤ Describe. ➤ Test: ➤ Assume the affair times are equal, the probability to observe it: super low. ➤ So, we accept the times are not equal at 1% significance level. ➤ Non-poor: 0.64 ➤ Poor: 1.52 23
  17. import scipy as sp import statsmodels.api as sm import seaborn

    as sns print(sm.datasets.fair.SOURCE, sm.datasets.fair.NOTE) # -> Pandas's Dataframe df_fair = sm.datasets.fair.load_pandas().data df = df_fair # 2: poor # 3: fair df = df.assign(poor_marriage_yn =(df.rate_marriage <= 2)) df_fair_1 = df 25
  18. df = df_fair_1 display(df .groupby('poor_marriage_yn') .affairs .describe()) a = df[df.poor_marriage_yn].affairs

    b = df[~df.poor_marriage_yn].affairs # ttest_ind(...) === Student's t-test # ttest_ind(..., equal_var=False) === Welch's t-test print('p-value:', sp.stats.ttest_ind(a, b, equal_var=False)[1]) 26
  19. #2 Chi-squared test ➤ Preprocess: ➤ Add “affairs > 0”

    as true. ➤ Group into poor or not. ➤ Describe. ➤ Test: ➤ Assume the affair proportions are equal, the probability to observe it: super low. ➤ So, we accept the proportions are not equal at 1% significance level. ➤ Non-poor: 30% ➤ Poor: 66% 28
  20. df = df_fair_2 df = (df .groupby(['poor_marriage_yn', 'affairs_yn']) [['affairs']] .count()

    .unstack() .droplevel(axis=1, level=0)) df_pct = df.apply(axis=1, func=lambda r: r/r.sum()) display(df, df_pct) print('p-value:', sp.stats.chi2_contingency( df, correction=False )[1]) 31
  21. #3 Welch's t-test ➤ Preprocess: ➤ Select the two occupations.

    ➤ Group by the occupations. ➤ Describe. ➤ Test: ➤ Assume the affair times are equal, the probability to observe it: 70%. ➤ So, we can't accept the times are not equal at 1% significance level. ➤ Farming-like: 0.72 ➤ White-colloar: 0.76 33
  22. df = df_fair # 2: farming-like # 3: white-colloar df

    = df[df.occupation.isin([2, 3])] df_fair_3 = df df = df_fair_3 display(df .groupby('occupation') .affairs .describe()) a = df[df.occupation == 2].affairs b = df[df.occupation == 3].affairs print('p-value:', sp.stats.ttest_ind(a, b, equal_var=False)[1]) 35
  23. If there is a true difference, can we detect it?

    ➤ To detect ≥ 0.5 times difference at 1% significance level: ➤ raw effect size = 0.5 ➤ α = 0.01 ➤ Use G*Power or StatsModels: ➤ power = 0.9981 ➤ If there is a 0.5 times difference and the given significance level, we can detect it 99.81% of the time. It's good. ➤ So, we accept the times are equal or the difference < 0.5. ➤ If power is low, relax effect size, α, or collect a larger sample. 37
  24. The similar concepts 39 Statistics Understandable α = 1 -

    confidence level ✔ power = 1 - β ✔ ✔ β = 1 - power confidence level = 1 - α ✔
  25. Statistics Understandable “reject null” ≡ “accept alter.” ✔ “accept alter.”

    ≡ “reject null” ✔ “can't reject null” ≡ “investigate further” ✔ “investigate further” ≡ “can't reject null” ✔
  26. ➤ f(α, raw effect size, power) = sample size ➤

    Before collecting data: ➤ Define α, raw effect size, power to calculate required sample size. ➤ After test: ➤ If p-value < α, good to say there is a difference. ➤ If p-value ≥ α, or closes to α, may investigate the power. ➤ The α, raw effect size, power here are “to-achieve”, not “observed”. ➤ 2×2 chi-squared test ≡ two-proportion z-test. [ref] ➤ The power analysis of two-proportion z-test is much easier. Power analysis 41
  27. #4 Chi-squared test ➤ Preprocess: ➤ Add “affairs > 0”

    as true. ➤ Select the two occupations. ➤ Group by the occupations. ➤ Describe. ➤ Test: ➤ Assume the affair proportions are equal, the probability to observe it: 0.4%. ➤ So, we accept the proportions are not equal at 1% significance level: ➤ Farming-like: 29% ➤ White-colloar: 35% 42
  28. df = df_fair_2 # 2: farming-like # 3: white-colloar df

    = df[df.occupation.isin([2, 3])] df_fair_4 = df 44
  29. df = df_fair_4 df = (df .groupby(['occupation', 'affairs_yn']) [['affairs']] .count()

    .unstack() .droplevel(axis=1, level=0)) df_pct = df.apply(axis=1, func=lambda r: r/r.sum()) display(df, df_pct) print('p-value:', sp.stats.chi2_contingency( df, correction=False )[1]) 45
  30. The mini cheat sheet ➤ If testing proportions, chi-squared test.

    ➤ If testing medians, Mann–Whitney U test. ➤ If testing means, Welch's t-test. 47
  31. The cheat sheet ➤ If testing homogeneity: ➤ If total

    sample size < 1000, or 
 more than 20% of cells have expected frequencies < 5, Fisher's exact test. ➤ Else, chi-squared test, or 2×2 chi-squared test ≡ two-proportion z-test. ➤ If testing equality: ➤ If median is better, don't want to trim outliers, 
 variable is ordinal, or any group size ≤ 20: ➤ If groups are paired, Wilcoxon signed-rank test. ➤ If groups are independent, Mann–Whitney U test. ➤ Else: ➤ If groups are paired, Paired Student's t-test. ➤ If groups are independent, Welch's t-test, not Student's. 48
  32. Why Welch's t-test, not Student's t-test? ➤ Student's t-test assumed

    the two populations have the same variance, which may not be true in most cases. ➤ Welch's t-test relaxed this assumption without side effects. ➤ So, just use Welch's t-test directly. [ref] 49
  33. ➤ More cheat sheets: ➤ Selecting Commonly Used Statistical Tests

    – Bates College ➤ Choosing a statistical test – HBS ➤ References: ➤ Fisher's exact test of independence – HBS ➤ Statistical notes for clinical researchers – Restor Dent Endod ➤ Nonparametric Test and Parametric Test – Minitab ➤ Dependent t-test for paired samples – Student's t-test – Wikipedia 50
  34. Complete steps 1. Decide what test. 2. Decide α, raw

    effect size, power to achieve. 3. Calculate sample size. 4. Still collect a sample as large as possible. 5. Test. 6. Investigate power if need. 7. Report fully, not only significant or not. ➤ Means, confidence intervals, p-values, research design, etc. 51
  35. Keep learning ➤ Seeing Theory ➤ Statistics – SciPy Tutorial

    ➤ StatsModels ➤ Biological Statistics ➤ Research Design 52
  36. Recap 53 ➤ The null hypothesis is the one which

    states “equal”. ➤ The p-value is: ➤ Given null, the probability to observe the data. ➤ “How compatible the null hypothesis and the data are.” ➤ The Welch's t-test and chi-squared test. ➤ The power analysis to calculate sample size or power. ➤ Report fully, not only significant or not. ➤ Let's evaluate hypotheses efficiently!
  37. Seeing is believing ➤ p-value = 0.0027 (< 0.01) ➤

    ### ➤ p-value = 0.0271 (0.01–0.05) ➤ #❓#❓❓❓ ➤ p-value = 0.2718 (≥ 0.05) ➤ ❓❓❓❓❓❓ ➤ appendixes/theory_01_how_tests_work.ipynb 55
  38. Confusion matrix, where A = 002 = C[0, 0] 56

    predicted negative AC predicted positive BD actual negative AB true negative A false positive B actual positive CD false negative C true positive D
  39. False positive rate = P(BD|AB) = B/AB = 4/(96+4) =

    4/100 57 predicted negative AC predicted positive BD actual negative AB 96 A 4 B actual positive CD 9 C 41 D
  40. α = P(reject null|null) = P(predicted positive|actual negative) 58 predicted

    negative AC predicted positive BD actual negative AB true negative A false positive B actual positive CD false negative C true positive D
  41. Predefined acceptable confusion matrix 59 predicted negative AC predicted positive

    BD actual negative AB true negative A false positive B actual positive CD false negative C true positive D
  42. False positive, p-value, and α 60 false positive rate Calculated

    
 with the actual answer. p-value Calculated false positive rate 
 by a null hypothesis. α Predefined acceptable 
 false positive rate.
  43. The elements of a complete test 1. The null hypothesis,

    data, p-value, α. 2. The raw effect size, β, sample size. 3. The false negative rate, inverse α, inverse β. ➤ Will introduce them by the confusion matrix. 62
  44. Raw effect size, and β ➤ DSM5: The case for

    double standards – James Coplan, M.D. ➤ The figures explain α, raw effect size, and β perfectly. ➤ “FP”: α ➤ “The distance between the means”: raw effect size ➤ “FN”: β 63
  45. β = P(AC|CD) = C/CD 68 predicted negative AC predicted

    positive BD actual negative AB true negative A false positive B actual positive CD false negative C true positive D
  46. ➤ Given α, raw effect size, β, get the sample

    size. ➤ Given α, raw effect size, sample size, get the β. ➤ Increase sample size to decrease α, β, or raw effect size. 69
  47. Inverse α = P(AB|BD) = B/BD 71 predicted negative AC

    predicted positive BD actual negative AB true negative A false positive B actual positive CD false negative C true positive D
  48. Inverse β = P(CD|AC) = C/AC 72 predicted negative AC

    predicted positive BD actual negative AB true negative A false positive B actual positive CD false negative C true positive D
  49. Rates in predefined acceptable confusion matrix 75 = = =

    predefined α B/AB significance level
 type I error rate false positive rate β C/CD type II error rate false negative rate inverse α B/BD false discovery rate inverse β C/AC false omission rate confidence level A/AB 1-α specificity power D/CD 1-β sensitivity
 recall
  50. Rates in confusion matrix 76 = = = observed false

    positive rate B/AB α false negative rate C/CD β false discovery rate B/BD inverse α false omission rate C/AC inverse β actual negative rate AB/ABCD sensitivity D/CD recall power specificity A/AB confidence level precision D/BD inverse power recall D/CD sensitivity power