# Lambda School Data Science Module 132
## Sampling, Confidence Intervals, and Hypothesis Testing

## Prepare - examine other available hypothesis tests

If you had to pick a single hypothesis test in your toolbox, t-test would probably be the best choice - but the good news is you don't have to pick just one! Here's some of the others to be aware of:

```
import numpy as np
from scipy.stats import chisquare  # One-way chi square test

# Chi square can take any crosstab/table and test the independence of rows/cols
# The null hypothesis is that the rows/cols are independent -> low chi square
# The alternative is that there is a dependence -> high chi square
# Be aware! Chi square does *not* tell you direction/causation

ind_obs = np.array([[1, 1], [2, 2]]).T
print(ind_obs)
print(chisquare(ind_obs, axis=None))

dep_obs = np.array([[16, 18, 16, 14, 12, 12], [32, 24, 16, 28, 20, 24]]).T
print(dep_obs)
print(chisquare(dep_obs, axis=None))
```

    [[1 2]
     [1 2]]
    Power_divergenceResult(statistic=0.6666666666666666, pvalue=0.8810148425137847)
    [[16 32]
     [18 24]
     [16 16]
     [14 28]
     [12 20]
     [12 24]]
    Power_divergenceResult(statistic=23.31034482758621, pvalue=0.015975692534127565)

```
# Distribution tests:
# We often assume that something is normal, but it can be important to *check*

# For example, later on with predictive modeling, a typical assumption is that
# residuals (prediction errors) are normal - checking is a good diagnostic

from scipy.stats import normaltest
# Poisson models arrival times and is related to the binomial (coinflip)
sample = np.random.poisson(5, 1000)
print(normaltest(sample))  # Pretty clearly not normal
```

    NormaltestResult(statistic=22.273646023922907, pvalue=1.4565963588062096e-05)

```
# Kruskal-Wallis H-test - compare the median rank between 2+ groups
# Can be applied to ranking decisions/outcomes/recommendations
# The underlying math comes from chi-square distribution, and is best for n>5
from scipy.stats import kruskal

x1 = [1, 3, 5, 7, 9]
y1 = [2, 4, 6, 8, 10]
print(kruskal(x1, y1))  # x1 is a little better, but not "significantly" so

x2 = [1, 1, 1]
y2 = [2, 2, 2]
z = [2, 2]  # Hey, a third group, and of different size!
print(kruskal(x2, y2, z))  # x clearly dominates
```

    KruskalResult(statistic=0.2727272727272734, pvalue=0.6015081344405895)
    KruskalResult(statistic=7.0, pvalue=0.0301973834223185)

And there's many more! `scipy.stats` is fairly comprehensive, though there are even more available if you delve into the extended world of statistics packages. As tests get increasingly obscure and specialized, the importance of knowing them by heart becomes small - but being able to look them up and figure them out when they *are* relevant is still important.

## T-test Assumptions

```
from scipy.stats import ttest_ind

?ttest_ind
```

<https://statistics.laerd.com/statistical-guides/independent-t-test-statistical-guide.php>

- Independence of means

Are the means of our voting data independent (do not affect the outcome of one another)?

The best way to increase thel likelihood of our means being independent is to randomly sample (which we did not do).

- "Homogeneity" of Variance?

Is the magnitude of the variance between the two roughly the same?

I think we're OK on this one for the voting data, although it probably could be better, one party was larger than the other.

If we suspect this to be a problem then we can use Welch's T-test

- "Dependent Variable" (sample means) are Distributed Normally

<https://stats.stackexchange.com/questions/9573/t-test-for-non-normal-when-n50>

Lots of statistical tests depend on normal distributions. We can test for normality using Scipy as was shown above.

This assumption is often assumed even if the assumption is a weak one. If you strongly suspect that things are not normally distributed, you can transform your data to get it looking more normal and then run your test. This problem typically goes away for large sample sizes (yay Central Limit Theorem) and is often why you don't hear it brought up. People declare the assumption to be satisfied either way.

## Central Limit Theorem

