(*   par Marcel Délèze   *)

BeginPackage["Statistique`"]

diagrammeBatons::usage=
	"diagrammeBatons[c_List, f_List] graphique des fréquences sous la forme de bâtons\nc est la liste des valeurs de la variable discrète\nf est la liste des fréquences correspondantes.\nOn peut rajouter une ou plusieurs options graphiques: diagrammeBatons[c_List, f_List, opt_]."

diagrammeCumulatif::usage=
	"diagrammeCumulatif[c_List, f_List] graphique des fréquences cumulées sous la forme d'un escalier\nc est la liste des valeurs de la variable discrète\nf est la liste des fréquences correspondantes, non cumulées.\nOn peut rajouter une ou plusieurs options graphiques: diagrammeCumulatif[c_List, f_List, opt]."

fctFrequenceCumulee::usage=
	"fctFrequenceCumulee[b_List, f_List, x_] valeur en x de la fonction fréquence cumulée\nb est la liste des bornes des classes de la variable discrète\nf est la liste des fréquences correspondantes."

amplitudes::usage=
	"amplitudes[b_List] liste des amplitudes des classes\nb est la liste des bornes des classes."

sommesCumulees::usage=
	"sommesCumulees[f_List] produit la liste des sommes cumulées de f\nqui débute par 0."

densites::usage=
	"densites[b_List,f_List] liste des densités de chaque classe\nb est la liste des bornes des classes de la variable continue\nf est la liste des fréquences des classes."

fctDensite::usage=
	"fctDensite[b_List, f_List, x_] valeur en x de la fonction densité (histogramme)\nb est la liste des bornes des classes de la variable continue\nf est la liste des fréquences correspondantes."

noeudsPolygonaux::usage=
	"noeudsPolygonaux[u_List] liste des abscisses du polygone de densité."

frequenceCumuleeContinue::usage=
	"frequenceCumuleeContinue[b_List, f_List] graphique des fréquences cumulées sous la forme d'une ligne polygonale\nb est la liste des bornes des classes de la variable continue\nf est la liste des fréquences correspondantes, non cumulées.\nOn peut rajouter une ou plusieurs options graphiques: frequenceCumuleeContinue[b_List, f_List, opt]."

histogramme::usage=
	"histogramme[b_List, f_List] graphique de la densité la forme de rectangles\nb est la liste des bornes des classes de la variable continue\nf est la liste des fréquences correspondantes.\nOn peut rajouter une ou plusieurs options graphiques: histogramme[b_List, f_List, opt]."

polygoneDeDensite::usage=
	"polygoneDeDensite[b_List, f_List] graphique de la densité la forme d'une ligne polygonale\nb est la liste des bornes des classes de la variable continue\nf est la liste des fréquences correspondantes.\nOn peut rajouter une ou plusieurs options graphiques: polygoneDeDensite[b_List, f_List, opt]."

densiteContinue::usage=
	"densiteContinue[b_List, f_List, x_] valeur en x de la fonction densité (polygone de densité)\nb est la liste des bornes des classes de la variable continue\nf est la liste des fréquences correspondantes."

distributionContinue::usage=
	"distributionContinue[b_List, f_List, x_] valeur en x de la fonction fréquence cumulée (interpolation linéaire)\nb est la liste des bornes des classes de la variable continue\nf est la liste des fréquences correspondantes, non cumulées."

frequenceCumuleeLissee::usage=
	"frequenceCumuleeLissee[b_List,f_List] graphique des fréquences cumulées sous la forme d'une ligne polygonale\nb est la liste des bornes des classes de la variable continue\nf est la liste des fréquences correspondantes, non cumulées.\nOn peut rajouter une ou plusieurs options graphiques: frequenceCumuleeLissee[b_List, f_List, opt]."

distributionLissee::usage="distributionLissee[b_List, f_List, x_] valeur en x de la fonction fréquence cumulée lissée (du 2-ème degré par morceaux)\nb est la liste des bornes des classes de la variable continue\nf est la liste des fréquences correspondantes, non cumulées."

