Calcular el valor medio en (La)TeX

Calcular el valor medio en (La)TeX

Tengo una lista de marcas incluidas en un .texdocumento, con el begin{filecontents*}comando.

Hasta ahora, dibujo un histograma de las frecuencias de las marcas.

Me gustaría agregar el valor medio.

¿Me puedes ayudar? Aquí está mi código hasta ahora,adaptado de esta respuesta

\documentclass[a4paper, landscape]{article}


\usepackage{filecontents}
\begin{filecontents*}{commadata.dat}
8,5
13,5
6,5
8,5
10
8
5,5
2,5
5,5
7
20
12
18,5
5,5
9,5
3,5
0
7
7
5,5
10
3,5
7
14,5
7
10,5
16,5
10,5
6,5
8
14
8,5
2,5
5
9,5
8
10
9,5
9
8,5
4,5
5,5
\end{filecontents*}


%%%%%%%%%%
% Layout %
%%%%%%%%%%
\def\myHMargin{0.85cm}
\def\myVMarginTop{7mm}
\def\myVMarginBottom{7mm}
\usepackage[hmargin={\myHMargin,\myHMargin},
            vmargin={\myVMarginTop,\myVMarginBottom},
            headsep=5mm,
            footskip=\dimexpr(\baselineskip+4mm),
            includefoot,
            includehead,
            twoside]{geometry}
\pagestyle{empty}