```
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

sample_means = []
for x in range(0,3000):
  coinflips = np.random.binomial(n=1, p=.5, size=30)
  one_sample = coinflips
  sample_means.append(coinflips.mean())

print(len(sample_means))
print(sample_means)
```

    3000
    [0.4666666666666667, 0.6, 0.5, 0.6, 0.36666666666666664, 0.5, 0.5666666666666667, 0.4, 0.5666666666666667, 0.5666666666666667, 0.7333333333333333, 0.5, 0.6, 0.43333333333333335, 0.5333333333333333, 0.5, 0.5, 0.36666666666666664, 0.5666666666666667, 0.4666666666666667, 0.36666666666666664, 0.5333333333333333, 0.3, 0.43333333333333335, 0.5666666666666667, 0.43333333333333335, 0.5, 0.43333333333333335, 0.43333333333333335, 0.5666666666666667, 0.5333333333333333, 0.6333333333333333, 0.43333333333333335, 0.6, 0.5666666666666667, 0.43333333333333335, 0.5333333333333333, 0.6, 0.4666666666666667, 0.5333333333333333, 0.5, 0.43333333333333335, 0.43333333333333335, 0.5, 0.5666666666666667, 0.3333333333333333, 0.4666666666666667, 0.36666666666666664, 0.5666666666666667, 0.6, 0.5, 0.6, 0.43333333333333335, 0.4666666666666667, 0.5333333333333333, 0.5333333333333333, 0.4666666666666667, 0.4666666666666667, 0.43333333333333335, 0.4666666666666667, 0.4, 0.6, 0.43333333333333335, 0.3333333333333333, 0.4666666666666667, 0.26666666666666666, 0.43333333333333335, 0.43333333333333335, 0.5333333333333333, 0.5, 0.6, 0.3, 0.5666666666666667, 0.4, 0.6666666666666666, 0.4666666666666667, 0.5333333333333333, 0.5, 0.43333333333333335, 0.43333333333333335, 0.5333333333333333, 0.5, 0.43333333333333335, 0.5666666666666667, 0.4666666666666667, 0.36666666666666664, 0.3, 0.4, 0.5666666666666667, 0.4, 0.6333333333333333, 0.5333333333333333, 0.4, 0.5333333333333333, 0.36666666666666664, 0.5333333333333333, 0.5, 0.5666666666666667, 0.43333333333333335, 0.5666666666666667, 0.3333333333333333, 0.4, 0.5, 0.5333333333333333, 0.43333333333333335, 0.4, 0.4666666666666667, 0.5333333333333333, 0.6, 0.43333333333333335, 0.5333333333333333, 0.6, 0.6333333333333333, 0.6333333333333333, 0.6, 0.5666666666666667, 0.5666666666666667, 0.3333333333333333, 0.43333333333333335, 0.5333333333333333, 0.4666666666666667, 0.6666666666666666, 0.3333333333333333, 0.43333333333333335, 0.6666666666666666, 0.4, 0.5, 0.36666666666666664, 0.43333333333333335, 0.5333333333333333, 0.6, 0.4666666666666667, 0.3333333333333333, 0.5333333333333333, 0.5333333333333333, 0.4, 0.6666666666666666, 0.4666666666666667, 0.4, 0.5333333333333333, 0.5666666666666667, 0.5333333333333333, 0.4, 0.43333333333333335, 0.5333333333333333, 0.5333333333333333, 0.5666666666666667, 0.6, 0.43333333333333335, 0.4666666666666667, 0.6, 0.5333333333333333, 0.5333333333333333, 0.5333333333333333, 0.5666666666666667, 0.4666666666666667, 0.43333333333333335, 0.5, 0.5333333333333333, 0.6, 0.6, 0.7, 0.5333333333333333, 0.43333333333333335, 0.6333333333333333, 0.43333333333333335, 0.3, 0.5333333333333333, 0.5666666666666667, 0.5666666666666667, 0.5666666666666667, 0.43333333333333335, 0.36666666666666664, 0.4666666666666667, 0.43333333333333335, 0.6, 0.5666666666666667, 0.26666666666666666, 0.6, 0.36666666666666664, 0.5333333333333333, 0.43333333333333335, 0.6666666666666666, 0.5333333333333333, 0.5, 0.36666666666666664, 0.5333333333333333, 0.4666666666666667, 0.5, 0.5, 0.43333333333333335, 0.5, 0.5, 0.6333333333333333, 0.5, 0.5, 0.43333333333333335, 0.43333333333333335, 0.4, 0.3333333333333333, 0.6666666666666666, 0.36666666666666664, 0.4666666666666667, 0.4666666666666667, 0.43333333333333335, 0.5333333333333333, 0.6, 0.5, 0.4, 0.6333333333333333, 0.4, 0.5, 0.5333333333333333, 0.6666666666666666, 0.36666666666666664, 0.36666666666666664, 0.4666666666666667, 0.5, 0.5333333333333333, 0.4, 0.6, 0.5, 0.5666666666666667, 0.5, 0.36666666666666664, 0.6, 0.5666666666666667, 0.36666666666666664, 0.5, 0.6, 0.6666666666666666, 0.5333333333333333, 0.6666666666666666, 0.4666666666666667, 0.43333333333333335, 0.6, 0.4, 0.4, 0.5333333333333333, 0.5666666666666667, 0.5, 0.6, 0.6666666666666666, 0.3333333333333333, 0.4666666666666667, 0.43333333333333335, 0.6, 0.4666666666666667, 0.5666666666666667, 0.6, 0.6, 0.5, 0.5, 0.7, 0.43333333333333335, 0.4666666666666667, 0.7, 0.3, 0.4, 0.7, 0.6666666666666666, 0.5333333333333333, 0.5333333333333333, 0.4, 0.6333333333333333, 0.5, 0.43333333333333335, 0.4666666666666667, 0.4, 0.4666666666666667, 0.5, 0.4, 0.5, 0.43333333333333335, 0.5, 0.4, 0.6666666666666666, 0.6333333333333333, 0.4666666666666667, 0.4666666666666667, 0.5, 0.4666666666666667, 0.4666666666666667, 0.4, 0.7, 0.6666666666666666, 0.6, 0.5333333333333333, 0.5, 0.5666666666666667, 0.43333333333333335, 0.6, 0.5, 0.5, 0.43333333333333335, 0.6, 0.5, 0.5333333333333333, 0.6666666666666666, 0.6333333333333333, 0.5666666666666667, 0.4, 0.43333333333333335, 0.5333333333333333, 0.6, 0.36666666666666664, 0.6333333333333333, 0.4666666666666667, 0.5, 0.4666666666666667, 0.6, 0.4666666666666667, 0.5666666666666667, 0.43333333333333335, 0.4666666666666667, 0.6, 0.5333333333333333, 0.4, 0.6666666666666666, 0.3333333333333333, 0.5333333333333333, 0.4666666666666667, 0.5, 0.5333333333333333, 0.5333333333333333, 0.6333333333333333, 0.5333333333333333, 0.5, 0.43333333333333335, 0.6333333333333333, 0.4666666666666667, 0.3333333333333333, 0.6, 0.43333333333333335, 0.36666666666666664, 0.6333333333333333, 0.5666666666666667, 0.36666666666666664, 0.5666666666666667, 0.5666666666666667, 0.7, 0.5666666666666667, 0.5333333333333333, 0.4666666666666667, 0.5, 0.5333333333333333, 0.6666666666666666, 0.5, 0.6333333333333333, 0.6, 0.6, 0.4, 0.5666666666666667, 0.4666666666666667, 0.5666666666666667, 0.5666666666666667, 0.36666666666666664, 0.36666666666666664, 0.3333333333333333, 0.3333333333333333, 0.6, 0.4666666666666667, 0.5666666666666667, 0.5, 0.6333333333333333, 0.5, 0.5, 0.6, 0.5, 0.5333333333333333, 0.6666666666666666, 0.43333333333333335, 0.5333333333333333, 0.5, 0.43333333333333335, 0.4, 0.6, 0.6666666666666666, 0.4, 0.7, 0.5, 0.3333333333333333, 0.5333333333333333, 0.4666666666666667, 0.43333333333333335, 0.5, 0.5333333333333333, 0.36666666666666664, 0.4, 0.4666666666666667, 0.36666666666666664, 0.43333333333333335, 0.5, 0.6, 0.4666666666666667, 0.5333333333333333, 0.4666666666666667, 0.43333333333333335, 0.43333333333333335, 0.6333333333333333, 0.6, 0.5666666666666667, 0.5333333333333333, 0.5, 0.6, 0.43333333333333335, 0.5, 0.4666666666666667, 0.43333333333333335, 0.6666666666666666, 0.5, 0.5666666666666667, 0.5, 0.4, 0.4666666666666667, 0.7333333333333333, 0.5333333333333333, 0.4, 0.5, 0.3, 0.6, 0.5666666666666667, 0.43333333333333335, 0.43333333333333335, 0.43333333333333335, 0.6666666666666666, 0.5666666666666667, 0.4666666666666667, 0.5333333333333333, 0.43333333333333335, 0.6, 0.43333333333333335, 0.5, 0.3, 0.6, 0.5333333333333333, 0.3333333333333333, 0.6, 0.5666666666666667, 0.4666666666666667, 0.4666666666666667, 0.4666666666666667, 0.43333333333333335, 0.3, 0.6333333333333333, 0.5666666666666667, 0.4666666666666667, 0.43333333333333335, 0.5, 0.5333333333333333, 0.5666666666666667, 0.4, 0.4666666666666667, 0.6, 0.5333333333333333, 0.43333333333333335, 0.5, 0.5333333333333333, 0.5333333333333333, 0.3333333333333333, 0.5666666666666667, 0.4, 0.6333333333333333, 0.43333333333333335, 0.5666666666666667, 0.3, 0.5, 0.26666666666666666, 0.6, 0.6, 0.5333333333333333, 0.5, 0.6, 0.4666666666666667, 0.5, 0.4, 0.3333333333333333, 0.4, 0.6333333333333333, 0.4666666666666667, 0.4666666666666667, 0.6666666666666666, 0.26666666666666666, 0.3, 0.5, 0.3333333333333333, 0.4, 0.5, 0.5333333333333333, 0.43333333333333335, 0.3, 0.43333333333333335, 0.3333333333333333, 0.5, 0.43333333333333335, 0.5333333333333333, 0.5, 0.3, 0.6333333333333333, 0.6333333333333333, 0.6333333333333333, 0.7, 0.5333333333333333, 0.5, 0.3, 0.5333333333333333, 0.5333333333333333, 0.5, 0.5, 0.4666666666666667, 0.6, 0.5, 0.6, 0.5666666666666667, 0.5666666666666667, 0.5666666666666667, 0.43333333333333335, 0.43333333333333335, 0.36666666666666664, 0.5333333333333333, 0.5666666666666667, 0.43333333333333335, 0.43333333333333335, 0.36666666666666664, 0.5666666666666667, 0.5333333333333333, 0.43333333333333335, 0.5, 0.7, 0.43333333333333335, 0.43333333333333335, 0.6, 0.5, 0.5, 0.5333333333333333, 0.4666666666666667, 0.5333333333333333, 0.43333333333333335, 0.43333333333333335, 0.43333333333333335, 0.5333333333333333, 0.36666666666666664, 0.4666666666666667, 0.5, 0.5666666666666667, 0.5, 0.5, 0.5333333333333333, 0.6, 0.4666666666666667, 0.5, 0.7, 0.5666666666666667, 0.4666666666666667, 0.6333333333333333, 0.4, 0.4666666666666667, 0.5, 0.5, 0.43333333333333335, 0.5666666666666667, 0.5, 0.6333333333333333, 0.5666666666666667, 0.3333333333333333, 0.6333333333333333, 0.5666666666666667, 0.5666666666666667, 0.6, 0.5333333333333333, 0.4, 0.6666666666666666, 0.5333333333333333, 0.6333333333333333, 0.43333333333333335, 0.6, 0.4666666666666667, 0.36666666666666664, 0.36666666666666664, 0.6333333333333333, 0.5333333333333333, 0.5, 0.36666666666666664, 0.5, 0.5, 0.3333333333333333, 0.5666666666666667, 0.6, 0.5, 0.43333333333333335, 0.4666666666666667, 0.5, 0.4666666666666667, 0.4, 0.6333333333333333, 0.5333333333333333, 0.5, 0.36666666666666664, 0.5, 0.5, 0.6, 0.5, 0.6666666666666666, 0.5, 0.4666666666666667, 0.43333333333333335, 0.5666666666666667, 0.5333333333333333, 0.4666666666666667, 0.6333333333333333, 0.5333333333333333, 0.5666666666666667, 0.4666666666666667, 0.4, 0.5, 0.6666666666666666, 0.6333333333333333, 0.5333333333333333, 0.5666666666666667, 0.36666666666666664, 0.6, 0.4666666666666667, 0.5, 0.4, 0.4, 0.43333333333333335, 0.5333333333333333, 0.5, 0.4666666666666667, 0.6666666666666666, 0.6, 0.5, 0.5333333333333333, 0.36666666666666664, 0.3333333333333333, 0.6, 0.5666666666666667, 0.5666666666666667, 0.4, 0.36666666666666664, 0.5666666666666667, 0.6333333333333333, 0.43333333333333335, 0.43333333333333335, 0.43333333333333335, 0.6333333333333333, 0.5, 0.43333333333333335, 0.3, 0.5666666666666667, 0.5, 0.6666666666666666, 0.36666666666666664, 0.6, 0.4666666666666667, 0.5666666666666667, 0.43333333333333335, 0.5333333333333333, 0.5666666666666667, 0.36666666666666664, 0.5666666666666667, 0.7, 0.5, 0.5666666666666667, 0.43333333333333335, 0.4, 0.43333333333333335, 0.5333333333333333, 0.5333333333333333, 0.43333333333333335, 0.4666666666666667, 0.4666666666666667, 0.5666666666666667, 0.43333333333333335, 0.4666666666666667, 0.5333333333333333, 0.4666666666666667, 0.5, 0.5333333333333333, 0.5666666666666667, 0.5666666666666667, 0.3, 0.43333333333333335, 0.4666666666666667, 0.6333333333333333, 0.4666666666666667, 0.36666666666666664, 0.5333333333333333, 0.4, 0.43333333333333335, 0.3, 0.3333333333333333, 0.6333333333333333, 0.5, 0.5, 0.5666666666666667, 0.6, 0.7666666666666667, 0.5, 0.4666666666666667, 0.5333333333333333, 0.4666666666666667, 0.4666666666666667, 0.43333333333333335, 0.5, 0.4666666666666667, 0.5333333333333333, 0.5, 0.6, 0.4666666666666667, 0.43333333333333335, 0.4, 0.5666666666666667, 0.5333333333333333, 0.4666666666666667, 0.5, 0.5333333333333333, 0.5, 0.5, 0.43333333333333335, 0.6333333333333333, 0.4666666666666667, 0.4666666666666667, 0.6333333333333333, 0.36666666666666664, 0.6666666666666666, 0.5666666666666667, 0.6, 0.5, 0.43333333333333335, 0.36666666666666664, 0.6333333333333333, 0.4666666666666667, 0.6, 0.43333333333333335, 0.36666666666666664, 0.43333333333333335, 0.5333333333333333, 0.5666666666666667, 0.36666666666666664, 0.4666666666666667, 0.5, 0.43333333333333335, 0.4666666666666667, 0.5666666666666667, 0.6, 0.6333333333333333, 0.3, 0.6, 0.3333333333333333, 0.5, 0.5, 0.43333333333333335, 0.6, 0.36666666666666664, 0.6333333333333333, 0.36666666666666664, 0.5, 0.5666666666666667, 0.4666666666666667, 0.5333333333333333, 0.5, 0.6666666666666666, 0.26666666666666666, 0.5333333333333333, 0.43333333333333335, 0.6333333333333333, 0.5666666666666667, 0.4, 0.6, 0.5333333333333333, 0.5666666666666667, 0.7, 0.6666666666666666, 0.4666666666666667, 0.6666666666666666, 0.43333333333333335, 0.5, 0.6333333333333333, 0.5666666666666667, 0.6, 0.5666666666666667, 0.4, 0.6, 0.43333333333333335, 0.5333333333333333, 0.4, 0.43333333333333335, 0.4, 0.3, 0.6666666666666666, 0.5333333333333333, 0.6333333333333333, 0.5666666666666667, 0.6666666666666666, 0.4666666666666667, 0.6333333333333333, 0.4666666666666667, 0.4666666666666667, 0.6, 0.5666666666666667, 0.43333333333333335, 0.4666666666666667, 0.5666666666666667, 0.6333333333333333, 0.5666666666666667, 0.6333333333333333, 0.4666666666666667, 0.6, 0.3, 0.5666666666666667, 0.5666666666666667, 0.5333333333333333, 0.4666666666666667, 0.5, 0.6, 0.5333333333333333, 0.3, 0.5, 0.5666666666666667, 0.6333333333333333, 0.6, 0.36666666666666664, 0.5666666666666667, 0.23333333333333334, 0.4666666666666667, 0.36666666666666664, 0.3333333333333333, 0.5, 0.5333333333333333, 0.6333333333333333, 0.5333333333333333, 0.4, 0.43333333333333335, 0.36666666666666664, 0.43333333333333335, 0.6, 0.5333333333333333, 0.6666666666666666, 0.5666666666666667, 0.3333333333333333, 0.5, 0.3333333333333333, 0.43333333333333335, 0.5, 0.3333333333333333, 0.26666666666666666, 0.5, 0.4666666666666667, 0.5666666666666667, 0.43333333333333335, 0.5, 0.5333333333333333, 0.4, 0.6333333333333333, 0.5, 0.5, 0.36666666666666664, 0.5, 0.4666666666666667, 0.43333333333333335, 0.36666666666666664, 0.6, 0.6, 0.6, 0.5333333333333333, 0.5666666666666667, 0.5, 0.3333333333333333, 0.6333333333333333, 0.7, 0.6, 0.4, 0.4, 0.5, 0.5666666666666667, 0.5333333333333333, 0.5, 0.5, 0.5666666666666667, 0.5666666666666667, 0.5666666666666667, 0.4, 0.4666666666666667, 0.5, 0.5, 0.6, 0.5333333333333333, 0.5, 0.5, 0.4, 0.6, 0.43333333333333335, 0.5, 0.5333333333333333, 0.5333333333333333, 0.5, 0.4666666666666667, 0.5, 0.5333333333333333, 0.4666666666666667, 0.5, 0.5, 0.6, 0.5666666666666667, 0.4666666666666667, 0.5333333333333333, 0.5666666666666667, 0.4, 0.3333333333333333, 0.43333333333333335, 0.6666666666666666, 0.6333333333333333, 0.4666666666666667, 0.43333333333333335, 0.5, 0.5, 0.5333333333333333, 0.6666666666666666, 0.4666666666666667, 0.5666666666666667, 0.3, 0.43333333333333335, 0.36666666666666664, 0.5666666666666667, 0.4666666666666667, 0.4666666666666667, 0.6, 0.4666666666666667, 0.5, 0.43333333333333335, 0.5666666666666667, 0.6, 0.4, 0.36666666666666664, 0.36666666666666664, 0.6333333333333333, 0.43333333333333335, 0.5333333333333333, 0.5333333333333333, 0.5333333333333333, 0.5333333333333333, 0.5666666666666667, 0.4666666666666667, 0.6, 0.5666666666666667, 0.6666666666666666, 0.5333333333333333, 0.5666666666666667, 0.5, 0.4666666666666667, 0.6, 0.36666666666666664, 0.5666666666666667, 0.5, 0.4, 0.5666666666666667, 0.26666666666666666, 0.43333333333333335, 0.4666666666666667, 0.4, 0.43333333333333335, 0.5, 0.3333333333333333, 0.5333333333333333, 0.6, 0.4666666666666667, 0.4666666666666667, 0.5, 0.4, 0.8, 0.4, 0.4666666666666667, 0.6333333333333333, 0.5, 0.6666666666666666, 0.5, 0.7, 0.5, 0.6333333333333333, 0.36666666666666664, 0.4, 0.43333333333333335, 0.5333333333333333, 0.5333333333333333, 0.36666666666666664, 0.5, 0.4, 0.4666666666666667, 0.43333333333333335, 0.4666666666666667, 0.4, 0.5666666666666667, 0.5333333333333333, 0.7, 0.4666666666666667, 0.4666666666666667, 0.5333333333333333, 0.5, 0.5, 0.5666666666666667, 0.4, 0.36666666666666664, 0.43333333333333335, 0.6333333333333333, 0.36666666666666664, 0.5666666666666667, 0.6333333333333333, 0.5333333333333333, 0.5, 0.43333333333333335, 0.5333333333333333, 0.5666666666666667, 0.36666666666666664, 0.4666666666666667, 0.5666666666666667, 0.5, 0.6333333333333333, 0.4, 0.5666666666666667, 0.5666666666666667, 0.43333333333333335, 0.5333333333333333, 0.3, 0.4, 0.6, 0.6, 0.3333333333333333, 0.4666666666666667, 0.43333333333333335, 0.43333333333333335, 0.43333333333333335, 0.6666666666666666, 0.6, 0.4, 0.6333333333333333, 0.5, 0.4, 0.3333333333333333, 0.4666666666666667, 0.5666666666666667, 0.5, 0.36666666666666664, 0.4, 0.6, 0.6333333333333333, 0.5, 0.43333333333333335, 0.4666666666666667, 0.5333333333333333, 0.5, 0.4, 0.6333333333333333, 0.5666666666666667, 0.6, 0.6666666666666666, 0.36666666666666664, 0.5, 0.5333333333333333, 0.5333333333333333, 0.4, 0.5, 0.3333333333333333, 0.4, 0.6333333333333333, 0.6333333333333333, 0.4, 0.4666666666666667, 0.36666666666666664, 0.5, 0.6, 0.5, 0.5, 0.6, 0.6, 0.5, 0.36666666666666664, 0.6, 0.4666666666666667, 0.4666666666666667, 0.5, 0.4, 0.43333333333333335, 0.4666666666666667, 0.36666666666666664, 0.43333333333333335, 0.5, 0.4666666666666667, 0.43333333333333335, 0.43333333333333335, 0.5, 0.5333333333333333, 0.5, 0.6, 0.4666666666666667, 0.4666666666666667, 0.6, 0.4666666666666667, 0.6333333333333333, 0.5, 0.5666666666666667, 0.43333333333333335, 0.4666666666666667, 0.5, 0.4666666666666667, 0.4666666666666667, 0.43333333333333335, 0.43333333333333335, 0.4666666666666667, 0.4666666666666667, 0.5666666666666667, 0.6333333333333333, 0.5, 0.5, 0.4, 0.5666666666666667, 0.6, 0.43333333333333335, 0.43333333333333335, 0.6333333333333333, 0.43333333333333335, 0.36666666666666664, 0.36666666666666664, 0.5, 0.4, 0.5333333333333333, 0.43333333333333335, 0.5, 0.5333333333333333, 0.5333333333333333, 0.5333333333333333, 0.6333333333333333, 0.5333333333333333, 0.43333333333333335, 0.5333333333333333, 0.3333333333333333, 0.5333333333333333, 0.4, 0.23333333333333334, 0.43333333333333335, 0.4, 0.43333333333333335, 0.4666666666666667, 0.4666666666666667, 0.5, 0.4666666666666667, 0.5, 0.6666666666666666, 0.5, 0.26666666666666666, 0.6666666666666666, 0.4666666666666667, 0.6, 0.4, 0.6, 0.43333333333333335, 0.6, 0.6333333333333333, 0.5333333333333333, 0.3333333333333333, 0.5666666666666667, 0.5333333333333333, 0.43333333333333335, 0.5, 0.6666666666666666, 0.3333333333333333, 0.4666666666666667, 0.43333333333333335, 0.6, 0.5333333333333333, 0.6, 0.3, 0.36666666666666664, 0.4666666666666667, 0.6666666666666666, 0.5333333333333333, 0.6, 0.4666666666666667, 0.5333333333333333, 0.43333333333333335, 0.43333333333333335, 0.5666666666666667, 0.43333333333333335, 0.4, 0.6, 0.4666666666666667, 0.4, 0.6333333333333333, 0.6, 0.26666666666666666, 0.5, 0.26666666666666666, 0.36666666666666664, 0.3333333333333333, 0.4666666666666667, 0.4, 0.43333333333333335, 0.43333333333333335, 0.6333333333333333, 0.4666666666666667, 0.5333333333333333, 0.5666666666666667, 0.6666666666666666, 0.6666666666666666, 0.5333333333333333, 0.6, 0.4, 0.6333333333333333, 0.5333333333333333, 0.5666666666666667, 0.5333333333333333, 0.43333333333333335, 0.4, 0.4666666666666667, 0.5, 0.5333333333333333, 0.43333333333333335, 0.36666666666666664, 0.5, 0.26666666666666666, 0.43333333333333335, 0.43333333333333335, 0.5333333333333333, 0.5666666666666667, 0.5, 0.5, 0.5333333333333333, 0.3333333333333333, 0.5666666666666667, 0.5333333333333333, 0.4666666666666667, 0.4, 0.5, 0.7, 0.43333333333333335, 0.5666666666666667, 0.5666666666666667, 0.5666666666666667, 0.6, 0.4666666666666667, 0.5666666666666667, 0.5666666666666667, 0.5333333333333333, 0.3333333333333333, 0.6333333333333333, 0.5666666666666667, 0.7, 0.5666666666666667, 0.4, 0.5333333333333333, 0.5666666666666667, 0.7, 0.5, 0.4666666666666667, 0.6666666666666666, 0.6, 0.6666666666666666, 0.43333333333333335, 0.6, 0.4, 0.36666666666666664, 0.5666666666666667, 0.43333333333333335, 0.4, 0.5, 0.7666666666666667, 0.4666666666666667, 0.6666666666666666, 0.36666666666666664, 0.5, 0.43333333333333335, 0.5666666666666667, 0.43333333333333335, 0.4666666666666667, 0.36666666666666664, 0.43333333333333335, 0.5666666666666667, 0.5333333333333333, 0.5333333333333333, 0.5333333333333333, 0.4666666666666667, 0.6333333333333333, 0.5, 0.5666666666666667, 0.4666666666666667, 0.5, 0.5666666666666667, 0.5333333333333333, 0.6, 0.4666666666666667, 0.5333333333333333, 0.6, 0.16666666666666666, 0.43333333333333335, 0.5333333333333333, 0.36666666666666664, 0.5, 0.43333333333333335, 0.4666666666666667, 0.5, 0.5666666666666667, 0.4, 0.43333333333333335, 0.4666666666666667, 0.5666666666666667, 0.4666666666666667, 0.36666666666666664, 0.5666666666666667, 0.5, 0.43333333333333335, 0.5666666666666667, 0.5333333333333333, 0.43333333333333335, 0.5333333333333333, 0.5333333333333333, 0.43333333333333335, 0.5333333333333333, 0.5666666666666667, 0.43333333333333335, 0.43333333333333335, 0.7, 0.4666666666666667, 0.4666666666666667, 0.5333333333333333, 0.5, 0.6666666666666666, 0.43333333333333335, 0.6, 0.43333333333333335, 0.5333333333333333, 0.4666666666666667, 0.5, 0.5, 0.6, 0.5, 0.5, 0.4, 0.4666666666666667, 0.3333333333333333, 0.6333333333333333, 0.5666666666666667, 0.36666666666666664, 0.43333333333333335, 0.5666666666666667, 0.4666666666666667, 0.43333333333333335, 0.5, 0.5, 0.5333333333333333, 0.5333333333333333, 0.6333333333333333, 0.7333333333333333, 0.5, 0.4, 0.5666666666666667, 0.6333333333333333, 0.4666666666666667, 0.4, 0.5, 0.4, 0.4, 0.4, 0.4666666666666667, 0.6, 0.5, 0.5, 0.6, 0.36666666666666664, 0.4666666666666667, 0.4666666666666667, 0.5, 0.7, 0.6666666666666666, 0.5333333333333333, 0.6333333333333333, 0.4666666666666667, 0.36666666666666664, 0.43333333333333335, 0.5666666666666667, 0.43333333333333335, 0.4, 0.3333333333333333, 0.36666666666666664, 0.4, 0.4666666666666667, 0.6333333333333333, 0.5666666666666667, 0.6, 0.5333333333333333, 0.36666666666666664, 0.43333333333333335, 0.6666666666666666, 0.5333333333333333, 0.36666666666666664, 0.43333333333333335, 0.5333333333333333, 0.3, 0.6, 0.4666666666666667, 0.5333333333333333, 0.5, 0.6333333333333333, 0.43333333333333335, 0.5333333333333333, 0.4, 0.5, 0.4666666666666667, 0.5666666666666667, 0.5, 0.4666666666666667, 0.4666666666666667, 0.6, 0.6, 0.43333333333333335, 0.43333333333333335, 0.4, 0.5666666666666667, 0.6333333333333333, 0.5, 0.3333333333333333, 0.3333333333333333, 0.5666666666666667, 0.6, 0.4666666666666667, 0.4, 0.4666666666666667, 0.5, 0.4666666666666667, 0.6, 0.5666666666666667, 0.5333333333333333, 0.5333333333333333, 0.3333333333333333, 0.6, 0.5333333333333333, 0.5666666666666667, 0.5, 0.4, 0.43333333333333335, 0.4666666666666667, 0.6, 0.6333333333333333, 0.5, 0.5666666666666667, 0.6, 0.43333333333333335, 0.6333333333333333, 0.5666666666666667, 0.5666666666666667, 0.4666666666666667, 0.5666666666666667, 0.5333333333333333, 0.5666666666666667, 0.43333333333333335, 0.4666666666666667, 0.43333333333333335, 0.6333333333333333, 0.6333333333333333, 0.5, 0.6, 0.4666666666666667, 0.6333333333333333, 0.5666666666666667, 0.4666666666666667, 0.5666666666666667, 0.43333333333333335, 0.6333333333333333, 0.5333333333333333, 0.4666666666666667, 0.4666666666666667, 0.6, 0.5666666666666667, 0.5333333333333333, 0.5666666666666667, 0.4666666666666667, 0.36666666666666664, 0.5333333333333333, 0.23333333333333334, 0.6333333333333333, 0.5333333333333333, 0.36666666666666664, 0.4, 0.5666666666666667, 0.5333333333333333, 0.4666666666666667, 0.5666666666666667, 0.5, 0.4, 0.5666666666666667, 0.5, 0.7, 0.36666666666666664, 0.6, 0.5666666666666667, 0.3333333333333333, 0.6, 0.4666666666666667, 0.5333333333333333, 0.6, 0.6, 0.5333333333333333, 0.5, 0.3, 0.4666666666666667, 0.36666666666666664, 0.6333333333333333, 0.5666666666666667, 0.5333333333333333, 0.5, 0.36666666666666664, 0.5333333333333333, 0.4666666666666667, 0.4666666666666667, 0.43333333333333335, 0.4, 0.5, 0.5, 0.6333333333333333, 0.5666666666666667, 0.36666666666666664, 0.4, 0.4666666666666667, 0.5, 0.36666666666666664, 0.5, 0.6666666666666666, 0.43333333333333335, 0.6, 0.4666666666666667, 0.5, 0.5333333333333333, 0.5, 0.6, 0.5, 0.4, 0.5333333333333333, 0.4, 0.7, 0.5666666666666667, 0.5, 0.5333333333333333, 0.6, 0.7333333333333333, 0.36666666666666664, 0.4666666666666667, 0.5333333333333333, 0.4666666666666667, 0.5, 0.4666666666666667, 0.7, 0.43333333333333335, 0.43333333333333335, 0.4666666666666667, 0.4, 0.43333333333333335, 0.43333333333333335, 0.5333333333333333, 0.5333333333333333, 0.5333333333333333, 0.5666666666666667, 0.43333333333333335, 0.5666666666666667, 0.6333333333333333, 0.43333333333333335, 0.43333333333333335, 0.3, 0.7333333333333333, 0.5333333333333333, 0.36666666666666664, 0.6, 0.5333333333333333, 0.5333333333333333, 0.5333333333333333, 0.3, 0.7333333333333333, 0.43333333333333335, 0.3333333333333333, 0.7, 0.4666666666666667, 0.5, 0.6333333333333333, 0.5333333333333333, 0.26666666666666666, 0.43333333333333335, 0.5666666666666667, 0.43333333333333335, 0.4666666666666667, 0.5333333333333333, 0.6333333333333333, 0.4666666666666667, 0.43333333333333335, 0.4, 0.6, 0.5666666666666667, 0.4666666666666667, 0.5, 0.5666666666666667, 0.43333333333333335, 0.4, 0.4666666666666667, 0.5666666666666667, 0.6, 0.4, 0.4666666666666667, 0.4, 0.43333333333333335, 0.5, 0.5333333333333333, 0.5, 0.5, 0.6, 0.5333333333333333, 0.3333333333333333, 0.4666666666666667, 0.5, 0.36666666666666664, 0.4, 0.43333333333333335, 0.5666666666666667, 0.5333333333333333, 0.3333333333333333, 0.3333333333333333, 0.43333333333333335, 0.6666666666666666, 0.5, 0.5333333333333333, 0.43333333333333335, 0.43333333333333335, 0.4666666666666667, 0.5666666666666667, 0.4, 0.5666666666666667, 0.5666666666666667, 0.5333333333333333, 0.5666666666666667, 0.43333333333333335, 0.43333333333333335, 0.5333333333333333, 0.43333333333333335, 0.6, 0.5, 0.36666666666666664, 0.4666666666666667, 0.5666666666666667, 0.5666666666666667, 0.6333333333333333, 0.43333333333333335, 0.5333333333333333, 0.4666666666666667, 0.43333333333333335, 0.4, 0.26666666666666666, 0.5666666666666667, 0.5666666666666667, 0.5666666666666667, 0.4666666666666667, 0.43333333333333335, 0.5333333333333333, 0.4, 0.6333333333333333, 0.7, 0.36666666666666664, 0.5666666666666667, 0.4, 0.4666666666666667, 0.4666666666666667, 0.5333333333333333, 0.36666666666666664, 0.36666666666666664, 0.43333333333333335, 0.5666666666666667, 0.4666666666666667, 0.4666666666666667, 0.5666666666666667, 0.4, 0.4666666666666667, 0.36666666666666664, 0.4666666666666667, 0.43333333333333335, 0.4, 0.4666666666666667, 0.5666666666666667, 0.5, 0.5333333333333333, 0.5666666666666667, 0.5, 0.4, 0.43333333333333335, 0.5333333333333333, 0.4, 0.6, 0.5333333333333333, 0.43333333333333335, 0.5666666666666667, 0.43333333333333335, 0.5333333333333333, 0.43333333333333335, 0.5, 0.6, 0.5666666666666667, 0.5666666666666667, 0.4666666666666667, 0.5333333333333333, 0.43333333333333335, 0.43333333333333335, 0.5666666666666667, 0.4666666666666667, 0.5666666666666667, 0.5666666666666667, 0.5333333333333333, 0.6, 0.5, 0.5333333333333333, 0.43333333333333335, 0.5, 0.5333333333333333, 0.4666666666666667, 0.6, 0.4666666666666667, 0.4666666666666667, 0.6333333333333333, 0.3333333333333333, 0.43333333333333335, 0.4, 0.4666666666666667, 0.6, 0.6, 0.5333333333333333, 0.3333333333333333, 0.3333333333333333, 0.36666666666666664, 0.5333333333333333, 0.36666666666666664, 0.36666666666666664, 0.4, 0.4666666666666667, 0.5666666666666667, 0.5333333333333333, 0.4666666666666667, 0.6, 0.6, 0.4666666666666667, 0.4666666666666667, 0.4, 0.6, 0.3, 0.6, 0.5333333333333333, 0.5333333333333333, 0.43333333333333335, 0.5, 0.5666666666666667, 0.5, 0.5, 0.5333333333333333, 0.6, 0.5, 0.3, 0.5666666666666667, 0.5666666666666667, 0.5, 0.4666666666666667, 0.3333333333333333, 0.4, 0.5, 0.5, 0.6, 0.5, 0.5, 0.4666666666666667, 0.5333333333333333, 0.4, 0.4666666666666667, 0.5666666666666667, 0.4, 0.5333333333333333, 0.4666666666666667, 0.3333333333333333, 0.5, 0.6, 0.43333333333333335, 0.3, 0.3333333333333333, 0.43333333333333335, 0.5, 0.5333333333333333, 0.43333333333333335, 0.4, 0.43333333333333335, 0.36666666666666664, 0.5, 0.5333333333333333, 0.5333333333333333, 0.5, 0.5333333333333333, 0.4, 0.6333333333333333, 0.5, 0.4666666666666667, 0.43333333333333335, 0.43333333333333335, 0.5666666666666667, 0.4666666666666667, 0.5, 0.5333333333333333, 0.5333333333333333, 0.4666666666666667, 0.43333333333333335, 0.5666666666666667, 0.6333333333333333, 0.5, 0.4666666666666667, 0.43333333333333335, 0.5333333333333333, 0.5333333333333333, 0.4666666666666667, 0.4, 0.6333333333333333, 0.4666666666666667, 0.4, 0.5333333333333333, 0.5666666666666667, 0.6333333333333333, 0.5666666666666667, 0.5666666666666667, 0.4, 0.6333333333333333, 0.5333333333333333, 0.4666666666666667, 0.4, 0.5333333333333333, 0.5, 0.4, 0.5, 0.6666666666666666, 0.4666666666666667, 0.43333333333333335, 0.5333333333333333, 0.5333333333333333, 0.6333333333333333, 0.5333333333333333, 0.43333333333333335, 0.4666666666666667, 0.6333333333333333, 0.5333333333333333, 0.5333333333333333, 0.5, 0.4, 0.43333333333333335, 0.5333333333333333, 0.4, 0.6666666666666666, 0.4666666666666667, 0.5333333333333333, 0.36666666666666664, 0.4666666666666667, 0.43333333333333335, 0.4666666666666667, 0.5666666666666667, 0.6333333333333333, 0.5, 0.26666666666666666, 0.5, 0.26666666666666666, 0.36666666666666664, 0.4, 0.5333333333333333, 0.4666666666666667, 0.5, 0.36666666666666664, 0.5666666666666667, 0.6333333333333333, 0.7333333333333333, 0.5, 0.4666666666666667, 0.5666666666666667, 0.4666666666666667, 0.5, 0.4, 0.4, 0.6666666666666666, 0.6, 0.36666666666666664, 0.5666666666666667, 0.5666666666666667, 0.5, 0.5666666666666667, 0.5333333333333333, 0.5333333333333333, 0.4666666666666667, 0.4666666666666667, 0.6, 0.4666666666666667, 0.43333333333333335, 0.6, 0.5333333333333333, 0.5666666666666667, 0.6333333333333333, 0.5, 0.43333333333333335, 0.5, 0.23333333333333334, 0.6666666666666666, 0.3333333333333333, 0.5, 0.43333333333333335, 0.4666666666666667, 0.43333333333333335, 0.4, 0.36666666666666664, 0.5666666666666667, 0.5666666666666667, 0.5666666666666667, 0.6, 0.43333333333333335, 0.43333333333333335, 0.6333333333333333, 0.3333333333333333, 0.5, 0.4666666666666667, 0.5, 0.6666666666666666, 0.5666666666666667, 0.4666666666666667, 0.6666666666666666, 0.5, 0.5333333333333333, 0.4666666666666667, 0.26666666666666666, 0.36666666666666664, 0.36666666666666664, 0.4666666666666667, 0.5666666666666667, 0.5333333333333333, 0.5666666666666667, 0.6333333333333333, 0.43333333333333335, 0.6666666666666666, 0.43333333333333335, 0.5333333333333333, 0.6, 0.5, 0.6333333333333333, 0.4666666666666667, 0.43333333333333335, 0.43333333333333335, 0.5333333333333333, 0.4666666666666667, 0.4666666666666667, 0.4666666666666667, 0.4666666666666667, 0.43333333333333335, 0.7, 0.5666666666666667, 0.43333333333333335, 0.6666666666666666, 0.36666666666666664, 0.5333333333333333, 0.4, 0.3333333333333333, 0.5333333333333333, 0.5666666666666667, 0.6333333333333333, 0.4, 0.5, 0.5, 0.7333333333333333, 0.5666666666666667, 0.6, 0.5333333333333333, 0.5, 0.4666666666666667, 0.5, 0.5, 0.7666666666666667, 0.4666666666666667, 0.6666666666666666, 0.6, 0.4666666666666667, 0.5, 0.5333333333333333, 0.4666666666666667, 0.36666666666666664, 0.4666666666666667, 0.6, 0.5666666666666667, 0.43333333333333335, 0.5, 0.5666666666666667, 0.5666666666666667, 0.4, 0.5333333333333333, 0.4666666666666667, 0.4, 0.43333333333333335, 0.43333333333333335, 0.4666666666666667, 0.43333333333333335, 0.5333333333333333, 0.5, 0.5333333333333333, 0.5666666666666667, 0.5, 0.36666666666666664, 0.5666666666666667, 0.4666666666666667, 0.5, 0.4666666666666667, 0.6333333333333333, 0.43333333333333335, 0.6, 0.43333333333333335, 0.4666666666666667, 0.5, 0.5666666666666667, 0.5666666666666667, 0.3333333333333333, 0.4, 0.6333333333333333, 0.6, 0.6333333333333333, 0.5666666666666667, 0.7, 0.36666666666666664, 0.5666666666666667, 0.36666666666666664, 0.6666666666666666, 0.6666666666666666, 0.6, 0.43333333333333335, 0.36666666666666664, 0.6, 0.5666666666666667, 0.5, 0.5666666666666667, 0.3333333333333333, 0.43333333333333335, 0.5, 0.5666666666666667, 0.5, 0.43333333333333335, 0.4666666666666667, 0.5666666666666667, 0.26666666666666666, 0.4666666666666667, 0.6, 0.43333333333333335, 0.4, 0.5666666666666667, 0.6, 0.4666666666666667, 0.43333333333333335, 0.3333333333333333, 0.6333333333333333, 0.4666666666666667, 0.3333333333333333, 0.5, 0.4, 0.5666666666666667, 0.4, 0.43333333333333335, 0.4, 0.5666666666666667, 0.43333333333333335, 0.4, 0.5, 0.5333333333333333, 0.5333333333333333, 0.5333333333333333, 0.43333333333333335, 0.5666666666666667, 0.5333333333333333, 0.5333333333333333, 0.5, 0.6666666666666666, 0.4666666666666667, 0.4666666666666667, 0.6, 0.5, 0.43333333333333335, 0.4, 0.5, 0.6666666666666666, 0.36666666666666664, 0.5666666666666667, 0.5333333333333333, 0.5666666666666667, 0.5, 0.3333333333333333, 0.5333333333333333, 0.5333333333333333, 0.3, 0.4, 0.4, 0.43333333333333335, 0.6333333333333333, 0.4, 0.4666666666666667, 0.6, 0.36666666666666664, 0.5666666666666667, 0.5, 0.5333333333333333, 0.43333333333333335, 0.5666666666666667, 0.4666666666666667, 0.4666666666666667, 0.6666666666666666, 0.5, 0.3333333333333333, 0.5, 0.4666666666666667, 0.43333333333333335, 0.5333333333333333, 0.5333333333333333, 0.5, 0.5, 0.5333333333333333, 0.5, 0.6666666666666666, 0.6333333333333333, 0.4, 0.5333333333333333, 0.43333333333333335, 0.6333333333333333, 0.6333333333333333, 0.36666666666666664, 0.6, 0.4, 0.6333333333333333, 0.5, 0.6, 0.6333333333333333, 0.5333333333333333, 0.36666666666666664, 0.5, 0.5, 0.5, 0.43333333333333335, 0.4666666666666667, 0.43333333333333335, 0.4666666666666667, 0.5666666666666667, 0.3, 0.5333333333333333, 0.4, 0.6, 0.7666666666666667, 0.5333333333333333, 0.4666666666666667, 0.5, 0.4666666666666667, 0.4666666666666667, 0.6, 0.43333333333333335, 0.5, 0.5, 0.6, 0.4, 0.43333333333333335, 0.3, 0.5333333333333333, 0.36666666666666664, 0.5333333333333333, 0.5333333333333333, 0.5333333333333333, 0.4666666666666667, 0.6, 0.5333333333333333, 0.6666666666666666, 0.4666666666666667, 0.5, 0.6333333333333333, 0.5333333333333333, 0.6, 0.5333333333333333, 0.43333333333333335, 0.5333333333333333, 0.4666666666666667, 0.5, 0.4, 0.5, 0.4666666666666667, 0.43333333333333335, 0.4, 0.7, 0.43333333333333335, 0.6333333333333333, 0.5, 0.5333333333333333, 0.4, 0.6, 0.5666666666666667, 0.4666666666666667, 0.6, 0.4666666666666667, 0.5666666666666667, 0.6, 0.7666666666666667, 0.5666666666666667, 0.6333333333333333, 0.5666666666666667, 0.43333333333333335, 0.5333333333333333, 0.4, 0.6, 0.6, 0.5666666666666667, 0.5, 0.43333333333333335, 0.4666666666666667, 0.6666666666666666, 0.4666666666666667, 0.5333333333333333, 0.6333333333333333, 0.5, 0.4666666666666667, 0.3, 0.7333333333333333, 0.5666666666666667, 0.4666666666666667, 0.5666666666666667, 0.5333333333333333, 0.6333333333333333, 0.6666666666666666, 0.36666666666666664, 0.3333333333333333, 0.5333333333333333, 0.4, 0.5666666666666667, 0.6666666666666666, 0.6, 0.5333333333333333, 0.43333333333333335, 0.5, 0.43333333333333335, 0.43333333333333335, 0.4, 0.36666666666666664, 0.5666666666666667, 0.4666666666666667, 0.4, 0.6666666666666666, 0.6333333333333333, 0.3333333333333333, 0.7333333333333333, 0.43333333333333335, 0.4666666666666667, 0.4666666666666667, 0.36666666666666664, 0.6, 0.6, 0.3333333333333333, 0.4666666666666667, 0.6333333333333333, 0.43333333333333335, 0.43333333333333335, 0.5333333333333333, 0.4666666666666667, 0.5333333333333333, 0.4, 0.5, 0.5333333333333333, 0.3333333333333333, 0.6333333333333333, 0.5, 0.4666666666666667, 0.4666666666666667, 0.5333333333333333, 0.5333333333333333, 0.5333333333333333, 0.5333333333333333, 0.5, 0.6, 0.5333333333333333, 0.5666666666666667, 0.5, 0.6333333333333333, 0.43333333333333335, 0.3333333333333333, 0.5, 0.4666666666666667, 0.5333333333333333, 0.4666666666666667, 0.5333333333333333, 0.43333333333333335, 0.5666666666666667, 0.5666666666666667, 0.6, 0.4, 0.4666666666666667, 0.4666666666666667, 0.4666666666666667, 0.6, 0.3333333333333333, 0.5333333333333333, 0.5666666666666667, 0.6, 0.6, 0.43333333333333335, 0.5, 0.36666666666666664, 0.4, 0.43333333333333335, 0.4666666666666667, 0.6, 0.5333333333333333, 0.4, 0.5666666666666667, 0.36666666666666664, 0.7333333333333333, 0.43333333333333335, 0.5333333333333333, 0.36666666666666664, 0.5, 0.43333333333333335, 0.6, 0.5, 0.6, 0.5666666666666667, 0.6, 0.4666666666666667, 0.6333333333333333, 0.26666666666666666, 0.5, 0.43333333333333335, 0.36666666666666664, 0.4666666666666667, 0.36666666666666664, 0.5666666666666667, 0.3333333333333333, 0.6, 0.5333333333333333, 0.5333333333333333, 0.5, 0.4, 0.5, 0.3, 0.36666666666666664, 0.3333333333333333, 0.3333333333333333, 0.43333333333333335, 0.4666666666666667, 0.43333333333333335, 0.5333333333333333, 0.43333333333333335, 0.5666666666666667, 0.6, 0.36666666666666664, 0.5, 0.4666666666666667, 0.5, 0.4666666666666667, 0.4666666666666667, 0.3333333333333333, 0.5, 0.4, 0.5666666666666667, 0.5666666666666667, 0.6666666666666666, 0.43333333333333335, 0.5666666666666667, 0.5666666666666667, 0.5333333333333333, 0.5333333333333333, 0.6, 0.36666666666666664, 0.4666666666666667, 0.36666666666666664, 0.5333333333333333, 0.3333333333333333, 0.5, 0.7666666666666667, 0.5666666666666667, 0.36666666666666664, 0.5, 0.6333333333333333, 0.5, 0.5, 0.3, 0.43333333333333335, 0.5, 0.4666666666666667, 0.6333333333333333, 0.5333333333333333, 0.5, 0.4, 0.4666666666666667, 0.43333333333333335, 0.7, 0.4666666666666667, 0.5, 0.36666666666666664, 0.4, 0.5666666666666667, 0.4666666666666667, 0.5666666666666667, 0.43333333333333335, 0.4666666666666667, 0.5666666666666667, 0.6, 0.5333333333333333, 0.5333333333333333, 0.5666666666666667, 0.3333333333333333, 0.5, 0.5666666666666667, 0.4666666666666667, 0.5333333333333333, 0.5333333333333333, 0.6666666666666666, 0.4666666666666667, 0.5333333333333333, 0.4666666666666667, 0.4666666666666667, 0.5, 0.43333333333333335, 0.6333333333333333, 0.5333333333333333, 0.5333333333333333, 0.26666666666666666, 0.6333333333333333, 0.4666666666666667, 0.5, 0.5666666666666667, 0.6666666666666666, 0.7, 0.6333333333333333, 0.5333333333333333, 0.5, 0.43333333333333335, 0.6, 0.6, 0.6333333333333333, 0.4, 0.3333333333333333, 0.5, 0.4, 0.4666666666666667, 0.5, 0.6, 0.6, 0.4666666666666667, 0.6333333333333333, 0.5333333333333333, 0.5, 0.36666666666666664, 0.43333333333333335, 0.5666666666666667, 0.5333333333333333, 0.5666666666666667, 0.5333333333333333, 0.6333333333333333, 0.43333333333333335, 0.5, 0.6333333333333333, 0.5, 0.4666666666666667, 0.4666666666666667, 0.5666666666666667, 0.5, 0.5333333333333333, 0.5666666666666667, 0.6, 0.5666666666666667, 0.4666666666666667, 0.4666666666666667, 0.4666666666666667, 0.4666666666666667, 0.5, 0.6333333333333333, 0.6666666666666666, 0.4, 0.5666666666666667, 0.6, 0.3333333333333333, 0.43333333333333335, 0.5, 0.5333333333333333, 0.4666666666666667, 0.4666666666666667, 0.5, 0.5, 0.5666666666666667, 0.6, 0.6666666666666666, 0.43333333333333335, 0.4666666666666667, 0.36666666666666664, 0.4666666666666667, 0.5666666666666667, 0.6, 0.6333333333333333, 0.5, 0.5, 0.4666666666666667, 0.5666666666666667, 0.6333333333333333, 0.4, 0.6, 0.5666666666666667, 0.6, 0.5, 0.4, 0.5333333333333333, 0.5, 0.3, 0.5, 0.4, 0.4666666666666667, 0.6666666666666666, 0.5, 0.7, 0.4, 0.4666666666666667, 0.4666666666666667, 0.4666666666666667, 0.36666666666666664, 0.5, 0.6333333333333333, 0.4666666666666667, 0.5333333333333333, 0.4666666666666667, 0.4666666666666667, 0.5, 0.4666666666666667, 0.5666666666666667, 0.4, 0.6333333333333333, 0.5333333333333333, 0.5666666666666667, 0.5, 0.5666666666666667, 0.5333333333333333, 0.36666666666666664, 0.6, 0.5333333333333333, 0.5, 0.4666666666666667, 0.43333333333333335, 0.36666666666666664, 0.6333333333333333, 0.5666666666666667, 0.4666666666666667, 0.43333333333333335, 0.43333333333333335, 0.36666666666666664, 0.36666666666666664, 0.5333333333333333, 0.6666666666666666, 0.6333333333333333, 0.5333333333333333, 0.5, 0.5, 0.36666666666666664, 0.5, 0.43333333333333335, 0.5666666666666667, 0.6333333333333333, 0.6333333333333333, 0.5, 0.5333333333333333, 0.4666666666666667, 0.5, 0.5, 0.4, 0.4, 0.6333333333333333, 0.5333333333333333, 0.5, 0.43333333333333335, 0.5666666666666667, 0.43333333333333335, 0.5666666666666667, 0.43333333333333335, 0.4666666666666667, 0.5333333333333333, 0.5, 0.43333333333333335, 0.4, 0.5666666666666667, 0.6, 0.36666666666666664, 0.6333333333333333, 0.5, 0.6333333333333333, 0.5, 0.3, 0.7, 0.5, 0.6, 0.5, 0.36666666666666664, 0.5333333333333333, 0.36666666666666664, 0.43333333333333335, 0.5666666666666667, 0.5333333333333333, 0.6333333333333333, 0.4, 0.4, 0.7, 0.4666666666666667, 0.6333333333333333, 0.5333333333333333, 0.4, 0.43333333333333335, 0.43333333333333335, 0.5666666666666667, 0.5, 0.3, 0.4666666666666667, 0.4666666666666667, 0.4, 0.6, 0.4, 0.5, 0.5333333333333333, 0.5, 0.5333333333333333, 0.5333333333333333, 0.3, 0.5, 0.5333333333333333, 0.43333333333333335, 0.4, 0.5333333333333333, 0.3333333333333333, 0.43333333333333335, 0.5, 0.6333333333333333, 0.5333333333333333, 0.5, 0.5, 0.5333333333333333, 0.4666666666666667, 0.6333333333333333, 0.4666666666666667, 0.5333333333333333, 0.43333333333333335, 0.3333333333333333, 0.5, 0.3, 0.5, 0.4666666666666667, 0.4, 0.5333333333333333, 0.4666666666666667, 0.5, 0.36666666666666664, 0.7, 0.4, 0.6333333333333333, 0.5666666666666667, 0.26666666666666666, 0.43333333333333335, 0.5666666666666667, 0.3, 0.6, 0.6333333333333333, 0.5, 0.36666666666666664, 0.4, 0.5, 0.43333333333333335, 0.43333333333333335, 0.6333333333333333, 0.43333333333333335, 0.6666666666666666, 0.5, 0.4666666666666667, 0.36666666666666664, 0.5666666666666667, 0.5333333333333333, 0.5, 0.4, 0.4, 0.5666666666666667, 0.43333333333333335, 0.5333333333333333, 0.5, 0.7, 0.4666666666666667, 0.6666666666666666, 0.4, 0.5, 0.5333333333333333, 0.4, 0.5333333333333333, 0.5, 0.4666666666666667, 0.6666666666666666, 0.36666666666666664, 0.5333333333333333, 0.5333333333333333, 0.4666666666666667, 0.5333333333333333, 0.4, 0.4, 0.5, 0.4666666666666667, 0.43333333333333335, 0.43333333333333335, 0.6666666666666666, 0.6, 0.5333333333333333, 0.5333333333333333, 0.43333333333333335, 0.4, 0.5666666666666667, 0.36666666666666664, 0.43333333333333335, 0.4666666666666667, 0.3333333333333333, 0.36666666666666664, 0.6, 0.5666666666666667, 0.4, 0.6666666666666666, 0.5333333333333333, 0.5666666666666667, 0.4666666666666667, 0.3333333333333333, 0.4, 0.36666666666666664, 0.6333333333333333, 0.6333333333333333, 0.26666666666666666, 0.43333333333333335, 0.4666666666666667, 0.43333333333333335, 0.4666666666666667, 0.43333333333333335, 0.5, 0.43333333333333335, 0.6, 0.5666666666666667, 0.4666666666666667, 0.43333333333333335, 0.5666666666666667, 0.36666666666666664, 0.4666666666666667, 0.5, 0.4666666666666667, 0.4666666666666667, 0.5333333333333333, 0.4666666666666667, 0.5333333333333333, 0.5, 0.7333333333333333, 0.6, 0.3, 0.5333333333333333, 0.5, 0.6, 0.6333333333333333, 0.5666666666666667, 0.5666666666666667, 0.5333333333333333, 0.6333333333333333, 0.4666666666666667, 0.5333333333333333, 0.5, 0.5333333333333333, 0.6, 0.43333333333333335, 0.5666666666666667, 0.5333333333333333, 0.5, 0.6666666666666666, 0.5666666666666667, 0.5666666666666667, 0.6, 0.5666666666666667, 0.43333333333333335, 0.5333333333333333, 0.36666666666666664, 0.4666666666666667, 0.5, 0.5666666666666667, 0.6, 0.5, 0.4, 0.5666666666666667, 0.43333333333333335, 0.5666666666666667, 0.6666666666666666, 0.6, 0.26666666666666666, 0.5333333333333333, 0.5, 0.5666666666666667, 0.43333333333333335, 0.5333333333333333, 0.36666666666666664, 0.5333333333333333, 0.5333333333333333, 0.5333333333333333, 0.5666666666666667, 0.43333333333333335, 0.6333333333333333, 0.43333333333333335, 0.5333333333333333, 0.5666666666666667, 0.6, 0.5333333333333333, 0.3333333333333333, 0.43333333333333335, 0.7, 0.43333333333333335, 0.4666666666666667, 0.6333333333333333, 0.5333333333333333, 0.5333333333333333, 0.43333333333333335, 0.5666666666666667, 0.4, 0.3, 0.43333333333333335, 0.5666666666666667, 0.6333333333333333, 0.5, 0.36666666666666664, 0.5, 0.4, 0.6, 0.5333333333333333, 0.6, 0.6333333333333333, 0.5333333333333333, 0.7, 0.5333333333333333, 0.3333333333333333, 0.43333333333333335, 0.3333333333333333, 0.6666666666666666, 0.43333333333333335, 0.43333333333333335, 0.5333333333333333, 0.5, 0.5666666666666667, 0.43333333333333335, 0.6666666666666666, 0.4666666666666667, 0.43333333333333335, 0.5666666666666667, 0.5666666666666667, 0.3333333333333333, 0.36666666666666664, 0.7, 0.4666666666666667, 0.43333333333333335, 0.6, 0.5, 0.6, 0.4666666666666667, 0.5, 0.43333333333333335, 0.5333333333333333, 0.5, 0.6, 0.43333333333333335, 0.4666666666666667, 0.6, 0.43333333333333335, 0.5666666666666667, 0.5333333333333333, 0.4, 0.5, 0.23333333333333334, 0.6, 0.4666666666666667, 0.36666666666666664, 0.4666666666666667, 0.5, 0.6, 0.5666666666666667, 0.6333333333333333, 0.43333333333333335, 0.5333333333333333, 0.3333333333333333, 0.5333333333333333, 0.6, 0.5666666666666667, 0.5, 0.5333333333333333, 0.5333333333333333, 0.5666666666666667, 0.5333333333333333, 0.5666666666666667, 0.5333333333333333, 0.4666666666666667, 0.43333333333333335, 0.5333333333333333, 0.5333333333333333, 0.43333333333333335, 0.36666666666666664, 0.5666666666666667, 0.4666666666666667, 0.6, 0.4666666666666667, 0.6, 0.3333333333333333, 0.4, 0.4666666666666667, 0.5333333333333333, 0.4666666666666667, 0.4, 0.5666666666666667, 0.5, 0.5333333333333333, 0.5666666666666667, 0.4, 0.4666666666666667, 0.5333333333333333, 0.43333333333333335, 0.6, 0.4, 0.6666666666666666, 0.5, 0.6666666666666666, 0.5666666666666667, 0.5, 0.4666666666666667, 0.5, 0.4, 0.6666666666666666, 0.5, 0.4, 0.6333333333333333, 0.6, 0.5333333333333333, 0.4666666666666667, 0.4, 0.43333333333333335, 0.5, 0.5, 0.3, 0.5333333333333333, 0.43333333333333335, 0.5, 0.43333333333333335, 0.4, 0.5666666666666667, 0.4666666666666667, 0.6, 0.6, 0.5666666666666667, 0.4, 0.5, 0.5666666666666667, 0.36666666666666664, 0.4, 0.43333333333333335, 0.5, 0.6, 0.4666666666666667, 0.43333333333333335, 0.5, 0.5666666666666667, 0.36666666666666664, 0.4666666666666667, 0.5333333333333333, 0.6, 0.5, 0.6333333333333333, 0.5333333333333333, 0.5333333333333333, 0.6, 0.6666666666666666, 0.6333333333333333, 0.4, 0.4666666666666667, 0.43333333333333335, 0.5333333333333333, 0.6666666666666666, 0.6, 0.4666666666666667, 0.6, 0.5, 0.5, 0.5, 0.4666666666666667, 0.4666666666666667, 0.5666666666666667, 0.43333333333333335, 0.5, 0.36666666666666664, 0.5666666666666667, 0.7, 0.36666666666666664, 0.5333333333333333, 0.6, 0.3, 0.5333333333333333, 0.5, 0.43333333333333335, 0.6, 0.4666666666666667, 0.5]

