В данной лекции мы будем работать с базой данных scores2.csv, содержащей оценки студентов-политологов (без имен) по разным курсам. Переменные в таблице:

Как загрузить csv-файл с базой данных?

По ссылке:

Например, с сайта math-info.hse.ru:

df <- read.csv("http://math-info.hse.ru/f/2017-18/ps-ms/scores2.csv")

С компьютера:

Способ 1:

df <- read.csv(file.choose())

Откроется окно, выбрать нужный файл и нажать Открыть.

Способ 2:

Выбрать файл в папке, кликнуть правой кнопкой мыши, выбрать Свойства, скопировать путь к файлу - строку из расположения, например:

C:\Users\student

Поменять обратные слэши на прямые:

C:/Users/student

Вставить полученную строку в кавычках в read.csv():

df <- read.csv("C:/Users/student/scores2.csv")

Как посмотреть на базу данных?

Полностью, в отдельном окне:

Способ 1:

Кликнуть на название базы (например, df) в окне Environment. Именно на название, не на стрелочку в синем круге рядом (если на нее нажать, ничего драматичного не пройзойдет, просто в окне Environment отобразится список переменных):

Откроется база данных в отдельной вкладке:

Можно двигать вправо-влево, вверх-вниз.

Способ 2:

View(df)

Обратите внимание, буква V заглавная.

Вывести первые несколько строк:

head(df)
##             id catps mstat soc econ eng polth mstat2 phist law phil polsoc
## 1 М141БПЛТЛ024     7     9   8    8   9     8     10     8   7    9      9
## 2 М141БПЛТЛ031     8    10  10   10  10    10     10     9   9   10     10
## 3 М141БПЛТЛ075     9     9   9   10   9    10      9     8   9   10      9
## 4 М141БПЛТЛ017     9     9   8    8   9     9     10     6   9    9      9
## 5 М141БПЛТЛ069    10    10  10   10  10    10      9     8   8   10      9
## 6 М141БПЛТЛ072    10     9   8   10   9     8      9     8   8   10      9
##   ptheo preg compp game wpol male
## 1     7    8     8    6   10    1
## 2     9    8     8    9   10    1
## 3     9    8     8    7    9    1
## 4     8    8     8    8    9    0
## 5     7    6     5    8   10    1
## 6     7    8     8    9    9    0

Последние несколько строк:

tail(df)
##              id catps mstat soc econ eng polth mstat2 phist law phil
## 55 М141БПЛТЛ066     7    10   7    7   9     5      8     4   6    5
## 56 М141БПЛТЛ043     5     5   6    5   8     5      6     5   6    4
## 57 М141БПЛТЛ084     6     7   8    4   8     5      5    NA   8    4
## 58 М141БПЛТЛ005     5     7   5    5   7     4      7     4   5    4
## 59 М141БПЛТЛ044     4     5   7    4   6     4      4     5   4    4
## 60     13051038     5     4   4    4   9     5      5     5   5    4
##    polsoc ptheo preg compp game wpol male
## 55      6     4    6     4    5    6    0
## 56      5     4    5    NA    4    6    0
## 57      4     4    4     4    6    7    1
## 58      5     5    4     4    4    8    1
## 59      4     4    6    NA    5    5    1
## 60      4    NA    7     4    4    4    1

Какие переменные есть в базе данных?

Структура базы данных:

str(df)
## 'data.frame':    60 obs. of  18 variables:
##  $ id    : Factor w/ 60 levels "06114043","130232038",..: 19 23 56 14 50 53 16 20 54 58 ...
##  $ catps : int  7 8 9 9 10 10 8 7 7 6 ...
##  $ mstat : int  9 10 9 9 10 9 7 10 9 6 ...
##  $ soc   : int  8 10 9 8 10 8 7 8 8 9 ...
##  $ econ  : int  8 10 10 8 10 10 6 7 8 5 ...
##  $ eng   : int  9 10 9 9 10 9 9 10 9 6 ...
##  $ polth : int  8 10 10 9 10 8 10 7 8 10 ...
##  $ mstat2: int  10 10 9 10 9 9 8 9 9 7 ...
##  $ phist : int  8 9 8 6 8 8 8 8 8 6 ...
##  $ law   : int  7 9 9 9 8 8 7 8 8 8 ...
##  $ phil  : int  9 10 10 9 10 10 7 8 9 6 ...
##  $ polsoc: int  9 10 9 9 9 9 9 8 9 9 ...
##  $ ptheo : int  7 9 9 8 7 7 7 8 7 6 ...
##  $ preg  : int  8 8 8 8 6 8 8 8 7 8 ...
##  $ compp : int  8 8 8 8 5 8 6 7 6 8 ...
##  $ game  : int  6 9 7 8 8 9 8 7 10 6 ...
##  $ wpol  : int  10 10 9 9 10 9 9 8 9 7 ...
##  $ male  : int  1 1 1 0 1 0 1 0 1 0 ...