\usepackage{xstring}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{pgfplots}
\pgfplotsset{compat=1.14}
\newcommand*{\ReadOutElement}[4]{%
    \pgfplotstablegetelem{#2}{[index]#3}\of{#1}%
    \let#4\pgfplotsretval
}


%----------------------------------------------------------------------------
\begin{document}
%----------------------------------------------------------------------------



% grid style
\pgfplotsset{grid style={dotted,gray}}


\begin{center}

\fbox{Mean value : $\displaystyle\frac{\ ??? \ }{20}$}

 \begin{tikzpicture}
  \pgfplotstableread[/pgf/number format/read comma as period]{commadata.dat}\datatable
  \pgfplotstablegetrowsof{\datatable}
  \pgfmathtruncatemacro{\numrows}{\pgfplotsretval}
  \pgfplotstablegetcolsof{\datatable}
  \pgfmathtruncatemacro{\numcols}{\pgfplotsretval}

%  \edef\myxmax{0}%
%  \foreach \nY in {1,...,\numrows}
%  {\ReadOutElement{\datatable}{\the\numexpr\nY-1}{0}{\Current}%
%   \StrSubstitute{\Current}{,}{.}[\mytemp]
%   \pgfmathtruncatemacro{\myx}{\mytemp}
%   \pgfmathtruncatemacro{\myxmax}{max(\myxmax,\myx)}
%   \xdef\myxmax{\myxmax}
%  }

  \edef\myxmax{20}
  \foreach \X in {0,...,\myxmax}
  {\expandafter\xdef\csname mypile\X\endcsname{0}}
  \foreach \nY in {1,...,\numrows}
  {\ReadOutElement{\datatable}{\the\numexpr\nY-1}{0}{\Current}%
   \StrSubstitute{\Current}{,}{.}[\mytemp]
   \pgfmathtruncatemacro{\myx}{\mytemp}%
   \edef\currentval{\csname mypile\myx\endcsname}
   \pgfmathtruncatemacro{\mycur}{\currentval+1}
   \expandafter\xdef\csname mypile\myx\endcsname{\mycur}
  }

  \begin{axis}[ymajorgrids,
        ymin=0,% ymax=6.2,
        xmin=-1,
        %ytick={0,2,...,6},
        xtick={0,1,...,20},
        xticklabels={\small $0$-$1$, \small $1$-$2$, \small $2$-$3$, \small $3$-$4$, \small $4$-$5$, \small $5$-$6$, \small $6$-$7$, \small $7$-$8$, \small $8$-$9$, \small $9$-$10$, \small $10$-$11$, \small $11$-$12$, \small 
        $12$-$13$, \small $13$-$14$, \small $14$-$15$, \small $15$-$16$, \small $16$-$17$, \small $17$-$18$, \small $18$-$19$, \small $19$-$20$, \small $\geq 20$},
        minor y tick num = 0,
        %area style,
        width=28cm,
        height=10cm,
        axis lines*=left,
        %bar width=0.2cm,
        y axis line style = {->},
        x axis line style = {->},
        tick align      = outside,
        tick pos        = left
        ]
   \pgfplotsinvokeforeach{0,...,\myxmax}{%
   \edef\currentval{\csname mypile#1\endcsname}
   \pgfmathtruncatemacro{\mycur}{\currentval}
   \addplot[ybar, fill=black!20, draw=black!40, ycomb, line width=8mm, color=blue!50] coordinates {(#1,\mycur)};
   }    
  \end{axis}
 \end{tikzpicture}
\end{center}



\end{document}

ingrese la descripción de la imagen aquí

Respuesta1

¿Algo como esto?

\documentclass[a4paper, landscape]{article}


\usepackage{filecontents}
\begin{filecontents*}{commadata.dat}
8,5
13,5
6,5
8,5
10
8
5,5
2,5
5,5
7
20
12
18,5
5,5
9,5
3,5
0
7
7
5,5
10
3,5
7
14,5
7
10,5
16,5
10,5
6,5
8
14
8,5
2,5
5
9,5
8
10
9,5
9
8,5
4,5
5,5
\end{filecontents*}


%%%%%%%%%%
% Layout %
%%%%%%%%%%
\def\myHMargin{0.85cm}
\def\myVMarginTop{7mm}
\def\myVMarginBottom{7mm}
\usepackage[hmargin={\myHMargin,\myHMargin},
            vmargin={\myVMarginTop,\myVMarginBottom},
            headsep=5mm,
            footskip=\dimexpr(\baselineskip+4mm),
            includefoot,
            includehead,
            twoside]{geometry}
\pagestyle{empty}

\usepackage{xstring}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{pgfplots}
\pgfplotsset{compat=1.14}
\newcommand*{\ReadOutElement}[4]{%
    \pgfplotstablegetelem{#2}{[index]#3}\of{#1}%
    \let#4\pgfplotsretval
}


%----------------------------------------------------------------------------
\begin{document}
%----------------------------------------------------------------------------



% grid style
\pgfplotsset{grid style={dotted,gray}}


\begin{center}

%\fbox{Mean value : $\displaystyle\frac{\ ??? \ }{20}$}

 \begin{tikzpicture}
  \pgfplotstableread[/pgf/number format/read comma as period]{commadata.dat}\datatable
  \pgfplotstablegetrowsof{\datatable}
  \pgfmathtruncatemacro{\numrows}{\pgfplotsretval}
  \pgfplotstablegetcolsof{\datatable}
  \pgfmathtruncatemacro{\numcols}{\pgfplotsretval}

  \edef\myxmax{20}
  \foreach \X in {0,...,\myxmax}
  {\expandafter\xdef\csname mypile\X\endcsname{0}}
  \edef\Total{0}
  \foreach \nY in {1,...,\numrows}
  {\ReadOutElement{\datatable}{\the\numexpr\nY-1}{0}{\Current}%
   \StrSubstitute{\Current}{,}{.}[\mytemp]
   \pgfmathtruncatemacro{\myx}{\mytemp}%
   \pgfmathsetmacro{\Total}{\Total+\myx}
   \xdef\Total{\Total}
   \edef\currentval{\csname mypile\myx\endcsname}
   \pgfmathtruncatemacro{\mycur}{\currentval+1}
   \expandafter\xdef\csname mypile\myx\endcsname{\mycur}
  }
  \begin{axis}[ymajorgrids,
        ymin=0,% ymax=6.2,
        xmin=-1,
        %ytick={0,2,...,6},
        xtick={0,1,...,20},
        xticklabels={\small $0$-$1$, \small $1$-$2$, \small $2$-$3$, \small $3$-$4$, \small $4$-$5$, \small $5$-$6$, \small $6$-$7$, \small $7$-$8$, \small $8$-$9$, \small $9$-$10$, \small $10$-$11$, \small $11$-$12$, \small 
        $12$-$13$, \small $13$-$14$, \small $14$-$15$, \small $15$-$16$, \small $16$-$17$, \small $17$-$18$, \small $18$-$19$, \small $19$-$20$, \small $\geq 20$},
        minor y tick num = 0,
        %area style,
        width=28cm,
        height=10cm,
        axis lines*=left,
        %bar width=0.2cm,
        y axis line style = {->},
        x axis line style = {->},
        tick align      = outside,
        tick pos        = left,
        title={Mean value : $\pgfmathparse{\Total/\numrows}
        \displaystyle\frac{\Total}{\numrows}=\pgfmathprintnumber{\pgfmathresult}$},
        ]
   \pgfplotsinvokeforeach{0,...,\myxmax}{%
   \edef\currentval{\csname mypile#1\endcsname}
   \pgfmathtruncatemacro{\mycur}{\currentval}
   \addplot[ybar, fill=black!20, draw=black!40, ycomb, line width=8mm, color=blue!50] coordinates {(#1,\mycur)};
   }    
  \end{axis}
 \end{tikzpicture}
\end{center}
\end{document}

ingrese la descripción de la imagen aquí

O, si desea el número medio de ocupación,

\documentclass[a4paper, landscape]{article}


\usepackage{filecontents}
\begin{filecontents*}{commadata.dat}
8,5
13,5
6,5
8,5
10
8
5,5
2,5
5,5
7
20
12
18,5
5,5
9,5
3,5
0
7
7
5,5
10
3,5
7
14,5
7
10,5
16,5
10,5
6,5
8
14
8,5
2,5
5
9,5
8
10
9,5
9
8,5
4,5
5,5
\end{filecontents*}


%%%%%%%%%%
% Layout %
%%%%%%%%%%
\def\myHMargin{0.85cm}
\def\myVMarginTop{7mm}
\def\myVMarginBottom{7mm}
\usepackage[hmargin={\myHMargin,\myHMargin},
            vmargin={\myVMarginTop,\myVMarginBottom},
            headsep=5mm,
            footskip=\dimexpr(\baselineskip+4mm),
            includefoot,
            includehead,
            twoside]{geometry}
\pagestyle{empty}

\usepackage{xstring}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{pgfplots}
\pgfplotsset{compat=1.14}
\newcommand*{\ReadOutElement}[4]{%
    \pgfplotstablegetelem{#2}{[index]#3}\of{#1}%
    \let#4\pgfplotsretval
}


%----------------------------------------------------------------------------
\begin{document}
%----------------------------------------------------------------------------



% grid style
\pgfplotsset{grid style={dotted,gray}}


\begin{center}

%\fbox{Mean value : $\displaystyle\frac{\ ??? \ }{20}$}

 \begin{tikzpicture}
  \pgfplotstableread[/pgf/number format/read comma as period]{commadata.dat}\datatable
  \pgfplotstablegetrowsof{\datatable}
  \pgfmathtruncatemacro{\numrows}{\pgfplotsretval}
  \pgfplotstablegetcolsof{\datatable}
  \pgfmathtruncatemacro{\numcols}{\pgfplotsretval}

  \edef\myxmax{20}
  \foreach \X in {0,...,\myxmax}
  {\expandafter\xdef\csname mypile\X\endcsname{0}}
  \edef\Total{0}
  \foreach \nY in {1,...,\numrows}
  {\ReadOutElement{\datatable}{\the\numexpr\nY-1}{0}{\Current}%
   \StrSubstitute{\Current}{,}{.}[\mytemp]
   \pgfmathtruncatemacro{\myx}{\mytemp}%
   \pgfmathsetmacro{\Total}{\Total+\myx}
   \xdef\Total{\Total}
   \edef\currentval{\csname mypile\myx\endcsname}
   \pgfmathtruncatemacro{\mycur}{\currentval+1}
   \expandafter\xdef\csname mypile\myx\endcsname{\mycur}
  }
  \begin{axis}[ymajorgrids,
        ymin=0,% ymax=6.2,
        xmin=-1,xmax=21,
        %ytick={0,2,...,6},
        xtick={0,1,...,20},
        xticklabels={\small $0$-$1$, \small $1$-$2$, \small $2$-$3$, \small $3$-$4$, \small $4$-$5$, \small $5$-$6$, \small $6$-$7$, \small $7$-$8$, \small $8$-$9$, \small $9$-$10$, \small $10$-$11$, \small $11$-$12$, \small 
        $12$-$13$, \small $13$-$14$, \small $14$-$15$, \small $15$-$16$, \small $16$-$17$, \small $17$-$18$, \small $18$-$19$, \small $19$-$20$, \small $\geq 20$},
        minor y tick num = 0,
        %area style,
        width=28cm,
        height=10cm,
        axis lines*=left,
        %bar width=0.2cm,
        y axis line style = {->},
        x axis line style = {->},
        tick align      = outside,
        tick pos        = left,
%       title={Mean value : $\pgfmathparse{\Total/\numrows}
%       \displaystyle\frac{\Total}{\numrows}=\pgfmathprintnumber{\pgfmathresult}$},
        ]
   \pgfmathsetmacro{\Occ}{0}        
   \pgfplotsinvokeforeach{0,...,\myxmax}{%
   \edef\currentval{\csname mypile#1\endcsname}
   \pgfmathtruncatemacro{\mycur}{\currentval}
   \pgfmathtruncatemacro{\Occ}{\Occ+\currentval}
   \xdef\Occ{\Occ}
   \addplot[ybar, fill=black!20, draw=black!40, ycomb, line width=8mm, color=blue!50] coordinates {(#1,\mycur)};
   }    
  \end{axis}
  \node[draw,above] at (current axis.north) {Mean value :
      $\displaystyle\frac{\Occ}{20}$};
 \end{tikzpicture}
\end{center}
\end{document}

ingrese la descripción de la imagen aquí

Respuesta2

Yo lo haría diferente.

\begin{filecontents*}{\jobname.dat}
8,5
13,5
6,5
8,5
10
8
5,5
2,5
5,5
7
20
12
18,5
5,5
9,5
3,5
0
7
7
5,5
10
3,5
7
14,5
7
10,5
16,5
10,5
6,5
8
14
8,5
2,5
5
9,5
8
10
9,5
9
8,5
4,5
5,5
\end{filecontents*}

\documentclass[varwidth=40cm,border=4]{standalone}

\usepackage{xparse}

\usepackage{pgfplots}
\pgfplotsset{compat=1.14}
\pgfplotsset{grid style={dotted,gray}}

\ExplSyntaxOn

\NewDocumentCommand{\readmarks}{mm}
 {% #1 = file name, #2 = upper limit
  \colas_readmarks:nn { #1 } { #2 }
 }
\NewExpandableDocumentCommand{\getmarks}{m}
 {
  0\prop_item:Nn \l_colas_readmarks_prop { #1 }
 }
\NewExpandableDocumentCommand{\getaverage}{m}
 {
  \fp_eval:n
   {
    (0 \int_step_function:nN { #1 } \__colas_readmarks_add:n )/(#1)
   }
 }

\cs_new:Nn \__colas_readmarks_add:n
 {
  +0\prop_item:Nn \l_colas_readmarks_prop { #1 }
 }

\ior_new:N \g__colas_readmarks_stream
\prop_new:N \l_colas_readmarks_prop
\tl_new:N \l__colas_readmarks_item_tl

\cs_generate_variant:Nn \prop_put:Nnn { Nxx }
\cs_generate_variant:Nn \prop_item:Nn { Ne }

\cs_new_protected:Nn \colas_readmarks:nn
 {
  \prop_clear:N \l_colas_readmarks_prop
  \ior_open:Nn \g__colas_readmarks_stream { #1 }
  \ior_map_inline:Nn \g__colas_readmarks_stream 
   {
    \__colas_readmarks_item:nn { #2 } { ##1 }
   }
 }
\cs_new_protected:Nn \__colas_readmarks_item:nn
 {% #1 = upper limit, #2 = item
  \tl_set:Nn \l__colas_readmarks_item_tl { #2 }
  \tl_replace_once:Nnn \l__colas_readmarks_item_tl { , } { . }
  \prop_put:Nxx \l_colas_readmarks_prop
   {
    \fp_eval:n { \l__colas_readmarks_item_tl < #1 ? floor(\l__colas_readmarks_item_tl) : 20 }
   }
   {
    \int_eval:n
     {
      1 + 
      0\prop_item:Ne \l_colas_readmarks_prop
       {
        \fp_eval:n { \l__colas_readmarks_item_tl < #1 ? floor(\l__colas_readmarks_item_tl) : 20 }
       }
     }
   }
 }

\ExplSyntaxOff

\begin{document}

\readmarks{\jobname.dat}{20}

\centering

\fbox{Mean value: $\getaverage{20}$}

\begin{tikzpicture}

\begin{axis}[
  ymajorgrids,
  ymin=0,
%  ymax=6.2,
  xmin=-1,
%  ytick={0,2,...,6},
  xtick={0,1,...,20},
  xticklabels={
    \small $0$-$1$, \small $1$-$2$, \small $2$-$3$, \small $3$-$4$,
    \small $4$-$5$, \small $5$-$6$, \small $6$-$7$, \small $7$-$8$,
    \small $8$-$9$, \small $9$-$10$, \small $10$-$11$, \small $11$-$12$,
    \small $12$-$13$, \small $13$-$14$, \small $14$-$15$, \small $15$-$16$,
    \small $16$-$17$, \small $17$-$18$, \small $18$-$19$, \small $19$-$20$,
    \small $\geq 20$
  },
  minor y tick num = 0,
%   area style,
   width=28cm,
   height=10cm,
   axis lines*=left,
%   bar width=0.2cm,
   y axis line style = {->},
   x axis line style = {->},
   tick align      = outside,
   tick pos        = left
]
\pgfplotsinvokeforeach{0,...,20}{%
  \addplot[
    ybar,
    fill=black!20,
    draw=black!40,
    ycomb,
    line width=8mm,
    color=blue!50
  ] coordinates {(#1,\getmarks{#1})};
}    
\end{axis}
\end{tikzpicture}

\end{document}

Se lee el archivo y se completa una lista de propiedades. Entonces podremos recuperar los valores de una forma mucho más sencilla.

ingrese la descripción de la imagen aquí

Respuesta3

No está claro si desea la frecuencia media o solo la media de la variable x. Para el segundo caso:

mwe

\documentclass[a4paper]{article}
\begin{document}
<<data,echo=F>>=
df <- read.csv(file="commadata.dat",head=F, dec=",", sep=";")
@

The mean is \(\frac{\Sexpr{sum(df$V1)}}{\Sexpr{length(df$V1)}}=
\Sexpr{sum(df$V1)/length(df$V1)}\)

\bigskip

<<histogran,echo=F,dev="tikz">>=
x <- round(mean(df$V1),2)
hist(df$V1, breaks=21,col="tan1",  xaxp  = c(0, 20, 20), ylim=c(0,8),
     main="", xlab="",ylab="")
arrows(x,7.8,x,0, length=0.15, col =4, code=1,lwd=2)
text(x,8,paste("$\\overline{\\mbox{x}}=$",x))
@

\end{document}

información relacionada