メインコンテンツへスキップ

Rを使用してデータから洞察を得る Mendix アプリケーション

Rを使用してデータから洞察を得る Mendix アプリケーション

述べたように ODataサポートに関するブログ記事 MendixODataは、アプリケーション内のデータにアクセスしたい場合にも便利です。 R or Rstudioこのブログ記事では、その方法を説明します。また、R に馴染みのない人向けに、R の使い方の簡単な例もいくつか紹介します。

Rとは何ですか?

R は、多くのデータ サイエンティストが使用する、非常に人気のあるオープン ソースの統計分析プログラミング言語です。無料のオープン ソース バージョンをダウンロードできますが、Microsoft Revolution R、Tibco Spitfire、Pivo​​tal、Oracle、Tableau など、多くの商用ツールでも R がサポートされています。R の興味深い点は、使用できるライブラリが多数あることです。ライブラリは、データ操作アルゴリズムからグラフ作成、レポート作成、機械学習まで多岐にわたります。

OData を R にロードする

OData を R に取得するには、次の 2 つのパッケージを使用します。 httr および XML最初のパッケージを使用すると Web からデータを読み取ることができ、2 番目のパッケージを使用すると XML ドキュメントを解析できます。

これらのパッケージを使用する小さな関数を使用すると、OData リソースを取得して R データに変換できます。

dataset <- getODataResource(<url of the odata resource>,<username>,<password>)

始める前に、必要なライブラリを指定する必要があります。

library('httr')
library('XML')
library('dplyr')
library('lubridate')

getODataResource 関数は、まず OData リソースを読み取り、返された XML ドキュメントを Httr パッケージを使用して解析します。次に、属性の名前を決定し、値を取得して、値を含むデータ フレームを構築します。

getODataResource <- function(resourcePath,domain,usr,pwd){
  
  url <- paste(domain, resourcePath,sep="")
  # get the OData resource
  response <- GET(url,authenticate(usr,pwd))
  
  # parse xml docucument
  responseContent <- content(response,type="text/xml")
  
  # determine the names of the attributes
  xmlNames <- xpathSApply(responseContent,
      '//ns:entry[1]//m:properties[1]/d:*',xmlName, 
      namespaces = c(ns = "http://www.w3.org/2005/Atom",
        m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata",
        d="http://schemas.microsoft.com/ado/2007/08/dataservices"))
  
  # determine all attribute values
  properties <- xpathSApply(responseContent,'//m:properties/d:*',xmlValue)
  
  # cast the attributes values into a data frame
  propertiesDF <- 
      as.data.frame(matrix(properties,ncol=length(xmlNames),byrow=TRUE))
  
  # set the column names
  names(propertiesDF) <- xmlNames
  return(propertiesDF)
}

これは取得する必要がある基本的な機能です Mendix OData リソースを R にインポートします。現在の形式では、ネストされたデータ (たとえば、注文明細が注文にネストされた注文) は処理されません。また、OData リソースに含まれるデータ型情報も使用されません。代わりに、以下に示すように、いくつかの R 式を使用してデータ型を手動で指定します。

ユースケースの例

例 Mendix アプリケーションには、注文、顧客、住所のリソースがあります。R で都市ごとの注文数の概要を作成します。

まず、ODataリソースへの接続方法を定義します。 Mendix アプリケーション。

domain <- "http://localhost:8080/"
username <- "demo_reporter"
password <- "goSfcsDj00"[/bash]

The following will load all the objects in the customers and address entities into R data frames.

[bash]customers <- getODataResource("odata/Orders/Customers()",domain,username,password)
addresses <-  getODataResource("odata/Orders/Address()",domain,username,password)

注文については、1年2014月XNUMX日以降に作成された注文のみに関心があります。Rで注文日をフィルタリングすることもできますが、ODataリソースURLで指定することで、クエリを実行するオーバーヘッドを回避できます。 Mendix データベースからすべてのデータを転送し、 Mendix ランタイムを R に渡します。

orders <- getODataResource(
  "odata/Orders/Orders()/?$filter=OrderDate%20gt%20datetimeoffset'2014-01-01T00:00:00z'"
  ,domain,username,password)

データフレームには、 Mendix オブジェクトは、OData リソースを通じて取得されます。注文の最初の 5 つのレコードは次のようになります。

orders[1:5,c("OrderNumber","Order_Customer","OrderDate")]
##   OrderNumber   Order_Customer                OrderDate
## 1           1 2533274790395905 2015-01-18T10:32:00.000Z
## 2           2 2533274790395906 2014-01-30T07:01:00.000Z
## 3           3 2533274790395907 2014-04-16T13:15:00.000Z
## 4           4 2533274790395908 2014-09-19T07:52:00.000Z
## 5           5 2533274790395909 2015-01-14T07:28:00.000Z

データが揃ったので、正しいデータ型を使用していることを確認する必要があります。 Mendix IDはlongを使用して実装されます MendixR では double を使用できます。

customers$DateOfBirth <- ymd_hms(customers$DateOfBirth)
customers$ID <- as.double(customers$ID)
customers$Billing_Address <- as.double(customers$Billing_Address)
customers$Delivery_Address <- as.double(customers$Delivery_Address)

