(*   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."

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."

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

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."

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."

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."

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."

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."

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."

etiquetteVert::usage=
	"Option pour les procédures graphiques. Par exemple, etiquetteVert->\"PROBABILITE\" remplace l'étiquette verticale par défaut par l'étiquette donnée."

Options[diagrammeBatons]={etiquetteVert->"FREQUENCE"}

Options[diagrammeCumulatif]={etiquetteVert->"FREQUENCE CUMULEE"}

Options[frequenceCumuleeContinue]={etiquetteVert->"FREQUENCE CUMULEE"}

Options[histogramme]={etiquetteVert->"DENSITE"}

Options[polygoneDeDensite]={etiquetteVert->"DENSITE"}

Options[frequenceCumuleeLissee]={etiquetteVert->"FREQUENCE CUMULEE"}

Begin["`Private`"]

(* Initialisations *)

SetOptions[Graphics,BaseStyle->{FontSize->9},ImageSize->{500,300}];

sommesCumulees[f_List]:=Table[Apply[Plus,Take[f,j]],{j,1,Length[f]}]

(* Distributions discrètes *)

baton[{v_,p_}]:={{PointSize[0.005],Point[{v,p}]},{Thickness[0.004],Line[{{v,p},{v,0}}]}};

diagrammeBatons[v_List,f_List,opts___Rule]:=Module[{x0,xt},x0=First[v]+(Last[v]-First[v])((-1)/7);xt=First[v]+(Last[v]-First[v])(8/7);Graphics[{Map[baton,Transpose[{v,f}]],Text[etiquetteVert/.{opts}/.Options[diagrammeBatons],{xt,0},{0,-1},{0,1}]},PlotRange->All,Axes->True,AxesOrigin->{x0,0},Ticks->{v,Automatic}]]

marche[a_,b_,h_]:={{PointSize[0.007],Point[{a,h}]},{Thickness[0.002],Line[{{a,h},{b,h}}]}}

diagrammeCumulatif[v_List,f_List,opts___Rule]:=Module[{fc,x0,xt},x0=First[v]+(Last[v]-First[v])((-1)/7);xt=First[v]+(Last[v]-First[v])(8/7);fc=sommesCumulees[f];Graphics[{{Thickness[0.002],Line[{{x0,0},{First[v],0}}]},Table[marche[v[[i]],v[[i+1]],fc[[i]]],{i,1,Length[fc]-1}],marche[Last[v],xt,1],Text[etiquetteVert/.{opts}/.Options[diagrammeCumulatif],{xt,0.5},{0,0},{0,1}]},PlotRange->All,Axes->True,AxesOrigin->{x0,0},Ticks->{v,Automatic}]]

(* 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[u_List,f_List,opts___Rule]:=Module[{fc,x0,xt},x0=First[u]+(Last[u]-First[u])((-1)/7);xt=First[u]+(Last[u]-First[u])(8/7);fc=sommesCumulees[f];Graphics[{{PointSize[0.005],Map[Point,Transpose[{u,Prepend[fc,0]}]]},{Thickness[0.002],Line[Join[{{x0,0}},Transpose[{u,Prepend[fc,0]}],{{xt,1}}]]},Text[etiquetteVert/.{opts}/.Options[frequenceCumuleeContinue],{xt,0.5},{0,0},{0,1}]},PlotRange->All,Axes->True,AxesOrigin->{x0,0},Ticks->{u,Automatic}]]

rect[a_,b_,h_]:={{GrayLevel[0.9],Rectangle[{a,0},{b,h}]},{Thickness[0.002],Line[{{a,0},{a,h},{b,h},{b,0},{a,0}}]}}

histogramme[u_List,f_List,opts___Rule]:=Module[{d,x0,xt},x0=First[u]+(Last[u]-First[u])((-1)/7);xt=First[u]+(Last[u]-First[u])(8/7);d=f/amplitudes[u];Graphics[{Table[rect[u[[j]],u[[j+1]],d[[j]]],{j,1,Length[f]}],Text[etiquetteVert/.{opts}/.Options[histogramme],{xt,0},{0,-1},{0,1}]},PlotRange->All,Axes->True,AxesOrigin->{x0,0},Ticks->{u,Automatic}]]

polygoneDeDensite[u_List,f_List,opts___Rule]:=Module[{w,d,x0,xt},x0=First[u]+(Last[u]-First[u])((-1.5)/7);xt=First[u]+(Last[u]-First[u])(8.5/7);w=noeudsPolygonaux[u];d=f/amplitudes[u];Graphics[{{PointSize[0.005],Map[Point,Transpose[{w,Append[Prepend[d,0],0]}]]},{Thickness[0.002],Line[Join[{{x0,0}},Transpose[{w,Append[Prepend[d,0],0]}],{{xt,0}}]]},Text[etiquetteVert/.{opts}/.Options[polygoneDeDensite],{xt,0},{0,-1},{0,1}]},PlotRange->All,Axes->True,AxesOrigin->{x0,0},Ticks->{w,Automatic}]]

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

frequence[u_List,f_List,x_]:=0/;(x<First[u])∨(Last[u]≤x);
frequence[u_List,f_List,x_]:=f[[indice[u,x]]]

interpol[x_List,y_List,t_]:=Module[{j},j=indice[x,t];y[[j]]+(y[[j+1]]-y[[j]])/(x[[j+1]]-x[[j]])(t-x[[j]])]

distributionContinue[u_List,f_List,x_]:=0/;x<First[u]
distributionContinue[u_List,f_List,x_]:=1/;Last[u]≤x;
distributionContinue[u_List,f_List,x_]:=interpol[u,Prepend[sommesCumulees[f],0],x]

fctDensite[u_List,f_List,x_]:=0/;(x<First[u])∨(Last[u]≤x);
fctDensite[u_List,f_List,x_]:=Module[{j},j=indice[u,x];f[[j]]/amplitudes[u][[j]]]

densiteContinue[u_List,f_List,x_]:=Module[{w},w=noeudsPolygonaux[u];If[x<First[w]∨Last[w]≤x,0,interpol[w,Append[Prepend[densites[u,f],0],0],x]]]

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[u_List,f_List,opts___Rule]:=Module[{w,x0,xt},x0=First[u]+(Last[u]-First[u])((-1.5)/7);xt=First[u]+(Last[u]-First[u])(8.5/7);w=noeudsPolygonaux[u];Graphics[{First[Plot[distributionLissee[u,f,x],{x,x0,xt},PlotStyle->{Thickness[0.002]},DisplayFunction->Identity]],Text[etiquetteVert/.{opts}/.Options[frequenceCumuleeLissee],{xt,0.5},{0,0},{0,1}]},PlotRange->All,Axes->True,AxesOrigin->{x0,0},Ticks->{w,Automatic}]]

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]]

End[]

EndPackage[]