2016-07-25 8 views
0

Я хочу, например, дисперсию набора данных, путем бутстрапа (resample) данных.Python & Matplotlib: Как построить график гистограмм бутстрапа?

from numpy.random import randn 

fig,ax = plt.subplots() 

bins = arange(-5,6,0.5) 
df = pd.DataFrame(randn(3000)) 
df.hist(ax=ax, bins=bins, alpha = 0.7, normed=True) 

count_collection = [] 
for i in xrange(1,100): 
    temp_df = df.sample(frac=0.5, replace=True) 
    temp_df.hist(ax=ax, bins=bins, alpha = 0.25, normed=True) 

    count, division = np.histogram(temp_df, bins=bins) 
    count_collection.append(count) 

enter image description here

Однако такой сюжет трудно увидеть предел. Можно ли построить верхний/нижний предел гистограммы, поэтому можно увидеть более четкое, может быть, что-то вроде Boxplot для каждого бина?

http://matplotlib.org/_images/boxplot_demo_06.png

или только кривые с верхним/нижним пределом, чтобы указать диапазон?

enter image description here

Моя главная трудность извлечения/мин значение максимального для каждого бина (The count_collection)

UPDATE:

Что бы быть хорошим способом, чтобы построить диапазон?

count_collection = np.array(count_collection) 
mx = np.max(count_collection,0) 
mn = np.min(count_collection,0) 

ax.plot(division[1:]-0.25, mx, '_', mew=1) 
ax.plot(division[1:]-0.25, mn, '_', mew=1) 

enter image description here

Я считаю, что это до сих пор трудно смотреть, любое предложение?

+0

Вы можете посмотреть на функции [ 'numpy.histogram'] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.histogram.html), который делает биннинга без каких-либо заговоров. Вы можете использовать его, чтобы получить данные, а затем нарисовать их, как вам нравится. – BrenBarn

+0

@BrenBarn Я знаю 'np.histogram', и я действительно использую его для сбора всех данных. Я просто не знаю, как получить значение max/min из коллекции значений. – cqcn1991

+0

Как примечание стороны, не следует ли 'count' собирать' temp_df'? В противном случае, похоже, всего 100 повторений 'df' ... – Aguy

ответ

1

Чтобы извлечь максимум и минимум, вы можете использовать следующее:

count_collection = np.array(count_collection) 
mx = np.max(count_collection,0) 
mn = np.min(count_collection,0) 

Первая строка просто переходит из списка 1d массивов в 2d массив, так что максимум и минимум может работать.

редактировать:

Поскольку оригинальный сюжет нормализовалось, это трудно понять макс и мин половины размера выборки. Но вы можете сделать что-то вроде этого: импорт NumPy как нп из numpy.random импорта randn импорт matplotlib.pyplot в PLT импорта панд как э.р.

fig,ax = plt.subplots() 

bins = np.arange(-5,6,0.5) 
df = pd.DataFrame(randn(3000)) 
#df.hist(ax=ax, bins=bins, alpha = 0.7, normed=True) 
histval, _ = np.histogram(df, bins=bins) 

count_collection = [] 
for i in np.arange(1,100): 
    temp_df = df.sample(frac=0.5, replace=True) 
# temp_df.hist(ax=ax, bins=bins, alpha = 0.25, normed=True) 

    count, division = np.histogram(temp_df, bins=bins) 
    count_collection.append(count) 

count_collection = np.array(count_collection) 
mx = np.max(count_collection,0) 
mn = np.min(count_collection,0) 

plt.bar(bins[:-1], histval, 0.5) 
plt.plot(bins[:-1] + 0.25, mx*2) 
plt.plot(bins[:-1] + 0.25, mn*2) 

Коэффициент 2x связано с меньшим размером выборки 2x при расчете max и min. enter image description here

+0

Есть ли какие-либо предложения по визуализации данных? Я обновляю этот сюжет. Есть ли хороший способ построения диапазона? Я думаю, может быть, панель ошибок будет хорошим выбором? – cqcn1991

+0

Это сложно, поскольку вы использовали нормализацию. На образце бункеры обычно составляют половину высоты, если они нанесены на график. Поэтому проблема не определена. Я добавил код, чтобы показать это. – Aguy

+0

Концептуально, почему это трудно понять?Повторно выбранные нормированные данные по-прежнему являются распределением. Ограничение является пределом, полученным из этого нормированного распределения. Я думаю, это просто указывает на присущую случайную вариабельность распределения. – cqcn1991

Смежные вопросы