Исследовательский анализ данных в программировании на R

Опубликовано: 4 Января, 2022

Исследовательский анализ данных или EDA - это статистический подход или метод анализа наборов данных с целью обобщения их важных и основных характеристик, как правило, с использованием некоторых наглядных пособий. Подход EDA можно использовать для сбора информации о следующих аспектах данных:

  • Основные характеристики или особенности данных.
  • Переменные и их отношения.
  • Выявление важных переменных, которые можно использовать в нашей задаче.

EDA - это итеративный подход, который включает:

  • Создание вопросов о наших данных
  • Поиск ответов с помощью визуализации, преобразования и моделирования наших данных.
  • Используя полученные уроки, чтобы уточнить наш набор вопросов или создать новый набор вопросов.

Реализация в R

В языке R мы собираемся выполнить EDA по двум широким классификациям:

  • Описательная статистика, которая включает среднее значение, медианное значение, режим, межквартильный диапазон и т. Д.
  • Графические методы, которые включают гистограмму, оценку плотности, ящичные диаграммы и т. Д.

Прежде чем мы начнем работать с EDA, мы должны правильно провести проверку данных. Здесь, в нашем анализе, мы будем использовать loafercreek из пакета почвыDB в R. Мы собираемся проверить наши данные, чтобы найти все опечатки и вопиющие ошибки. Дальнейший EDA может быть использован для определения и идентификации выбросов и выполнения необходимого статистического анализа. Для выполнения EDA нам необходимо установить и загрузить следующие пакеты:

  • Пакет «aqp»
  • Пакет «ggplot2»
  • Пакет «почвенная база данных»

Мы можем установить эти пакеты из консоли R с помощью команды install.packages () и загрузить их в наш сценарий R с помощью команды library () . Теперь мы увидим, как проверять наши данные и удалять опечатки и вопиющие ошибки.

Проверка данных для EDA в R

Чтобы гарантировать, что мы имеем дело с правильной информацией, нам необходимо четкое представление ваших данных на каждом этапе процесса преобразования. Проверка данных - это просмотр данных в целях проверки и отладки до, во время или после перевода. Теперь посмотрим, как проверять и удалять ошибки и опечатки в данных.

Пример:

р

# Data Inspection in EDA
# loading the required packages
library (aqp)
library (soilDB)
# Load from the the loakercreek dataset
data ( "loafercreek" )
# Construct generalized horizon designations
n <- c ( "A" , "BAt" , "Bt1" , "Bt2" , "Cr" , "R" )
# REGEX rules
p <- c ( "A" , "BA|AB" , "Bt|Bw" , "Bt3|Bt4|2B|C" ,
"Cr" , "R" )
# Compute genhz labels and
# add to loafercreek dataset
loafercreek$genhz <- generalize.hz (
loafercreek$hzname,
n, p)
# Extract the horizon table
h <- horizons (loafercreek)
# Examine the matching of pairing of
# the genhz label to the hznames
table (h$genhz, h$hzname)
vars <- c ( "genhz" , "clay" , "total_frags_pct" ,
"phfield" , "effclass" )
summary (h[, vars])
sort ( unique (h$hzname))
h$hzname <- ifelse (h$hzname == "BT" ,
"Bt" , h$hzname)

Выход:

 > таблица (h $ genhz, h $ hzname)
          
           2BCt 2Bt1 2Bt2 2Bt3 2Bt4 2Bt5 2CB 2CBt 2Cr 2Crt 2R A A1 A2 AB ABt Ad Ap B BA BAt BC BCt Bt Bt1 Bt2 Bt3 Bt4 Bw Bw1 Bw2 Bw3 C
  А 0 0 0 0 0 0 0 0 0 0 0 97 7 7 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  BAt 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 31 8 0 0 0 0 0 0 0 0 0 0 0 0
  Bt1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 8 94 89 0 0 10 2 2 1 0
  Bt2 1 2 7 8 6 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 5 16 0 0 0 47 8 0 0 0 0 6
  Cr 0 0 0 0 0 0 0 0 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  R 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  не используется 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
          
           CBt Cd Cr Cr / R Crt H1 Oi R Rt
  А 0 0 0 0 0 0 0 0 0
  БАТ 0 0 0 0 0 0 0 0 0
  Bt1 0 0 0 0 0 0 0 0 0
  Bt2 6 1 0 0 0 0 0 0 0
  Кр 0 0 49 0 20 0 0 0 0
  К 0 0 0 1 0 0 0 41 1
  не используется 0 0 0 0 0 1 24 0 0

