Задание 1: Разведочный анализ данных

Разведочный анализ на Python

import seaborn as sns
import matplotlib.pyplot as plt

Загружаем датасет iris

iris = sns.load_dataset('iris')

Выводим основные характеристики данных

print(iris.describe())
##        sepal_length  sepal_width  petal_length  petal_width
## count    150.000000   150.000000    150.000000   150.000000
## mean       5.843333     3.057333      3.758000     1.199333
## std        0.828066     0.435866      1.765298     0.762238
## min        4.300000     2.000000      1.000000     0.100000
## 25%        5.100000     2.800000      1.600000     0.300000
## 50%        5.800000     3.000000      4.350000     1.300000
## 75%        6.400000     3.300000      5.100000     1.800000
## max        7.900000     4.400000      6.900000     2.500000

Строим графики для анализа данных

sns.pairplot(iris, hue='species')

plt.show()

Разведочный анализ на R

library(ggplot2)

Загружаем датасет iris

data(iris)

Выводим основные характеристики данных

summary(iris)
##   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
##  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
##  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
##        Species  
##  setosa    :50  
##  versicolor:50  
##  virginica :50  
##                 
##                 
## 

Строим графики для анализа данных

ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species)) + geom_point() + theme_minimal()

Задание 2: Реализация бутстрапа

Бутстрап на Python

import numpy as np
import matplotlib.pyplot as plt

def get_percentile_ci(bootstrap_stats, pe, alpha):
    left, right = np.quantile(bootstrap_stats, [alpha / 2, 1 - alpha / 2])
    return left, right

Параметры

n = 1000
B = 10000
alpha = 0.05

Генерация данных

values_a = np.random.normal(90, 20, n)
values_b = np.random.normal(95, 15, n)

Расчет перцентилей

pe = np.quantile(values_b, 0.9)
bootstrap_values_a = np.random.choice(values_a, (B, n), replace=True)
bootstrap_metrics_a = np.quantile(bootstrap_values_a, 0.9, axis=1)
bootstrap_values_b = np.random.choice(values_b, (B, n), replace=True)
bootstrap_metrics_b = np.quantile(bootstrap_values_b, 0.9, axis=1)

Разница в перцентилях

bootstrap_stats = bootstrap_metrics_b - bootstrap_metrics_a
ci = get_percentile_ci(bootstrap_stats, pe, alpha)
has_effect = not (ci[0] < 0 < ci[1])

Визуализация

plt.hist(bootstrap_stats, bins=50, edgecolor='k')
plt.axvline(ci[0], color='r', linestyle='dashed', linewidth=1)
plt.axvline(ci[1], color='r', linestyle='dashed', linewidth=1)
plt.title('Bootstrap Confidence Interval')
plt.xlabel('Difference in 90th Percentile')
plt.ylabel('Frequency')
plt.show()

print(f"Значение 90% квантиля изменилось на: {pe:.2f}")
## Значение 90% квантиля изменилось на: 115.76
print(f"95% доверительный интервал: ({ci[0]:.2f}, {ci[1]:.2f})")
## 95% доверительный интервал: (-2.97, 2.77)
print(f"Отличия статистически значимы: {has_effect}")
## Отличия статистически значимы: False

Бутстрап на R

library(boot)
set.seed(0)

Определим функцию модели R-квадрат

rsq_function <- function(formula, data, indices) {
  d <- data[indices, ]
  fit <- lm(formula, data = d)
  return(summary(fit)$r.squared)
}

Бутстрапируем 2000 раз

reps <- boot(data = mtcars, statistic = rsq_function, R = 2000, formula = mpg ~ disp)
print(reps)
## 
## ORDINARY NONPARAMETRIC BOOTSTRAP
## 
## 
## Call:
## boot(data = mtcars, statistic = rsq_function, R = 2000, formula = mpg ~ 
##     disp)
## 
## 
## Bootstrap Statistics :
##      original      bias    std. error
## t1* 0.7183433 0.003272215  0.06390141

Визуализация

plot(reps)

Персентильный доверительный интервал

boot_ci <- boot.ci(reps, type = "bca")
print(boot_ci)
## BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
## Based on 2000 bootstrap replicates
## 
## CALL : 
## boot.ci(boot.out = reps, type = "bca")
## 
## Intervals : 
## Level       BCa          
## 95%   ( 0.5437,  0.8149 )  
## Calculations and Intervals on Original Scale