```
# Create dataframe with single coin flip
```

```
# Plot histogram to look at distribution of a single coin flip
```

```
# Plot histogram to look at distribution of all coin flips
```

What does the Central Limit Theorem State? That no matter the initial distribution of the population, the distribution of sample means taken will approximate a normal distribution as $n \rightarrow \infty$.

This has very important implications for hypothesis testing and is precisely the reason why the t-distribution begins to approximate the normal distribution as our sample size increases.

## Standard Error of the Mean

What does it mean to "estimate"? the Population mean?

```
import numpy as np
import pandas as pd

# Average Height
mu = 70
sigma = 3

lambda_heights = np.random.normal(mu, sigma, 2000)
print(len(lambda_heights))
lambda_heights
```

    2000

    array([64.52980773, 75.16776072, 70.69565154, ..., 69.35265898,
           72.82941193, 71.11879291])

```
import seaborn as sns

sns.distplot(lambda_heights)
plt.title('Distribution of Heights (in inches)');
```

```
print("Population Mean:", lambda_heights.mean())
print("Population Standard Deviation:", lambda_heights.std())
```

    Population Mean: 69.9296448140553
    Population Standard Deviation: 2.9611799110435335

```
population = pd.DataFrame({'heights': lambda_heights})
print(population.shape)
population.head()
```

    (2000, 1)

      heights

      0
      64.529808

      1
      75.167761

      2
      70.695652

      3
      69.006209

      4
      72.512828

