Суббота, 04.04.2026, 19:28Приветствуем вас Гость | RSS
Решение задач в среде R
Главная | Анализ данных из файла | Регистрация | Вход
» Меню сайта

» R практикум

» R кодинг

» Rmatem

» Опрос
Сколько вам лет?
Всего ответов: 9

» Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Анализ датасета  данных юных спортсменов.

Для начала необходимо загрузить с нашего сайта файл архив sportkids с данными для этого жми сюда. Далее не забудем в скрипте указать путь к рабочей директории в которую разархивируем загруженный файл sportkids который представляет собой текстовый документ. По сути этот файл состоит из заголовков "Пол Рост Вес Пресс Прыжок" и целочисленных данных (обратим внимание что все данные разделены знаком "пробел" это важно учесть при чтении файла). Начало скрипта будет выглядеть следующим образом:

setwd('C:/datas')
kids=read.table('sportkids.txt',header=TRUE)
head(kids)

Поскольку первая строчка содержит названия колонок, то обязательно об этом "известим"  среду программирования R: header=TRUE. Выполним конструкцию и выведем в консоль первые шесть строк (по умолчанию). Но можно немного изменить параметр и вывести например первые десять строк. head(kids,n = 10)

> head(kids,n = 10)
 Пол Рост Вес Пресс Прыжок
1 f 139 31 24 141
2 f 136 29 31 140
3 m 141 35 29 145
4 m 140 33 26 135
5 f 132 31 26 109
6 m 132 31 31 101
7 m 138 34 26 131
8 f 138 34 25 140
9 f 144 34 24 135
10 m 132 27 16 141

Изучим данные полученные из файла sportkids: выясним структуру и типы данных

str(kids) #Выводит полную структуру объекта
class(kids) #проверить тип данных "data.frame"

> str(kids) #Выводит полную структуру объекта
'data.frame': 40 obs. of 5 variables:
 $ Пол : chr "f" "f" "m" "m" ...
 $ Рост : int 139 136 141 140 132 132 138 138 144 132 ...
 $ Вес : int 31 29 35 33 31 31 34 34 34 27 ...
 $ Пресс : int 24 31 29 26 26 31 26 25 24 16 ...
 $ Прыжок: int 141 140 145 135 109 101 131 140 135 141 ...
> str(kids) #Выводит полную структуру объекта
'data.frame': 40 obs. of 5 variables:
 $ Пол : chr "f" "f" "m" "m" ...
 $ Рост : int 139 136 141 140 132 132 138 138 144 132 ...
 $ Вес : int 31 29 35 33 31 31 34 34 34 27 ...
 $ Пресс : int 24 31 29 26 26 31 26 25 24 16 ...
 $ Прыжок: int 141 140 145 135 109 101 131 140 135 141 ...
> class(kids) #проверить тип данных "data.frame"
[1] "data.frame"

А теперь приступим к первичному анализу данных. Для начала создадим два вектора которые будут содержать данные отдельно по двум группам ("f" и "m" это сокращения female (девочки) и  мальчики  male). Для этого выполним следующую конструкцию:

boys = kids[kids$Пол=='m',]
gerls = kids[kids$Пол=='f',]

Наглядно видно что у нас файл данных содержит данные о 19 мальчиках и 21 девочек. Теперь можно поработать с этими данными. Допустим мы хотим выбрать юных спортсменов у которых прыжок дальше 135 сантиметрам, для этого просто выполним следующую конструкцию:

# выбрать юных спортсменов у которых прыжок дальше 135
s = kids[kids$Прыжок > 135,]
s

> # выбрать юных спортсменов у которых прыжок дальше 135
> s = kids[kids$Прыжок > 135,]
> s
 Пол Рост Вес Пресс Прыжок
