На данном занятии мы узнаем, как язык программирования R можно сочетать с RMarkdown’ом. На выходе мы можем получить красивые документы в трёх разных форматах: Ворде, LaTeX’е и HTML’е. К тому же, при перезапуске кода информация, отражаемая в этих документах, может автоматически обновляться. А если Вы используете в качестве выходного формата HMTL, то Вы можете разместить свои документы в интернете на всеобщее обозрение и, конечно, сделать их нтерактивными.
Для начала загрузим данные, чтобы можно было с чем работать. В этот раз мы рассмотрим сведения о стоимости жизни в разных городах России, собираемые пользователями портала Numbeo.
sFolder = "d:/kkholodilin/VShE/"
sInFile = "Data/Statistika/Cost_of_living_Numbeo_RUB_Russia_2019-12.csv"
sOutFile = "Draft/Statistika/Fig_Numbeo_Russia.pdf"
#---------------------------------------------------------
#--- Load the cost of living data for Russia
X = read.csv(paste(sFolder, sInFile, sep=""), dec = ",", sep = ";")
Обычно я создаю отдельные текстовые переменные для названия папки, а также входных и выходных файлов. С помощью функции paste() их можно легко комбинировать, получая пути к читаемым и создаваемым файлам.
Посмотрим для начала, что за данные мы загрузили. Сколько в них переменных? Что они обозначают? Насколько велик наш набор данных?
head(X)
## Item Average Range
## 1 Meal, Inexpensive Restaurant 233.09 166,19-300,00
## 2 Meal for 2 People, Mid-range Restaurant, Three-course 1000.00
## 3 McMeal at McDonalds (or Equivalent Combo Meal) NA
## 4 Domestic Beer (0.5 liter draught) 50.00
## 5 Imported Beer (0.33 liter bottle) 100.00
## 6 Cappuccino (regular) 120.00 100,00-140,00
## Lower Upper City
## 1 166.19 300 Abakan
## 2 NA NA Abakan
## 3 NA NA Abakan
## 4 NA NA Abakan
## 5 NA NA Abakan
## 6 100.00 140 Abakan
summary(X)
## Item Average Range Lower
## Length:5952 Min. : 0.0 Length:5952 Min. : 0
## Class :character 1st Qu.: 59.1 Class :character 1st Qu.: 40
## Mode :character Median : 250.0 Mode :character Median : 150
## Mean : 51765.2 Mean : 39424
## 3rd Qu.: 4642.9 3rd Qu.: 2000
## Max. :1843000.0 Max. :1836000
## NA's :967 NA's :1339
## Upper City
## Min. : 1 Length:5952
## 1st Qu.: 70 Class :character
## Median : 300 Mode :character
## Mean : 64290
## 3rd Qu.: 5000
## Max. :2000000
## NA's :1339
table(X$City)
##
## Abakan Arkhangelsk Astrakhan
## 64 64 64
## Balashikha Barnaul Belgorod
## 64 64 64
## Blagoveshchensk Bryansk Cheboksary
## 64 64 64
## Chelyabinsk Cherepovets Fryazino
## 64 64 64
## Irkutsk Ivanovo Izhevsk
## 64 64 64
## Kaliningrad Kaluga Kazan
## 64 64 64
## Kemerovo Khabarovsk Khimki
## 64 64 64
## Kirov Korolyov Kostroma
## 64 64 64
## Krasnodar Krasnoyarsk Kurgan
## 64 64 64
## Kursk Lipetsk Lyubertsy
## 64 64 64
## Magadan Magnitogorsk Makhachkala
## 64 64 64
## Moscow Murmansk Mytishchi
## 64 64 64
## Nalchik Nizhny Novgorod Nizhny Tagil
## 64 64 64
## Novocheboksarsk Novokuznetsk Novorossiysk
## 64 64 64
## Novosibirsk Obninsk Odintsovo
## 64 64 64
## Omsk Orenburg Oryol (Orel)
## 64 64 64
## Penza Perm Petropavlovsk-Kamchatsky
## 64 64 64
## Petrozavodsk Podolsk Pskov
## 64 64 64
## Pyatigorsk Rostov-na-donu Ryazan
## 64 64 64
## Saint Petersburg Samara Saransk
## 64 64 64
## Saratov Sergiyev Posad Sevastopol
## 64 64 64
## Shchelkovo (Shchyolkovo) Simferopol Smolensk
## 64 64 64
## Sochi Stavropol Sterlitamak
## 64 64 64
## Surgut Syktyvkar Taganrog
## 64 64 64
## Tambov Tolyatti (Togliatti) Tomsk
## 64 64 64
## Tula Tver Tyumen
## 64 64 64
## Ufa Ulan Ude Ulyanovsk
## 64 64 64
## Veliky Novgorod Vladikavkaz Vladimir
## 64 64 64
## Vladivostok Volgograd Vologda
## 64 64 64
## Voronezh Yakutsk Yaroslavl
## 64 64 64
## Yekaterinburg Yoshkar-Ola Yuzhno-Sakhalinsk
## 64 64 64
table(X$Item)
##
## 1 min. of Prepaid Mobile Tariff Local (No Discounts or Plans)
## 93
## 1 Pair of Jeans (Levis 501 Or Similar)
## 93
## 1 Pair of Men Leather Business Shoes
## 93
## 1 Pair of Nike Running Shoes (Mid-Range)
## 93
## 1 Summer Dress in a Chain Store (Zara, H&M, ...)
## 93
## Apartment (1 bedroom) in City Centre
## 93
## Apartment (1 bedroom) Outside of Centre
## 93
## Apartment (3 bedrooms) in City Centre
## 93
## Apartment (3 bedrooms) Outside of Centre
## 93
## Apples (1kg)
## 93
## Average Monthly Net Salary (After Tax)
## 93
## Banana (1kg)
## 93
## Basic (Electricity, Heating, Cooling, Water, Garbage) for 85m2 Apartment
## 93
## Beef Round (1kg) (or Equivalent Back Leg Red Meat)
## 93
## Bottle of Wine (Mid-Range)
## 93
## Buy Apartment Price
## 93
## Cappuccino (regular)
## 93
## Chicken Breasts (Boneless, Skinless), (1kg)
## 93
## Childcare
## 93
## Cigarettes 20 Pack (Marlboro)
## 93
## Cinema, International Release, 1 Seat
## 93
## Clothing And Shoes
## 93
## Coke/Pepsi (0.33 liter bottle)
## 93
## Domestic Beer (0.5 liter bottle)
## 93
## Domestic Beer (0.5 liter draught)
## 93
## Eggs (regular) (12)
## 93
## Fitness Club, Monthly Fee for 1 Adult
## 93
## Gasoline (1 liter)
## 93
## Imported Beer (0.33 liter bottle)
## 186
## International Primary School, Yearly for 1 Child
## 93
## Internet (60 Mbps or More, Unlimited Data, Cable/ADSL)
## 93
## Lettuce (1 head)
## 93
## Loaf of Fresh White Bread (500g)
## 93
## Local Cheese (1kg)
## 93
## Markets
## 93
## McMeal at McDonalds (or Equivalent Combo Meal)
## 93
## Meal for 2 People, Mid-range Restaurant, Three-course
## 93
## Meal, Inexpensive Restaurant
## 93
## Milk (regular), (1 liter)
## 93
## Monthly Pass (Regular Price)
## 93
## Mortgage Interest Rate in Percentages (%), Yearly, for 20 Years Fixed-Rate
## 93
## One-way Ticket (Local Transport)
## 93
## Onion (1kg)
## 93
## Oranges (1kg)
## 93
## Potato (1kg)
## 93
## Preschool (or Kindergarten), Full Day, Private, Monthly for 1 Child
## 93
## Price per Square Meter to Buy Apartment in City Centre
## 93
## Price per Square Meter to Buy Apartment Outside of Centre
## 93
## Rent Per Month
## 93
## Rice (white), (1kg)
## 93
## Salaries And Financing
## 93
## Sports And Leisure
## 93
## Taxi 1hour Waiting (Normal Tariff)
## 93
## Taxi 1km (Normal Tariff)
## 93
## Taxi Start (Normal Tariff)
## 93
## Tennis Court Rent (1 Hour on Weekend)
## 93
## Tomato (1kg)
## 93
## Toyota Corolla 1.6l 97kW Comfort (Or Equivalent New Car)
## 93
## Transportation
## 93
## Utilities (Monthly)
## 93
## Volkswagen Golf 1.4 90 KW Trendline (Or Equivalent New Car)
## 93
## Water (0.33 liter bottle)
## 93
## Water (1.5 liter bottle)
## 93
Мы увидели, что в этой выборке представлены данные о стоимости различных потребительских товаров и услуг в городах России. Но городов и товаров слишком много, чтобы представить в одной таблице. Поэтому мы можем воспользоваться функцией, создающей интерактивные таблицы. Внимание: использовать её можно только, если ваш выходной формат – HTML.
DT::datatable(X, rownames=F)
Нередко работа с данными начинается с их доведения до нужного состояния. Иногда нам нужна лишь часть данных, например, определённые города или группы товаров. Здесь мы выберем только один товар – молоко. Построим график средней цены за литр молока в рублях.
vSel = grep("Milk", X$Item)
Y = X[vSel,]
plot(Y$Average)
Красивый график? По-моему, не очень. А вы, что думаете?
Отсортируем данные по средней цене и снова нарисуем график.
Y = Y[order(Y$Average),]
plot(Y$Average)
Что вы можете сказать об этой картинке?
Для каждого вида данных подходит лишь определённый вид графика. Например, выбранные данные лучше изобразить с помощью столбиковой диаграммы.
par(mar=c(4,7,1,1), bty="l", mfcol=c(1,1), cex.axis=0.6)
barplot(Y$Average, lwd=3, col="cyan4", xlab="", ylab="", main = "Цена молока в городах России", horiz=T, names.arg=Y$City, las=2)
mtext("Источник: Numbeo и собственное представление.", side=1, line=3)
mtext("рублей за литр", side=1, line=2)
Правильный график должен содержать понятное описание изображённых на нём данных. Кроме того, он должен быть хорошо читаемым. В частности, это означает, что названия лучше располагать горизонтально. Наконец, на нём не должно быть ненужной информации. Поэтому мы убираем лишние оси (верхнюю и правую), которые не содержат никакой информации. Также очень важно указывать источник данных. Таким образом, мы добиваемся прозрачности и воспроизводимости нашего исследования. Любой другой исследователь, взяв наши данные и методы сможет легко понять, что мы проделали, и получить точно такие же результаты. Если же речь идёт не об исследователях, которые захотят проверить наши результаты, а о просто заинтересованных людях, то наше исследование должно быть понятным, убедительным и увлекательным. Мы рассказываем историю и хотим, чтобы наши читатели и слушатели поняли, насколько она интересна.