Главная — Семестр 2 |
Обновлено: 09 May 2019 |
Документ будет формироваться и немного меняться.
При выполнении задания рекомендую установить рабочую директорию. В данной папке у вас должны находится скаченные документы и файлы. Это существенно упростит выполнение задания.
setwd(dir = "~/Documents/GitHub/info/s2/banks_data/")
# ~ обозначает "домашнюю" папку
Данные представляют собой балансы банков с 2004 года на каждый месяц по сегодня.
Сайт ЦБ РФ — Информация по кредитным организациям — Формы отчётности
Форма 101 — Оборотная ведомость по счетам бухгалтерского учета кредитной организации (А, к примеру, форма 102 — отчёт о прибылях и убытках). Данная форма составляется на конкретную дату (на первое число каждого месяца без учета операций в этот день). Форма содержит информацию о привлечённых депозитах, выданных кредитах, объёмах просроченной задолженности, о кредитах, выданных ЦБ этой кредитной организации.
План счетов (список всех счетов и что они значат) можно посмотреть тут:
Папка на определенную дату содержит следующие файлы (в зависимости от периода, где-то файлов меньше):
Файлы, которые имеют “_“, отличаются от других просто количеством предоставляемой информации. Если банк есть в одной файле, то его нет в другом.
Описание переменных можно взять тут: http://cbr.ru/credit/forms/ http://cbr.ru/vfs/credit/formats/101-20181201.PDF
Скачивайте данные за 2015 - н/в. Берите квартальные данные. Для загрузки данных формата DBF
необходима функция read.dbf()
из пакета foreign
.
library(foreign)
d_b <- read.dbf(file = path_to_file, as.is = T)
head(d_b)
## REGN PLAN NUM_SC A_P VR VV VITG ORA OVA OITGA
## 1 1 \x80 10605 1 3072535 0 3072535 8447315 0 8447315
## 2 1 \x80 10610 1 1792729 0 1792729 0 0 0
## 3 1 \x80 20202 1 2631566 4173422 6804988 28307132 11636585 39943717
## 4 1 \x80 20208 1 1826144 480846 2306990 13329907 3437126 16767033
## 5 1 \x80 20209 1 261132 232374 493506 9425625 6541838 15967463
## 6 1 \x80 20308 1 0 4984 4984 0 0 0
## ORP OVP OITGP IR IV IITG DT PRIZ
## 1 8858366 0 8858366 2661484 0 2661484 2019-01-01 1
## 2 0 0 0 1792729 0 1792729 2019-01-01 1
## 3 27269874 10745349 38015223 3668824 5064658 8733482 2019-01-01 1
## 4 12836601 3267728 16104329 2319450 650244 2969694 2019-01-01 1
## 5 9407410 6665380 16072790 279347 108832 388179 2019-01-01 1
## 6 0 16 16 0 4968 4968 2019-01-01 1
# path_to_file - путь к файлу, текстовый тип, вида "./122018B1.DBF"
# параметр as.is = T указывает функции на то, чтобы она текстовые форматы
# оставляла текстовыми
Для получения адреса можно использовать функции list.dirs
и list.files
.
list.dirs(path = , recursive = )
- позволяет получить список всех папок (директорий).
path
указывает, где надо искать папки;recursive
указан как F
, то будут выведены, только папки, которые находят по указаному адресу в path
, Если параметр указан как T
, то функция будет искать папки и внутри уже найденных папок.list.files(path = , pattern = , recursive = , ignore.case = )
позволяет найти файлы по заданному адресу.
path
содержит путь, где надо искать файлы;pattern
указывается шаблон искомых файлов. Например, можно указать “B.DBF$”, чтобы он искал только файлы, которые заканчиваются на “B.DBF”, а знак $ указывает на то, что это должен быть конец строки (более подробно о таких символах в разделе “Работа с текстом. Регулярные выражения”).recursive
указывает, надо ли искать в имеющихся папках дальше (вглубь).ignore.case = T
указывает, что надо игнорировать регистр (большие и маленькие буквы). print(list.files(path = "." , pattern = ".DBF$", recursive = T, ignore.case = T))
## [1] "banks_data/122018B1.DBF" "banks_data/122018N1.DBF"
## [3] "banks_data/NAMES.DBF"
Данными функциями можно воспользоваться, чтобы получить список всех папок, путем сортировки, можно найти “последнюю” папку (то есть папку на последнюю доступную дату).
Затем можно получить список файлов, находящихся в папке.
Данные закодированы в кодировке 866. Для перекодирования необходимо применить к каждому ряду, который является текстовым типом, функцию iconv(x, from = "866")
. x
- что будет перекодировано, from = "866"
- из какой кодировки.
Чтобы определить тип столбца, можно вопсользоваться функцией class
.
x <- data.frame(n = c(1,2,3,4),
t = as.character(c(1,2,3,4)),
tt = c("Москва", "Питер", "Волгоград", "Севастополь"),
stringsAsFactors = F)
sapply(X = x, FUN = class)
## n t tt
## "numeric" "character" "character"
sapply(X = x, FUN = class) == "character"
## n t tt
## FALSE TRUE TRUE
Загрузив данные на последнюю доступную дату необходимо провести кластеризацию банков. Для начала необходимо выбрать параметры, по которым будут сраниваться банки. Например: размер активов, доля депозитов ФЛ в активах, отношение депозитов к кредитам.
Провести кластеризацию модифицрованным методом K-means. В рамках кластеризации определить не только принадлежность каждого банка к кластеру, но и определить количество кластеров.
Если выбраны номинальные показатели (размер активов, депозитов), то для уменьшения разброса можно использовать log(), log10()
(возможно такое, что у банка нет какого-то показателя, тогда после применения функции будет получен ответ -Inf
).
Если выбран показатель номинальный и доля (размер активов и доля депозитов относительно активов), то необходимо привести их более сравнивым показателям, то есть номинальыйн показатель также привести к интервалу \([0, 1]\).
Нормировка показателя \(x\) к интервалу \([a, b]\) можно сделать по формуле: \[x_{new} = \frac{x - x_{min}}{x_{max} - x_{min}} * (b - a) + a\]
Всё описано тут. будут вопросы - спрашиайте.
https://ru.wikipedia.org/wiki/K-means http://intellect-tver.ru/?p=265 http://www.cs.cmu.edu/~dpelleg/kmeans.html
Пакет R: https://stat.ethz.ch/R-manual/R-devel/library/stats/html/kmeans.html
Нариуйте просто все точки на графике. Посмотрите, есть ли какие-то явные центры, выеляются ли они.
Выбери в качестве начального количества значение, выбранное в п.1. Увеличьте, уменьшьте количество центров, посмотрите, меняется ли распределение сильно.
Проще всего отрисовать при поиощи пакета ggplot2
.
library(ggplot2)
x1 <- rnorm(n = 50, mean = 10, sd = 2)
y1 <- rnorm(n = 50, mean = 10, sd = 2)
x2 <- rnorm(n = 50, mean = 5, sd = 2)
y2 <- rnorm(n = 50, mean = 5, sd = 2)
db <- data.frame(x = c(x1,x2),
y = c(y1, y2),
group = as.factor(rep(c(1,2), each = 50)))
qplot(x, y, data = db, colour = group)
Государственные банки - это банки, котрыми владеет государство, государственные компании, или госудасртвенные банки. Понятие владение означает наличие доли у владеющей компании не менее 50% акций + 1.
#REGN банков, которые можно назвать госудасртвенными
gos <- c(1481, 1623, 1000, 2168, 650, 2748, 3349, 354, 2403, 2790, 1088, 3360,
3340, 3466, 1950, 2312, 1911, 1942, 1470, 3287, 843, 2590, 708, 2306,
2546)
sber <- 1481
Необходимо собрать информацию по депозитам и кредитам в разрезе ФЛ и ЮЛ. Найти общий объем показателей, найти объём, которые принадлежит госбанкам и отдельно Сберу. Найти доли на каждую дату.
нарисовать 4 графика: 1) депозиты физиков 2) депозиты юриков 3) кредиты физиков 4) кредиты юриков
Подписать доли, название графика, откуда данные.
Тут будет пример графика.
Отчет должен быть написан в Rmd. Коды не скрывать, вывод не скрывать. Должно быть описание того:
Под регулярными выражениями понимаются выражения для работы с текстом. Иногда необходимо искать некие шаблоны (чтобы имя файлы было особенным, или начиналось с определённого символа) и тд.
Функции для работы с текстом:
grep
, grepl
- поиск (первая выдает позиции, вторая выдает T/F)
pattern
- что искать (тут как раз и испоьзуются регулярные выражения).x
- где искать (вектор, где каждый элемент, например, название файла)pattern
- что искатьreplacement
- на что заменятьx
- где искатьПример. Если необходимо найти картинки (с раширением png
).
# x - список всех имен файлов какой-то папке.
grep(pattern = "\\.png$", x = x, ignore.case = T)
\\.
- означает просто .
, но просто нельзя указать, так как точка является вспомогательным выражением (означает 1 любой символ), потому перед ней стоит \\
.
$
означает, что это в конце строки. ^
означает начало строки.
Подробно можно это посмотреть:
MarkDown - упрощённый язык для вёрстки (разметки) текста.
На основе MarkDown был сделан RMD.
Примеры.
# Заголовок 1
## Заголовок 1.1
Это просто текст, а это *курсив*, а это **жирный**
Чтобы вставить код R, надо использоваться "`" 3 раза и затем {r}.
Чтобы вставить формулу надо использоваться $$formula$$. Между двойными знаками $
используется синтаксис LaTex.
Примеры формул \(\LaTeX\) можно глянуть тут: sharelatex