```
# Take a random sample and print sample mean
```

```
# Take a different random sample and print sample mean
```

## Build and Interpret a Confidence Interval

```

```

### What confidence level do we want our confidence interval to represent?

95% confidence Interval? 99% confidence interval?

```

```

## Graphically Represent a Confidence Interval

```

```

## Relationship between Confidence Intervals and T-tests

Confidence Interval == Bounds of statistical significance for our t-test

A sample mean that falls inside of our confidence interval will "FAIL TO REJECT" our null hypothesis

A sample mean that falls outside of our confidence interval will "REJECT" our null hypothesis

```
from scipy.stats import t, ttest_1samp
```

```
import numpy as np

coinflip_means = []
for x in range(0,100):
  coinflips = np.random.binomial(n=1, p=.5, size=30)
  coinflip_means.append(coinflips.mean())

print(coinflip_means)
```

    [0.5, 0.6, 0.3333333333333333, 0.43333333333333335, 0.5666666666666667, 0.5, 0.5, 0.43333333333333335, 0.6, 0.36666666666666664, 0.5, 0.6333333333333333, 0.4666666666666667, 0.5333333333333333, 0.5333333333333333, 0.4, 0.4666666666666667, 0.6, 0.5666666666666667, 0.5333333333333333, 0.4, 0.5, 0.5333333333333333, 0.5333333333333333, 0.36666666666666664, 0.6333333333333333, 0.3, 0.5, 0.5, 0.4666666666666667, 0.4666666666666667, 0.6, 0.6333333333333333, 0.5333333333333333, 0.36666666666666664, 0.5, 0.6, 0.5, 0.5, 0.4666666666666667, 0.5333333333333333, 0.43333333333333335, 0.36666666666666664, 0.6666666666666666, 0.5333333333333333, 0.5333333333333333, 0.5333333333333333, 0.5, 0.4, 0.4666666666666667, 0.43333333333333335, 0.5, 0.6, 0.4666666666666667, 0.5666666666666667, 0.4, 0.4666666666666667, 0.43333333333333335, 0.4666666666666667, 0.4666666666666667, 0.5333333333333333, 0.7, 0.6666666666666666, 0.5, 0.6333333333333333, 0.43333333333333335, 0.5, 0.36666666666666664, 0.5333333333333333, 0.43333333333333335, 0.4666666666666667, 0.36666666666666664, 0.4666666666666667, 0.5, 0.36666666666666664, 0.36666666666666664, 0.6333333333333333, 0.5333333333333333, 0.5, 0.6, 0.4666666666666667, 0.5666666666666667, 0.4666666666666667, 0.5666666666666667, 0.4666666666666667, 0.4666666666666667, 0.5, 0.5333333333333333, 0.6, 0.4, 0.43333333333333335, 0.4, 0.5666666666666667, 0.5, 0.5333333333333333, 0.8, 0.5333333333333333, 0.3333333333333333, 0.5, 0.43333333333333335]

