% proflycee-tools-stats.tex
% Copyright 2023  Cédric Pierquet
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license or (at your option) any later version.
% The latest version of this license is in
%   http://www.latex-project.org/lppl.txt
% and version 1.3 or later is part of all distributions of LaTeX
% version 2005/12/01 or later.

%%------RegressionLinéaire
%calcul des paramètres
\defKV[coeffreglin]{%
	NomCoeffa=\def\RegLinCoeffa{#1},%
	NomCoeffb=\def\RegLinCoeffb{#1},%
	NomCoeffr=\def\RegLinCoeffr{#1},%
	NomCoeffrd=\def\RegLinCoeffrd{#1},%
	NomXmin=\def\RegLinCoeffXmin{#1},%
	NomXmax=\def\RegLinCoeffXmax{#1}
}

\setKVdefault[coeffreglin]{%
	NomCoeffa=COEFFa,%
	NomCoeffb=COEFFb,%
	NomCoeffr=COEFFr,%
	NomCoeffrd=COEFFrd,%
	NomXmin=LXmin,%
	NomXmax=LXmax
}

\newcommand\CalculsRegLin[3][]{%
	\useKVdefault[coeffreglin]%
	\setKV[coeffreglin]{#1}% on paramètres les nouvelles clés et on les simplifie
	%xmin et xmax
	\expandafter\def\csname\RegLinCoeffXmin\endcsname{\fpeval{min(#2)}}
	\expandafter\def\csname\RegLinCoeffXmax\endcsname{\fpeval{max(#2)}}
	%listes des données
	\def\xliste{#2}
	\def\yliste{#3}
	\readlist*\LX{\xliste}
	\readlist*\LY{\yliste}
	%taille des listes
	\def\LNB{\inteval{\LXlen}}
	%somme des LX et des LY OK
	\xdef\LXSomme{0}
	\xdef\LYSomme{0}
	\foreach \i in {1,2,...,\LNB}{
		\xdef\LXSomme{\fpeval{\LXSomme+\LX[\i]}}
	}
	\foreach \i in {1,2,...,\LNB}{
		\xdef\LYSomme{\fpeval{\LYSomme+\LY[\i]}}
	}
	%moyenne des LX et des LY OK
	\xdef\LXmoy{\fpeval{\LXSomme/\LNB}}
	\xdef\LYmoy{\fpeval{\LYSomme/\LNB}}
	%variance des LX et des LY OK
	\xdef\LXvar{0}
	\foreach \i in {1,2,...,\LNB}{
		\xdef\LXvar{\fpeval{\LXvar+(\LX[\i]-\LXmoy)*(\LX[\i]-\LXmoy)}}
	}
	\xdef\LXvar{\fpeval{\LXvar/\LNB}}
	\xdef\LYvar{0}
	\foreach \i in {1,2,...,\LNB}{
		\xdef\LYvar{\fpeval{\LYvar+(\LY[\i]-\LYmoy)*(\LY[\i]-\LYmoy)}}
	}
	\xdef\LYvar{\fpeval{\LYvar/\LNB}}
	%covariance des XY OK
	\xdef\LXYvar{0}
	\foreach \i in {1,2,...,\LNB}{
		\xdef\LXYvar{\fpeval{\LXYvar+(\LX[\i]-\LXmoy)*(\LY[\i]-\LYmoy)}}
	}
	\xdef\LXYvar{\fpeval{\LXYvar/\LNB}}
	%COEFFS OK
	\expandafter\def\csname\RegLinCoeffa\endcsname{\fpeval{\LXYvar/\LXvar}}
	\expandafter\def\csname\RegLinCoeffb\endcsname{\fpeval{\LYmoy-\csname\RegLinCoeffa\endcsname*\LXmoy}}
	\expandafter\def\csname\RegLinCoeffr\endcsname{\fpeval{\LXYvar/sqrt(\LXvar*\LYvar)}}
	\expandafter\def\csname\RegLinCoeffrd\endcsname{\fpeval{\csname\RegLinCoeffr\endcsname*\csname\RegLinCoeffr\endcsname}}
}

%pour un nuage en TiKz
\defKV[nuagereglin]{%
	Couleur=\def\RegLinNuageCouleur{#1},%
	Taille=\def\RegLinNuageTaille{#1},
	Ox=\def\RegLinNuageOx{#1},%
	Oy=\def\RegLinNuageOy{#1},%
}

\setKVdefault[nuagereglin]{%
	Couleur=teal,%
	Taille=2pt,%
	Ox=0,%
	Oy=0
}

\newcommand\PointsRegLin[3][]{%
	\useKVdefault[nuagereglin]
	\setKV[nuagereglin]{#1}% on paramètres les nouvelles clés et on les simplifie
	\def\xliste{#2}
	\def\yliste{#3}
	\readlist*\LX{\xliste}
	\readlist*\LY{\yliste}
	%taille des listes
	\def\LNB{\inteval{\LXlen}}
	\foreach \i in {1,2,...,\LNB} {\filldraw[\RegLinNuageCouleur] ({\LX[\i]-\RegLinNuageOx},{\LY[\i]-\RegLinNuageOy}) circle[radius=\RegLinNuageTaille] ;}
}

\NewDocumentEnvironment{StatsTikz}{ O{} }
{%
	\begin{tikzpicture}[#1]
	}%
	{%
	\end{tikzpicture}%
}

%%------BOITES MOUSTACHES
\defKV[boiteamoustaches]{%
	Couleur=\def\BaMCouleur{#1},%
	Elevation=\def\BaMElevation{#1},%
	Hauteur=\def\BaMHauteur{#1},%
	Moyenne=\def\BaMMoyenne{#1},%
	Epaisseur=\def\BaMEpaisseur{#1},%
	Remplir=\def\BaMRemplissage{#1}
}

\setKVdefault[boiteamoustaches]{%
	Couleur=black,%
	Elevation=1,%
	Hauteur=1,%
	AffMoyenne=false,%
	Epaisseur=thick,%
	Pointilles=false,%
	Valeurs=false,%
	Remplir=white
}

\defKV[boiteamoustachesaxe]{%
	Min=\def\BaMAxeMin{#1},%
	Max=\def\BaMAxeMax{#1},%
	Elargir=\def\BaMAxeElarg{#1},%
	Epaisseur=\def\BaMAxeEpaisseur{#1},%
	Valeurs=\def\BaMAxeValeurs{#1}
}

\setKVdefault[boiteamoustachesaxe]{%
	Elargir=0.05,%
	Epaisseur=thick,%
	AffValeurs=false
}

\newcommand\BoiteMoustachesAxe[1][]{
	\useKVdefault[boiteamoustachesaxe]
	\setKV[boiteamoustachesaxe]{#1}
	\def\BaMaxelargeur{\fpeval{\BaMAxeMax-\BaMAxeMin}}
	\def\BaMaxexmin{\fpeval{\BaMAxeMin-\BaMAxeElarg*\BaMaxelargeur}}
	\def\BaMaxexmax{\fpeval{\BaMAxeMax+\BaMAxeElarg*\BaMaxelargeur}}
	\draw[\BaMAxeEpaisseur,->,>=latex] (\BaMaxexmin,0) -- (\BaMaxexmax,0) ;
	\ifboolKV[boiteamoustachesaxe]{AffValeurs}
		{\foreach \x in \BaMAxeValeurs \draw[\BaMAxeEpaisseur] (\x,3pt)--(\x,-3pt) node[below=3pt] {\num{\x}} ;}
		{}
}

\newcommand\BoiteMoustaches[2][]{
	\useKVdefault[boiteamoustaches]
	\setKV[boiteamoustaches]{#1}
	\setsepchar[.]{/}%
	\readlist*\BaMListeparams{#2}%
	\itemtomacro\BaMListeparams[1]\BaMmin%
	\itemtomacro\BaMListeparams[2]\BaMqu%
	\itemtomacro\BaMListeparams[3]\BaMmed%
	\itemtomacro\BaMListeparams[4]\BaMqt%
	\itemtomacro\BaMListeparams[5]\BaMmax%
	\draw[draw,\BaMEpaisseur,\BaMCouleur,fill=\BaMRemplissage] ({\BaMqu},{\BaMElevation-0.5*\BaMHauteur}) rectangle ({\BaMqt},{\BaMElevation+0.5*\BaMHauteur}) ;
	\draw[\BaMEpaisseur,\BaMCouleur] (\BaMmin,{\BaMElevation-0.5*\BaMHauteur})--(\BaMmin,{\BaMElevation+0.5*\BaMHauteur}) (\BaMmax,{\BaMElevation-0.5*\BaMHauteur})--(\BaMmax,{\BaMElevation+0.5*\BaMHauteur}) (\BaMmed,{\BaMElevation-0.5*\BaMHauteur})--(\BaMmed,{\BaMElevation+0.5*\BaMHauteur});
	\draw[\BaMEpaisseur,\BaMCouleur] ({\BaMmin},{\BaMElevation})--({\BaMqu},{\BaMElevation}) ({\BaMqt},{\BaMElevation})--({\BaMmax},{\BaMElevation}) ;
	\ifboolKV[boiteamoustaches]{AffMoyenne}
		{\filldraw[\BaMCouleur] ({\BaMMoyenne},{\BaMElevation}) circle[radius=2.5pt] ;}
		{}
	\ifboolKV[boiteamoustaches]{Pointilles}
		{
			\draw[\BaMEpaisseur,densely dashed] (\BaMmin,{\BaMElevation-0.5*\BaMHauteur}) -- (\BaMmin,0) ;
			\draw[\BaMEpaisseur,densely dashed] (\BaMqu,{\BaMElevation-0.5*\BaMHauteur}) -- (\BaMqu,0) ;
			\draw[\BaMEpaisseur,densely dashed] (\BaMmed,{\BaMElevation-0.5*\BaMHauteur}) -- (\BaMmed,0) ;
			\draw[\BaMEpaisseur,densely dashed] (\BaMqt,{\BaMElevation-0.5*\BaMHauteur}) -- (\BaMqt,0) ;
			\draw[\BaMEpaisseur,densely dashed] (\BaMmax,{\BaMElevation-0.5*\BaMHauteur}) -- (\BaMmax,0) ;
		}
		{}
	\ifboolKV[boiteamoustaches]{Valeurs}
		{
			\filldraw (\BaMmin,0) circle[radius=2pt] node[below=4pt] {\num{\BaMmin}} ;
			\filldraw (\BaMqu,0) circle[radius=2pt] node[below=4pt] {\num{\BaMqu}} ;
			\filldraw (\BaMmed,0) circle[radius=2pt] node[below=4pt] {\num{\BaMmed}} ;
			\filldraw (\BaMqt,0) circle[radius=2pt] node[below=4pt] {\num{\BaMqt}} ;
			\filldraw (\BaMmax,0) circle[radius=2pt] node[below=4pt] {\num{\BaMmax}} ;
		}
		{}
}

\endinput