La curva de distribución normal en Excel

Aplicando los gráficos de dispersión

estadística
Excel
código R
AUTOR

Juan Riera

PUBLICADO

February 19, 2023

Hay muchos métodos en internet para hacer el gráfico de la distribución normal con Microsoft Excel. Aquí vamos a utilizar un método sencillo mediante los gráficos de dispersión, que permite redibujar la curva para cualquier valor de la media y desviación típica, añadiendo una línea vertical en la posición de la media.

En primer lugar, estableceremos los valores de X que vamos a representar. Sabemos que la probabilidad de valores a una distancia superior a \(\pm4\) desviaciones típicas es prácticamente cero. Según esto, vamos a establecer los valores de nuestra variable a representar en el eje X entre \(\pm4\ \sigma\). Con un número de puntos en torno a 30 es suficiente para que la curva normal sea una curva suave.

En Excel, introducimos en la columna A una secuencia entre -4 y +4, con un incremento de 0,25. Eso nos proporciona una secuencia de 33 puntos.

A continuación, colocamos en la columna B nuestros valores de media y varianza (en este caso empezaremos con una normal de media 0 y desv t 1), y, a la derecha de la serie de valores de intervalos del eje X que hemos introducido, añadimos una fórmula que nos calcula el valor X como media + n veces la desv t

No nos queda más que calcular el valor de la función normal que corresponde a ese valor X. Para ello, Excel dispone de la función =DISTR.NORM(valor; media; desviación típica; acumular):

Para hacer el gráfico, seleccionamos los valores de las columnas By Cque son los que vamos a representar en el gráfico

y a continuación, en el Menu>Ìnsertar, elegimos el gráfico de dispersión con curvas suavizadas:

Esto completa nuestro gráfico de la distribución normal estándar (la que tiene media = 0 y desvt = 1)

Como en B1y B2tenemos los valores de la media y la desviación típica, podemos modificarlos para representar cualquier otra curva normal con otros valores de media y desviación típica; por ejemplo para un valor de media de 125 y de desvt de 2, no tenemos más que cambiar los valores en sus celdas correspondientes:

Por último, vamos a añadir una línea vertical en la posición de la media. Para hacerlo, sólo necesitamos dos valores que definan los extremos de la línea, y que colocaremos en el extremo inferior del rango de datos.. Los valores de X son los de la media, y los valores de Y son cero y el valor máximo de la función, que calculamos con la fórmula =MAX(C3:C35)

Ahora vamos al gráfico y, en la opción Seleccionar datos…, añadimos una nueva serie, que va a estar formada sólo por estos dos valores X e Y:

Editamos la línea de la nueva serie, ajustando color y tipo de línea, y completamos el gráfico:

Como hacer el gráfico en R

Para hacer la curva normal en ggplot, desde -4 \(\sigma\) hasta +4 \(\sigma\), usamos este código. Creamos el dataframe que vamos a dibujar directamente dentro de la propia instrucción ggplot:

library(ggplot2)
ggplot(data.frame(x = c(-4, 4)), aes(x = x)) +
  stat_function(fun = dnorm) +
  theme_minimal()

Podemos hacer más genérico el código para que dibuje cualquier curva normal a partir de una media y ua desviación típica cualquiera, incluyendo la línea vertical al valor medio. Una alternativa es hacer una secuencia de valores X, pero realmente no los necesitamos para dibujar la curva; nos basta con la media y la desviación típica. Para calcular la escala del eje X necesitamos el valor mínimo y máximo. La función dnorm() de R es equivalente a la función =DISTRIBUCION.NORMAL() de Excel, nos devuelve los valores de densidad de la función para los valores X especificados. En el caso de R, al especificar esta función dentro de ggplot, la gráfica utiliza internamente la función para calcular la curva sin necesidad de crear los valores, como habíamos hecho en Excel.

library(ggplot2)

Xmedia <- 125
Xdt <- 2

Xmin <- Xmedia-4*Xdt
Xmax <- Xmedia+4*Xdt

Ymax <- dnorm(Xmedia, Xmedia, Xdt)

ggplot(data.frame(X = c(Xmin, Xmax)), aes(x = X)) +
  stat_function(fun = dnorm, args = c(Xmedia, Xdt), 
                linewidth = 1, 
                colour = "blue") +
  geom_segment(aes(x = Xmedia, y = 0, xend = Xmedia, yend = Ymax), 
               linetype = "dashed", 
               linewidth = 1, 
               colour = "blue") +
  theme_minimal() +
  xlim(c(Xmin, Xmax))

import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import norm

Xmedia = 125
Xdt = 2

Xmin = Xmedia - 4 * Xdt
Xmax = Xmedia + 4 * Xdt

Ymax = norm.pdf(Xmedia, Xmedia, Xdt)

x = np.linspace(Xmin, Xmax, 100)
y = norm.pdf(x, Xmedia, Xdt)

plt.plot(x, y, linewidth=1, color='blue')
plt.axvline(Xmedia, linestyle='dashed', linewidth=1, color='blue')
plt.xlim(Xmin, Xmax)
(117.0, 133.0)
plt.show()

Code
using Gadfly
using Distributions

Xmedia = 125
125
Code
Xdt = 2
2
Code

Xmin = Xmedia - 4 * Xdt
117
Code
Xmax = Xmedia + 4 * Xdt
133
Code

Ymax = pdf(Normal(Xmedia, Xdt), Xmedia)
0.19947114020071635
Code

x = range(Xmin, stop=Xmax, length=100)
117.0:0.16161616161616163:133.0
Code
y = pdf.(Normal(Xmedia, Xdt), x)
100-element Vector{Float64}:
 6.691511288244268e-5
 9.214765115907646e-5
 0.00012606902807632802
 0.00017135493647929596
 0.00023139230722985193
 0.00031043114958320055
 0.0004137573773409694
 0.0005478861071560332
 0.0007207736582685398
 0.000942044905076905
 ⋮
 0.000720773658268557
 0.0005478861071560332
 0.0004137573773409694
 0.00031043114958320055
 0.00023139230722984597
 0.00017135493647930055
 0.00012606902807633138
 9.214765115907646e-5
 6.691511288244268e-5
Code

Gadfly.plot(x=x, y=y, Geom.line, Theme(default_color=colorant"blue"))
Plot(...)