Par exemple, supposons que vous ayez un bloc de données comme celui-ci.
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
Lorsque j'essaie de dessiner un diagramme avec une erreur standard à partir de cette trame de données, cela ressemble à ceci.
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)
De cette manière, une barre d'erreur peut être créée en spécifiant l'ampleur de l'erreur dans yerr.
Par conséquent, nous définirons et utiliserons cilen pour trouver la longueur de l'intervalle de confiance.
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)
J'ai pu créer un diagramme avec un intervalle de confiance.
La méthode de calcul de l'intervalle de confiance est confuse en raison du problème «n ou n-1».
Pour ceux qui ont recherché "intervalle de confiance Python" pour le moment selon "Évitez de réinventer les roues",
Je pense que vous serez confus par les différences subtiles, essayez les deux et serez frustré par les différents résultats.
1 est la même réponse que R. La différence est dans 2. Je vais essayer.
> 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)
Cette fois, j'ai décidé de suivre R dans le monde, j'ai donc choisi 1.
La différence avec 2 est la fin de la partie où ci est calculé.
math.sqrt(len(data))
Cette. Divisez par n. Cependant, si vous voulez faire des statistiques spéculatives, il est préférable de diviser par n-1. C'est parce que nous supposons une distribution t. En réalité,
math.sqrt(len(data) - 1)
Ensuite, la réponse de la méthode 2 correspond également complètement à R.
Recommended Posts