# Height¶

Imports:

import numpy as np
import pioupiou as pp; pp.restart()


## Models¶

Sex as a symbol (♀ or ♂), for fun !

@pp.randomize
@np.vectorize
def sex_symbol(is_female):
if is_female:
return "♀"
else:
return "♂"


Proportion of females in the population:

proportion_female = 0.516
Is_female = pp.Bernoulli(proportion_female)
Sex_symbol = sex_symbol(Is_female)


Distribution of heights (sex-dependent):

mu_female = 161.7
sigma_female = (175.0 - 149.0) / (2 * 1.96)
Height_female = pp.Normal(mu_female, sigma_female**2)
mu_male = 174.4
sigma_male = (189.0 - 162.0) / (2 * 1.96)
Height_male = pp.Normal(mu_male, sigma_male**2)


Combined height:

Is_male = pp.logical_not(Is_female)
Height = Is_female * Height_female + Is_male * Height_male


## Simulation¶

Sexes:

>>> omega = pp.Omega(1000)
>>> Sex_symbol(omega) # doctest: +ELLIPSIS
array(['♂', '♀', '♀', '♀', '♂', '♂', '♂', '♂', '♂', '♂', '♂', '♀', ...)


Height (sex-dependent):

>>> Height_female(omega) # doctest: +NORMALIZE_WHITESPACE, +ELLIPSIS
array([146.93582968, 167.97025732, 161.63754187, 160.62997627, ...])
>>> Height_male(omega) # doctest: +NORMALIZE_WHITESPACE, +ELLIPSIS
array([188.17949253, 163.69348513, 183.98172232, 170.37550933, ...])


Combined height:

>>> height = Height(omega)
>>> height # doctest: +NORMALIZE_WHITESPACE, +ELLIPSIS
array([188.17949253, 167.97025732, 161.63754187, 160.62997627, ...])


## Visualization¶

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

df = pd.DataFrame({"Height [cm]": height})
_  = sns.displot(df, x="Height [cm]", stat="density", kde=True, aspect=16/9)
_ = plt.title("Height Distribution in France")