In [26]:

```
import scipy as sp
from scipy import stats
import matplotlib as mpl # As of July 2017 Bucknell computers use v. 2.x
import matplotlib.pyplot as plt
# Following is an Ipython magic command that puts figures in the notebook.
# For figures in separate windows, comment out following line and uncomment
# the next line
# Must come before defaults are changed.
%matplotlib notebook
#%matplotlib
# As of Aug. 2017 reverting to 1.x defaults.
# In 2.x text.ustex requires dvipng, texlive-latex-extra, and texlive-fonts-recommended,
# which don't seem to be universal
# See https://stackoverflow.com/questions/38906356/error-running-matplotlib-in-latex-type1cm?
mpl.style.use('classic')
# M.L. modifications of matplotlib defaults using syntax of v.2.0
# More info at http://matplotlib.org/2.0.0/users/deflt_style_changes.html
# Changes can also be put in matplotlibrc file, or effected using mpl.rcParams[]
plt.rc('figure', figsize = (6, 4.5)) # Reduces overall size of figures
plt.rc('axes', labelsize=16, titlesize=14)
plt.rc('figure', autolayout = True) # Adjusts supblot parameters for new size
```

Twelve data points given. Enter them into a `scipy`

array:

In [15]:

```
data = sp.array([5.33, 4.95, 4.93, 5.08, 4.95, 4.96, 5.02, 4.99, 5.24, 5.25, 5.23, 5.01])
```

In [16]:

```
print('mean = ', sum(data)/len(data))
```

OR

In [17]:

```
print('mean = ', sp.mean(data))
```

In [18]:

```
print("standard deviation = ",sp.sqrt(sum((data-sp.mean(data))**2)/(len(data)-1)))
```

OR

In [19]:

```
print("standard deviation = ",sp.std(data))
```

These results do not agree!!

By default the scipy std method calculates $\sigma_N$, which is similar to the $\sigma_{N−1}$ given in Eq.(2.3) of H&H, except the denominator is $N$ instead of $N−1$.
The difference doesn't usually matter, and we won't go into this in any depth now. But if we set the `ddof=1`

option, `scipy`

will calculate $\sigma_{N−1}$.

Remember: you can see all the details of `sp.std`

by typing `sp.std?`

.

In [20]:

```
print("standard deviation = ",sp.std(data, ddof=1))
```

Use Eq.(2.7): $$\quad \alpha = \frac{\sigma_{N-1}}{\sqrt{N}}. $$

In [21]:

```
print("standard error =",sp.std(data,ddof=1)/sp.sqrt(len(data)))
```

Sensitivity = $5.08 \pm 0.04\, \mbox{A/W}$

The standard error, or standard deviation of the mean, is given by Eq.(2.7):

$$ \alpha = \frac{\sigma_{N-1}}{\sqrt{N}}. $$To decrease $\alpha$ by a factor of 10, the denominator must be increased by the same factor, which means that $N$ must increase by a factor of 100. Translating to the described experiment, this means that data should be collected for 100 minutes (assuming that everything in the experiment is stable for that length of time).

The probabilities in this problem can be evaluated with the cumulative distribution function, or $C_{DF}$, of a normal distribution. (This $C_{DF}$ also has the name $\mbox{Erf}(x)$.)
I will use the $C_{DF}$ in the `scipy.stats`

module.

In [22]:

```
mean = 502
sigma = 14
```

In [23]:

```
sp.stats.norm.cdf(500, mean, sigma)
```

Out[23]:

In [24]:

```
1 - sp.stats.norm.cdf(530, mean, sigma)
```

Out[24]:

Data for pendulum swings:

- Standard deviation for any set of timing measurements $= 0.04\, \mbox{s}$
- Experiment A: 12 sets of 10 swings; average time for 10 swings $T_{10} = 28.39\, \mbox{s}$
- Experiment B: 1 set of 120 swings; time for 120 swings $T_{120} = 340.61\, \mbox{s}$

The standard error (standard deviation of the mean) for the time for 10 swings is $$ \alpha = \frac{\sigma}{\sqrt{N}} = \frac{0.04}{\sqrt{12}} $$ The time for one swing is the time for 10 swings divided by 10:

\begin{eqnarray*} T_{1} &=& \frac{T_{10}}{10}\\ &=& \frac{28.39 \pm \frac{0.04}{12}}{10}\\ &=& 2.839 \pm \frac{0.04}{10\sqrt{12}}\\ &=& 2.839 \pm 0.001155 \end{eqnarray*}The presentation form of this result is $$ T_1 = 2.839\pm 0.001\, \mbox{s}. $$

The standard error (standard deviation of the mean) for the time for 120 swings is $$ \alpha = \frac{\sigma}{\sqrt{N}} = \frac{0.04}{\sqrt{1}} $$ The time for one swing is the time for 120 swings divided by 120:

\begin{eqnarray*} T_{1} &=& \frac{T_{120}}{120}\\ &=& \frac{340.61 \pm \frac{0.04}{1}}{120}\\ &=& 2.838417 \pm \frac{0.04}{120\sqrt{1}}\\ &=& 2.838417 \pm 0.000333 \end{eqnarray*}The presentation form of this result is $$ T_1 = 2.8384\pm 0.0003\, \mbox{s}. $$

One method is to look for the median. There are 15 data points. The middle value is 4.19365, meaning 7 values are larger than this and 7 are smaller. The median can be a poor estimate for the mean if the distribution is very asymmetric, but these numbers go up to 4.5 and down to 3.9, so it looks like they are fairly well centered on 4.2.

Using H&H's "rough and ready" estimate (p. 11) for the standard deviation, we find that the max value minus the mean is about 0.3. Taking 2/3 of that gives a estimated standard deviation of 0.2.

Checking this:

In [25]:

```
data = sp.array([4.1075, 4.39831, 4.19365, 4.20259, 4.26921, 4.13037, 3.97548, 4.51314, 4.01286,
4.0101, 4.15578, 4.35153, 4.30801, 4.21082, 3.94315])
print("mean =", sp.mean(data))
print("standard deviation =", sp.std(data))
```

In [ ]:

```
```