пʼятницю, 13 липня 2012 р.

RMongo. Використовуємо для аналізу Crunchbase R та MongoDB

Працювати з MongoDB використовуючи R можна викостовуючи пакети RMongo та rmongodb. RMongo - клієнт для MongoDB.



Використовує mongo-java-driver.
Вимоги: R (>= 2.11.0), Java (>= 1.6), MongoDB (>= 1.6).
Залежить від пакету  rJava.
Після оновлення RStudio до найновішої версії виникла наступна проблема з встановленням rJava:
Error : .onLoad failed in loadNamespace() for 'rJava', details:
call: dyn.load(file, DLLpath = DLLpath, ...) error: unable to load shared object '/home/nastya/R/library/rJava/libs/rJava.so': libjvm.so: cannot open shared object file: No such file or directory Failed with error: 'package 'rJava' could not be loaded'

Була вирішена виконанням:
sudo apt-get install r-cran-rjava
sudo R CMD javareconf

Далі працюємо в RStudio. Встановлюємо пакет та підключаємо його:
install.packages("RMongo")
library("RMongo")
З'єднуємося з базою crunch, яка розміщена на локальній машині, порт по замовчуванню. Ця база містить дані з cruncbase (каталог технологічних компаній):
mongo <- mongoDbConnect("crunch")
Отримуємо перелік колекцій (таблиць у реляційних СКБД):
> collections <- dbShowCollections(mongo)
> collections
[1] "system.indexes" "company" 
Отримати всі дані про 10 компаній, які були засновані у період 2000 -2011  можна скориставшись командою:
opened <- dbGetQuery(mongo, "company", "{'founded_year': {'$gte':2000, '$lt':2012}}",0,10)

Аргументи команди:

  • об'єкт mongo, створений при під'єднанні до бази
  • назва колекції
  • запит
  • кількість об'єктів, які треба пропустити перед виконанням (по замовчуванню 0)
  • кількість об'єктів, які треба вибрати (по замовчуванню 1000)

Тут стикаємося з проблемою: результат приводиться до датафрейму, а документи (рядки) містять в собі вкладені підструктури (детальніше можна переглянути на прикладі Twitter тут http://api.crunchbase.com/v/1/company/twitter.js). Ці підструктури коректно до датафрейму не приводяться. Тому слід будувати такі запити, які будуть виводити лише плоскі стркутри. В нашому випадку можна отримати не всю інформацію про компанії, а лише назву та рік заснування:
opened<- dbGetQueryForKeys(mongo, "company", "{'founded_year': {'$gte':2000, '$lt':2012}}", "{'name': 1, 'founded_year':1}", 0, 95000)

Аргументи команди:

  • об'єкт mongo, створений при під'єднанні до бази
  • назва колекцій
  • запит
  • ключі  - набір полів, які треба вивести (для них вказуємо значення 1 або true)
  • кількість об'єктів, які треба пропустити перед виконанням (по замовчуванню 0)
  • кількість об'єктів, які треба вибрати (по замовчуванню 1000)
В результаті отримаємо датафрейм,який містить 43833 рядки такого змісту:

X_idfounded_yearname
14ff202ecd410022b230000002005Wetpaint
24ff202edd410022b230000022005Zoho
34ff202eed410022b230000032004Digg
44ff202efd410022b230000042004Facebook
54ff202f0d410022b230000052003Photobucket, Inc.
64ff202f0d410022b230000062005Omnidrive
74ff202f1d410022b230000082006Geni
84ff202f5d410022b2300000d2003Gizmoz
94ff202f9d410022b230000132006Wis.dm
104ff202f3d410022b2300000b2006Twitter
114ff202f4d410022b2300000c2002StumbleUpon
124ff202f6d410022b2300000e2007Scribd
Якою була динаміка створення компаній? Для відповіді на це питання побудуємо графік, де кількість заснованих компаній згрупована по роках:

barplot(table(opened$founded_year), main = "Засновані компанії", xlab = "Рік", ylab = "Кількість" )


Бачимо, що в 2010 був пік росту. Які саме сфери дали цей ріст? Щоб відповісти на це питання, потрібно вибрати з бази для кожної компанії крім року заснування ще й сферу, у якій працює (чи працювала ця компанія):
fieldssphere <- dbGetQueryForKeys(mongo, "company", "{'founded_year': {'$gte':2000, '$lt':2012}}", "{'name': 1, 'founded_year':1, 'category_code':1}", 0, 95000)
Згрупуємо отримані дані за роком заснування та сферою:
fieldsbyyear <- aggregate(openedsphere, by = list(openedfields$founded_year, openedfields$category_code), FUN = length)
Побудуємо графік для кожної сфери:
library(lattice)
xyplot(fieldsbyyear$X_id ~ fieldsbyyear$Group.1| fieldsbyyear$Group.2, 
       type = "b",
       xlab = "Рік", ylab = "Кількість", main = "Розподіл по галузях")
Бачимо, що найбільший внесок у стрімке зростання технологічний компаній дали такі області як веб, розробка програмного забезпечення, мобільні технології, електронна комерція, відео-ігри та реклама. 
Але далеко не всі стартапи є успішними. Хтось отримує фінансування, хтось ні. Деякі стартапи здатні розвинутись у велику технологічну компанію, інші ж швидко продаються. З допомогою пакету RMongo зробити аналіз інвестицій, на жаль, не вдасться, оскільки він не підтримує роботу з документами, які мають складну вкладену підструктуру, яку неможливо коректно привести до датафрейму. Але вихід є: rmongodb. Про роботу з цим пакетом у наступній статті.

Немає коментарів:

Дописати коментар