Цель работы — изучить метод бутстрапа на примере открытого набора данных и реализовать его на двух языках программирования: Python и R.
В работе используется встроенный датасет mtcars,
содержащий технические характеристики автомобилей.
data(mtcars)
head(mtcars)
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
summary(mtcars)
## mpg cyl disp hp
## Min. :10.40 Min. :4.000 Min. : 71.1 Min. : 52.0
## 1st Qu.:15.43 1st Qu.:4.000 1st Qu.:120.8 1st Qu.: 96.5
## Median :19.20 Median :6.000 Median :196.3 Median :123.0
## Mean :20.09 Mean :6.188 Mean :230.7 Mean :146.7
## 3rd Qu.:22.80 3rd Qu.:8.000 3rd Qu.:326.0 3rd Qu.:180.0
## Max. :33.90 Max. :8.000 Max. :472.0 Max. :335.0
## drat wt qsec vs
## Min. :2.760 Min. :1.513 Min. :14.50 Min. :0.0000
## 1st Qu.:3.080 1st Qu.:2.581 1st Qu.:16.89 1st Qu.:0.0000
## Median :3.695 Median :3.325 Median :17.71 Median :0.0000
## Mean :3.597 Mean :3.217 Mean :17.85 Mean :0.4375
## 3rd Qu.:3.920 3rd Qu.:3.610 3rd Qu.:18.90 3rd Qu.:1.0000
## Max. :4.930 Max. :5.424 Max. :22.90 Max. :1.0000
## am gear carb
## Min. :0.0000 Min. :3.000 Min. :1.000
## 1st Qu.:0.0000 1st Qu.:3.000 1st Qu.:2.000
## Median :0.0000 Median :4.000 Median :2.000
## Mean :0.4062 Mean :3.688 Mean :2.812
## 3rd Qu.:1.0000 3rd Qu.:4.000 3rd Qu.:4.000
## Max. :1.0000 Max. :5.000 Max. :8.000
ggplot(mtcars, aes(x=mpg)) +
geom_histogram(fill="steelblue", bins=10) +
theme_minimal() +
labs(title="Распределение расхода топлива (mpg)",
x="Miles per gallon",
y="Частота")
Пояснение графика:
Гистограмма показывает распределение значений расхода топлива. Видно,
что значения распределены примерно нормально с небольшим смещением.
ggplot(mtcars, aes(x=wt, y=mpg)) +
geom_point(color="darkred") +
theme_minimal() +
labs(title="Зависимость mpg от веса автомобиля",
x="Вес автомобиля",
y="Расход топлива (mpg)")
Пояснение графика:
Чем больше вес автомобиля, тем ниже значение mpg. Наблюдается
отрицательная зависимость.
library(reticulate)
import numpy as np
import matplotlib.pyplot as plt
# Данные (расход топлива)
data = np.array([21.0,21.0,22.8,21.4,18.7,18.1,14.3,24.4,22.8,19.2,
17.8,16.4,17.3,15.2,10.4,10.4,14.7,32.4,30.4,33.9,
21.5,15.5,15.2,13.3,19.2,27.3,26.0,30.4,15.8,19.7,
15.0,21.4])
n_iterations = 2000
bootstrap_means = []
for i in range(n_iterations):
sample = np.random.choice(data, size=len(data), replace=True)
bootstrap_means.append(np.mean(sample))
# Гистограмма
plt.hist(bootstrap_means, bins=30)
plt.title("Bootstrap distribution of mean (Python)")
plt.xlabel("Mean mpg")
plt.ylabel("Frequency")
plt.show()
np.mean(bootstrap_means)
## np.float64(20.06986875)
Пояснение графика:
Гистограмма показывает распределение средних значений, полученных при
многократной случайной выборке с возвращением. Распределение
приближается к нормальному.
set.seed(123)
data_r <- mtcars$mpg
n_iter <- 2000
boot_means <- numeric(n_iter)
for(i in 1:n_iter){
samp <- sample(data_r, replace=TRUE)
boot_means[i] <- mean(samp)
}
mean(boot_means)
## [1] 20.10278
hist(boot_means,
breaks=30,
col="lightblue",
main="Bootstrap distribution of mean (R)",
xlab="Mean mpg")
Пояснение графика:
Распределение средних значений похоже на нормальное. Это подтверждает
центральную предельную теорему — даже при произвольном распределении
данных распределение средних стремится к нормальному.
quantile(boot_means, probs=c(0.025,0.975))
## 2.5% 97.5%
## 18.06867 22.18133
Пояснение:
Полученный интервал показывает диапазон, в котором с вероятностью 95%
находится истинное среднее значение mpg.
В работе был выбран датасет mtcars и проведён краткий разведочный
анализ.
Метод бутстрапа был реализован на Python и R.
Гистограммы показали, что распределение средних значений приближается
к нормальному.
Полученные оценки среднего и доверительные интервалы подтверждают
корректность работы алгоритма.
Бутстрап позволяет оценивать параметры выборки и строить доверительные интервалы без строгих предположений о распределении данных.