Структура таблицы: названия переменных и их тип (numeric - числовой, integer - целочисленный, character - текстовый, factor - факторный).

Факторный тип представляет собой закодированный качественный показатель (текст). Например, у фактора может быть два уровня: 1 - мужчины, 2 - женщины.

Названия переменных:

colnames(df)
##  [1] "id"     "catps"  "mstat"  "soc"    "econ"   "eng"    "polth" 
##  [8] "mstat2" "phist"  "law"    "phil"   "polsoc" "ptheo"  "preg"  
## [15] "compp"  "game"   "wpol"   "male"

Как удалить строки с пропущенными значениями из базы данных?

# и сохраняем изменения в самой df
df <- na.omit(df)

Как получить описательные статистики по всем переменным в базе данных?

summary(df)
##             id         catps            mstat             soc        
##  130232038   : 1   Min.   : 5.000   Min.   : 5.000   Min.   : 5.000  
##  М141БПЛТЛ001: 1   1st Qu.: 6.000   1st Qu.: 6.250   1st Qu.: 6.000  
##  М141БПЛТЛ004: 1   Median : 7.000   Median : 7.500   Median : 7.000  
##  М141БПЛТЛ005: 1   Mean   : 6.815   Mean   : 7.593   Mean   : 7.241  
##  М141БПЛТЛ006: 1   3rd Qu.: 7.750   3rd Qu.: 9.000   3rd Qu.: 8.000  
##  М141БПЛТЛ007: 1   Max.   :10.000   Max.   :10.000   Max.   :10.000  
##  (Other)     :48                                                     
##       econ             eng             polth            mstat2      
##  Min.   : 4.000   Min.   : 6.000   Min.   : 4.000   Min.   : 4.000  
##  1st Qu.: 5.000   1st Qu.: 8.000   1st Qu.: 6.000   1st Qu.: 6.000  
##  Median : 6.000   Median : 8.500   Median : 6.000   Median : 7.000  
##  Mean   : 6.259   Mean   : 8.389   Mean   : 6.722   Mean   : 7.148  
##  3rd Qu.: 7.000   3rd Qu.: 9.000   3rd Qu.: 8.000   3rd Qu.: 8.750  
##  Max.   :10.000   Max.   :10.000   Max.   :10.000   Max.   :10.000  
##                                                                     
##      phist            law             phil            polsoc     
##  Min.   :4.000   Min.   :5.000   Min.   : 4.000   Min.   : 4.00  
##  1st Qu.:4.000   1st Qu.:6.000   1st Qu.: 5.000   1st Qu.: 6.00  
##  Median :6.000   Median :7.000   Median : 6.000   Median : 8.00  
##  Mean   :5.833   Mean   :6.963   Mean   : 6.074   Mean   : 7.37  
##  3rd Qu.:7.000   3rd Qu.:8.000   3rd Qu.: 7.000   3rd Qu.: 8.00  
##  Max.   :9.000   Max.   :9.000   Max.   :10.000   Max.   :10.00  
##                                                                  
##      ptheo            preg           compp            game      
##  Min.   :4.000   Min.   :4.000   Min.   :4.000   Min.   : 4.00  
##  1st Qu.:5.000   1st Qu.:6.000   1st Qu.:5.000   1st Qu.: 5.00  
##  Median :5.000   Median :7.000   Median :5.000   Median : 6.00  
##  Mean   :5.685   Mean   :6.815   Mean   :5.648   Mean   : 6.37  
##  3rd Qu.:6.750   3rd Qu.:8.000   3rd Qu.:6.750   3rd Qu.: 8.00  
##  Max.   :9.000   Max.   :8.000   Max.   :8.000   Max.   :10.00  
##                                                                 
##       wpol             male       
##  Min.   : 4.000   Min.   :0.0000  
##  1st Qu.: 7.000   1st Qu.:0.0000  
##  Median : 8.000   Median :0.0000  
##  Mean   : 7.722   Mean   :0.4259  
##  3rd Qu.: 9.000   3rd Qu.:1.0000  
##  Max.   :10.000   Max.   :1.0000  
## 

Как получить описательные статистики по отдельной переменной?

Выбор переменной из базы данных осуществляется с помощью символа $:

summary(df$mstat2)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   4.000   6.000   7.000   7.148   8.750  10.000

Как получить отдельные описательные статистики?

Выборочное среднее:

mean(df$mstat2)
## [1] 7.148148

Выборочная дисперсия (несмещенная оценка):

var(df$mstat2)
## [1] 2.845563

Выборочное стандартное отклонение (несмещенная оценка):

sd(df$mstat2)
## [1] 1.68688