1 f 139 31 24 141
2 f 136 29 31 140
3 m 141 35 29 145
8 f 138 34 25 140
10 m 132 27 16 141
13 f 136 31 22 150
14 f 138 35 21 139
15 f 137 33 31 155
24 f 139 35 29 150
25 m 145 38 26 141
26 f 136 31 21 157
27 m 136 30 24 145
33 m 144 33 28 145
36 m 144 37 32 144
39 f 140 40 37 141
40 m 146 42 34 151

Не совсем наглядно представлены данные: давайте разместим данные по длине прыжка в порядке возрастания от наименьшего значения к наибольшему, для этого выполним конструкцию:

s1 = s[order(s$Прыжок),]
s1

> s1 = s[order(s$Прыжок),]
> s1
 Пол Рост Вес Пресс Прыжок
14 f 138 35 21 139
2 f 136 29 31 140
8 f 138 34 25 140
1 f 139 31 24 141
10 m 132 27 16 141
25 m 145 38 26 141
39 f 140 40 37 141
36 m 144 37 32 144
3 m 141 35 29 145
27 m 136 30 24 145
33 m 144 33 28 145
13 f 136 31 22 150
24 f 139 35 29 150
40 m 146 42 34 151
15 f 137 33 31 155
26 f 136 31 21 157

Так же можно задавать и более сложные условия отбора. Например нам нужно отобрать девочек у которых прыжок дальше 130 сантиметров  и рост выше 136 сантиметров. Выполним конструкцию:

# выбрать девочек у которых прыжок дальше 130 и рост выше 136
kids[kids$Прыжок > 130 & kids$Пол == 'f' & kids$Рост > 136,]

> # выбрать девочек у которых прыжок дальше 130 и рост выше 136
> kids[kids$Прыжок > 130 & kids$Пол == 'f' & kids$Рост > 136,]
 Пол Рост Вес Пресс Прыжок
1 f 139 31 24 141
8 f 138 34 25 140
9 f 144 34 24 135
14 f 138 35 21 139
15 f 137 33 31 155
24 f 139 35 29 150
39 f 140 40 37 141

Теперь выясним есть ли статистически значимые различия между средними показателями дальности прыжка у мальчиков и девочек. Выполним конструкцию (обратите внимание что эти две строки будут давать один и тот же результат, первая конструкция выглядит грамозко и не уклюже, но к счастью можно провести тот же самый тест воспользовавшись разделением на группы. Так же обратите внимание что на этот раз мы работаем со всеми представленными данными по весу):

Построим для большей наглядности "ящик с усами" который отразит графически некоторые описательные статистики по весу среди девочек и мальчиков. Для чего выполним простую конструкцию (и далее выполним Welch Two Sample t-test):

boxplot(kids$Вес ~ kids$Пол)

Так же можно воспользоваться функцией StatTwoGrupCI (загрузить ее можно с нашего сайта жми сюда):
setwd('C:/R myFunction')
source('StatTwoGrupCI.R')
StatTwoGrupCI(x1 = boys$Вес, x2 = gerls$Вес, CI = 97)

> StatTwoGrupCI(x1 = boys$Вес, x2 = gerls$Вес, CI = 97)
-----------------------------------------------------
 Name N Mean SD Med As Ex Min Max V CS
1 X1 19 33.94737 3.778208 34 0.06203894 -0.56948724 27 42 11.12960 2.553306
2 X2 21 31.66667 3.336665 31 0.86967538 -0.07377375 28 40 10.53684 2.299326
-----------------------------------------------------
 Name Low Hi
1 X1 31.90508 35.98966
2 X2 29.96560 33.36773
-----------------------------------------------------

 Welch Two Sample t-test

data: x1 and x2
t = 2.0147, df = 36.161, p-value = 0.05142
alternative hypothesis: true difference in means is not equal to 0
97 percent confidence interval:
 -0.2766602 4.8380638
sample estimates:
mean of x mean of y 
 33.94737 31.66667 

t.test(kids[kids$Пол=='m',]$Вес , kids[kids$Пол=='f',]$Вес)
t.test(kids$Вес ~ kids$Пол)

> t.test(kids$Вес ~ kids$Пол)

 Welch Two Sample t-test