quantileC::usage=
	"quantileC[b_List, f_List, q_] quantile en q via les fréquences cumulées continues (interpolation linéaire)\nb est la liste des bornes des classes de la variable continue\nf est la liste des fréquences non cumulées."

quantileLisse::usage=
	"quantileC[b_List, f_List, q_] quantile en q via les fréquences cumulées lissées (polygone de densité)\nb est la liste des bornes des classes de la variable continue\nf est la liste des fréquences non cumulées."

StandardDeviationMLE::usage=
	"StandardDeviationMLE[data_] calcule l'écart-type de données brutes (échantillon)."

VarianceMLE::usage=
	"VarianceMLE[data_] calcule la variance de données brutes (échantillon)."

InterpolatedQuantile::usage=
	"InterpolatedQuantile[data_List, q_] calcule le quantile interpolé linéairement."

Begin["`Private`"]

(* Initialisations *)

Needs["BarCharts`"]

sommesCumulees[f_List]:=Prepend[Accumulate[f],0]

fctConst[x_List, y_List,t_]:=Module[{i},
Piecewise[Table[{y[[i]], x[[i]]≤t<x[[i+1]]},{i,1,Length[y]}],0]]

fctConst01[x_List, y_List,t_]:=Module[{i},
Piecewise[Prepend[Table[{y[[i]], x[[i]]≤t<x[[i+1]]},{i,1,Length[x]-1}], {0, t<x[[1]]}],1]]

fctLin[x_List, y_List,t_]:=Module[{i},
Piecewise[Table[{y[[i]]+((t-x[[i]])/(x[[i+1]]-x[[i]]))(y[[i+1]]-y[[i]]), x[[i]]≤t<x[[i+1]]},{i,1,Length[x]-1}],0]]

fctLin01[x_List, y_List,t_]:=Module[{i},
Piecewise[Prepend[Table[{y[[i]]+((t-x[[i]])/(x[[i+1]]-x[[i]]))(y[[i+1]]-y[[i]]), x[[i]]≤t<x[[i+1]]},{i,1,Length[x]-1}], {0, t<x[[1]]}],1]]

(* Distributions discrètes *)

diagrammeBatons[c_List, f_List,opt__:{}]:=Module[{h, largBar,c0,entree},h=((Max[c]-Min[c])/80);
largBar=Table[h,{Length[c]}];
c0=(8/7)Min[c]-(1/7)Max[c];
entree=Transpose[{c,f,largBar}];
GeneralizedBarChart[entree,opt, BarStyle->Black, AxesOrigin->{c0,0},AspectRatio->0.6,ImageSize->{400,240}]]

fctFrequenceCumulee[c_List,f_List, t_]:=fctConst01[c,Accumulate[f],t]

diagrammeCumulatif[c_List,f_List, opt__:{}]:=Module[{v,fc,i},
v[0]:=(8/7)Min[c]-(1/7)Max[c];
Do[v[i_]:=c[[i]],{i,1,Length[c]}];
v[Length[c]+1]:=(8/7)Max[c]-(1/7)Min[c];
fc[0]=0;
Do[fc[i_]:=Accumulate[f][[i]],{i,1,Length[f]}];
Graphics[{AbsoluteThickness[2],Table[Line[{{v[i],fc[i]},{v[i+1],fc[i]}}],{i,0,Length[c]}],AbsolutePointSize[5],Table[Point[{v[i],fc[i]}],{i,1,Length[c]}]},opt, AspectRatio->0.6, Axes->True, AxesOrigin->{v[0],0}, ImageSize->{400,240}]]

(* Distributions continues *)

amplitudes[u_List]:=Drop[u,1]-Drop[u,-1]

densites[u_List,f_List]:=f/amplitudes[u]

