2016-07-29 2 views
2

나는 데이터처럼 보이는 (PD 시리즈) (매일 주식 수익률, N = 555)가 :디스플레이 확률로하기 matplotlib 히스토그램 y 축를 가져올 수 없습니다

S = perf_manual.returns 
S = S[~((S-S.mean()).abs()>3*S.std())] 

2014-03-31 20:00:00 0.000000 
2014-04-01 20:00:00 0.000000 
2014-04-03 20:00:00 -0.001950 
2014-04-04 20:00:00 -0.000538 
2014-04-07 20:00:00 0.000764 
2014-04-08 20:00:00 0.000803 
2014-04-09 20:00:00 0.001961 
2014-04-10 20:00:00 0.040530 
2014-04-11 20:00:00 -0.032319 
2014-04-14 20:00:00 -0.008512 
2014-04-15 20:00:00 -0.034109 
... 

가 나는를 생성하고 싶습니다 확률 분포도. 사용 :

print stats.normaltest(S) 

n, bins, patches = plt.hist(S, 100, normed=1, facecolor='blue', alpha=0.75) 
print np.sum(n * np.diff(bins)) 

(mu, sigma) = stats.norm.fit(S) 
print mu, sigma 
y = mlab.normpdf(bins, mu, sigma) 
plt.grid(True) 
l = plt.plot(bins, y, 'r', linewidth=2) 

plt.xlim(-0.05,0.05) 
plt.show() 

을 나는 다음과 같은 얻을 :

NormaltestResult(statistic=66.587382579416982, pvalue=3.473230376732532e-15) 
1.0 
0.000495624926242 0.0118790391467 

graph

나는 y 축이 카운트 인상을 가지고 있지만, 내가 대신 확률을 가지고 싶습니다. 어떻게해야합니까? 전 StackOverflow 답변을 많이 시도했는데이를 이해할 수 없습니다.

+0

당신이이 카운트이라는 것을 확신

따라서, 당신이 결국 코드의 라인을 따라 뭔가입니까? 그래프를 통합 할 때 그래프가 1로 표준화 될 때 확률 밀도 값이라고 생각합니다. 귀하의 x 값의 범위는 매우 작습니다. – jotasi

+0

확률 밀도가 가장 강한 점이 아닐 수 있습니다. 적어도 이들을 백분율로 만들 수 있습니까? –

+0

몇 퍼센트를 갖고 싶습니까? 각 bin에 대해이 bin에있는 데이터의 확률은? 확률 밀도는 기본적으로 일부 x 범위의 밀도에 대한 적분이 그 범위의 확률을 제공한다는 것을 의미합니다. – jotasi

답변

2

plt.hist을 사용하면 쉽게 알 수 있습니다. 그러나 단순히 np.histogram을 사용하여 데이터를 보관 한 다음 원하는 방식으로 데이터를 표준화 할 수 있습니다. 내가 너를 올바르게 이해했다면, 데이터는 확률 분포가 아닌 주어진 빈에서 한 점을 발견 할 확률을 나타내기를 원한다. 즉, 데이터를 축척하여 모든 빈에 대한 합이 1 인 것을 의미합니다. 이는 bin_probability = n/float(n.sum())을 수행하여 간단히 수행 할 수 있습니다.

그런 다음 적절하게 정규화 된 확률 분포 함수 (pdf)가 없으므로 간격을 통한 적분은 확률이 아닙니다! 그 이유는 왜 mlab.normpdf을 히스토그램과 동일한 표준으로 재조정해야하는 이유입니다. 필요한 요소는 빈 폭뿐입니다. 제대로 정규화 된 binned pdf에서 시작하면 모든 빈에 대한 합계의 너비와 각각의 너비가 1이되기 때문입니다. 이제는 빈의 합이 1이되기를 원합니다. 따라서 배율 인수는 다음과 같습니다. 빈 너비

import numpy as np 
import scipy.stats as stats 
import matplotlib.pyplot as plt 
import matplotlib.mlab as mlab 

# Produce test data 
S = np.random.normal(0, 0.01, size=1000) 

# Histogram: 
# Bin it 
n, bin_edges = np.histogram(S, 100) 
# Normalize it, so that every bins value gives the probability of that bin 
bin_probability = n/float(n.sum()) 
# Get the mid points of every bin 
bin_middles = (bin_edges[1:]+bin_edges[:-1])/2. 
# Compute the bin-width 
bin_width = bin_edges[1]-bin_edges[0] 
# Plot the histogram as a bar plot 
plt.bar(bin_middles, bin_probability, width=bin_width) 

# Fit to normal distribution 
(mu, sigma) = stats.norm.fit(S) 
# The pdf should not normed anymore but scaled the same way as the data 
y = mlab.normpdf(bin_middles, mu, sigma)*bin_width 
l = plt.plot(bin_middles, y, 'r', linewidth=2) 

plt.grid(True) 
plt.xlim(-0.05,0.05) 
plt.show() 

그리고 그 결과 그림이 될 것입니다 :

enter image description here

+0

이것과 내 혼란을 쫓아 버려서 고마워 :) –

관련 문제