A null hypothesis that's just inside of our confidence interval == fail to reject

```

```

A null hypothesis that's just outside of our confidence interval == reject

```

```

```
def confidence_interval(data, confidence=0.95):
  """
  Calculate a confidence interval around a sample mean for given data.
  Using t-distribution and two-tailed test, default 95% confidence.

  Arguments:
    data - iterable (list or numpy array) of sample observations
    confidence - level of confidence for the interval

  Returns:
    tuple of (mean, lower bound, upper bound)
  """
  data = np.array(data)
  mean = np.mean(data)
  n = len(data)
  stderr = stats.sem(data)
  interval = stderr * stats.t.ppf((1 + confidence) / 2.0, n - 1)
  return (mean, mean - interval, mean + interval)
```

## Run a $\chi^{2}$ Test "by hand" (Using Numpy)

```
df = pd.read_csv('https://raw.githubusercontent.com/ryanleeallred/datasets/master/adult.csv', na_values=" ?")
print(df.shape)
df.head()
```

    (32561, 15)

      age
      workclass
      fnlwgt
      education
      education-num
      marital-status
      occupation
      relationship
      race
      sex
      capital-gain
      capital-loss
      hours-per-week
      country
      salary

      0
      39
      State-gov
      77516
      Bachelors
      13
      Never-married
      Adm-clerical
      Not-in-family
      White
      Male
      2174
      0
      40
      United-States
      <=50K

      1
      50
      Self-emp-not-inc
      83311
      Bachelors
      13
      Married-civ-spouse
      Exec-managerial
      Husband
      White
      Male
      0
      0
      13
      United-States
      <=50K

      2
      38
      Private
      215646
      HS-grad
      9
      Divorced
      Handlers-cleaners
      Not-in-family
      White
      Male
      0
      0
      40
      United-States
      <=50K

      3
      53
      Private
      234721
      11th
      7
      Married-civ-spouse
      Handlers-cleaners
      Husband
      Black
      Male
      0
      0
      40
      United-States
      <=50K

      4
      28
      Private
      338409
      Bachelors
      13
      Married-civ-spouse
      Prof-specialty
      Wife
      Black
      Female
      0
      0
      40
      Cuba
      <=50K