> сводка (h [, vars])
      genhz глина total_frags_pct phfield effclass  
 А: 113 мин. : 10.00 мин. : 0.00 Мин. : 4.90 очень слабая: 0  
 Бат: 40 1-я четверть: 18.00 1-я четверть: 0,00 1-я четверть: 6.00 легкая: 0  
 Bt1: 208 Медиана: 22,00 Медиана: 5,00 Медиана: 6,30 сильных: 0  
 Bt2: 116 Среднее значение: 23,67 Среднее значение: 14,18 Среднее значение: 6,18 Жестокое: 0  
 Кр: 75 3-я четверть: 28.00 3-я четверть:20.00 3-я четверть: 6,50 нет: 86  
 R: 48 Макс. : 60.00 Макс. : 95.00 Макс. : 7.00 NA: 540  
 не используется: 26 NA: 173 NA: 381                     

> sort (уникальный (h $ hzname))
 [1] «2BCt» «2Bt1» «2Bt2» «2Bt3» «2Bt4» «2Bt5» «2CB» «2CBt» «2Cr» «2Crt» «2R» «A» «A1» «A2» «AB» «ABt "" Ad "" Ap "" B "   
[20] «BA» «BAt» «BC» «BCt» «Bt» «Bt1» «Bt2» «Bt3» «Bt4» «Bw» «Bw1» «Bw2» «Bw3» «C» «CBt» «Cd "" Cr "" Cr / R "" Crt " 
[39] «H1» «Oi» «R» «Rt» 

Теперь приступим к EDA.

Описательная статистика в EDA

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

  • Меры центральной тенденции
  • Меры рассеивания
  • Корреляция

Мы попытаемся определить средние значения, используя функции из раздела Меры центральной тенденции . В этом разделе мы будем вычислять среднее значение, медианное значение, моду и частоту .

Пример 1:

Теперь посмотрим на меры центральной тенденции в этом примере.

р

# EDA
# Descriptive Statistics
# Measures of Central Tendency
#loading the required packages
library (aqp)
library (soilDB)
# Load from the the loakercreek dataset
data ( "loafercreek" )
# Construct generalized horizon designations
n <- c ( "A" , "BAt" , "Bt1" , "Bt2" , "Cr" , "R" )
# REGEX rules
p <- c ( "A" , "BA|AB" , "Bt|Bw" , "Bt3|Bt4|2B|C" ,
"Cr" , "R" )
# Compute genhz labels and
# add to loafercreek dataset
loafercreek$genhz <- generalize.hz (
loafercreek$hzname,
n, p)
# Extract the horizon table
h <- horizons (loafercreek)
# Examine the matching of pairing
# of the genhz label to the hznames
table (h$genhz, h$hzname)
vars <- c ( "genhz" , "clay" , "total_frags_pct" ,
"phfield" , "effclass" )
summary (h[, vars])
sort ( unique (h$hzname))
h$hzname <- ifelse (h$hzname == "BT" ,
"Bt" , h$hzname)
# first remove missing values
# and create a new vector
clay <- na.exclude (h$clay)
mean (clay)
median (clay)
sort ( table ( round (h$clay)),
decreasing = TRUE )[1]
table (h$genhz)
# append the table with
# row and column sums
addmargins ( table (h$genhz,
h$texcl))
# calculate the proportions
# relative to the rows, margin = 1
# calculates for rows, margin = 2 calculates
# for columns, margin = NULL calculates
# for total observations
round ( prop.table ( table (h$genhz, h$texture_class),
margin = 1) * 100)
knitr:: kable ( addmargins ( table (h$genhz, h$texcl)))
aggregate (clay ~ genhz, data = h, mean)
aggregate (clay ~ genhz, data = h, median)
aggregate (clay ~ genhz, data = h, summary)