Медиана выборки:

median(df$mstat2)
## [1] 7

Нижний квартиль выборки:

quantile(df$mstat2, 0.25)
## 25% 
##   6

Верхний квартиль выборки:

quantile(df$mstat2, 0.75)
##  75% 
## 8.75

Выборочный квантиль какого-то уровня:

quantile(df$mstat2, 0.1)
## 10% 
##   5

Минимум:

min(df$mstat2)
## [1] 4

Максимум:

max(df$mstat2)
## [1] 10

Как построить гистограмму для переменной?

Легко!

hist(df$phist)

Поменяем цвет заливки:

# col - цвет заливки
hist(df$phist, col = 'tomato')

Полную палитру цветов см. здесь.

Поменяем цвет границ столбиков:

# border - цвет границ
hist(df$phist, col = 'tomato', border = 'white')

Добавим заголовок:

# main - заголовок (главный)
hist(df$phist, col = 'tomato', main = 'Political history :(')

Добавим подпись к оси \(x\):

# xlab - подпись к оси x (x label)
hist(df$phist, col = 'tomato', main = 'Political history :(', xlab = 'Marks')

Добавим вертикальную линию, которая отчерчивает медиану:

hist(df$phist, col = 'tomato', main = 'Political history :(')

# прогонять строки с hist и abline одновременно (выделить мышкой и Run)
# v - вертикальная черта 
# col - цвет, lwd - ширина линии (line width), lty - тип (line type)
abline(v = median(df$phist), col = "blue", lwd = 2, lty = 2)

Добавим горизонтальную линию, которая отчерчивает определенную частоту значений:

hist(df$phist, col = 'tomato', main = 'Political history :(')

# прогонять строки с hist и abline одновременно (выделить мышкой и Run)
# h - горизонтальная линия на уровне 20
abline(h = 20, col = "green", lwd = 2, lty = 1)

Изменим число столбцов в гистограмме:

# breaks - число разбиений, два разреза - три столбика
hist(df$phist, col = 'tomato', main = 'Political history :(', breaks = 2)

Сделаем так, чтобы по оси y отмечались значения плотности (вероятности), а не абсолютные частоты:

# freq - частоты, frequences, мы их выключаем - FALSE
hist(df$phist, col = 'tomato', freq = FALSE)

Наложим на график кривую плотности соответствующего нормального распределения:

hist(df$phist, col = 'tomato', main = 'Political history :(', freq = FALSE)
curve(dnorm(x, mean(df$phist), sd = sd(df$phist)), add = TRUE)

Внимание: Обязательно при freq=FALSE, иначе смысла нет, кривая будет проходить примерно в интервале от 0 до 1, на графике с абсолютными частотами ее просто не будет видно. Строки с hist() и curve() нужно прогонять сразу друг за другом, иначе R не поймет, куда накладывать кривую.

Сравним две гистограммы: изобразим их в одинаковом масштабе (одинаковые длины осей \(x\) и \(y\)):

hist(df$phist, col = 'darkred', main = 'Political history :(', xlim = c(1, 11))

hist(df$mstat, col = 'hotpink', main = 'Statistics :)', xlim = c(1, 11))

Нарисуем четыре графика одновременно - два на два (два графика в строке, два в столбце):

par(mfrow = c(2, 2))
hist(df$phist, col = 'darkred', main = 'Political history :(', xlim = c(1, 11))
hist(df$mstat, col = 'hotpink', main = 'Statistics :)', xlim = c(1, 11))
hist(df$phil, col = 'sienna1', main = 'Philosophy :(', xlim = c(1, 11))
hist(df$law, col = 'limegreen', main = 'Law :|', xlim = c(1, 11))

Три на один (один график в строке, три в столбце):

par(mfrow = c(3, 1))
hist(df$phist, col = 'darkred', main = 'Political history :(', xlim = c(1, 11))
hist(df$mstat, col = 'hotpink', main = 'Statistics :)', xlim = c(1, 11))
hist(df$phil, col = 'sienna1', main = 'Philosophy', xlim = c(1, 11))

Как построить ящик с усами для переменной?

boxplot(df$econ)

Поменяем цвет ящика с усами:

boxplot(df$econ, col = "yellow")

Построим ящик с усами по группам - группировка по переменной пол:

# через ~ указана переменная, по которой производится группировка
boxplot(df$econ ~ df$male,  col = c("yellow", "green"))

Как построить скрипичную диаграмму?

  1. Установить библиотеку (достаточно один раз, при подключении к интернету):
install.packages("vioplot")
  1. Обратиться к библиотеке:
library(vioplot)
  1. Построить график:
vioplot(df$catps)

Поменять цвет:

vioplot(df$catps, col = "lightgreen")

Питон, который проглотил оценки студентов :)