data: kids$Вес by kids$Пол
t = -2.0147, df = 36.161, p-value = 0.05142
alternative hypothesis: true difference in means between group f and group m is not equal to 0
95 percent confidence interval:
 -4.57618789 0.01478438
sample estimates:
mean in group f mean in group m 
 31.66667 33.94737 

p-value = 0.05142 что немного превышает уровень 0.05, что с одной стороны говорит о принятии нулевой гипотезы о равенстве групп, то есть среднее значение по массе у юных спортсменов одинаковы или проще говоря средний вес мальчиков и девочек является одинаковым а отличия носят случайный характер. Но с другой стороны лучше провести еще дополнительные исследования (то есть обработать больше данных). Или на худой случай (если нет такой возможности) провести бутстреп анализ не забудем так же загрузить с нашего сайта функцию CIboot и поместить ее в рабочую директорию

setwd('C:/R myFunction')
source('CIboot.R')
CIboot(x1 = kids[kids$Пол=='m',]$Вес, 
       x2 = kids[kids$Пол=='f',]$Вес,R = 1000, CI = 98

> CIboot(x1 = kids[kids$Пол=='m',]$Вес, x2 = kids[kids$Пол=='f',]$Вес,R = 1000, CI = 98)

 Welch Two Sample t-test

data: x1 and x2
t = 2.0147, df = 36.161, p-value = 0.05142
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.01478438 4.57618789
sample estimates:
mean of x mean of y 
 33.94737 31.66667 

 ConfLevel_x1 ConfLevel_x2
1 0.98000 0.98000
2 31.91552 30.05631
3 35.88069 33.29979

Как мы наглядно убедились и с использованием бутстрепа: статистически значимых различий в группах нет.

А теперь давайте выясним есть ли зависимость у мальчиков дальности прыжка от их веса. Сначала отберем нужные нам данные (предлагаю два способа - они дают одинаковый результат, но второй более наглядный так как отражает какие данные подверглись отбору)

SM = boys[,c(3,5)]
SM = boys[,c('Вес', 'Прыжок')]
SM

> SM 
 Вес Прыжок
3 35 145
4 33 135
6 31 101
7 34 131
10 27 141
12 39 129
16 35 135
17 34 130
19 36 129
20 35 134
23 28 131
25 38 141
27 30 145
30 30 115
31 32 120
33 33 145
36 37 144
38 36 132
40 42 151

cor(SM$Вес, SM$Прыжок) 

> cor(SM$Вес, SM$Прыжок)
[1] 0.346910

Видим что зависимость очень небольшая, попробуем это предствить еще более наглядно с помощью точечного графика

plot(SM)

И все же попробуем найти уравнение регрессии зависимости дальности прыжка от веса юного спортсмена

bsm = lm(SM$Прыжок ~ SM$Вес )
summary(bsm)
xx = seq(25, 45, 0.1)
yy = 1.0989*xx + 96.0625 
lines(xx,yy)

> summary(bsm)

Call:
lm(formula = SM$Прыжок ~ SM$Вес)

Residuals:
 Min 1Q Median 3Q Max 
-29.1295 -5.1241 0.4748 8.0296 15.9695 

Coefficients:
 Estimate Std. Error t value Pr(>|t|) 
(Intercept) 96.0625 24.6051 3.904 0.00114 **
SM$Вес 1.0989 0.7206 1.525 0.14563 
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 11.55 on 17 degrees of freedom
Multiple R-squared: 0.1203, Adjusted R-squared: 0.0686 
F-statistic: 2.326 on 1 and 17 DF, p-value: 0.1456

» Вход на сайт

» Поиск

» Работа с файлами

» Вся графика

» Гистогра́мма

» Теория вероятности

» Сравнение групп

» Дисперс анализ

» Блог

» Календарь
«  Апрель 2026  »
ПнВтСрЧтПтСбВс
  12345
6789101112
13141516171819
20212223242526
27282930

» Архив записей


Copyright MyCorp © 2026
uCoz