Angenommen, Sie haben einen Datenrahmen wie diesen.
x y
0 2 0.954025
1 3 0.146810
2 1 0.409961
3 1 0.164558
4 3 0.782152
5 2 0.905869
6 3 0.210528
7 1 0.437970
8 1 0.801206
9 3 0.089576
10 2 0.960357
11 2 0.670732
Wenn ich versuche, aus diesem Datenrahmen ein Diagramm mit Standardfehler zu zeichnen, sieht es so aus.
import numpy as np
import matplotlib.pyplot as plt
m = df.pivot_table(index='x', values='y', aggfunc='mean')
e = df.pivot_table(index='x', values='y', aggfunc='sem')
m.plot(xlim=[0.8, 3.2], yerr=e)
Auf diese Weise kann ein Fehlerbalken erstellt werden, indem die Größe des Fehlers in yerr angegeben wird.
Daher definieren und verwenden wir cilen, um die Länge des Vertrauensintervalls zu ermitteln.
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
def cilen(arr, alpha=0.95):
if len(arr) <= 1:
return 0
m, e, df = np.mean(arr), stats.sem(arr), len(arr) - 1
interval = stats.t.interval(alpha, df, loc=m, scale=e)
cilen = np.max(interval) - np.mean(interval)
return cilen
m = df.pivot_table(index='x', values='y', aggfunc='mean')
e = df.pivot_table(index='x', values='y', aggfunc=cilen)
m.plot(xlim=[0.8, 3.2], yerr=e)
Ich konnte ein Diagramm mit einem Konfidenzintervall erstellen.
Die Methode zur Berechnung des Konfidenzintervalls ist aufgrund des Problems "n oder n-1" verwirrt.
Für diejenigen, die vorerst nach "Vertrauensintervall Python" gesucht haben, laut "Vermeiden Sie es, Räder neu zu erfinden",
Ich denke, Sie werden durch die subtilen Unterschiede verwirrt sein, beides versuchen und durch die unterschiedlichen Ergebnisse frustriert sein.
1 ist die gleiche Antwort wie R. Der Unterschied liegt in 2. Ich werde es versuchen.
> x <- c(1, 1, 3, 3)
> t.test(x)
One Sample t-test
data: x
t = 3.4641, df = 3, p-value = 0.04052
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
0.1626138 3.8373862
sample estimates:
mean of x
2
import numpy as np
from scipy import stats
alpha = 0.95
data = [1, 1, 3, 3]
mean_val = np.mean(data)
sem_val = stats.sem(data) # standared error of the mean
ci = stats.t.interval(alpha, len(data)-1, loc=mean_val, scale=sem_val)
print(ci)
>> (0.16261376896260105, 3.837386231037399)
import math
import numpy as np
from scipy import stats
alpha = 0.95
data = [1, 1, 3, 3]
mean_val = np.mean(data)
std_val = np.std(data)
ci = stats.t.interval(alpha,len(data)-1,loc=mean_val,scale=std_val/math.sqrt(len(data)))
print(ci)
>> (0.40877684735786857, 3.5912231526421312)
Dieses Mal habe ich beschlossen, R in der Welt zu folgen, also habe ich 1 gewählt.
Was an 2 anders ist, ist das Ende des Teils, in dem ci berechnet wird.
math.sqrt(len(data))
Dies. Teilen Sie durch n. Wenn Sie jedoch spekulative Statistiken erstellen möchten, ist es besser, durch n-1 zu teilen. Dies liegt daran, dass wir eine t-Verteilung annehmen. Eigentlich,
math.sqrt(len(data) - 1)
Dann stimmt die Antwort von Methode 2 auch vollständig mit R überein.