addresses$ID <- as.double(addresses$ID)

orders$ID <- as.double(orders$ID)
orders$Order_Customer <- as.double(orders$Order_Customer)
# for easy access, create separate columns with date and date time
orders$OrderDateTime <- ymd_hms(orders$OrderDate)
orders$OrderDate <- ymd(format(ymd_hms(orders$OrderDate),"%Y-%m-%d"))

次に、dplyr ライブラリを使用して、受信したデータを操作します。Dplyr を使用すると、通常のデータベースで SQL を使用して行うのとほぼ同じように、データのフィルタリング、新しい列の追加、特定の列の選択、行の並べ替えを行うことができます。

次の dplyr 式は、顧客、住所、注文のデータ フレームを結合します。

customerOrders <- customers %>%
  rename(CustomerID=ID) %>%
  left_join(addresses, by=c("Delivery_Address"="ID")) %>%
  select(CustomerID,Firstname,Lastname,City,Country) %>%
  left_join(orders, by=c("CustomerID"="Order_Customer")) %>%
  select(Firstname,Lastname,City,Country,OrderNumber)

このデータフレームの最初の行は次のようになります。

customerOrders[1:5,]
##   Firstname Lastname        City Country OrderNumber
## 1      Ivan  Freeman New Orleans      US           1
## 2      Ivan  Freeman New Orleans      US         499
## 3   Anthony Robinson    Brighton      US           2
## 4   Anthony Robinson    Brighton      US         500
## 5     Kaden Griffith  Bridgeport      US           3

これで、都市ごとの注文数を次のようにカウントできます。

cityOrderCount <- customerOrders %>%
  group_by(City) %>%
  summarize(OrderCount = n()) %>%
  arrange(desc(OrderCount))

結果:

cityOrderCount[1:5,]
## Source: local data frame [5 x 2]
## 
##           City OrderCount
## 1     New York         28
## 2 Philadelphia         16
## 3      Chicago         15
## 4        Miami         12
## 5    Baltimore         10

グラフの作成

次の例では、ggplot2 を使用してグラフを作成します。グラフ作成には他のライブラリを使用することもできますが、ggplot2 は最も人気があるものの XNUMX つです。

まず、月ごとの注文数をプロットする簡単な BART チャートから始めます。

library('ggplot2')

# Determine first day of month for every order, count number of orders per month

orderCount <- orders %>%
  # Determine date of first day of the month, so ggplot understands it's a date
  mutate(OrderMonth = ymd(format(OrderDate,"%Y-%m-01"))) %>%
  group_by(OrderMonth) %>%
  summarize(noOfOrders = n())

# generate barchart to display number of orders per month

ggplot() +
  geom_bar(data=orderCount,aes(x=OrderMonth,y=noOfOrders), stat="identity") +
  xlab("Month") + 
  ylab("Number of orders") + 
  ggtitle("Orders per month")

月間注文数チャート

次に、週のどの時期に注文が行われるかを確認したいと思います。まず、すべての注文の曜日と時刻を含むデータセットが必要です。

ordersPerWeekHour <- orders %>%
  mutate(DayOfWeek = wday(OrderDate)) %>%
  mutate(HourOfDay = hour(OrderDateTime)) %>%
  group_by(DayOfWeek,HourOfDay) %>%
  summarize(noOfOrders = n())

さて、実際のグラフでは、 タイル面 毎日の時間ごとの注文数を表示します。X 軸に日、Y 軸に時間を設定し、注文数によって表示される色を決定します。

ggplot(ordersPerWeekHour, aes(x=DayOfWeek,y=HourOfDay))+
  geom_tile(aes(fill=noOfOrders)) +
  scale_fill_gradient(low="green", high="red") + 
  scale_x_continuous(breaks=1:7,labels=c("Sun","Mon","Tues","Wed","Thurs","Fri","Sat")) + 
  scale_y_continuous(breaks=0:24) +
  labs(x="Day", y="Hour")

注文数ヒートマップ

注文のほとんどが 16:00 から 22:00 の間に行われ、週のすべての曜日に均等に分散されていることが簡単にわかります。

Rを使用してレポートを生成する

Rには興味深いレポート機能があります。 Rマークダウン、R レポートから直接 HTML、Word、PDF、さらにはスライドを生成することもできます。

このブログ記事は、実際にはrmarkdownを使用してMS-Word文書を生成して書かれました。Word文書を最新のデータで更新するには、 Mendix アプリケーションの場合は、rmarkdown スクリプトを再実行するだけです。

Rmarkdown を使用する最も簡単な方法は、RStudio の組み込み機能を使用することです。または、RStudio を使用せずに R コードを使用して Rmarkdown レポートを生成することもできます。

library(knitr) # required for knitting from rmd to md
require(rmarkdown) # required for md to html
setwd('<location of your rmarkdown file>')
render("<name of the rmarkdown script>", "all")

まとめ:

OData機能は Mendix 多くの可能性が開かれる Mendix ユーザー。Rは統計分析とデータレポートのための強力なツールです。ODataの使用 Mendix ユーザーはこれらすべての機能を簡単に利用できるようになります。


言語を選択してください