library(ggplot2)
ggplot(data.frame(x = c(-4, 4)), aes(x = x)) +
stat_function(fun = dnorm) +
theme_minimal()
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)
:
valor será cada celda de nuestros valores X
Introducimos en
B1
el valor de la mediaIntroducimos en
B2
el valor de la desviación típicaEn el valor que hemos llamado acumular, introducimos
FALSO
, puesto que no queremos la función acumulada (la veremos más tarde)Introducimos la fórmula
=DISTR.NORM.N(B3;B$1;B$2;FALSO)
en el rangoC3:C35
Para hacer el gráfico, seleccionamos los valores de las columnas B
y C
que 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 B1
y B2
tenemos 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
:
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)
<- 125
Xmedia <- 2
Xdt
<- Xmedia-4*Xdt
Xmin <- Xmedia+4*Xdt
Xmax
<- dnorm(Xmedia, Xmedia, Xdt)
Ymax
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
= 125
Xmedia = 2
Xdt
= Xmedia - 4 * Xdt
Xmin = Xmedia + 4 * Xdt
Xmax
= norm.pdf(Xmedia, Xmedia, Xdt)
Ymax
= np.linspace(Xmin, Xmax, 100)
x = norm.pdf(x, Xmedia, Xdt)
y
=1, color='blue')
plt.plot(x, y, linewidth='dashed', linewidth=1, color='blue')
plt.axvline(Xmedia, linestyle plt.xlim(Xmin, Xmax)
(117.0, 133.0)
plt.show()
Code
using Gadfly
using Distributions
= 125 Xmedia
125
Code
= 2 Xdt
2
Code
= Xmedia - 4 * Xdt Xmin
117
Code
= Xmedia + 4 * Xdt Xmax
133
Code
= pdf(Normal(Xmedia, Xdt), Xmedia) Ymax
0.19947114020071635
Code
= range(Xmin, stop=Xmax, length=100) x
117.0:0.16161616161616163:133.0
Code
= pdf.(Normal(Xmedia, Xdt), x) y
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
plot(x=x, y=y, Geom.line, Theme(default_color=colorant"blue")) Gadfly.
Plot(...)