import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as st

import pandas as pan



###################Exercice 5.1#########################

taille=[ 166, 170, 161, 167, 168, 169, 169,166, 163, 161, 162, 171, 169, 156, 168]

#1

#D'abord, la fonction st.sem renvoie sigma_n(x)/n^{1/2} comme illustré par les deux calculs suivants
st.sem(taille)
np.std(taille,ddof=1)/np.sqrt(len(taille))

#intervalle calculé directement 
st.t.interval(0.95,df=len(taille)-1,loc=np.mean(taille),scale=st.sem(taille))
#(163.38881498488192, 168.07785168178472)
#On arrondit en élargissant l'intervalle à [163.38, 168.08]


#2 
def StudentInterval(x,alpha=0.05):
    m=np.mean(x)
    s = np.std(x,ddof=1)
    l=len(x)
    delta = (st.t.ppf(1-alpha/2,df=l-1)*s) / np.sqrt(l)
    return (m-delta,m+delta)

#On retrouve la même valeur qu'avant:
StudentInterval(taille)

#Intervalle au niveau de confiance 90%
StudentInterval(taille,alpha=0.1)


###################Exercice 5.2#########################

df=pan.read_csv("http://math.univ-lyon1.fr/homes-www/dabrowski/nutriage.csv",sep="\t")

df=pan.read_csv("https://math.univ-lyon1.fr/~dabrowski/nutriage.csv",sep="\t")


#Don=pan.read_csv("http://math.univ-lyon1.fr/~dabrowski/Donnees.csv",sep="\t")
#Don=pan.read_csv("http://math.univ-lyon1.fr/homes-www/dabrowski/Donnees.csv",sep="\t")
for nom in df.keys():
    globals()[nom] = df[nom]
    
#1
t=df["taille"]
s=df["sexe"]
th=t[s=='H']
tf=t[s=='F']

th=taille[sexe=="H"]
tf=taille[sexe=="F"]

#petite vérification
pan.value_counts(sexe)
len(th)
len(tf)

#Il faut supposer que les échantillons suivent
# une loi normale


#2
st.ttest_1samp(tf,popmean=160.5)
#pvalue=0.0006045000059191302<0.01 donc on rejette
# l'hypothèse d'égalité à la moyenne française
# avec une extraordinaire présomption contre.
np.mean(tf)#158.80141843971631

#Si l'hypothèse alternative était H_1 \mu_h<163,9
st.ttest_1samp(tf,popmean=160.5,alternative="less")
#on obtiendrait  pvalue=0.0003022500029595651<0.01 donc la moyenne est a fortiori aussi significativement inférieure.
np.mean(tf)#158.80141843971631

#Option en Python 3.7 (où l'option alternative n'est pas disponible)
st.t.cdf(st.ttest_1samp(tf,popmean=160.5)[0],df=len(tf)-1)



#3

st.ttest_1samp(th,popmean=170,alternative="greater")
#pvalue=0.0003414672490581896<0.01 donc on rejette
# l'hypothèse d'égalité à la moyenne française
# avec une extraordinaire présomption contre. La moyenne de l'échantillon est significativement supérieure.
np.mean(th)#172.51764705882354

st.ttest_1samp(th,popmean=172.5,alternative="greater")

#p-valeur: 0.49016647508601974>0.1 donc on rejette
# l'hypothèse d'égalité à la moyenne française  des 20-30 ans de 1970,  
# sans présomption contre.
# La moyenne n'est pas significativement supérieure.



#Option en Python 3.7 (où l'option alternative n'est pas disponible)
1-st.t.cdf(st.ttest_1samp(th,popmean=172.5)[0],df=len(th)-1)

###################Exercice 5.3#########################

#1 pan.crosstab(the,cafe,normalize=True)


#cafe         0         1         2         3         4         5
#the                                                             
#0     0.115044  0.115044  0.283186  0.154867  0.026549  0.026549
#1     0.017699  0.022124  0.017699  0.000000  0.000000  0.000000
#2     0.061947  0.044248  0.013274  0.008850  0.000000  0.000000
#3     0.017699  0.013274  0.004425  0.000000  0.000000  0.000000
#4     0.013274  0.017699  0.004425  0.000000  0.000000  0.004425
#5     0.000000  0.004425  0.000000  0.000000  0.000000  0.000000
#6     0.004425  0.000000  0.000000  0.000000  0.000000  0.000000
#9     0.004425  0.000000  0.000000  0.000000  0.000000  0.000000
#10    0.000000  0.004425  0.000000  0.000000  0.000000  0.000000


#2
def RegroupeThe(x):
    if x==0: return("Zero")
#    elif x==1: return("Un")
    elif (x>0 and x<3 ): return("1 ou 2")
    else: return("Plus de 3")


#Pour ne pas se tromper on regarde l'ordre des classes
the2=the.apply(RegroupeThe)
#verification
pan.crosstab(the,the2)


def RegroupeCafe(x):
    if x<1: return("Zero")
#    elif x==1: return("Un")
#    elif (x>0 and x<3 ): return("1 ou 2")
    else: return("Plus de 1")


cafe2=cafe.apply(RegroupeCafe)

table=pan.crosstab(the2,cafe2,normalize=True)

#3
help(st.chi2_contingency)

st.chi2_contingency(table)
#(0.08107960854645972,
 #0.960270940863781,
 #2,
 #array([[0.1422586 , 0.04358211],
 #       [0.0711293 , 0.02179106],
 #       [0.55209883, 0.1691401 ]]))
 
# La p-valeur est p=0.960270940863781>0.1, on rejette l'hypothèse de dépendance, sans préseomption contre l'hypothèse d'indépendance.
#Il n'y a pas de dépendance significative entre consommation de thé et de café.