Выход:

 > среднее (глина)
[1] 23,6713
> медиана (глина)
[1] 22
> sort (table (round (h $ Clay)), по убыванию = ИСТИНА) [1]
25 
41 год 
> таблица (h $ genhz)

       A BAt Bt1 Bt2 Cr R не используется 
     113 40 208 116 75 48 26 

> addmargins (таблица (h $ genhz, h $ texcl))
          
           cos s fs vfs lcos ls lfs lvfs cosl sl fsl vfsl l sil si scl cl sicl sc sic c Sum
  А 0 0 0 0 0 0 0 0 0 6 0 0 78 27 0 0 0 0 0 0 0 111
  BAt 0 0 0 0 0 0 0 0 0 1 0 0 31 4 0 0 2 1 0 0 0 39
  Bt1 0 0 0 0 0 0 0 0 0 1 0 0 125 20 0 4 46 5 0 1 2 204
  Bt2 0 0 0 0 0 0 0 0 0 0 0 0 28 5 0 5 52 3 0 1 16110
  Cr 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
  R 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  не используется 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1
  Сумма 0 0 0 0 0 0 0 0 0 8 0 0 262 56 0 9 101 9 0 2 19 466

> round (prop.table (table (h $ genhz, h $ texture_class), margin = 1) * 100)
          
            br c cb cl gr l pg scl sic sicl sil sl spm
  А 0 0 0 0 0 70 0 0 0 0 24 5 0
  БАТ 0 0 0 5 0 79 0 0 0 3 10 3 0
  Bt1 0 1 0 23 0 61 0 2 0 2 10 0 0
  Bt2 0 14 1 46 2 25 1 4 1 3 4 0 0
  Cr 98 2 0 0 0 0 0 0 0 0 0 0 0
  Р 100 0 0 0 0 0 0 0 0 0 0 0 0
  не используется 0 0 0 4 0 0 0 0 0 0 0 0 96

> knitr :: kable (addmargins (table (h $ genhz, h $ texcl)))


| | cos | s | fs | vfs | lcos | ls | lfs | lvfs | cosl | sl | fsl | vfsl | л | сил | си | scl | cl | sicl | sc | sic | c | Сумма |
|: -------- | ---: | -: | -: | ---: | ----: | -: | ---: | ----: | ----: | -: | ---: | ----: | ---: | ---: | -: | ---: | ---: | ----: | -: | ---: | -: | ---: |
| A | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 6 | 0 | 0 | 78 | 27 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 111 |
| BAt | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 31 | 4 | 0 | 0 | 2 | 1 | 0 | 0 | 0 | 39 |
| Bt1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 125 | 20 | 0 | 4 | 46 | 5 | 0 | 1 | 2 | 204 |
| Bt2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 28 | 5 | 0 | 5 | 52 | 3 | 0 | 1 | 16 | 110 |
| Cr | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
| R | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| неиспользованный | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 |
| Сумма | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 8 | 0 | 0 | 262 | 56 | 0 | 9 | 101 | 9 | 0 | 2 | 19 | 466 |
> агрегат (глина ~ genhz, данные = h, среднее)
  глина
1 А 16.23113
2 бат 19.53889
3 BT1 24.14221
4 BT2 31.35045
5 Кр 15.00000

> агрегат (глина ~ genhz, данные = h, медиана)
  глина
1 А 16,0
2 бат 19,5
3 BT1 24,0
4 Бат2 30,0
5 Кр 15.0

> агрегат (глина ~ genhz, данные = h, сводка)
  глина глина. глина. 1 кв. глина. средн. глина. средн. глина. 3-й кв. глина. макс.
1 А 10.00000 14.00000 16.00000 16.23113 18.00000 25.00000
2 бат 14.00000 17.00000 19.50000 19.53889 20.00000 28.00000
3 бат1 12.00000 20.00000 24.00000 24.14221 28.00000 51.40000
4 BT2 10.00000 26.00000 30.00000 31.35045 35.00000 60.00000
5 Кр 15.00000 15.00000 15.00000 15.00000 15.00000 15.00000

