В этом документе мы рассмотрим, как рассчитать описательные статистики (среднее, медиану, моду, стандартное отклонение, квартили и др.) на датасете iris. Также мы создадим визуализации для анализа распределения данных: ящик с усами, гистограмму, точечную диаграмму и график плотности. Датасет iris содержит 150 наблюдений по 5 переменным: длине и ширине чашелистика и лепестка, а также виду ириса.
Загрузим датасет iris и посмотрим его структуру.
## Загрузка датасета
data(iris)
## Структура данных
str(iris)
## 'data.frame': 150 obs. of 5 variables:
## $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
## $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
## $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
## $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
## $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
Команда str выводит информацию о структуре данных.
В нашем случае датасет включает числовые переменные (Sepal.Length, Sepal.Width, Petal.Length, Petal.Width) и категориальную (Species). Для анализа выберем переменную Sepal.Length (длина чашелистика).
Рассчитаем основные описательные статистики для Sepal.Length.
# Выборка данных
sepal_length <- iris$Sepal.Length
# Среднее
mean_value <- mean(sepal_length)
# Медиана
median_value <- median(sepal_length)
# Стандартное отклонение
sd_value <- sd(sepal_length)
# Минимум и максимум
min_value <- min(sepal_length)
max_value <- max(sepal_length)
# Квартили
quantiles <- quantile(sepal_length)
# Интерквартильный размах
iqr_value <- IQR(sepal_length)
# Мода (собственная функция, так как нет встроенной)
get_mode <- function(x) {
freq_table <- table(x)
modes <- as.numeric(names(freq_table[freq_table == max(freq_table)]))
return(modes)
}
mode_value <- get_mode(sepal_length)
# Вывод результатов
cat("Среднее:", mean_value, "\n")
## Среднее: 5.843333
cat("Медиана:", median_value, "\n")
## Медиана: 5.8
cat("Стандартное отклонение:", sd_value, "\n")
## Стандартное отклонение: 0.8280661
cat("Минимум:", min_value, "\n")
## Минимум: 4.3
cat("Максимум:", max_value, "\n")
## Максимум: 7.9
cat("Квартили:\n")
## Квартили:
print(quantiles)
## 0% 25% 50% 75% 100%
## 4.3 5.1 5.8 6.4 7.9
cat("Интерквартильный размах:", iqr_value, "\n")
## Интерквартильный размах: 1.3
cat("Мода:", mode_value, "\n")
## Мода: 5
# Сводная статистика
summary(sepal_length)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 4.300 5.100 5.800 5.843 6.400 7.900
Здесь:
Создадим графики для анализа распределения Sepal.Length.
Показывает медиану, квартили и возможные выбросы.
boxplot(sepal_length, main="Boxplot Длина чашелистика", ylab="Длина (см)",
col="tomato3")
Медиана Sepal.Length около 5.8 см, данные симметричны, выбросов нет.
Показывает частотное распределение данных.
hist(sepal_length, main="Гистограмма распределения длин чашелистиков", xlab="Длина (см)",
col="lightgreen", breaks=10)
Распределение близко к нормальному с пиком около 5–6 см.
Отображает значения относительно их индекса.
plot(1:length(sepal_length), sepal_length, main="Точечная диаграмма",
xlab="Index", ylab="Длина чашелистиков (см)", pch=19, col="darkgreen")
Показывает разброс значений, без явных паттернов по индексу.
Показывает гладкое распределение данных.
plot(density(sepal_length), main="График плотности распределения по длине",
xlab="Длина чашелистиков (см)", col="blue", lwd=2, ylab="Плотность")
Подтверждает нормальность распределения с гладким пиком.
Для компактности можно разместить все графики в одной сетке.
par(mfrow=c(2,2))
boxplot(sepal_length, main="Boxplot", ylab="Length (cm)", col="lightblue")
hist(sepal_length, main="Гистограмма", xlab="Length (cm)", col="lightgreen", breaks=10)
plot(1:length(sepal_length), sepal_length, main="Scatterplot", xlab="Index",
ylab="Length (cm)", pch=19, col="darkgreen")
plot(density(sepal_length), main="Распределение плотности", xlab="Length (cm)",
col="blue", lwd=2)
# возвращаем настройку по умолчанию
par(mfrow=c(1,1))
Это сигнальный пробный выпуск, если понравится, буду добавлять сюда различные варианты использования скриптовых примитив R.
Спасибо!