## Expected Value Calculation
\begin{align}
expected_{i,j} =\frac{(row_{i} \text{total})(column_{j} \text{total}) }{(\text{total observations})}
\end{align}

```

```

## Chi-Squared Statistic with Numpy

\begin{align}
\chi^2 = \sum \frac{(observed_{i}-expected_{i})^2}{(expected_{i})}
\end{align}

For the $observed$ values we will just use a version of our contingency table without the margins as a numpy array. In this way, if our observed values array and our expected values array are the same shape, then we can subtract them and divide them directly which makes the calculations a lot cleaner. No for loops!

```

```

## Run a $\chi^{2}$ Test using Scipy

```

```

Null Hypothesis: Hours worked per week bins is **independent** of sex.

Due to a p-value of 0, we REJECT the null hypothesis that hours worked per week and sex are independent, and conclude that there is an association between hours worked per week and sex.

## Assignment - Build a confidence interval

A confidence interval refers to a neighborhood around some point estimate, the size of which is determined by the desired p-value. For instance, we might say that 52% of Americans prefer tacos to burritos, with a 95% confidence interval of +/- 5%.

52% (0.52) is the point estimate, and +/- 5% (the interval $[0.47, 0.57]$) is the confidence interval. "95% confidence" means a p-value $\leq 1 - 0.95 = 0.05$.

In this case, the confidence interval includes $0.5$ - which is the natural null hypothesis (that half of Americans prefer tacos and half burritos, thus there is no clear favorite). So in this case, we could use the confidence interval to report that we've failed to reject the null hypothesis.

But providing the full analysis with a confidence interval, including a graphical representation of it, can be a helpful and powerful way to tell your story. Done well, it is also more intuitive to a layperson than simply saying "fail to reject the null hypothesis" - it shows that in fact the data does *not* give a single clear result (the point estimate) but a whole range of possibilities.

How is a confidence interval built, and how should it be interpreted? It does *not* mean that 95% of the data lies in that interval - instead, the frequentist interpretation is "if we were to repeat this experiment 100 times, we would expect the average result to lie in this interval ~95 times."

For a 95% confidence interval and a normal(-ish) distribution, you can simply remember that +/-2 standard deviations contains 95% of the probability mass, and so the 95% confidence interval based on a given sample is centered at the mean (point estimate) and has a range of +/- 2 (or technically 1.96) standard deviations.

Different distributions/assumptions (90% confidence, 99% confidence) will require different math, but the overall process and interpretation (with a frequentist approach) will be the same.