Теперь мы увидим функции в разделе « Меры дисперсии» . В этой категории мы собираемся определить значения спреда вокруг средней точки. Здесь мы собираемся вычислить дисперсию, стандартное отклонение, диапазон, межквартильный диапазон, коэффициент дисперсии и квартили.

Пример 2:

В этом примере мы увидим меры дисперсии.

р

# EDA
# Descriptive Statistics
# Measures of Dispersion
# loading the packages
library (aqp)
library (soilDB)
# Load from the the loakercreek dataset
data ( "loafercreek" )
# Construct generalized horizon designations
n <- c ( "A" , "BAt" , "Bt1" , "Bt2" , "Cr" , "R" )
# REGEX rules
p <- c ( "A" , "BA|AB" , "Bt|Bw" , "Bt3|Bt4|2B|C" ,
"Cr" , "R" )
# Compute genhz labels and add
# to loafercreek dataset
loafercreek$genhz <- generalize.hz (
loafercreek$hzname,
n, p)
# Extract the horizon table
h <- horizons (loafercreek)
# Examine the matching of pairing of
# the genhz label to the hznames
table (h$genhz, h$hzname)
vars <- c ( "genhz" , "clay" , "total_frags_pct" ,
"phfield" , "effclass" )
summary (h[, vars])
sort ( unique (h$hzname))
h$hzname <- ifelse (h$hzname == "BT" ,
"Bt" , h$hzname)
# first remove missing values
# and create a new vector
clay <- na.exclude (h$clay)
var (h$clay, na.rm= TRUE )
sd (h$clay, na.rm = TRUE )
cv <- sd (clay) / mean (clay) * 100
cv
quantile (clay)
range (clay)
IQR (clay)

Выход:

 > var (h $ Clay, na.rm = ИСТИНА)
[1] 64,89187

> sd (h $ Clay, na.rm = ИСТИНА)
[1] 8,055549

> резюме
[1] 34,03087

> квантиль (глина)
  0% 25% 50% 75% 100% 
  10 18 22 28 60 

> ассортимент (глина)
[1] 10 60

> IQR (глина)
[1] 10

Теперь займемся корреляцией . В этой части все рассчитанные значения коэффициентов корреляции всех переменных в виде таблицы корреляции. Это дает нам количественную меру, чтобы направлять наш процесс принятия решений.

Пример 3:

Теперь мы увидим корреляцию в этом примере.

р

# EDA
# Decriptive Statistics
# Correlation
# loading the required packages
library (aqp)
library (soilDB)
# Load from the the loakercreek dataset
data ( "loafercreek" )
# Construct generalized horizon designations
n <- c ( "A" , "BAt" , "Bt1" , "Bt2" , "Cr" , "R" )
# REGEX rules
p <- c ( "A" , "BA|AB" , "Bt|Bw" , "Bt3|Bt4|2B|C" ,
"Cr" , "R" )
# Compute genhz labels and add
# to loafercreek dataset
loafercreek$genhz <- generalize.hz (
loafercreek$hzname,
n, p)
# Extract the horizon table
h <- horizons (loafercreek)
# Examine the matching of pairing
# of the genhz label to the hznames
table (h$genhz, h$hzname)
vars <- c ( "genhz" , "clay" , "total_frags_pct" ,
"phfield" , "effclass" )
summary (h[, vars])
sort ( unique (h$hzname))
h$hzname <- ifelse (h$hzname == "BT" ,
"Bt" , h$hzname)
# first remove missing values
# and create a new vector
clay <- na.exclude (h$clay)
# Compute the middle horizon depth
h$hzdepm <- (h$hzdepb + h$hzdept) / 2
vars <- c ( "hzdepm" , "clay" , "sand" ,
"total_frags_pct" , "phfield" )
round ( cor (h[, vars], use = "complete.obs" ), 2)

Выход:

 hzdepm глиняный песок total_frags_pct phfield
hzdepm 1,00 0,59 -0,08 0,50 -0,03
глина 0,59 1,00 -0,17 0,28 0,13
песок -0,08 -0,17 1,00 -0,05 0,12
total_frags_pct 0,50 0,28 -0,05 1,00 -0,16
phfield -0,03 0,13 0,12 -0,16 1,00