noeudsPolygonaux[u_List]:=Module[{c,k},k=Length[u];c=u[[3]]-u[[2]];Join[{2*u[[1]]-u[[2]]+c/2,u[[2]]-c/2},(Take[u,{3,-2}]+Take[u,{2, -3}])/2,{u[[k-1]]+c/2,2*u[[k]]-u[[k-1]]-c/2}]]

frequenceCumuleeContinue[b_List,f_List, opt__:{}]:=Module[{b0, bm, entree},
b0=(8/7)Min[b]-(1/7)Max[b];
bm=(8/7)Max[b]-(1/7)Min[b];
entree=Append[Transpose[{b,sommesCumulees[f]}],{bm,1}];
ListLinePlot[entree,opt, AxesOrigin->{b0,0},PlotStyle->Black,AspectRatio->0.6,  ImageSize->{400,240}]]

histogramme[b_List,f_List, opt__:{}]:=Module[{centres, ampl, entree},
centres=(1/2)(Drop[b,1]+Drop[b,-1]);
ampl=Drop[b,1]-Drop[b,-1];
entree=Transpose[{centres,f/ampl,ampl}];
GeneralizedBarChart[entree,opt, BarStyle->GrayLevel[0.85] ,AspectRatio->0.6,  ImageSize->{400,240}]]

polygoneDeDensite[b_List, f_List, opt__:{}]:= Module[{b0, bm,x},b0=First[noeudsPolygonaux[b]];
bm=Last[noeudsPolygonaux[b]];entree=Transpose[{noeudsPolygonaux[b],Join[{0},densites[b,f],{0}]}];
ListLinePlot[entree,opt,AxesOrigin->{b0,0},PlotStyle->Black,  AspectRatio->0.6,ImageSize->{400,240}]]

fctDensite[u_List,f_List,t_]:=fctConst[u,densites[u,f],t]

densiteContinue[u_List,f_List, t_]:=fctLin[noeudsPolygonaux[u], Join[{0},densites[u,f],{0}], t]

indice[u_List,x_]:=Module[{j},k=Length[u];j=1;While[(j≤k)∧(x≥u[[j]]),j++];j-1]

distributionContinue[b_List, f_List,t_]:=fctLin01[b,sommesCumulees[f],t]

distributionLissee[u_List,f_List,x_]:=Module[{w,j},w=noeudsPolygonaux[u];j=indice[w,x];Which[x<First[w],0,Last[w]≤x,1,True,distributionContinue[u,f,w[[j]]]+(x-w[[j]])(densiteContinue[u,f,x]+densiteContinue[u,f,w[[j]]])/2]]

frequenceCumuleeLissee[b_List, f_List, opt__:{}]:= Module[{b0, bm,x},b0=(8/7)Min[b]-(1/7)Max[b];
bm=(8/7)Max[b]-(1/7)Min[b];
Plot[distributionLissee[b,f,x], {x,b0,bm},opt,PlotPoints->100,AxesOrigin->{b0,0},PlotStyle->Black,  ImageSize->{400,240}]]

quantileC[b_List,f_List,q_]:=Module[{i},i=1;
While[(distributionContinue[b,f,b[[i]]]-q) (distributionContinue[b,f,b[[i+1]]]-q)>0,
i=i+1];
b[[i]]+(1/(f[[i]]))((q-distributionContinue[b,f,b[[i]]])amplitudes[b][[i]])]

quantileLisse[b_List,f_List,q_]:=Module[{r,s,m},
r=First[b]; s=Last[b];
While[N[r]<N[s],
m=((r+s)/2);
If[distributionLissee[b,f,m]≤q,r=m,s=m]
];N[r]]

StandardDeviationMLE[data_]:=StandardDeviation[data]Sqrt[(Length[data]-1)/Length[data]]

VarianceMLE[data_]:=Variance[data](Length[data]-1)/Length[data]

InterpolatedQuantile[data_List,q_]:=Quantile[data, q, {{(1/2),0},{0,1}}]

End[]

EndPackage[]