Your assignment - using the data from the prior module ([congressional voting records](https://archive.ics.uci.edu/ml/datasets/Congressional+Voting+Records)):

### Confidence Intervals:
1. Generate and numerically represent a confidence interval
2. Graphically (with a plot) represent the confidence interval
3. Interpret the confidence interval - what does it tell you about the data and its distribution?

### Chi-squared tests:
4. Take a dataset that we have used in the past in class that has **categorical** variables. Pick two of those categorical variables and run a chi-squared tests on that data
  - By hand using Numpy
  - In a single line using Scipy

Stretch goals:

1. Write a summary of your findings, mixing prose and math/code/results. *Note* - yes, this is by definition a political topic. It is challenging but important to keep your writing voice *neutral* and stick to the facts of the data. Data science often involves considering controversial issues, so it's important to be sensitive about them (especially if you want to publish).
2. Apply the techniques you learned today to your project data or other data of your choice, and write/discuss your findings here.
3. Refactor your code so it is elegant, readable, and can be easily run for all issues.

```
# TODO - your code!
```

## Resources

- [Interactive visualize the Chi-Squared test](https://homepage.divms.uiowa.edu/~mbognar/applets/chisq.html)
- [Calculation of Chi-Squared test statistic](https://en.wikipedia.org/wiki/Pearson%27s_chi-squared_test)
- [Visualization of a confidence interval generated by R code](https://commons.wikimedia.org/wiki/File:Confidence-interval.svg)
- [Expected value of a squared standard normal](https://math.stackexchange.com/questions/264061/expected-value-calculation-for-squared-normal-distribution) (it's 1 - which is why the expected value of a Chi-Squared with $n$ degrees of freedom is $n$, as it's the sum of $n$ squared standard normals)


# Plotting with Matplotlib

## Prepare for action

```
import numpy as np
import scipy as sp
import sympy

# Pylab combines the pyplot functionality (for plotting) with the numpy
# functionality (for mathematics and for working with arrays) in a single namespace
# aims to provide a closer MATLAB feel (the easy way). Note that his approach
# should only be used when doing some interactive quick and dirty data inspection.
# DO NOT USE THIS FOR SCRIPTS
#from pylab import *

# the convienient Matplotib plotting interface pyplot (the tidy/right way)
# use this for building scripts. The examples here will all use pyplot.
import matplotlib.pyplot as plt

# for using the matplotlib API directly (the hard and verbose way)
# use this when building applications, and/or backends
import matplotlib as mpl
```

How would you like the IPython notebook show your plots? In order to use the
matplotlib IPython magic youre IPython notebook should be launched as

    ipython notebook --matplotlib=inline

Make plots appear as a pop up window, chose the backend: 'gtk', 'inline', 'osx', 'qt', 'qt4', 'tk', 'wx'

    %matplotlib qt

or inline the notebook (no panning, zooming through the plot). Not working in IPython 0.x

    %matplotib inline

```
# activate pop up plots
#%matplotlib qt
# or change to inline plots
%matplotlib inline
```

### Matplotlib documentation

Finding your own way (aka RTFM). Hint: there is search box available!

* http://matplotlib.org/contents.html

The Matplotlib API docs:

* http://matplotlib.org/api/index.html

Pyplot, object oriented plotting:

* http://matplotlib.org/api/pyplot_api.html
* http://matplotlib.org/api/pyplot_summary.html

Extensive gallery with examples:

* http://matplotlib.org/gallery.html

### Tutorials for those who want to start playing

If reading manuals is too much for you, there is a very good tutorial available here:

* http://nbviewer.ipython.org/github/jrjohansson/scientific-python-lectures/blob/master/Lecture-4-Matplotlib.ipynb

Note that this tutorial uses

    from pylab import *

which is usually not adviced in more advanced script environments. When using

    import matplotlib.pyplot as plt

you need to preceed all plotting commands as used in the above tutorial with

    plt.

Give me more!

[EuroScipy 2012 Matlotlib tutorial](http://www.loria.fr/~rougier/teaching/matplotlib/). Note that here the author uses ```from pylab import * ```. When using ```import matplotliblib.pyplot as plt``` the plotting commands need to be proceeded with ```plt.```

## Plotting template starting point

```
# some sample data
x = np.arange(-10,10,0.1)
```

To change the default plot configuration values.

```
page_width_cm = 13
dpi = 200
inch = 2.54 # inch in cm
# setting global plot configuration using the RC configuration style
plt.rc('font', family='serif')
plt.rc('xtick', labelsize=12) # tick labels
plt.rc('ytick', labelsize=20) # tick labels
plt.rc('axes', labelsize=20)  # axes labels
# If you don’t need LaTeX, don’t use it. It is slower to plot, and text
# looks just fine without. If you need it, e.g. for symbols, then use it.
#plt.rc('text', usetex=True) #<- P-E: Doesn't work on my Mac
```

```
# create a figure instance, note that figure size is given in inches!
fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(8,6))
# set the big title (note aligment relative to figure)
fig.suptitle("suptitle 16, figure alignment", fontsize=16)

# actual plotting
ax.plot(x, x**2, label="label 12")

# set axes title (note aligment relative to axes)
ax.set_title("title 14, axes alignment", fontsize=14)

# axes labels
ax.set_xlabel('xlabel 12')
ax.set_ylabel(r'$y_{\alpha}$ 12', fontsize=8)

# legend
ax.legend(fontsize=12, loc="best")

# saving the figure in different formats
fig.savefig('figure-%03i.png' % dpi, dpi=dpi)
fig.savefig('figure.svg')
fig.savefig('figure.eps')
```

```
# following steps are only relevant when using figures as pop up windows (with %matplotlib qt)
# to update a figure with has been modified
fig.canvas.draw()
# show a figure
fig.show()
```

    C:\Anaconda\lib\site-packages\matplotlib\figure.py:371: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure
      "matplotlib is currently using a non-GUI backend, "

## Exercise

The current section is about you trying to figure out how to do several plotting features. You should use the previously mentioned resources to find how to do that. In many cases, google is your friend!

* add a grid to the plot

```
plt.plot(x,x**2)
#Write code to show grid in plot here
axes = plt.gca()
axes.grid(True)
```

* change the location of the legend to different places

```
plt.plot(x,x**2, label="label 12")
plt.legend(fontsize=12, loc=4)
```

* find a way to control the line type and color, marker type and color, control the frequency of the marks (`markevery`). See plot options at: http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.plot

```
plt.plot(x,x**2, 'o-', markevery=5, linewidth = 2, markerfacecolor='r')
```

* add different sub-plots

```
fig, ax = plt.subplots(nrows=2, ncols=1)
ax[0].plot(x,x**2)
ax[1].plot(x, x**3)
```

* size the figure such that when included on an A4 page the fonts are given in their true size

```

```

* make a contour plot

```
X, Y = np.meshgrid(x,x)
Z = X**2+Y**2

cnt = plt.contour(Z, vmin=abs(Z).min(), vmax=abs(Z).max(), extent=[0, 1, 0, 1])

```

* use twinx() to create a second axis on the right for the second plot

```
fig, ax1 = plt.subplots()
ax1.plot(x,x**2)
ax2 = ax1.twinx()
ax2.plot(x,x**4, 'r')

for label in ax2.get_yticklabels():
    label.set_color("red")
```

* add horizontal and vertical lines using axvline(), axhline()

```
plt.plot(x,x**2)
plt.axvline(x=0, ymin=0, ymax=1)
plt.axhline(y=50, xmin=-10, xmax=10)
```

* autoformat dates for nice printing on the x-axis using fig.autofmt_xdate()

```
import datetime
dates = np.array([datetime.datetime.now() + datetime.timedelta(days=i) for i in xrange(24)])
fig, ax = plt.subplots(nrows=1, ncols=1)
ax.bar(dates, np.random.rand(24))
fig.autofmt_xdate(bottom=0.2, rotation=30, ha='right')
```

## Advanced exercises

We are going to play a bit with regression

* Create a vector x of equally spaced number between $x \in [0, 5\pi]$ of 1000 points (keyword: linspace)

```
x = np.linspace(0, 5*np.pi, 1000)
```

* create a vector y, so that y=sin(x) with some random noise

```
y = np.sin(x)+(np.random.random(1000)-0.5)
```

* plot it like this:

```
fig, ax = plt.subplots(1, 1)
ax.plot(x, y, '.')
ax.plot(x, np.sin(x), 'b--', linewidth=3, label='y=sin(x)')

ax.legend(loc =1)
```

Try to do a polynomial fit on y(x) with different polynomial degree (Use numpy.polyfit to obtain coefficients)

Plot it like this (use np.poly1d(coef)(x) to plot polynomials)

```
fig, ax = plt.subplots(1, 1)
ax.plot(x, y, '.')
ax.plot(x, np.sin(x), 'b--', linewidth=3, label='y=sin(x)')

for i in range(0, 10):
    coeff = np.polyfit(x, y, i)
    ax.plot(x, np.polyval(coeff, x), label='deg=%i'%i)

ax.legend(loc=7, bbox_to_anchor=(1.32, 0.5))
```

```

```


<figure>
  <IMG SRC="gfx/Logo_norsk_pos.png" WIDTH=100 ALIGN="right">
</figure>

# Getting started with Python and Jupyter
*Roberto Di Remigio*, *Luca Frediani*

During the course we will use [Python] to solve some of the exercises and explore concepts in quantum mechanics.
Instead of just using the command line, we will exploit [Jupyter notebooks].
You will be able to look at the exercises and run them on your browser. We recommend you install Python on your machine anyway: we think you will find knowledge of Python useful also in the future.
The easiest way to get a reasonably complete Python distribution working is *via* [Anaconda], detailed instructions for Windows, Max OS X and Linux are [here].

[Python]: https://en.wikipedia.org/wiki/Python_(programming_language)
[Jupyter notebooks]: https://jupyter.readthedocs.org
[Anaconda]: https://www.continuum.io/why-anaconda
[here]: http://docs.continuum.io/anaconda/install

## Why Python?

Python is an interpreted scripting language that has become more and more popular in the past years.
It can be used (and it **is used**) to do pretty much anything. It can be your pocket calculator, you can use it to [plot data], [calculate derivatives and integrals], perform tasks in [linear algebra] and much, much more!

[plot data]: http://matplotlib.org/
[calculate derivatives and integrals]: http://www.sympy.org/en/index.html
[linear algebra]: http://www.numpy.org/

There are a lot of resources out there to learn Python.
[Mark Bakker]'s collection of Jupyter notebooks is really great. It covers a lot of ground, plus you have screencasts for the notebooks covering the basics of Python.
We also recommend the book [Learning IPython for Interactive Computing and Data Visualization] by Cyrille Roussant.
The ebook is available from the University's library. You will have to be on campus to access it *via* [this link],
click the __Fulltekst tilgjengelig på: ebrary Academic Complete Non-US__ link to go to the ebook.
Finally, to learn more about how to fully exploit a Jupyter notebook we recommend you read the tutorials in this [page]

[Mark Bakker]: http://mbakker7.github.io/exploratory_computing_with_python/
[Learning IPython for Interactive Computing and Data Visualization]: http://ipython-books.github.io/minibook/
[this link]: http://bibsys-almaprimo.hosted.exlibrisgroup.com/primo_library/libweb/action/display.do?tabs=viewOnlineTab&ct=display&fn=search&doc=BIBSYS_ILS71524751750002201&indx=2&recIds=BIBSYS_ILS71524751750002201&recIdxs=1&elementId=1&renderMode=poppedOut&displayMode=full&frbrVersion=9&frbg=&&dscnt=0&scp.scps=scope%3A%28SC_OPEN_ACCESS%29%2Cscope%3A%28%22UBTO%22%29%2Cprimo_central_multiple_fe&tb=t&mode=Basic&vid=UBTO&srt=rank&tab=default_tab&dum=true&vl(freeText0)=ipython&dstmp=1454313553096
[page]: https://www.datacamp.com/community/tutorials/tutorial-jupyter-notebook#gs.svdmCKs

## First steps

Let's start off by using Python as a calculator. There are different types of **cells** in Jupyter notebooks. We will be mostly using **code cells** to write and execute code and **Markdown cells** to write comments to the code.
A Markdown cell is just text. You can add images and also equations, using $\LaTeX$:

\begin{equation}
    f(x) = ax^2 + bx + c
\end{equation}

Code cells contain Python code. Each code cell has an input and an output section. The input section contains code you write, the ouput section contains the results of executing your code.
Move your cursor to the code cell right below this Markdown cell and press [shift][Enter].
This triggers evaluation of the cell and you will see the output of the computation right below.

```python
6 * 2
```

    12

When programming, you can (and should) use variables to hold values, so that you can reference them later in your code. Pressing [shift][Enter] will always trigger evaluation of a code cell and print out the results.

```python
a = 6
b = 2
a * b
```

    12

Python provides the `print` function to write output to the screen.

```python
a = 6
b = 2
c = a * b
print(a)
print(b)
print(c)
```

    6
    2
    12

Of course, we can add more information to a print statement! A line starting with `#` is a comment, the intepreter will just ignore it. It is useful to add comments, to remind both yourself and others what you were trying to do when writing the code ;)

```python
a = 6 # Assign value to a
b = 2 # Assign value to b
c = a * b # Perform operation
# Now print everything out!
print('a =', a)
print('b =', b)
print('c =', c)
```

    a = 6
    b = 2
    c = 12

## Python modules: basic plotting with `matplotlib`

When you first install Python and launch an instance of the interpreter (the program running the commands) you cannot do very much. Luckily, Python was designed to be highly extensible using independent packages called **modules**. Much of the functionality that makes Python appealing is provided *via* modules.
A module is a collection of functions designed to perform a very specific set of tasks.

For example, the [`matplotlib`] module provides the functions needed to perform plotting in Python.
To use it we need to **import** it. There are many different ways to import a module, for the moment we import only the plottig part of `matplotlib` and call it `plt`. The second command ensures that the plots are generated in this Notebook and not in a separate window.

[`matplotlib`]: http://matplotlib.org/

```python
import matplotlib.pyplot as plt
# make sure we see it on this notebook
%matplotlib inline
```

Modules only have to be imported once in a Jupyter session. After the import, any plotting function may be called from any code cell as `plt.function`. In the following we are plotting the data table:

 x | y
---|---
 0 | 1
 1 | 2
 2 | 3
 3 | 5
 4 | 2
 5 | 6

```python
import matplotlib.pyplot as plt
# make sure we see it on this notebook
%matplotlib inline
plt.plot([1, 2, 3, 5, 2, 6])
plt.show()
```

## Python modules: arrays with `numpy`

OK, let's plot something more interesting than just a bunch of points.
The function we want to plot is:
\begin{equation}
  f(x) = 10x^3\mathrm{e}^{-x^2} + \frac{\sin(x^5)}{\cos(x^3)}
\end{equation}
How do we do it? We could of course create a table of $x$,$y$ pairs and feed it to the `plt.plot` function as in the example above, but that's too tedious.
The module [`numpy`] comes to the rescue. First of all, we import `numpy` and give it the name `np`:

[`numpy`]: http://www.numpy.org/

```python
import numpy as np
```

Next, we create an **array** of, for example, 10 equally spaced points between -4 and +4 with the `linspace` command. This array will contain the values of the `x` variables where we will evaluate the function $f(x)$.

```python
x = np.linspace(-4, 4, 10)
print(x)
```

    [-4.         -3.11111111 -2.22222222 -1.33333333 -0.44444444  0.44444444
      1.33333333  2.22222222  3.11111111  4.        ]

The next step is to evaluate the function at all the $x$ points listed in the `x` array and save the results in another array, which we call `y`:

```python
y = 10 * x**3 * np.exp(-x**2) + np.sin(x**5) / np.cos(x**3)
print(y)
```

    [  0.40449721  -2.48343478 -33.46262352  -5.23117497  -0.73796062
       0.73796062   5.23117497  33.46262352   2.48343478  -0.40449721]

Notice that:
1. Raising to power has the syntax `x**3` and **not** `x^3`
2. The exponential, sine and cosine are included in `numpy` and you have to invoke them as `np.exp`, `np.sin` and `np.cos` since you are giving `numpy` arrays as arguments.
We are now ready to plot!

```python
import matplotlib.pyplot as plt
# make sure we see it on this notebook
%matplotlib inline
plt.plot(x, y)
```

Done! OK, it doesn't look that great. That's because we are using only 10 sampling points. Try changing the number of points generated by `np.linspace` from 10 to another, higher value. Re-run all the cells and see what changes.

We can also apply other changes. First of all, we can define a Python function to calculate $f(x)$. We can then reuse this function wherever we want instead of typing it down everytime!
A Python function:
1. Starts with the `def` statement
2. Followed by the name of the function
3. In parentheses, a comma-separated list of **function arguments**. In this case the `numpy` array with the $x$ points.
4. A colon
5. The body of the function
Our function first calculates $f(x)$ and stores the values in the `y` array, then **returns** the array.

```python
def my_first_function(x):
    import numpy as np
    y = 10 * x**3 * np.exp(-x**2) + np.sin(x**5) / np.cos(x**3)
    return y
```

```python
function = my_first_function(x)
print(function)
```

    [  0.40449721  -2.48343478 -33.46262352  -5.23117497  -0.73796062
       0.73796062   5.23117497  33.46262352   2.48343478  -0.40449721]

As you can see, calling the function gives the same results as calculated above.
As further improvements we will add a legend to the plot, labels to the $x$ and $y$ axes and a title. Python functions in `matplotlib` and `numpy` take many arguments. Pressing [shift][Tab] when typing in a code cell will open an help box with a lot of useful information on the function arguments.

```python
plt.plot(x, my_first_function(x), 'r--')
# Write label on x axis
plt.xlabel('x-axis')
# Write label on y axis
plt.ylabel('y-axis')
# Write title
plt.title('First Python Figure')
# Add legend
plt.legend('f')
```


# KVLCC2 Ikeda method

# Purpose
How good is original Ikeda method for this ship?

# Methodology
Run PyScoresII and calculate Ikeda

# Setup

```python
# %load imports.py
"""
These is the standard setup for the notebooks.
"""

%matplotlib inline
%load_ext autoreload
%autoreload 2

import sys
sys.path.append("../../")

import pandas as pd
pd.options.display.max_rows = 999
pd.options.display.max_columns = 999
pd.set_option("display.max_columns", None)
import numpy as np
import os
import matplotlib.pyplot as plt
from collections import OrderedDict
import copy
from sklearn.pipeline import Pipeline
from rolldecayestimators.transformers import CutTransformer, LowpassFilterDerivatorTransformer, ScaleFactorTransformer, OffsetTransformer
from rolldecayestimators.direct_estimator_cubic import EstimatorQuadraticB, EstimatorCubic
from rolldecayestimators.ikeda_estimator import IkedaQuadraticEstimator
import src.equations as equations
import rolldecayestimators.lambdas as lambdas
from rolldecayestimators.substitute_dynamic_symbols import lambdify
import rolldecayestimators.symbols as symbols
import sympy as sp

from sympy.physics.vector.printing import vpprint, vlatex
from IPython.display import display, Math, Latex

from sklearn.metrics import r2_score
import shipflowmotionshelpers.shipflowmotionshelpers as helpers
import src.visualization.visualize as visualize
import scipy
from copy import deepcopy
import joblib
```

    Duplicate key in file WindowsPath('C:/Users/maa/.matplotlib/stylelib/paper.mplstyle'), line 462 ('figure.figsize   : 5, 3   ## figure size in inches')
    Duplicate key in file WindowsPath('C:/Users/maa/.matplotlib/stylelib/paper.mplstyle'), line 463 ('figure.dpi       : 100        ## figure dots per inch')

```python
import pyscores2
import pyscores2.runScores2
import pyscores2.xml_hydrostatics
from pyscores2.output import OutputFile
from rolldecayestimators.ikeda import Ikeda, IkedaR

from rolldecayestimators.simplified_ikeda_class import SimplifiedIkeda, SimplifiedIkedaABS
from rolldecayestimators.simplified_ikeda import limits_kawahara
from pyscores2.runScores2 import Calculation
import shutil
from reports import mdl_results
```

```python
df_rolldecays=mdl_results.df_rolldecays
```

```python
row = df_rolldecays.iloc[2]
```

## Run ScoresII

```python
xml_parser = pyscores2.xml_hydrostatics.Parser(fileName='../../data/external/KVLCC2m_kbk_final_ScoresData.xml')
indata = xml_parser.convertToScores2Indata(conditionName='Design')
indata.runOptions["IJ"].set_value(1)
indata.runOptions["IK"].set_value(2)
```

```python
indata.kxx = row.KXX*0.78  # To get correct natural frequency
indata.kyy = row.KZZ
indata.speedMax=15.5
indata.speedIncrement=15
indata.waveFrequenciesMax = 1.0
indata.waveFrequenciesMin = 0.3
indata.waveFrequenciesIncrement = 0.015
#indata.zcg = run.loading_condition.kg
```

```python
indata.save('../../models/KVLCC2_speed.IN')
```

```python
save_dir_name = 'scores'
if not os.path.exists(save_dir_name):
    os.mkdir(save_dir_name)

calculation = Calculation(outDataDirectory='scores')
```

```python
if os.name == 'nt':
    calculation.run(indata=indata)  # (This only works on windows)
    shutil.copyfile(calculation.outDataPath,'../../data/interim/KVLCC2_speed.out')
else:
    calculation.outDataPath = '../../data/interim/KVLCC2_speed.out'
```

    Running Scores2 for KVLCC2m_kbk_final Design

    C:\python36-64\lib\re.py:212: FutureWarning: split() requires a non-empty pattern match.
      return _compile(pattern, flags).split(string, maxsplit)

## Load ScoresII results

```python
output_file = OutputFile(filePath=calculation.outDataPath)
output_file.results
```

    {0.0: {0.0: <pyscores2.result.Result at 0x2a59b865470>,
      30.0: <pyscores2.result.Result at 0x2a59b865400>,
      60.0: <pyscores2.result.Result at 0x2a59b865518>,
      90.0: <pyscores2.result.Result at 0x2a59b865cc0>,
      120.0: <pyscores2.result.Result at 0x2a59b847a90>,
      150.0: <pyscores2.result.Result at 0x2a59b847a58>,
      180.0: <pyscores2.result.Result at 0x2a59b847d68>},
     15.0: {0.0: <pyscores2.result.Result at 0x2a59b847b70>,
      30.0: <pyscores2.result.Result at 0x2a59b847c50>,
      60.0: <pyscores2.result.Result at 0x2a59b8478d0>,
      90.0: <pyscores2.result.Result at 0x2a59b847198>,
      120.0: <pyscores2.result.Result at 0x2a59b847518>,
      150.0: <pyscores2.result.Result at 0x2a59b847438>,
      180.0: <pyscores2.result.Result at 0x2a59b8470f0>}}

```python
df = output_file.get_result()
```

```python
df.describe()
```

      frequencies
      encounterFrequencies
      waveLengths
      heaveAmplitude
      heavePhase
      pitchAmplitude
      pitchPhase
      surgeAmplitude
      surgePhase
      forces
      moments
      speed
      wave direction
      swayAmplitude
      swayPhase
      yawAmplitude
      yawPhase
      rollAmplitude
      rollPhase

      count
      658.000000
      658.000000
      658.000000
      658.000000
      658.000000
      658.000000
      658.000000
      658.000000
      658.000000
      658.000000
      658.000000
      658.000000
      658.000000
      470.000000
      470.000000
      470.000000
      470.000000
      470.000000
      470.000000

      mean
      0.468033
      0.468033
      368.670000
      0.552034
      103.735714
      0.298860
      -14.244225
      0.234176
      4.969453
      41.159458
      198.457057
      7.500000
      90.000000
      0.347209
      64.377872
      0.141297
      50.977234
      0.962086
      41.333617

      std
      0.167776
      0.214466
      181.225973
      0.377948
      105.112846
      0.198350
      85.181421
      0.235361
      91.020527
      43.875515
      1409.387936
      7.505706
      60.045645
      0.259896
      60.204130
      0.099550
      103.094235
      1.634676
      100.136149

      min
      0.301970
      0.213130
      61.620000
      0.000200
      -179.800000
      0.001000
      -176.400000
      0.000000
      -175.400000
      0.990810
      -4040.000000
      0.000000
      0.000000
      0.000900
      -166.500000
      0.000500
      -179.100000
      0.000400
      -179.600000

      25%
      0.341330
      0.328962
      208.470000
      0.158850
      60.725000
      0.082275
      -85.175000
      0.021250
      -87.600000
      6.707588
      -168.750000
      0.000000
      30.000000
      0.085800
      79.675000
      0.030850
      -10.900000
      0.117025
      -57.725000

      50%
      0.408820
      0.398135
      368.670000
      0.602900
      163.550000
      0.344500
      -49.150000
      0.190950
      32.100000
      26.241750
      0.000000
      7.500000
      90.000000
      0.306700
      89.550000
      0.156750
      3.600000
      0.437800
      79.750000

      75%
      0.543660
      0.533963
      528.870000
      0.902550
      174.675000
      0.465350
      68.175000
      0.364600
      90.700000
      63.642375
      490.500000
      15.000000
      150.000000
      0.587325
      90.900000
      0.218425
      172.575000
      1.039675
      115.825000

      max
      0.999980
      1.786820
      675.720000
      1.191500
      179.400000
      0.650000
      176.700000
      1.047400
      166.100000
      200.369250
      7580.000000
      15.000000
      180.000000
      0.833100
      171.200000
      0.351600
      179.500000
      15.787100
      177.600000

```python
df.head()
```

      frequencies
      encounterFrequencies
      waveLengths
      heaveAmplitude
      heavePhase
      pitchAmplitude
      pitchPhase
      surgeAmplitude
      surgePhase
      forces
      moments
      speed
      wave direction
      swayAmplitude
      swayPhase
      yawAmplitude
      yawPhase
      rollAmplitude
      rollPhase

      0
      0.99998
      0.99998
      61.62
      0.0035
      -115.2
      0.0041
      -116.6
      0.0032
      -31.6
      28.44900
      0.0
      0.0
      0.0
      NaN
      NaN
      NaN
      NaN
      NaN
      NaN

      1
      0.90658
      0.90658
      74.97
      0.0075
      61.1
      0.0090
      64.8
      0.0036
      110.2
      32.86350
      0.0
      0.0
      0.0
      NaN
      NaN
      NaN
      NaN
      NaN
      NaN

      2
      0.83526
      0.83526
      88.32
      0.0116
      -76.1
      0.0207
      -51.1
      0.0125
      136.2
      38.74950
      0.0
      0.0
      0.0
      NaN
      NaN
      NaN
      NaN
      NaN
      NaN

      3
      0.77849
      0.77849
      101.67
      0.0213
      -140.8
      0.0327
      -151.5
      0.0140
      -72.2
      44.88075
      0.0
      0.0
      0.0
      NaN
      NaN
      NaN
      NaN
      NaN
      NaN

      4
      0.73192
      0.73192
      115.02
      0.0272
      137.9
      0.0636
      159.5
      0.0326
      -64.2
      53.95500
      0.0
      0.0
      0.0
      NaN
      NaN
      NaN
      NaN
      NaN
      NaN

```python
df[r'lambda/lpp'] = df['waveLengths']/row.lpp

fig,ax=plt.subplots()
for index, group in df.groupby(by=['speed','wave direction']):
    group.plot(x=r'lambda/lpp', y='heaveAmplitude', style='o-', label=index, ax=ax)

ax.grid(True)
ax.legend();
ax.set_ylabel('Heave');
```

```python
RAO_15_0 = df.groupby(by=['speed','wave direction']).get_group((15,180))
```

```python
fig,ax=plt.subplots()
RAO_15_0.plot(x=r'lambda/lpp', y='heaveAmplitude', style='o-', ax=ax)
ax.set_xlim((0,1.8))

fig,ax=plt.subplots()
RAO_15_0.plot(x=r'lambda/lpp', y='pitchAmplitude', style='o-', ax=ax)
#ax.set_xlim((0,1.8))
```

```python
df_roll_damping = output_file.get_roll_damping()
df_roll_damping
```

      calculated_wave_damping_in_roll
      critical_wave_damping_in_roll
      natural_roll_frequency
      roll_damping_ratio
      speed
      wave_direction

      0
      9054.0
      7738000.0
      0.29838
      0.026150
      0.0
      0.0

      1
      9054.0
      7738000.0
      0.29838
      0.037180
      0.0
      30.0

      2
      9054.0
      7738000.0
      0.29838
      0.041460
      0.0
      60.0

      3
      9054.0
      7738000.0
      0.29838
      0.037180
      0.0
      90.0

      4
      9054.0
      7738000.0
      0.29838
      0.026120
      0.0
      120.0

      5
      NaN
      NaN
      NaN
      NaN
      0.0
      150.0

      6
      NaN
      NaN
      NaN
      NaN
      0.0
      180.0

      7
      9054.0
      7738000.0
      0.29838
      0.004322
      15.0
      0.0

      8
      9054.0
      7738000.0
      0.29838
      0.012690
      15.0
      30.0

      9
      9054.0
      7738000.0
      0.29838
      0.041640
      15.0
      60.0

      10
      9054.0
      7738000.0
      0.29838
      0.013430
      15.0
      90.0

      11
      9054.0
      7738000.0
      0.29838
      0.006129
      15.0
      120.0

      12
      NaN
      NaN
      NaN
      NaN
      15.0
      150.0

      13
      NaN
      NaN
      NaN
      NaN
      15.0
      180.0

## Run Ikeda

```python
w = 2.462149630662348

scale_factor=row.scale_factor
V = row.ship_speed*1.852/3.6/np.sqrt(scale_factor)

if not row.BKL:
    BKL=0
else:
    BKL=row.BKL/scale_factor

if not row.BKB:
    BKB = 0
else:
    BKB=row.BKB/scale_factor

kg = row.kg/scale_factor

#fi_as = np.deg2rad([1,10])
fi_as = np.deg2rad(10)

ikeda = Ikeda.load_scoresII(V=V, w=w, fi_a=fi_as, indata=indata, output_file=output_file,
                            scale_factor=scale_factor, BKL=BKL, BKB=BKB, kg=kg)

R = 0.05*row.beam/scale_factor  # Just guessing...
ikeda.R = R
```

```python
def calculate_ikeda(ikeda):

    output = pd.DataFrame()
    output['B_44_hat']   = ikeda.calculate_B44()
    output['B_W0_hat']   = float(ikeda.calculate_B_W0())
    output['B_W_hat']    = float(ikeda.calculate_B_W())
    output['B_F_hat']    = ikeda.calculate_B_F()
    output['B_E_hat']    = ikeda.calculate_B_E()
    output['B_BK_hat']   = ikeda.calculate_B_BK()
    output['B_L_hat']    = float(ikeda.calculate_B_L())
    output['Bw_div_Bw0'] = float(ikeda.calculate_Bw_div_Bw0())
    return output
```

```python
result_datas = calculate_ikeda(ikeda)  # DataFrame with two roll amplitudes
```

    c:\dev\prediction-of-roll-damping-using-fully-nonlinear-potential-flow-and-ikedas-method\reports\venv\lib\site-packages\rolldecayestimators\ikeda_speed.py:595: RuntimeWarning: invalid value encountered in sqrt
      gamma=sqrt(pi)*f3*(rmax+2*M/H*sqrt(B0**2*A0**2))/((2*Ts*(1-OG/Ts)*sqrt(H0_prim*sigma_prim)))

```python
result_datas
```

      B_44_hat
      B_W0_hat
      B_W_hat
      B_F_hat
      B_E_hat
      B_BK_hat
      B_L_hat
      Bw_div_Bw0

      0
      0.002264
      0.000064
      0.000303
      0.000498
      0.000118
      0.0
      0.001345
      4.754679

## Simplified Ikeda also...

```python
lpp = row.lpp/scale_factor
beam = row.beam/scale_factor
kg = row.kg/scale_factor
volume = row.Volume/(scale_factor**3)
draught = (row.TA + row.TF)/2/scale_factor
A0 = row.A0

if not row.BKL:
    BKL=0
else:
    BKL = row.BKL

if not row.BKB:
    BKB = 0
else:
    BKB = row.BKB

si = SimplifiedIkeda(V=V, w=w, fi_a=fi_as, beam=beam, lpp=lpp, kg = kg, volume=volume, draught=draught, A0=A0, BKL=BKL, BKB=BKB)
```

```python
def calculate_SI(si):

    output = pd.DataFrame()
    output['B_44_hat'] = si.calculate_B44()
    output['B_W0_hat'] =si.calculate_B_W0()
    output['B_W_hat'] =si.calculate_B_W()
    output['B_F_hat'] =si.calculate_B_F()
    output['B_E_hat'] =si.calculate_B_E()
    output['B_BK_hat'] =si.calculate_B_BK()
    output['B_L_hat'] =si.calculate_B_L()
    output['Bw_div_Bw0'] =si.calculate_Bw_div_Bw0()

    return output
```

```python
result_datas_SI = calculate_SI(si=si)
```

```python
result_datas_SI
```

      B_44_hat
      B_W0_hat
      B_W_hat
      B_F_hat
      B_E_hat
      B_BK_hat
      B_L_hat
      Bw_div_Bw0

      0
      NaN
      0.000731
      0.003476
      0.000296
      0.001962
      NaN
      0.00137
      4.754679

```python
df_results = pd.DataFrame(columns=result_datas.columns)
df_results.loc['ikeda']=result_datas.iloc[0]
df_results.loc['SI']=result_datas_SI.iloc[0]

```

```python
interesting = ['B_W_hat','B_F_hat','B_E_hat']
df_results[interesting].plot(kind='bar',stacked=True)
```

```python
limits_kawahara
```

    {'CB': (0.5, 0.85),
     'B/d': (2.5, 4.5),
     'OG/d': (-1.5, 0.2),
     'CMID': (0.9, 0.99),
     'bBk/B': (0.01, 0.06),
     'lBk/LPP': (0.05, 0.4),
     'OMEGA_hat': (0, 1.0)}

```python
df_limits = pd.DataFrame(data = limits_kawahara, index = ['min','max']).transpose()
df_limits
```

      min
      max

      CB
      0.50
      0.85

      B/d
      2.50
      4.50

      OG/d
      -1.50
      0.20

      CMID
      0.90
      0.99

      bBk/B
      0.01
      0.06

      lBk/LPP
      0.05
      0.40

      OMEGA_hat
      0.00
      1.00

```python
g=9.81
omega_hat = lambdas.omega_hat(beam=beam, g=g, omega0=w)
```

```python
Cb = volume/(lpp*beam*draught)
OG = draught-kg
ship_limits = {
 'CB': Cb,
 'B/d': beam/draught,
 'OG/d': OG/draught,
 'CMID': A0,
 'bBk/B': BKB/beam,
 'lBk/LPP': BKL/beam,
 'OMEGA_hat': omega_hat}
ship_limits = pd.Series(ship_limits,name='ship')
```

```python
df_limits['ship'] = ship_limits
```

```python
df_limits_clean = df_limits.copy()
if df_limits.loc['bBk/B','ship']==0:
    df_limits_clean.drop('bBk/B', inplace=True)

if df_limits.loc['lBk/LPP','ship']==0:
    df_limits_clean.drop('lBk/LPP', inplace=True)
```

```python
fig,ax=plt.subplots()
ax.errorbar(df_limits_clean.index,df_limits_clean['ship'],yerr=[df_limits_clean['ship']-df_limits_clean['min'],df_limits_clean['max']-df_limits_clean['ship']],
            fmt='ok', lw=1, ecolor='gray', capsize=20)
ax.set_title('Ship vs. SI limits')
```

```python
df_ = df_limits_clean.sub(df_limits['min'],axis=0)
df_limits_normalized = df_.div(df_['max'], axis=0)
```

```python
fig,ax=plt.subplots()
ax.errorbar(df_limits_normalized.index,df_limits_normalized['ship'],yerr=[df_limits_normalized['ship']-df_limits_normalized['min'],
                                                                         df_limits_normalized['max']-df_limits_normalized['ship']], fmt='ok', lw=1, ecolor='gray', capsize=20)
ax.set_title('Ship vs. SI limits')
ax.set_ylabel('Norlimized limit')
```