Следовательно, вышеупомянутые три классификации относятся к части описательной статистики EDA. Теперь перейдем к графическому методу представления EDA.

Графический метод в EDA

Поскольку мы уже проверили наши данные на наличие пропущенных значений, явных ошибок и опечаток, теперь мы можем проверить наши данные графически, чтобы выполнить EDA. Мы увидим графическое представление в следующих категориях:

  • Распределения
  • Точечный и линейный график

В разделе « Распределение» мы будем исследовать наши данные, используя гистограмму, гистограмму, кривую плотности, прямоугольные диаграммы и график QQ.

Пример 1:

Мы увидим, как в этом примере можно использовать графы распределения для исследования данных в EDA.

р

# EDA Graphical Method Distributions
# loading the required packages
library ( "ggplot2" )
library (aqp)
library (soilDB)
# Load from the the loakercreek dataset
data ( "loafercreek" )
# Construct generalized horizon designations
n <- c ( "A" , "BAt" , "Bt1" , "Bt2" , "Cr" , "R" )
# REGEX rules
p <- c ( "A" , "BA|AB" , "Bt|Bw" , "Bt3|Bt4|2B|C" ,
"Cr" , "R" )
# Compute genhz labels and add
# to loafercreek dataset
loafercreek$genhz <- generalize.hz (
loafercreek$hzname, n, p)
# Extract the horizon table
h <- horizons (loafercreek)
# Examine the matching of pairing
# of the genhz label to the hznames
table (h$genhz, h$hzname)
vars <- c ( "genhz" , "clay" , "total_frags_pct" ,
"phfield" , "effclass" )
summary (h[, vars])
sort ( unique (h$hzname))
h$hzname <- ifelse (h$hzname == "BT" ,
"Bt" , h$hzname)
# graphs
# bar plot
ggplot (h, aes (x = texcl)) + geom_bar ()
# histogram
ggplot (h, aes (x = clay)) +
geom_histogram (bins = nclass.Sturges (h$clay))
# density curve
ggplot (h, aes (x = clay)) + geom_density ()
# box plot
ggplot (h, ( aes (x = genhz, y = clay))) +
geom_boxplot ()
# QQ Plot for Clay
ggplot (h, aes (sample = clay)) +
geom_qq () +
geom_qq_line ()

Выход:

Теперь перейдем к графику разброса и линий . В этой категории мы увидим два типа построения графиков - точечный график и линейный график. Отображение точек одного интервала или переменной отношения по отношению к переменной известно как диаграмма рассеяния.

Пример 2:

Теперь мы увидим, как использовать точечные и линейные графики для проверки наших данных.

р

# EDA
# Graphical Method
# Scatter and Line plot
# loading the required packages
library ( "ggplot2" )
library (aqp)
library (soilDB)
# Load from the the loakercreek dataset
data ( "loafercreek" )
# Construct generalized horizon designations
n <- c ( "A" , "BAt" , "Bt1" , "Bt2" , "Cr" , "R" )
# REGEX rules
p <- c ( "A" , "BA|AB" , "Bt|Bw" , "Bt3|Bt4|2B|C" ,
"Cr" , "R" )
# Compute genhz labels and add
# to loafercreek dataset
loafercreek$genhz <- generalize.hz (
loafercreek$hzname, n, p)
# Extract the horizon table
h <- horizons (loafercreek)
# Examine the matching of pairing
# of the genhz label to the hznames
table (h$genhz, h$hzname)
vars <- c ( "genhz" , "clay" , "total_frags_pct" ,
"phfield" , "effclass" )
summary (h[, vars])
sort ( unique (h$hzname))
h$hzname <- ifelse (h$hzname == "BT" ,
"Bt" , h$hzname)
# graph
# scatter plot
ggplot (h, aes (x = clay, y = hzdepm)) +
geom_point () +
ylim (100, 0)
# line plot
ggplot (h, aes (y = clay, x = hzdepm,
group = peiid)) +
geom_line () + coord_flip () + xlim (100, 0)

Выход: