Я строю две гистограммы, используя функцию histplot Сиборна. Первая гистограмма представляет весь мой набор данных, а вторая является подмножеством первого. Однако вторая гистограмма, похоже, не совпадает с первой, как ожидалось. Вот код, который я использую:
import numpy as np
from scipy.stats import norm
data = np.sin(np.arange(0, 6*np.pi, 0.1)) * 100
sns.scatterplot(x=[np.mean(data)], y=[0])
sns.lineplot(data)
population_size = 10000
sample_size = 100
total_means = []
for x in range(population_size):
total_means.append(np.mean(np.random.choice(data, 100)))
total_means = np.array(total_means)
sns.histplot(total_means, kde=True)
# Q. Find the range for 68% of data will lie in that interval
from scipy.stats import norm
z1 = norm.ppf(.50 - .68/2)
se = np.array(data).std() / sample_size ** .5
x1 = z1 * se + np.array(data).mean()
z2 = norm.ppf(.50 + .68/2)
x2 = z2 * se + np.array(data).mean()
print(x1, x2)
plt.xticks(np.arange(total_means.min(), total_means.max(), 10))
plt.xticks(np.arange(0, 500, 100))
sns.histplot(total_means, kde=True)
sns.histplot(total_means[(total_means >= x1) & (total_means <= x2)], kde=True, color='r')
При переполнении стека рекомендуется избегать публикации полного кода. Однако у меня есть некоторые данные, которые можно использовать для быстрого решения проблемы без необходимости создания новых данных.
В моем коде последние две строки отображают две гистограммы. Однако из полученного графика видно, что эти гистограммы не перекрываются, как ожидалось.
sns.histplot(total_means, kde=True)
sns.histplot(total_means[(total_means >= x1) & (total_means <= x2)], kde=True, color='r')
Не уверен, правильно ли я понял ваш вопрос. Но в предоставленном вами коде, похоже, есть перекрывающиеся графики. Просто были дополнительные вещи, которые делали его неразборчивым.
Вот то же самое после чистки. Пожалуйста, дайте мне знать, если вы это имели в виду.
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import norm
data = np.sin(np.arange(0, 6 * np.pi, 0.1)) * 100
population_size = 10000
sample_size = 100
total_means = []
for x in range(population_size):
total_means.append(np.mean(np.random.choice(data, 100)))
total_means = np.array(total_means)
# Q. Find the range for 68% of data will lie in that interval
z1 = norm.ppf(.50 - .68 / 2)
se = np.array(data).std() / sample_size ** .5
x1 = z1 * se + np.array(data).mean()
z2 = norm.ppf(.50 + .68 / 2)
x2 = z2 * se + np.array(data).mean()
plt.xticks(np.arange(total_means.min(), total_means.max(), 10))
sns.histplot(total_means, kde=True, color='g')
sns.histplot(total_means[(total_means >= x1) & (total_means <= x2)], kde=True, color='r')
Надеюсь это поможет.
Проблема в том, что для красного графика используются ячейки меньшего размера (по умолчанию рассчитывается с помощью np.histogram_bin_edges()). Меньшие ячейки означают, что каждая ячейка содержит меньше значений.
Вот код, показывающий разницу между использованием интервалов по умолчанию и использованием одних и тех же интервалов для обеих гистограмм. Первый и последний интервалы подмножества меньше, чем у большей гистограммы, поскольку края интервала не совпадают с пределами подмножества.
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
total_means = np.random.randn(2000)
fig, (ax1, ax2) = plt.subplots(ncols=2)
sns.histplot(total_means, kde=True, ax=ax1)
sns.histplot(total_means[(total_means >= -1) & (total_means <= 1)], kde=True, ax=ax1)
ax1.set_title('default bins')
bins = np.linspace(total_means.min(), total_means.max(), 30)
sns.histplot(total_means, bins=bins, kde=True, ax=ax2)
sns.histplot(total_means[(total_means >= -1) & (total_means <= 1)], bins=bins, kde=True, ax=ax2)
ax2.set_title('same bins for both')
plt.show()
вторая гистограмма должна находиться внутри первой гистограммы для значений x между x1 и x2, но, как вы можете видеть на графике, высоты гистограмм не совпадают.