<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Rittman Mead Consulting &#187; Real-Time Decisions</title>
	<atom:link href="http://www.rittmanmead.com/category/real-time-decisions/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.rittmanmead.com</link>
	<description>Delivering Oracle Business Intelligence</description>
	<lastBuildDate>Mon, 06 Feb 2012 21:18:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>Using Oracle Real-Time Decisions to Automate Business Decisions</title>
		<link>http://www.rittmanmead.com/2008/03/using-oracle-real-time-decisions-to-automate-business-decisions/</link>
		<comments>http://www.rittmanmead.com/2008/03/using-oracle-real-time-decisions-to-automate-business-decisions/#comments</comments>
		<pubDate>Sat, 01 Mar 2008 18:22:52 +0000</pubDate>
		<dc:creator>Mark Rittman</dc:creator>
				<category><![CDATA[Real-Time Decisions]]></category>

		<guid isPermaLink="false">http://www.rittmanmead.com/2008/03/01/using-oracle-real-time-decisions-to-automate-business-decisions/</guid>
		<description><![CDATA[As well as being useful for call center applications where cross-selling offers have to be generated, Oracle Real-Time Decisions can also be used in general business situations where a decision has to be made, but you don&#8217;t have perfect knowledge of all the factors. For example, you might want to make a decision about whether [...]]]></description>
			<content:encoded><![CDATA[<p>As well as being useful for <a href="http://www.oracle.com/technology/obe/obe_bi/rtd/rtd.htm">call center applications</a> where cross-selling offers have to be generated, <a href="http://www.oracle.com/applications/crm/siebel/business-analytics/real-time-decisions.html">Oracle Real-Time Decisions</a> can also be used in general business situations where a decision has to be made, but you don&#8217;t have perfect knowledge of all the factors. For example, you might want to make a decision about whether to refund a customer&#8217;s bank charges, and your general business goals might be to maximize revenue and minimize customer attrition, but you don&#8217;t really know what effect either refunding, or not refunding, a charge might have. If you can build up a model of what customers do when you do, or don&#8217;t refund a charge, and the circumstances around the refund request, then it&#8217;s conceivable that you could start to learn after a while when you should and when you shouldn&#8217;t give the customer their money back.</p>
<p>Or take, for example, a situation where you have a number of competing delivery companies that can deliver an order to a customer. On the face of it, they&#8217;re all pretty much the same &#8211; each one claims it&#8217;ll get the delivery to the customer on time &#8211;  and whilst they charge different amounts for their service, keeping our costs to a minimum isn&#8217;t always the most important thing, if we&#8217;re looking to build customer loyalty as well.</p>
<p>So, we&#8217;re in a situation where every company claims to do the same thing, but you know that in reality some will perform better than others in different situations. How do you make a decision on which delivery company to use then, when you&#8217;ve got competing business goals, a bunch of suppliers that perform differently in different situations, and you&#8217;ve got to make a decision when you don&#8217;t have perfect knowledge of all the factors?</p>
<p>This is where a tool like Real-Time Decisions comes in. Using Real-Time Decisions, we can set up a process that receives the order details, takes into account the context of the order (the day of week for example), factors in, for example, the fact that you want to in general offer better service to premium customers, and the builds up a model that records what actually happens, correlates this with the details of the order, and gradually builds up an model that can predict, given your business goals and the context, what the best delivery firm would be for a particular order.</p>
<p>So how do we set up Real-Time Decisions (RTD) to put this all in place? The first step is to start up Oracle RTD Studio, define a new Inline Service, and create an &#8220;entity&#8221; to hold the details of the order.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdbp1.jpg"></p>
<p>This entity will allow RTD to consider the city that the order is being delivered to, whether the customer is a premium customer or not (so that we can treat them slightly differently), what day of week the order is placed, the value of the order and the size of the package, in case these factors turn out to influence the outcome of the delivery. When a decision needs to be made, the calling application will contact RTD, pass across the order ID and these bits of information, and they&#8217;ll then be persisted in RTD until the decision process is complete.</p>
<p>The next thing we need to do is to create some inputs into the RTD decision process. These inputs are called &#8220;informants&#8221; and we create one for the start of each individual decision process, for when we pass across the details of the order, and for when the decision process completes. We also create another one, which we&#8217;ve called &#8220;Supplier Feedback&#8221;, that we let us pass feedback into the decision so we can tell whether the decision we made turned out to be the right one &#8211; this feedback loop is key to how RTD works and allows us to create a &#8220;self-learning model&#8221; that gets more accurate the more decisions it makes and feedback it receives.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdbp2.jpg"></p>
<p>Each one of these informants has input parameters, which in the case of the start and end informants is just the order ID, but in the case of the one that receives details of the order, consists of the list of order details that gets passed through from the calling application.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdbp3.jpg"></p>
<p align="center">
<p>Each of these input variables is tied back to the session variables set up when the decision process started, so that&#8217;s available later on when a choice needs to be made.</p>
<p>Now that we&#8217;ve got some inputs into the decision process, it&#8217;s time to start setting out the choices that can be made. First of all is the list of delivery companies we can choose from, which we enumerate in the application under the heading of a &#8220;choice group&#8221;.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdbp4.jpg"></p>
<p>Each of these choices can have attributes assigned to them, such as an ID code, a description and so on.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdbp5.jpg"></p>
<p>We then do the same for the days of week, the size of packages and the cities we deliver to, with all of these choices and options being enumerated in the application so that we can assign outcomes and probabilities to them later on.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdbp6.jpg"></p>
<p><strong>UPDATE :</strong> You don&#8217;t actually have to define choices and choice groups for these input variables, you only really need this for the things the decision is going to choose from &#8211; in statistical terms, the &#8220;dependent variables&#8221;. As long as the package size, city and so on are in the session variable, RTD will be able to correlate them to the choice that&#8217;s selected, so you don&#8217;t even need the choice models that I mentioned just below. &#8211; MR</p>
<p>Now, as we&#8217;re looking to create a self-learning model that detects correlations between, say, the day of week and whether a certain delivery company actually delivers on time, we need to create a way of storing for a particular order what day the deliver was booked on, what size of parcel it was and so on. To do this we create a number of &#8220;Choice Models&#8221; that are used to record what city was delivered to, what day of the week the order happened, anything that we feel might influence the outcome of the delivery.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdbp7.jpg"></p>
<p>To set up the mechanism where these models are populated with data, we add a bit of Java code to the informant that receives the customer order details, using a CASE statement to add the relevant choice to the model.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdbp8.jpg"></p>
<p>Now that we&#8217;ve got some inputs into the decision process, and a way of recording the details of each order, it&#8217;s time to think about the decision we&#8217;re going to take, which is what delivery company to use for a particular order. Now the decision we&#8217;re going to take its going to depend on a number of factors;</p>
<ul>
<li>whether the customer is &#8220;premium&#8221; or not &#8211; if they are, we probably want to get them their order a bit faster</li>
<li>the price each delivery company charges</li>
<li>the reliability of each delivery firm based on whether it deliverers &#8220;first time&#8221;</li>
</ul>
<p>Leaving aside the issue of premium customers for the moment, the price and reliability factors can be boiled down to a couple of performance goals</p>
<ul>
<li>cost, which we will want to minimize, and</li>
<li>chance of delivering on time, which we want to maximize</li>
</ul>
<p>So the next step then is to put these performance goals into the model &#8211; later on, we&#8217;ll assign priorities to these, which we can vary for different segments of customers.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdbp9.jpg"></p>
<p>Now we&#8217;ve got some performance goals, we can score each of the suppliers against them. The cost of each service we can add now, the chance of delivery we&#8217;ll add later once we add functionality to predict it into the model.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdbp9a.jpg"></p>
<p>So now we&#8217;ve got some inputs, and some business goals and scores against these for each delivery firm, we can tell RTD that we want to make a decision. To do this, we define a decision that specifies weighting for the performance goals, which can be different for different customer segments. In this case, we&#8217;ve only got a single performance goal that&#8217;s being populated, so we make the decision 100%-based on the cost of the service, and we don&#8217;t distinguish between regular and premium customers.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdbp10.jpg"></p>
<p>Now that we&#8217;ve defined this decision, we can create an &#8220;Advisor&#8221;, an output from the decision process that takes a decision and sends it back to the calling application.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdbp12.jpg"></p>
<p>As well as using the decision we just defined, we also define a random decision as well, which we&#8217;ll use every so often to see whether the models we&#8217;re building up are actually improving the accuracy of the decision.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdbp13.jpg"></p>
<p>So that we can record what decision was actually made for this order, which we can tie back to the factors that defined the order, we add another bit of Java logic, this time to the Advisor, to record the decision.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdbp14.jpg"></p>
<p>So, so far, we&#8217;re at the point where we&#8217;ve achieved the following:</p>
<ol>
<li>Details of an order come in, we record which city it&#8217;s to, the day of the week and so on</li>
<li>We&#8217;ve got a set of delivery firms, and a set of performance goals, which at the moment is just to minimize the cost of the delivery</li>
<li>We&#8217;ve scored the delivery firms against this goal, and</li>
<li>Set up a decision that chooses a delivery firm based on this goal.</li>
</ol>
<p>In real-life though, price isn&#8217;t the only factor that&#8217;ll we&#8217;ll base our choice of delivery firm on though. We also want to consider how likely it is they&#8217;ll get the delivery to the customer on time, something that depends on the choice of delivery company, where they are delivering to, how big the parcel is and so on. Some firms may deliver well to Manchester and not to London, some firms might be overwhelmed at the start of the week but deliver on time towards the end. Others may handle big parcels worse than small ones, all of which leads to a situation where it&#8217;s pretty hard to judge in advance which delivery firm is most likely to deliver on time. Where RTD comes in though is that we can set up another type of model, called a &#8220;Choice Event Model&#8221;, that records events against a choice, in this case a delivery company, and over time correlates deliveries placed, and deliveries that are then on time, with the order factors we recorded earlier &#8211; parcel size, day of week and city. </p>
<p>Now, for each delivery we make, we&#8217;ll record whether the delivery happened first time, or whether the customer needed to contact the delivery firm and arrange delivery for a second or third time. Crucially, we&#8217;ll record this feedback on the delivery and use it to &#8220;learn&#8221; which delivery company actually delivers well based on the city, day of week and size of the parcel.</p>
<p>To do this,  I go back to the application and define the new Choice Event Model This new type of model takes two events that I assign to suppliers, &#8220;Assigned Work Order&#8221; and &#8220;Delivered On Time&#8221;, and records these bits of information for each delivery that takes place.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdbp16.jpg"></p>
<p>In case you&#8217;ve not already guessed, this is where the &#8220;data mining&#8221; part of RTD comes in. For this Choice Event Model, I tell RTD to use it for prediction, so that it starts to correlate successful and unsuccessful deliveries with the city, package size and day of week that the order takes place, and I add another Informant, this time to feed back to the Choice Event Model whether the order actually arrived on time.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdbp17.jpg"></p>
<p>Again, I add a bit of Java logic to add the feedback to this new model.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdbp18.jpg"></p>
<p>Now I can go back to the performance goal scores for each supplier, and tell it to calculate each one&#8217;s reliability score based on the DeliveryOnTime Choice Event Model I created earlier.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdbp19.jpg"></p>
<p>So now my model has two performance goals; one is static and is based on the price each charges, another evolves over time as we get actual feedback from each delivery on whether the delivery actually reached the customer on time. All that&#8217;s left now is to go back to the decision I created earlier and include this new performance goal in the decision. For standard customers, I&#8217;ll give equal weight to cost reduction and reliability maximization.</p>
<p align="center"><<img src="http://www.rittmanmead.com/images/rtdbp20.jpg"></p>
<p>For our premium customers though, I&#8217;ll create another segment where cost reduction is downplayed and chance of delivering on time in emphasized.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdbp21.jpg"></p>
<p>So now we&#8217;re ready to go. RTD comes with a load generator that lets you define a script that passes values to the RTD decision process, where you can weight the input variables so that, for example, only 20% of customers are premium and 70% of deliveries happen on time. Running this load generator gives us some basic information to add to the model.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdbp22.jpg"></p>
<p>Although the values going into the decision process are random, after a while we&#8217;ll start to get some skew which will mean certain choices get made more than others, and we&#8217;ll start to get a bit of correlation between input variables and delivery outcomes. To check this out, I start up a web-based console called RTD Decision Center to see how decisions have played out so far.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdbp23.jpg"></p>
<p>Taking a look at the distribution of orders, we can see that most have gone to Economy Parcels, who just happen to charge the least for delivering. As the load generator script has assigned a 70% chance of delivering on time to all suppliers, one delivering more reliably than another hasn&#8217;t had a chance to impact the decision, but if, for example, Express Delivery turned out to deliver more reliably than all the others, it would end up getting selected more and more times.</p>
<p>Using Decision Center I can take a look at which order attributes were most significant for the outcome we&#8217;re trying to predict &#8211; delivery on time &#8211; so that over time, we can start to understand that the day of the week and the city are the two things that most determine whether a particular company would deliver on time, so that in future, if we have that particular day and need to deliver to that particular city, we&#8217;ll know which supplier is most likely to help us meet our business goals.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdbp24.jpg"></p>
<p>So there you go, we&#8217;ve used RTD and it&#8217;s self-learning predictive models to work out, based on the history of previous deliveries against a wide range of different scenarios, which delivery firm to use in a particular situation. I wouldn&#8217;t say I&#8217;m an expert at this &#8211; part of the skill in setting this sort of thing up is to work out how much information, or &#8220;rules&#8221; to feed in to the model and how much you should let it work things out itself, part of it is working out what we should be trying to predict in the first place &#8211; but it&#8217;s certainly an interesting technology and a good example of BI becoming &#8220;pervasive&#8221; and helping business decision making.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rittmanmead.com/2008/03/using-oracle-real-time-decisions-to-automate-business-decisions/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Five Oracle BI Trends for the Future</title>
		<link>http://www.rittmanmead.com/2007/10/five-oracle-bi-trends-for-the-future/</link>
		<comments>http://www.rittmanmead.com/2007/10/five-oracle-bi-trends-for-the-future/#comments</comments>
		<pubDate>Fri, 05 Oct 2007 21:02:32 +0000</pubDate>
		<dc:creator>Mark Rittman</dc:creator>
				<category><![CDATA[Hyperion]]></category>
		<category><![CDATA[Oracle BI Suite EE]]></category>
		<category><![CDATA[Oracle OLAP]]></category>
		<category><![CDATA[Real-Time Decisions]]></category>
		<category><![CDATA[User Groups & Conferences]]></category>

		<guid isPermaLink="false">http://www.rittmanmead.com/2007/10/05/five-oracle-bi-trends-for-the-future/</guid>
		<description><![CDATA[I gave a BI keynote (pdf copy of slides) at a couple of events last week (the Business Intelligence, Warehousing and Analytics Summit in Reston, VA and the OUG Scotland Conference &#038; Exhibition, Glasgow), and as it&#8217;s been picked up on the Eye on Oracle blog site, I thought that it&#8217;s worth giving a bit [...]]]></description>
			<content:encoded><![CDATA[<p>I gave a BI keynote (<a href="http://www.rittmanmead.com/files/BIWA%20Keynote.pdf">pdf copy of slides</a>) at a couple of events last week (the Business Intelligence, Warehousing and Analytics Summit in Reston, VA and the OUG Scotland Conference &#038; Exhibition, Glasgow), and as it&#8217;s been <a href="http://eyeonoracle.blogs.techtarget.com/2007/10/03/five-key-business-intelligence-bi-trends-from-mark-rittman/">picked up on the Eye on Oracle blog site</a>, I thought that it&#8217;s worth giving a bit of background to the five Oracle BI trends I highlighted in the talk. I also went through a bit of a potted history of Discoverer, OWB and Oracle BI Suite Enterprise Edition, I&#8217;ll leave that for the moment but keep an eye on the blog for a posting on this.</p>
<p>Anyway, as a bit of background the last couple of years have seen an unprecedented amount of new products, BI acquisitions and new announcements from Oracle, including the announcement of Siebel Analytics being the go-forward strategy for Oracle&#8217;s BI platform, the acquisition of Hyperion, the release of Oracle Database 11g, the inclusion of Oracle BI in Fusion Middleware and the move towards standards and hot-pluggability. Although it&#8217;s been two years of near constant change, in my opinion this is only just the start and what we&#8217;ll be seeing over the next eighteen to twenty-four months will significantly change and impact the world of Oracle BI developers and customers.</p>
<p>Starting with the most probable and going through to more longer-term, &#8220;visionary&#8221; things, here&#8217;s five key Oracle BI &#038; data warehousing trends to look out for over the next couple of years:</p>
<p><b>1:  Convergence and Interoperability</b></p>
<p>Over the late-10g timeframe and the whole 11g timeframe, Oracle&#8217;s Standard Edition and Enterprise Edition tools will increasingly interoperate. Already, <a href="http://www.rittmanmead.com/2007/09/09/integrating-bi-publisher-and-discoverer/">BI Publisher can use Discoverer worksheets as a data source</a>, and <a href="http://www.rittmanmead.com/2007/09/07/integrating-oracle-bi-answers-and-oracle-portal/">Answers reports can be embedded in an Oracle Portal page</a>. Going into the 11g timeframe, Discoverer reports will be able to be scheduled using Delivers, with Delivers alerts being able to be based off of Discoverer worksheets as well as Answers requests.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/trends1.jpg" alt="" /></p>
<p>OWB11gR2 is scheduled to include functionality to enable you to <a href="http://www.oracle.com/technology/products/warehouse/pdf/TWP_BIDW_OWB_Roadmap_1006.pdf">create and load the Oracle BI EE metadata layer</a>, and Oracle BI EE will support Essbase as both a data source and data target. The 11g release the Oracle Database moves OLAP metadata directly into the database data dictionary, whilst <a href="http://www.oracle.com/technology/products/bi/olap/pdf/olap-11g-datasheet.pdf">Oracle OLAP analytic workspaces</a> will quality for query rewrite and are refreshable using standard materialized view refresh functions. Later on, you can imagine Discoverer worksheets being embedded directly within Oracle BI EE dashboards, and Oracle OLAP analytic workspaces being created, updated, inserted into and managed using standard SQL DDL and DML functions.</p>
<p><b>2:  Developer Adoption of Hyperion FPM Applications and Platform</b></p>
<p>If like me, you initially thought that the Hyperion acquisition wouldn&#8217;t mean much to you, recent announcements by Oracle (listen to <a href="http://ioug.itconvergence.com/pls/apex/DWBISIG.download_my_file?p_file=885.">this podcast</a> by Joe Thomas, Oracle Snr. Director of BI Applications) indicate that in time, the <a href="http://www.rittmanmead.com/category/hyperion/">Hyperion tools</a> and Oracle&#8217;s BI tools will share a common infrastructure and technology foundation. Release 10.1.3.3.1 of Oracle BI EE will support Essbase and possibly Hyperion SmartView as OBIEE clients, with Essbase also becoming a supported datasource through it&#8217;s XML/A interface. </p>
<p align="center"><img src="http://www.rittmanmead.com/images/trends2.jpg" alt="" /></p>
<p>In time, the OBIEE metadata layer will contain metrics, KPIs and other Essbase and Oracle OLAP calculations, with Oracle&#8217;s eventual vision being an integrated business intelligence platform that supports both financial and operational business intelligence, As this vision starts to take hold, it will be increasingly easy for developers to extend their Oracle BI knowledge to such areas as planning, budgeting and financial consolidation, with a common technology platform, metadata layer and reporting UI providing a common, consistent user experience for developers and customers.</p>
<p><b>3:  OLAP Resumes Central Role in Oracle BI Platform</b></p>
<p>This is one that&#8217;s dear to my heart. The past few years have seen a bit of a de-emphasis on OLAP within Oracle business intelligence, with a lack of viable OLAP query and reporting tools (Oracle Discoverer for OLAP frankly not being up to the job) and an emphasis instead on relational reporting &#8211; BI Publisher, Discoverer relational and Oracle Answers.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/trends3.jpg" alt="" /></p>
<p>Now though, the tide is likely to change with a revolutionary release of Oracle OLAP and the bringing into the fold of Hyperion Essbase. Oracle OLAP is being positioned as a &#8220;data warehouse supercharger&#8221; with Oracle aiming for a high percentage of it&#8217;s data warehousing customers to install Oracle OLAP and transparently speed up their relational data warehouse queries. For those customers looking for a standalone OLAP server, and for mutli-dimensional query tools and an Excel interface that supports XML/A and MDX, Essbase will be positioned as both a standalone solution, as part of the Hyperion FPM stack and as a way of adding analytics, KPIs and multi-dimensional calculations to the Oracle BI Suite Enterprise Edition stack. For certain types of calculation and analysis, multi-dimensional OLAP technology will always be faster than relational, and now that Oracle have got all of their ducks in a line when it comes to OLAP, expect to see greater and greater emphasis on this option within Oracle&#8217;s BI foundation layer.</p>
<p><b>4:  BI Becomes Pervasive and Embedded</b></p>
<p>Looking further into the future, demand for BI will only increase but not neccessarily in the form of reports, crosstabs, standalone systems and graphs. For the moment, BI is still a minority interest within organizations and whilst 5% of the company might be trained up on Discoverer and have the time and inclination to learn a tool most people have a job to do and cannot afford the context switch that&#8217;s needed to go from their normal applications to a BI tool. For the vast majority within an organization, if you can take the value, analytics and smarts within your BI system and embed it directly within their business processes and business applications, you can &#8220;bring BI to them&#8221; and deliver it within the context of their day to day work.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/trends4.jpg" alt="" /></p>
<p>What this means in practice is integration of Oracle BI with the wider world of Oracle Fusion Middleware, having <a href="http://www.rittmanmead.com/2007/06/30/obiee-soa-and-a-parrot-in-the-fireplace/">Oracle BI EE talk to your applications via Web Services</a>, having Oracle BI EE reports, metrics and conditions accessed from BPEL business processes, and embedding Answers and Discoverer reports and graphs directly in applications using technologies such as JSR-168. This is an area of BI that&#8217;s only just starting out, but has the potential to broaden the audience for BI from the analysts and planners to everyone within the organization.</p>
<p><b>5:  Decisions Become Automated</b></p>
<p>Lastly, and going into the future, you can see Oracle BI, and in particular tools like <a href="http://www.rittmanmead.com/category/real-time-decisions/">Real-Time Decisions</a> and Oracle Data Mining, being used to automate the actual decision-making process.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/trends5.jpg" alt="" /></p>
<p>At the end of the day, BI is generally used to help you make a more informed decision, and if you can use techniques such as predictive modelling, automated generation of models, positive feedback loops and statistical analysis to make faster, more accurate and more profitable decisions, you can see a future where many more mundane business decisions are taken using business intelligence and data mining tools, leaving us to make more strategic choices and setting performance goals based on broad business strategies.</p>
<p>Anyway, that&#8217;s just a few thoughts on some trends that will probably impact on the world of Oracle BI developers and customers, over the next couple of years., If you&#8217;ve got any thoughts on this, add a comment to the posting, otherwise in the next day or so I&#8217;ll put a posting together on the other part of the keynote, a potted history of some of Oracle&#8217;s BI tools.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rittmanmead.com/2007/10/five-oracle-bi-trends-for-the-future/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Creating a Real-Time Decisions Project : Day 7</title>
		<link>http://www.rittmanmead.com/2007/10/creating-a-real-time-decisions-project-day-7/</link>
		<comments>http://www.rittmanmead.com/2007/10/creating-a-real-time-decisions-project-day-7/#comments</comments>
		<pubDate>Fri, 05 Oct 2007 13:00:38 +0000</pubDate>
		<dc:creator>Mark Rittman</dc:creator>
				<category><![CDATA[Real-Time Decisions]]></category>

		<guid isPermaLink="false">http://www.rittmanmead.com/2007/10/05/creating-a-real-time-decisions-project-day-7/</guid>
		<description><![CDATA[Yesterday, I enhanced my Oracle Real-Time Decisions project to start providing cross-sell offers to customers who had ordered through the SOA Suite Order Bookings business process. Today, I&#8217;m going to take the acceptances, or rejections, from customers and feed then back into the model, so that future offers can take into account the preferences of [...]]]></description>
			<content:encoded><![CDATA[<p>Yesterday, I enhanced my Oracle Real-Time Decisions project to start providing cross-sell offers to customers who had ordered through the SOA Suite Order Bookings business process. Today, I&#8217;m going to take the acceptances, or rejections, from customers and feed then back into the model, so that future offers can take into account the preferences of customers over time.</p>
<p>The first step in this process is to define two choice events that are associated with the cross-sell group I defined yesterday. These two events represent the two events that are associated with presenting a cross-sell offer &#8211; what offer we made, and whether the offer was accepted. In a moment we&#8217;ll build a second model to help us predict the latter more accurately.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdnew19.jpg" /></p>
<p>So, now to create the associated Choice Event Model. I call the model &#8220;Offer Acceptance Predictor&#8221;, associate it with the set of cross-selling choices, give it a window of a week to base it&#8217;s predictions on (i.e. disregarding choices made more than a week ago), and tie it into the presented and accepted choice events I defined a moment ago.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdnew20.jpg" /></p>
<p>I then go back to the session entity definition and add an attribute to hold the name of the offer we&#8217;ve presented to the customer, and then return to the Get Cross Sell Offer and amend the advisor logic to record the offer within this new session attribute, using this Java code:</p>
<pre>
logInfo("Integration Point - Get Cross Sell Offer");
logInfo("  Customer status = " + session().getCustomer().getStatus() );// 'choices' is array returned by the 'Select Offer' decision
if (choices.size() &gt; 0) {
  //Get the first offer from array
  Choice offer = choices.get(0);
  //For the selected offer, record that it has been 'presented'
  offer.recordEvent("presented");
  //Set the session attribute 'OfferExtended' with the offer's ID.
  session().setOfferExtended(offer.getSDOId());
  logInfo("  Offer presented: '" + offer.getSDOLabel() + "'");
}</pre>
<p>
<p>The advisor that presents the offer to the customer now records the offer selected in the session variable. Next I want to create another informant, this time to record the response from the customer.</p>
<p>I call this new informant &#8220;Offer Feedback&#8221;, give it the customer ID key, set the external system name and informant order, and create an input variable which will hold the customer&#8217;s response.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdnew21.jpg" /></p>
<p>I then switch to the Logic tab and enter the following Java code to record positive responses.</p>
<pre>
logInfo("Integration Point - Offer Feedback");
//"yes" or "no" to accept offer.
String	positive = request.getPositive();
positive = positive.toLowerCase();

//Get the offer id from session attribute 'OfferExtended'
String extendedOfferID = session().getOfferExtended();
if (extendedOfferID != null) {
   //Get the offer from choice group 'Cross Selling Offer'
   Choice offer = CrossSellingOffer.getChoice(extendedOfferID);
   if (offer != null){
        String offerId = offer.getSDOId();
        //If response is "yes", then record the offer as accepted.
        if (positive.equals("yes")) {
            offer.recordEvent ("accepted");
            logInfo("  Offer '" + offer.getSDOLabel() + "' accepted");
        }
   }
}</pre>
<p>I then save and then deploy the project, to test out this new informant. Running the load generator again, and giving a 30%/70% weighting between offer acceptance and rejection, I can see that the offer feedback is being recorded correctly, and that at the moment, only extended warranties are being offered as they score the lowest in terms of cost.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdnew22.jpg" /></p>
<p>If I want to, I can adjust the cost scoring so that, for example, customers who have the &#8220;Gold&#8221; status on their account have the cost metric adjusted up so that it&#8217;s less likely to be recommended, for these customers we&#8217;d rather recommend something else.</p>
<p>To do this, I define a scoring rule that implements a condition that sets cost to 100 if the customer status is Gold, otherwise it sets it to 30, like this:</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdnew24.jpg" /></p>
<p>I then assign this rule to the Cost scoring setting for the Extended Warranty choice.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdnew25.jpg" /></p>
<p>Now, if I run the load generator again, I can see the offers being split between extended warranties and gift wrapping.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdnew26.jpg" /></p>
<p>So far so good. The final step now is to use the offer acceptance prediction model to influence the cross-sell offer choice, so that offers that are more likely to be accepted have a higher chance of being picked by RTD to present to the customer. To show this working, I&#8217;m going to create a new metric, &#8220;Revenue&#8221;, which I&#8217;m going to use in conjunction with the prediction model.</p>
<p>I add Revenue as a choice group attribute, alongside URL, description and agent script, and set values for this for all of the cross-sell choices. This will be the baseline revenue figure for each choice.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdnew27.jpg" /></p>
<p>I then define an additional performance goal, &#8220;Expected Revenue&#8221;, which I add to the existing &#8220;Minimize Cost&#8221; performance goal.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdnew28.jpg" /></p>
<p>Then, I go back to the score setting for the Cross-Sell Offer choice group and add in this performance goal, and set the scoring algorithm to multiply the base revenue for each choice by the chance of each choice actually being accepted, which is a value between 0 and 1 (0% and 100%)</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdnew29.jpg" /></p>
<p>Finally, I go back to the decision I created earlier and factor revenue into the decision, weighting the decision 50/50 between cost and revenue:</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdnew30.jpg" /></p>
<p>Now, when I run the load generator again, the choices are far more spread amongst the five options, as we now factor expected revenue into the choice which itself is adjusted over time as certain offers get accepted or rejected.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdnew31.jpg" /></p>
<p>So there we have it; we&#8217;ve created a feedback loop where customer acceptances and rejections over time are fed back into the predictive model and influence the cross-sell offers being presented to customers. Next week, I&#8217;ll take a look back at what we&#8217;ve built using Real-Time Decisions, and think again about how the ideas used in this particular real-time marketing project can be applied to our original scenario, deciding which supplier to use to fufill a customer order.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rittmanmead.com/2007/10/creating-a-real-time-decisions-project-day-7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creating a Real-Time Decisions Project : Day 6</title>
		<link>http://www.rittmanmead.com/2007/10/creating-a-real-time-decisions-project-day-6/</link>
		<comments>http://www.rittmanmead.com/2007/10/creating-a-real-time-decisions-project-day-6/#comments</comments>
		<pubDate>Thu, 04 Oct 2007 22:20:33 +0000</pubDate>
		<dc:creator>Mark Rittman</dc:creator>
				<category><![CDATA[Real-Time Decisions]]></category>

		<guid isPermaLink="false">http://www.rittmanmead.com/2007/10/04/creating-a-real-time-decisions-project-day-6/</guid>
		<description><![CDATA[Yesterday we got going with a slightly revised Oracle Real-Time Decisions project that we are using to come up with customer cross-sell offers after recieving orders via the Oracle SOA Suite Order Bookings demo. Today, we&#8217;ll look at generating cross-sell offers based on performance goals we define, such as maximizing revenue or minimizing costs. The [...]]]></description>
			<content:encoded><![CDATA[<p>Yesterday we got going with a slightly revised Oracle Real-Time Decisions project that we are using to come up with customer cross-sell offers after recieving orders via the Oracle SOA Suite Order Bookings demo. Today, we&#8217;ll look at generating cross-sell offers based on performance goals we define, such as maximizing revenue or minimizing costs.</p>
<p>The first thing I have to do is to create a cross-selling offer choice group, and then create some offers to present to the customer, like this:
<p align="center"><img src="http://www.rittmanmead.com/images/rtdnew11.jpg" alt="" /></p>
<p>Next, I need to create some performance goals, by which we&#8217;ll later on measure the various offers. The first performance goal is &#8220;Cost&#8221;, and I&#8217;ll set our objective to be to minimize this value.
<p align="center"><img src="http://www.rittmanmead.com/images/rtdnew12.jpg" alt="" /></p>
<p>I then go through each of the cross-selling offers and assign a cost score to them, telling RTD that some offers cost our organization more to offer than others. These costings can be made conditional, so for example it might cost us less to offer an extended warranty to older customers, who claim less, than to others. Later on, I&#8217;ll add Revenue in as another performance goal, and we&#8217;ll score each option based on it&#8217;s ability to contribute revenue.
<p align="center"><img src="http://www.rittmanmead.com/images/rtdnew13.jpg" alt="" /></p>
<p>I&#8217;m now at the point where I can create my first &#8220;decision&#8221;. Decisions use one particular set of performance goal weightings and feed back to the calling application the decision made by RTD. I create a new decision and call it &#8220;Cross Selling Offer&#8221;, I point it towards the cross-selling choice group, and place a 100% weighting on the cost reduction performance goal. Note how I can segment customers within this dialog &#8211; later on, I&#8217;ll use this to apply different weightings to different groups, emphazing cost reduction more for silver and bronze customers.
<p align="center"><img src="http://www.rittmanmead.com/images/rtdnew14.jpg" alt="" /></p>
<p>I then create another decision, this time a control group where I check the &#8220;select at random&#8221; box, to allow us to compare random results with results from the predictive model.</p>
<p>Now that I&#8217;ve created the decisions, I need to create an &#8220;Advisor&#8221; to send the offer recommendation back to the client. I therefore create an Advisor called &#8220;Get Cross Sell Offer&#8221;, select the predictive model decision and the control (random) decision, and then picked the extended warranty choice as the default offer.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdnew15.jpg" alt="" /></p>
<p>Next, I add some logic to the decision to output the offer that was presented to the customer:</p>
<pre>
logInfo("Integration Point - Get Cross Sell Offer");
logInfo("  Customer status = " + session().getCustomer().getStatus() );// 'choices' is array returned by the 'Select Offer' decision
if (choices.size() > 0) {
  //Get the first offer from array
  Choice offer = choices.get(0);
  logInfo("  Offer presented: '" + offer.getSDOLabel() + "'");
}
</pre>
<p></p>
<p>Then I deploy the inline service and test it out.</p>
<p>I simulate a call coming in from a customer who is &#8220;silver&#8221; status, and who is calling regarding a business order:</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdnew16.jpg" alt="" /></p>
<p>Then, when I run the advisor, this lucky customer gets offered an extended warranty, which just happens to be the lowest cost offer, and is therefore picked by the decision which currently is aiming to minimize costs as much as possible.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdnew17.jpg" alt="" /></p>
<p>Now, if I go back to the Decision Center web interface, I can see the revised Inline Service process flow:</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdnew18.jpg" alt="" /></p>
<p>Notice the step now where the cross-sell offer is generated, and that I&#8217;ve turned off the option to display the &#8220;Testing&#8221; informant that I created earlier, as it&#8217;s not really needed.</p>
<p>So, where we are now is that our Inline Service is generating offers, based a current business priority of minimizing cost. Tomorrow, we&#8217;ll add a feedback loop in to feed back customer acceptances, or rejections, of our offers into the model, so that future offers take into account the chance that the customer will take up, or not, the offer.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rittmanmead.com/2007/10/creating-a-real-time-decisions-project-day-6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creating a Real-Time Decisions Project : Day 5</title>
		<link>http://www.rittmanmead.com/2007/10/creating-a-real-time-decisions-project-day-5/</link>
		<comments>http://www.rittmanmead.com/2007/10/creating-a-real-time-decisions-project-day-5/#comments</comments>
		<pubDate>Thu, 04 Oct 2007 17:42:46 +0000</pubDate>
		<dc:creator>Mark Rittman</dc:creator>
				<category><![CDATA[Real-Time Decisions]]></category>

		<guid isPermaLink="false">http://www.rittmanmead.com/2007/10/04/creating-a-real-time-decisions-project-day-5/</guid>
		<description><![CDATA[OK, back to the drawing board a bit. After having worked through the first four sessions putting together an RTD Inline Service to select the most appropriate manufacturer for the Order Bookings BPEL process, it became increasingly clear that trying to put this particular scenario together for my first RTD project was a bit ambitious. [...]]]></description>
			<content:encoded><![CDATA[<p>OK, back to the drawing board a bit. After having worked through the first four sessions putting together an RTD Inline Service to select the most appropriate manufacturer for the Order Bookings BPEL process, it became increasingly clear that trying to put this particular scenario together for my first RTD project was a bit ambitious.</p>
<p>The problems boiled down to two things: firstly, the only full-scale, keypress-by-keypress example I had was the Oracle By Example CRM cross-selling project available for download on OTN, which although thorough didn&#8217;t map too well to the scenario I was working on. I do have a demo around order allocation using RTD, but it&#8217;s undocumented and a bit tricky to &#8220;reverse-engineer&#8221; when I&#8217;ve not put a proper, full-scale RTD system together before. So, rather than press on with things not being too clear, I thought I&#8217;d restart, but with a slightly simpler scenario that mapped easily onto the <a href="http://www.oracle.com/technology/obe/obe_bi/rtd/rtd.htm">OTN Cross-Selling example</a>.</p>
<p>So, in this revised scenario, our customer who has placed the order through the Order Bookings SOA Suite demo, gets a call from our customer service team after the order goes through. The aim of this call is to cross-sell them something, which they may or may not accept. We will use RTD to firstly, model the reasons the customers give for placing the order (a gift, a business purchase, a personal purchase, other), the various cross-selling things we might offer them (express delivery, free gift-wrapping, a voucher off their next purchase, an extended warranty, rechargeable batteries), and whether or not they take up the offer. Each offer will have a revenue figure and cost associated with it, and our performance goals will aim to maximize revenue and/or minimize cost, with different weightings given to these goals depending on which segment they belong to (gold, silver and bronze). So, still a fairly interesting scenario, but one that also maps well to the detailed steps on OTN, albeit with different data and choices so I&#8217;ll still need to think about how it gets implemented.</p>
<p>Going back to the start again, this time I define my data source as pointing to a CUSTOMER table, which brings across details of the customer status, credit card type, number of previous returns, previous highest order and the customer ID. I then define an entity which I map to this data source, like this:</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdnew1.jpg" alt="" /></p>
<p>I then define another entity, called CALL, that records the name of the agent, the length of the call, and the reason for the order. This entity, together with the customer entity, are then added as attributes to the session entity, whose key is defined as being the customer ID, like this:</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdnew2.jpg" alt="" /></p>
<p>I now create two External systems references, once for the Interactive Voice system (IVR) that calls the customer after they&#8217;ve placed the order, one for the CRM system that records details of the call.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdnew3.jpg" alt="" /></p>
<p>Next I create three informants: </p>
<ol>
<li>One to record the start of the call</li>
<li>One to record the reason for the order,length of call etc at end of customer service section (&#8220;Did the order go ok for you, is there anything else we can do&#8221; etc) and the name of the agent.</li>
<li>one to close the call off, at the end</li>
</ol>
<p>For the moment, I don&#8217;t add any logic to these, although for the second informant, I map the order reason, agent name and length of call to the Call element of the session entity, so they&#8217;re available to the rest of the process. </p>
<p>So now, I&#8217;m at the point where I was yesterday, but I&#8217;m putting an inline service together that&#8217;s more in line with RTD&#8217;s main purpose &#8211; making real-time marketing offers to customers, basing the offer on a model, and feeding their response back into the model at the end to make it more accurate. Later on in the week, I&#8217;ll come back to the original manufacturer selection problem and see how this can fit back to that.</p>
<p>So, now to move on. The next thing to do is to create the first of the two Choice Groups i&#8217;ll be working with. The first is the set of order reasons that the customer will provide, the second is the list of cross-selling offers I can present to the customer.</p>
<p>To do this, I create an Order Reason choice group, then associate the four order reason choices with it, assigning each of them an ID number that will eventually get stored in the order reasons model:</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdnew4.jpg" alt="" /></p>
<p>Then I create the first of the models, in this instance one that I&#8217;ll use to store the reasons that customers place orders. I create the model as a Choice Model, associate it with the choice group I just defined, and tell it to get its input from the Call Complete informant, using the Learn Location tab.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdnew5.jpg" alt="" /></p>
<p>Now I need to add some Java code to load values into this Choice Model. I go back to the Service Complete informant and add the following Java code to the logic tab:</p>
<pre>
logInfo ("Integration Point – Service Complete. ");
logInfo ("  Order Reason: " + session().getCall().getOrderReason());
logInfo ("  Agent: " + session().getCall().getAgent());
logInfo ("  Length: " + session().getCall().getLength());

int code=session().getCall().getOrderReason();
switch (code) {
     case 17:
  		ReasonAnalysis.addToChoice("Gift");
  		logInfo ("  Gift was added to the model");
        break;
     case 18:
		ReasonAnalysis.addToChoice("Business");
		logInfo ("  Business was added to the model");
		break;
     case 19:
		ReasonAnalysis.addToChoice("Personal");
		logInfo ("  Personal was added to the model");
        break;
	default:
		ReasonAnalysis.addToChoice("Other");
  		logInfo ("  Other was added to the model");
		break;
}
</pre>
<p></p>
<p>When I deploy the project and then run a test on it, I can see that it&#8217;s working ok and adding the order reason (Business, corresponding to code 18) to the Reason Analysis model.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdnew6.jpg" alt="" /></p>
<p>So now I&#8217;m in a situation where calls are being processed, and we record the order reason, length of call and the handling agent into an order reasons model, which I&#8217;ll refer back to later on when working out which cross-selling offer to make (on the basis that, if someone says their order was for business, they&#8217;re more likely to take up an express delivery offer, whilst if the order is a gift, they&#8217;ll be likely to go for a gift wrapping order, although that might not make as much money for us).</p>
<p>Now, I need to use another RTD tool, the Load Generator, to create a script that will simulate calls coming in, customers giving us their order reasons, and the reason for call, call length and agent name being recorded in the Reason Analysis model. This step involves working with a load generator tool, creating variables and assigning them to the various informants in place in the RTD Inline Service, and then running the load generator to simulate in this case 2000 calls coming into the call centre.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdnew7.jpg" alt="" /></p>
<p>Now I&#8217;m going to start up my Web browser and take a look at the results of the generated load. I start up the RTD Decision Center application, log in and take a look at my Inline Service.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdnew8.jpg" alt="" /></p>
<p>Looking at the diagram, I can see the four informants within my Inline Service, and down the left-hand side, the various choices and informants that I created earlier.</p>
<p>If I then look at the correlation between each choice, and the various customer attributes, by far the strongest correlation is between the order reason, and the choice &#8211; which is fairly obvious if you think about it. </p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdnew9.jpg" alt="" /></p>
<p>When I need to do, then, is to take Order Reason out of the predictive model, as it&#8217;ll always have a 1:1 correlation between it and the Order Reason choice. I do this via the RTD Studio application, redeploy the Inline Service and clear down the existing model values, then run the load tester again and check the output.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdnew10.jpg" alt="" /></p>
<p>That&#8217;s more like it, there&#8217;s a weak correlation between the various customer attributes and the order reason, but no huge correlation between the order reason given and the order reason recorded, which would skew the figures. Of course, any correlation that there is, is purely random as the load generator used random figures. Later on, we&#8217;ll use proper customer responses, and skew the data a bit, to show how the model works.</p>
<p>Well that&#8217;s it for today; we&#8217;ve got the various entities set up, together with the main informants, and created a model to record the reasons that customers give for placing an order. Tomorrow, we&#8217;ll look at generating cross-sell offers based on various performance goals we set the system, and the day after that, we&#8217;ll feed customer responses back into the model to make it more accurately predictive, over time.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rittmanmead.com/2007/10/creating-a-real-time-decisions-project-day-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creating a Real-Time Decisions Project : Day 4</title>
		<link>http://www.rittmanmead.com/2007/09/creating-a-real-time-decisions-project-day-4/</link>
		<comments>http://www.rittmanmead.com/2007/09/creating-a-real-time-decisions-project-day-4/#comments</comments>
		<pubDate>Sun, 30 Sep 2007 18:09:27 +0000</pubDate>
		<dc:creator>Mark Rittman</dc:creator>
				<category><![CDATA[Real-Time Decisions]]></category>

		<guid isPermaLink="false">http://www.rittmanmead.com/2007/09/30/creating-a-real-time-decisions-project-day-4/</guid>
		<description><![CDATA[In this next posting on building an Oracle Real-Time Decisions project (part 1, part2 and part 3 are here if you&#8217;ve not seen them already), I&#8217;m going to look at the process of creating and populating the variables that RTD will use when building my predictive model. To recap, I&#8217;m looking to build an RTD [...]]]></description>
			<content:encoded><![CDATA[<p>In this next posting on building an Oracle Real-Time Decisions project (<a href="http://www.rittmanmead.com/2007/09/27/creating-a-real-time-decisions-project-day-1/">part 1</a>, <a href="http://www.rittmanmead.com/2007/09/27/creating-a-real-time-decisions-project-day-2/">part2</a> and <a href="http://www.rittmanmead.com/2007/09/29/creating-a-real-time-decisions-project-day-3/">part 3</a> are here if you&#8217;ve not seen them already), I&#8217;m going to look at the process of creating and populating the variables that RTD will use when building my predictive model. To recap, I&#8217;m looking to build an RTD Inline Service that will decide on the most appropriate manufacturer for a customer order, with the inputs to this model being the details on the customer, details on the order and the previous history of four potential manufacturers. This step of the process is about defining variables (or &#8220;entities&#8221;) to hold details on the customer, order and manufacturers, and then creating a mechanism to populate them when the inline service is invoked.</p>
<p>Details on the customer and the order will come from the BPEL process that calls the RTD inline service, but details on the various manufacturers will actually be held in a database table that we&#8217;ll have to read from whenever the service is invoked. Starting off first with manufacturers then, I create a table called MANUF that holds details on the four manufacturerers and metrics on their manufacturing and delivery history. I&#8217;ve installed the Web element of Oracle Real-Time Decisions in to Oracle Application Server 10.1.3.3.1, and so I create a JDBC connection pool, and then a managed data source using the Enterprise Manager Control Web site that maps through to the schema containing this table. I then register this new data source with RTD by following the instructions on page 69 of the Oracle RTD Installation and Administration guide, it basically involves editing four XML files which whilst a bit tricky, does work and makes my new JDBC data source visibile in the RTD Studio application.</p>
<p>Once you&#8217;ve got the JDBC data source defined and registed with RTD, the next step is to create a Data Source object within RTD Studio that points through to the JDBC data source, and then use it to import the table metadata into the application. Once you&#8217;ve done this, you can select the table columns that you want to make available to the application, and pick one of the columns that will be used as the lookup column.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdentities1.jpg" alt="" /></p>
<p>Now I&#8217;ve brought in the database data source, I can now create the Manufacturer entity, which I&#8217;ll map to this data source in a moment so that it auto-populates when the service is invoked. To start this process, I select &#8220;New Entity&#8221; from the RTD Studio service metadata menu, like this:</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdentities2.jpg" alt="" /></p>
<p>and then auto-create the entity columns (entities are like tables, they exist at the table-level in RTD applications and have one or more columns associated with them) using the &#8220;Import&#8221; option. This allows me to pick a data source, suck across the columns associated with one of the tables available through the data source, and then provide a set of default values for the entity, something that RTD requires.</p>
<p>The columns in this new entity are then mapped to the data source columns using the Mapping tab, and finally I press the Key button to define an entity key which is defined as an integer. The final entity looks like this:</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdentities3.jpg" alt="" /></p>
<p>with the mapping defined as this:</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdentities4.jpg" alt="" /></p>
<p>The next step is to define a session variable that will hold the values of the various manufacturers during the time the service is running. To do this, I double-click on the Session entity in the Inline Service Explorer and then use the press the &#8220;Add Attribute&#8221; button to add an attribute called Manufacturer, which is then defined as a complex attribute based on the manufacturer entity I just defined earlier.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdentities5.jpg" alt="" /></p>
<p>Finally, I need to go back to the Manufacturer entity settings, click on the Mapping tab and map and use the Data Source Input Values section to map the manufacturer session entity key (which will get it&#8217;s value from the BPEL process) to the entity key, so RTD will do an auto-lookup of the manufacturers details from the database when required.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdentities5a.jpg" alt="" /></p>
<p>So the situation I&#8217;m in now is that I&#8217;ve defined a data source that maps to a table containing the details and metrics on manufacturers, and then I&#8217;ve used this data source to build an entity which is keyed on the manufacturer ID, with the entity mapping back to the data source so it knows where to get it&#8217;s data from when invoked. Then, I&#8217;ve defined a session variable of a type &#8220;manufacturer&#8221;, which is used to hold values of manufacturer entities in memory when the service is run. One thing that I&#8217;m not sure of is how we hold details on more than one manufacturer &#8211; do we read them into the session variable serially, then feed them into the model, or do we have multiple instances of this session variable, one for each manufacturer under consideration. We&#8217;ll have to wait and see.</p>
<p>As well as requiring details on manufacturers, the inline service I&#8217;m building also need to hold details on the customer (their name, their status, their credit limit) and details of the order (the order value, the order date and so on). These values will actually come from the BPEL process calling the inline service, and so I won&#8217;t need to go through the process of defining additional data sources and using these to create the entities. Instead, I just use the inline service explorer to create the new entities, with customer being created first, and I use the &#8220;Add Attribute&#8221; and &#8220;Add Key&#8221; buttons to create the required columns, like this:</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdentities6.jpg" alt="" /></p>
<p>I then do the same for Orders, creating an Order entity, adding just a single key (Order ID) and two attributes, Order Value and Order Date.</p>
<p>Next I create two more session variables, one for Customer and one for Order, creating them using the Customer and Order entity types, and defining session keys to map to the keys used by the two entities.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdentities7.jpg" alt="" /></p>
<p>When everything&#8217;s set up, the session variables used in the RTD inline process look like this:</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdentities8.jpg" alt="" /></p>
<p>So as a process the steps are:</p>
<ol>
<li>Define relational data sources if required.</li>
<li>Define the entity, either manually or by reference to an associated data source table.</li>
<li>Define the key for each entity.</li>
<li>Define a session variable attribute for each entity, with the variable type being based on the entity table definition.</li>
<li>Define a session key for each session variable attribute, based on the key for each entity.</li>
<li>If the associated entity is auto-mapped to a database table, provide a link between the session variable key and then entity key so an auto-lookup can take place.</li>
</ol>
<p>OK, so we&#8217;re now in a position to test everything out. To do this, I need to create an Informant, an input into the RTD process that we can then use to debug and diagnose the variable initialization process.</p>
<p>I first of all locate the Integration Points, then Informants node in the Inline Service Explorer, and select &#8220;New Informant&#8221;.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdentities9.jpg" alt="" /></p>
<p>I call the new informant &#8220;Testing&#8221; and press the &#8220;Advanced&#8221; button when naming the informant to check the &#8220;Show in Decision Center&#8221; button (the Web interface for RTD that&#8217;s used for monitoring the process of RTD inline services).</p>
<p>On the Testing informant properties page, I press the &#8220;Select&#8221; button to pick the Manufacturer session key, which is passed as in input into the informant.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdentities10.jpg" alt="" /></p>
<p>Now, that&#8217;s got me thinking. In a second, I&#8217;m going to add some logic that will display some of the manufacturer attributes for the manufacturer that is referenced by the manufacturer ID input value passed to the informant. To do this, it&#8217;ll do a database lookup, using the key and entity binding I created earlier. I wonder, therefore, if I should do all the customer and order details lookups in this way as well, where the inputs to the Inline Service are just the customer ID, order ID and manufacturer ID, and RTD gets all the rest of the information from the database, i.e. not from the calling BPEL process? I&#8217;ll carry on for the moment, but I may have to come back and revisit this later on.</p>
<p>Anyway, the next step is to add some logic to this informant, logic that is going to output the diagnostic data we&#8217;re looking for. To do this, I click on the Logic tab and type in the following Java code:</p>
<pre>
logInfo("Manufacturer name = " + session().getManufacturer().getName());
logInfo("Manufacturer accepted orders = " + session().getManufacturer().getNumAcceptedOrders());</pre>
<p></p>
<p>like this:</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdentities11.jpg" alt="" /></p>
<p>Be careful with the variable names etc, they&#8217;re case sensitive &#8211; in my case, RTD took the column name NUM_ACCEPTED_ORDERS and turned it into the java method getNumAcceptedOrders, which is referenced through the class session().getManufacturer().getNumAcceptedOrders &#8211; it helps with RTD if you&#8217;re got a bit of Java knowledge, mine consists of going on a couple of courses a few years ago, but at least I know how to hunt through a bit of Java code, which I had to do in this instance to see how RTD had named this variable/method in the auto-generated Java code.</p>
<p>Now it&#8217;s just a case of deploying the Inline service, like this:</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdentities12.jpg" alt="" /></p>
<p>Once it&#8217;s deployed OK and with no errors, you can use the Test facility in RTD Studio to test it out. I input a manufacturer_id of 1, and get back the correct results.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdentities13.jpg" alt="" /></p>
<p>OK, so where does this leave us?</p>
<ol>
<li>Firstly, we know we can look up details of a manufacturer given a manufacturer ID. HOWEVER, I&#8217;m not sure whether this is in fact what we should be doing &#8211; we need some metrics on manufacturers to feed into the predictive model, but then again it&#8217;s the manufacturer we&#8217;re choosing at the end, I&#8217;m not sure whether we get the manufacturers attributes from a table like this, or whether they come from the predictive model &#8211; we&#8217;ll have to wait and see.</li>
<li>I&#8217;ve defined entities and session variables for customers and orders, but as yet haven&#8217;t populated them, as I&#8217;m planning to get the BPEL process calling the RTD Inline Service to provide these values as input parameters. I&#8217;m not discounting the option, though, of just having the BPEL process pass across the customer ID and order ID, and have RTD get the rest o of the customer and order details from database tables, like we did with manufacturer. This would fit the <a href="http://www.oracle.com/technology/obe/obe_bi/rtd/rtd.htm">OTN Oracle-by-example</a> better, but in the scenario I&#8217;m trying to built, it&#8217;d be more logical to get the BPEL process to provide these values, as it holds them as part of the order it&#8217;s processing.</li>
</ol>
<p>So, some good progress but a few questions that I still need to answer. Tomorrow, I&#8217;m going to create some informants for the external systems &#8211; the BPEL process, the feedback at the end of the customer order and so on, which should well answer these outstanding questions. Check back tomorrow for some more progress.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rittmanmead.com/2007/09/creating-a-real-time-decisions-project-day-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creating a Real-Time Decisions Project : Day 3</title>
		<link>http://www.rittmanmead.com/2007/09/creating-a-real-time-decisions-project-day-3/</link>
		<comments>http://www.rittmanmead.com/2007/09/creating-a-real-time-decisions-project-day-3/#comments</comments>
		<pubDate>Sat, 29 Sep 2007 18:05:51 +0000</pubDate>
		<dc:creator>Mark Rittman</dc:creator>
				<category><![CDATA[Real-Time Decisions]]></category>

		<guid isPermaLink="false">http://www.rittmanmead.com/2007/09/29/creating-a-real-time-decisions-project-day-3/</guid>
		<description><![CDATA[Over the past two days, we&#8217;ve taken an initial look at Oracle Real-Time Decisions (RTD), come up with a scenario with which we can build an RTD demo, and yesterday taken a look at the various elements of an RTD project. Today, we&#8217;re going to take the Order Bookings manufacturer choice scenario and match it [...]]]></description>
			<content:encoded><![CDATA[<p>Over the past <a href="http://www.rittmanmead.com/2007/09/27/creating-a-real-time-decisions-project-day-1/">two</a> <a href="http://www.rittmanmead.com/2007/09/27/creating-a-real-time-decisions-project-day-2/">days</a>, we&#8217;ve taken an initial look at Oracle Real-Time Decisions (RTD), come up with a scenario with which we can build an RTD demo, and yesterday taken a look at the various elements of an RTD project. Today, we&#8217;re going to take the Order Bookings manufacturer choice scenario and match it up to the various RTD project elements.</p>
<p>As a recap, we have a current BPEL process that takes a customer order, validates it, retrieves some customer information and then gets to a point where it has to decide on a manufacturer. At the moment, the choice is based purely on which manufacturer provides the lowest quote; in the future, we&#8217;re going to use RTD to choose a manufacturer based on which one helps us achieve our current business goals, be they to minimize cost, improve customer service, get most orders delivered on time and so on. RTD is going to build up a predictive model that will take information on the customer and their order, take into account contextual information such as the time of year, and come up with the choice of manufacturer that is most likely to help us deliver on our business goals.</p>
<p>RTD projects have five main elements:</p>
<ol>
<li>Entities, the actors in the process</li>
<li>Choices, the things that the decision can pick between, in our cases the various manufacturers</li>
<li>Performance Goals, the business priorities that can be in effect at any one time &#8211; reduce costs, improve customer service, get most orders accepted and delivered within X days</li>
<li>The models and rules that are used to make a decision, and</li>
<li>The actual decisions that take place</li>
</ol>
<p>In addition, we need to define Informants, interfaces into the Inline Service that provide data on the customer, whether the decision was accepted, what the customer&#8217;s feedback on the order process was and so forth.</p>
<p>Going through this list then, the entities that we will need are:</p>
<ol>
<li>The customer &#8211; the person placing the order. Customers will have several data items associated with them including their age, status and so forth. Data on the customer will come from an Oracle database, which will be accessed via the customer ID passed to the inline service from the Order Bookings BPEL process.</li>
<li>The order &#8211; principally the value of the order, passed to the Inline Service from the BPEL process, and also the number of items, name of the most expensive item in the order and so forth.</li>
<li>The manufacturers, their name, number of staff, whether they will take orders electronically and so on.</li>
</ol>
<p>I mentioned in one of my initial postings that I&#8217;ve actually got a very similar RTD project, built by the RTD product management team, that does a similar job &#8211; it selects the most suitable satellite TV installer based on a similar scenario and set of inputs.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdproj6.jpg" alt="" /></p>
<p>Taking a look at the project in Oracle RTD Studio, I can see that I might well need some additional entities, to hold manufacturer metrics, real-time data on manufacturers, such us the number of order rejections they&#8217;d made in the last hour, day and so on. I&#8217;ll have to decide on whether these additional entities are needed when putting my example together.</p>
<p>In terms of choices, these are going to be the various different manufacturers that the decision-making process can decide from. At the moment, the Order Bookings BPEL process uses two manufacturers, &#8220;Select Manufacturers&#8221; and &#8220;Rapid Manufacturers&#8221;. To this we&#8217;ll add &#8220;Bargain Manufacturers&#8221; and &#8220;Expert Manufacturers&#8221;, and we&#8217;ll set up the details for each of them to reflect the following characteristics:</p>
<ul>
<li>Select Manufacturers will be expensive, provide excellent customer service, and deliver within an average timeframe.</li>
<li>Rapid Manufacturers will be expensive, typically delivery faster, have average to just under average customer service, but sometimes reject orders because they&#8217;re too busy.</li>
<li>Bargain Manufacturers are typically the cheapest, always take on orders but sometimes delivery them late, and don&#8217;t have particularly good customer service.</li>
<li>Expert manufacturers are expensive, always take on orders, have below-average response times but good customer service.</li>
</ul>
<p>Within the BPEL process, I&#8217;ll introduce a random element such that some manufacturers reject orders and some deliver late. These results will feed back into the RTD model, meaning that over time, a decision might start to change as certain suppliers&#8217; delivery time starts to suffer, their number of rejected jobs goes up and so on. We&#8217;ll store these scores and metrics in a database table, and make them available in the RTD project through the supplier entity.</p>
<p>In terms of performance goals, we&#8217;ll have a number that we&#8217;ll emphasize and de-emphasize at various times. These goals will be:</p>
<ul>
<li>Minimize Service Cost</li>
<li>Maximize chance of delivery on-time</li>
<li>Minimize rejection rate of work orders</li>
</ul>
<p>Over time, if we want to maximize customer service at any one time, we&#8217;ll emphasize delivering on time and having all work orders accepted, whilst at others, if we&#8217;re more concerned with maximizing profits, we&#8217;ll emphasize cost reduction instead. If I can work out how to do it, I&#8217;ll segment the customers (based on their status, which can be either gold, silver or bronze), emphasizing customer service for the gold customers and cost reduction for the others.</p>
<p>The informants, or events or interfaces into the RTD inline service, will come at three points:</p>
<ol>
<li>When we get all four quotes through an need to pick a manufacturer</li>
<li>When we get the work acceptance, or not, from the manufacturer</li>
<li>When we get data back from the customer on when the order actually arrived.</li>
</ol>
<p>The three models we will initially build up will be used to predict the following metrics:</p>
<ol>
<li>Customer Satisfaction</li>
<li>Order rejection, and</li>
<li>Order completion on time</li>
</ol>
<p>Finally, we will have one decision that the RTD project will generate, which will be a choice of manufacturers based on our current business priorities, which will be expressed by weighting the various performance goals to emphasize customer service, keeping costs down and so on.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdproj7.jpg" alt="" /></p>
<p>As shown in the screenshot above, taken from the existing RTD demo I&#8217;ve got on my machine, it&#8217;s also possible to segment customers and apply different performance goal weightings for each segment.</p>
<p>So, that&#8217;s the background to the project. Tomorrow, we&#8217;ll set up the entities and choices.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rittmanmead.com/2007/09/creating-a-real-time-decisions-project-day-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creating a Real-Time Decisions Project : Day 2</title>
		<link>http://www.rittmanmead.com/2007/09/creating-a-real-time-decisions-project-day-2/</link>
		<comments>http://www.rittmanmead.com/2007/09/creating-a-real-time-decisions-project-day-2/#comments</comments>
		<pubDate>Thu, 27 Sep 2007 21:00:14 +0000</pubDate>
		<dc:creator>Mark Rittman</dc:creator>
				<category><![CDATA[Real-Time Decisions]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.rittmanmead.com/2007/09/27/creating-a-real-time-decisions-project-day-2/</guid>
		<description><![CDATA[In yesterday&#8217;s posting, I set the scene for an Oracle Real-Time Decisions project that I&#8217;m going to integrate into the Oracle SOA Suite Order Bookings BPEL process. At present, the Order Bookings process allocates manufacturing jobs based on who provided the lowest quote; in the demo I&#8217;m going to build, jobs will be allocated based [...]]]></description>
			<content:encoded><![CDATA[<p>In <a href="http://www.rittmanmead.com/2007/09/27/creating-a-real-time-decisions-project-day-1/">yesterday&#8217;s posting</a>, I set the scene for an <a href="http://www.oracle.com/applications/crm/siebel/business-analytics/real-time-decisions.html">Oracle Real-Time Decisions</a> project that I&#8217;m going to integrate into the Oracle SOA Suite Order Bookings BPEL process. At present, the Order Bookings process allocates manufacturing jobs based on who provided the lowest quote; in the demo I&#8217;m going to build, jobs will be allocated based on a predictive model that takes into account the customer and their order, information about the context of the order, directives from me on what my current business priorities are, and comes up with a manufacturer recommendation that is mostly likely to help me meet my business goals.</p>
<p>Before diving in though, it&#8217;s worth taking a few moments to think about some of the key concepts in Oracle Real-Time Decisions.</p>
<p>At the most basic level, what you build in Real-Time Decisions is an &#8220;Inline Service&#8221;, a process that you can call using in and out parameters that makes a decision for you. The inline process takes your input parameters, runs them past it&#8217;s model and comes up with a decision, based on various weightings that you give to your various business priorities.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdproj4.jpg" alt="" /></p>
<p>At the end of the process, you feed back to the Inline Service the actual choice that the customer made, so that Real-Time Decisions can fine tune it&#8217;s predictive model in order to come up with more and more appropriate decisions, of offers, for the customer. The Inline Service can either be called via a Java client interface, or we can register it as a Web Service and call it from, for example, a BPEL process.</p>
<p>Within a Real-Time Decisions project, there are five main &#8220;elements&#8221; that you need to work with:</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdproj3.jpg" alt="" /></p>
<ol>
<li>Entities, the main &#8220;actors&#8221; in a system. Entities have properties and are effectively the variables that you populate at the start of the process, read details from as needed and the load up prior to passing back the decision to the calling application.</li>
<li>Performance Goals are the key performance indicators that the the Inline Service tracks and optimizes.</li>
<li>Choices, the possible process outcomes, such as as offers, agents, service providers and so on. In our example, the choices will be the various manufacturers that can be used to deliver the order &#8211; Select Manufacturer, Rapid Manufacturer, and some others that we&#8217;ll come up with.</li>
<li>Models and Rules are the predictive models that RTD builds up, and the rules that you define as part of the inline service definition, that are used to work out what score each particular choice attracts, and</li>
<li>Decisions take the output of the model, apply weightings based on your performance goals and come up with the most appropriate decision.</li>
</ol>
<p>Another key concept in RTD is &#8220;informants&#8221;. Informants are the interfaces into the Inline Service, and provide, for example, feedback on what the customer&#8217;s call is actually about, whether they accept an offer, whether they take up the offer some time down the line and so on. All of the above elements, plus the informants and the predictive models, are built up using a tool called Oracle RTD Studio, a Java GUI based on the Eclipse framework that builds up an RTD project in much the same way that you&#8217;d build an OWB project, or a Java application.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdproj5.jpg" alt="" /></p>
<p>Tomorrow, we take the Order Bookings process and pull out from it the RTD elements and potential informants that we&#8217;ll use in the project.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rittmanmead.com/2007/09/creating-a-real-time-decisions-project-day-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creating a Real-Time Decisions Project : Day 1</title>
		<link>http://www.rittmanmead.com/2007/09/creating-a-real-time-decisions-project-day-1/</link>
		<comments>http://www.rittmanmead.com/2007/09/creating-a-real-time-decisions-project-day-1/#comments</comments>
		<pubDate>Thu, 27 Sep 2007 17:51:16 +0000</pubDate>
		<dc:creator>Mark Rittman</dc:creator>
				<category><![CDATA[Real-Time Decisions]]></category>

		<guid isPermaLink="false">http://www.rittmanmead.com/2007/09/27/creating-a-real-time-decisions-project-day-1/</guid>
		<description><![CDATA[And for my next trick, I shall be &#8230;. building an Oracle Real-Time Decisions project. For anyone who didn&#8217;t catch the posting on this blog earlier this year, Real-Time Decisions is a part of Oracle BI Suite Enterprise Edition, originally built by Sigma Dynamics and included as part of Siebel CRM, and now available standalone [...]]]></description>
			<content:encoded><![CDATA[<p>And for my next trick, I shall be &#8230;. building an Oracle Real-Time Decisions project. For anyone who didn&#8217;t catch the <a href="http://www.rittmanmead.com/2007/04/19/a-first-look-at-oracle-real-time-decisions/">posting on this blog</a> earlier this year, <a href="http://www.oracle.com/applications/crm/siebel/business-analytics/real-time-decisions.html">Real-Time Decisions</a> is a part of Oracle BI Suite Enterprise Edition, originally built by Sigma Dynamics and included as part of Siebel CRM, and now available standalone to add real-time marketing features to your business process or application.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdproj0.jpg" alt="" /></p>
<p>Real-Time Decisions is effectively a data mining engine that takes on board details, for example, of a customer, adds to it some contextual information &#8211; what the customer has rung up about, how long they were on hold waiting for a call centre operator, what part of the year it is and so on &#8211; and comes up with a recommendation, or a product offer, that&#8217;s most likely to help you meet your business goals.</p>
<p>For example, you may have a call centre application that is used by operators dealing with incoming customer service calls. A customer may call in who&#8217;s in your &#8220;Gold customers&#8221; category, and normally you&#8217;d try and cross-sell them a savings account, or a bond or whatever. However when it turns out that they are calling with a complaint, and it&#8217;s the time of the year when customer retention is particularly being focused on, Real-Time Decisions might actually recommend a free gift, or a bonus interest rate, or whatever. The key thing is that Real-Time Decisions builds up a predictive model of what offers are most likely to be taken up by particular segments of customers, and it comes up with recommendations that you can influence by emphasizing particular business goals &#8211; minimize transaction costs, retain more customers and so on. One of the main differentiators for Real-Time Decisions is that the process of picking a data mining model, and the building of that model, is completely automated meaning that you don&#8217;t need statisticians to work out whether to use neural networks, bayesian models or whatever for your predictive model &#8211; RTD does all that for you.</p>
<p>I do in fact have a <a href="http://www.rittmanmead.com/2007/07/06/oracle-real-time-decisions-and-bpel/">working demo of RTD</a> which I use as part of the <a href="http://www.rittmanmead.com/services/bi-masterclasses-20078/">Business Intelligence Masterclasses</a> that I run with Oracle University (next venues, <a href="http://education.oracle.com/pls/web_prod-plq-dad/show_desc.redirect?dc=D48573_946979&#038;p_org_id=40&#038;lang=S&#038;source_call=">Sweden</a>, Hungary, <a href="http://education.oracle.com/pls/web_prod-plq-dad/show_desc.redirect?dc=D48573_946979&#038;p_org_id=27&#038;lang=US&#038;source_call=">Ireland</a> and <a href="http://education.oracle.com/pls/web_prod-plq-dad/show_desc.redirect?dc=D48573_946979&#038;p_org_id=41&#038;lang=NL&#038;source_call=">The Netherlands</a>), but it&#8217;s one that was put together by the RTD product management team and I want to now build one myself, to see how the process works. I have been through the RTD tutorial that you can access on OTN, but again there&#8217;s no substitute for building your own demo, working through all the problems and so on, as opposed to working through a step-by-step tutorial.</p>
<p>So, on to the demo scenario. One of the first tricky points that I encountered was to come up with a scenario that matched how RTD works. RTD generally makes marketing recommendation based on a predictive model plus contextual information you feed through in real-time. For my example, I wanted to really avoid having to build an application as working with JDev, ADF and so on is a bit outside my area of competence, so one area I thought of was to add some decision-making capability to a BPEL business process, which would let me build up a workflow but avoid all the GUI development, etc. As the rest of my BI Masterclass is based around the <a href="http://download.oracle.com/docs/cd/B31017_01/core.1013/b28938/intro.htm#BABHGBCA">Oracle SOA Suite Order Bookings</a> BPEL process, the scenario I eventually came up with is around picking manufacturers for a customer order.</p>
<p>In the Order Bookings process, customers place orders via a Web interface which eventually make their way, via Enterprise Service Bus, to a BPEL process. The BPEL process then logs the order, gathers some customer information, verifies the credit card number and then gets to a point where it has to decide which manufacturer to use.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtdproj1.jpg" alt="" /></p>
<p>It does this by first of all getting quotes from two manufacturers, Select Manufacturer and Rapid Manufacturer, via a Web Service. Once the quotes come in, it chooses the one it wishes to use based on who provides the lowest quote. In my example, I&#8217;m going to replace this with an RTD &#8220;Inline Service&#8221; that takes the quotes, plus some contextual information and information on the customer and order, and selects the most appropriate manufacturer based on my business goals at the time &#8211; minimize cost, increase customer satisfaction, give us the greatest chance the manufacturer will accept the order an process it first time (as opposed to reject it, or end up delivering late). This scenario isn&#8217;t too far from the RTD demo I currently have (which allocates satellite TV installations based on similar criteria), but it&#8217;ll be integrated into the SOA Demo Order Bookings process, I&#8217;ll have to figure out the plumbing myself, and I&#8217;ll be on my own.</p>
<p>So, in the next posting, I&#8217;ll be looking at what sorts of data and processes I&#8217;ll need to get the most out of Oracle Real-Time Decisions.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rittmanmead.com/2007/09/creating-a-real-time-decisions-project-day-1/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Oracle Real-Time Decisions and BPEL</title>
		<link>http://www.rittmanmead.com/2007/07/oracle-real-time-decisions-and-bpel/</link>
		<comments>http://www.rittmanmead.com/2007/07/oracle-real-time-decisions-and-bpel/#comments</comments>
		<pubDate>Fri, 06 Jul 2007 21:51:42 +0000</pubDate>
		<dc:creator>Mark Rittman</dc:creator>
				<category><![CDATA[Real-Time Decisions]]></category>

		<guid isPermaLink="false">http://www.rittmanmead.com/2007/07/06/oracle-real-time-decisions-and-bpel/</guid>
		<description><![CDATA[This week, apart from some interesting client work, I&#8217;ve been mostly spending my free time finishing off the BI and SOA section of the new masterclass, and working on the section after that on Oracle Real-Time Decisions. Although I spend a fair amount of time in the new masterclass looking at the OBIEE basics &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p>This week, apart from some interesting client work, I&#8217;ve been mostly spending my free time finishing off the BI and SOA section of the new masterclass, and working on the section after that on <a href="http://www.oracle.com/applications/crm/siebel/business-analytics/real-time-decisions.html">Oracle Real-Time Decisions</a>. Although I spend a fair amount of time in the new masterclass looking at the OBIEE basics &#8211; data modeling, data loading, building dashboards and so on &#8211; I thought it&#8217;d be interesting to look at some of the more &#8220;left-field&#8221; applications of OBIEE components, and as Oracle recently bought the Real-Time Decisions technologies from Sigma Dynamics, I thought it&#8217;d be interesting to bring this new tool into the masterclass and do a bit of an introduction.</p>
<p><a href="http://www.rittmanmead.com/2007/04/19/a-first-look-at-oracle-real-time-decisions/">I went throught the basics of a Real-Time Decisions project</a> a few months ago when I worked through the tutorial (there&#8217;s a much more comprehensive <a href="http://www.oracle.com/technology/obe/obe_bi/rtd/rtd.htm">Oracle By Example walk-through</a> now available on OTN), but for the masterclass, I wanted to show how a basic model was built and then interfaced into the world of BPEL and Service-Orientated Architecture. Now I won&#8217;t go into the full details of the example &#8211; you&#8217;ll have to come to the event for that &#8211; but at a high level, we have a BPEL process that assigns contracts to install satellite TV to one of a number of service providers. In the past, contracts were assigned based purely on who could offer the best price; now, we want to incorporate a number of factors, such as whether the supplier did the job once and didn&#8217;t need to be called back, whether customers rated the supplier well in subsequent customer surveys, whether they commonly reject jobs, and so on. Moreover, we want Real-Time Decisions to use the past history of service provider events &#8211; survey scores, work rejections and so on &#8211; to predict, with increasing accuracy, which supplier will be most appropriate for a job, with the underlying predictive model getting more and more accurate as we provide it with feedback from the informants.</p>
<p>So, how is the decision model put together? Firstly, a new Inline Service is created using the RTD Design Center application, a customized version of Eclipse. Once the project is created, data sources are defined together with the internal data model &#8211; &#8220;entities&#8221; and &#8220;session variables&#8221; &#8211; that the Inline Service will use.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtd1.jpg" /></p>
<p>Then, &#8220;Informants&#8221; are created, which are the inputs into the predictive models that we&#8217;ll create in a minute. Informants tell the Inline Service, for example, whether a supplier did the job within the required time, what the supplier scored in the subsequent customer survey, whether they rejected the job and so on. The BPEL process I&#8217;ll create later on will provide values to these informants through BPEL variables.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtd2.jpg" /></p>
<p>Next, we create the list of choices for the Inline Service to make, which in our case are the list of service providers that the decision service can choose from. Then, we create a number of predictive models, one for each metric (&#8220;on-time performance&#8221;, &#8220;customer satisfaction&#8221; and so on), and then define performance goals which we then link to these metrics to to allow us to emphasize, for example, arriving on time, minimizing cost, only needing one visit to do the work and so on.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtd3.jpg" /></p>
<p>Now, we create one or more decisions. Decisions are things such as &#8220;Provide the best performing service provider&#8221;, and take the metrics available for each service provider and apply weightings to them, so that for example we might place more emphasis at one point on keeping the customer satisfied with cost minimization a lesser goal; later on, we might define a new decision that changes the weightings and provides a service provider much more based on their ability to get to the customer on time.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtd4.jpg" /></p>
<p>Finally, we define some Advisors, the interfaces &#8220;out&#8221; of the Inline Service, that will be called from the BPEL process to get a decision on, in our case, the best service provider. Each advisor uses at any one point a particular decision, this allows us to emphasize at the start, say, of a year, customer service, whilst at the end of the year, when the figures become more important, we can switch to a decision based more on keeping costs down.</p>
<p>After deploying the service and running some sample data through it to provide values for the models, I can then view the Inline Service using the Decision Center application, like this:</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtd5.jpg" /></p>
<p>&#8230;and then incorporate it into a BPEL process, to be used as the means of picking the most appropriate service provider based on my current business goals, and the predictive powers of the KPI models I&#8217;ve created. Within the BPEL process, I pass values from process outcomes and variables back into the Inline Service via the Informers I created earlier, creating a positive feedback loop that&#8217;ll help the models learn and make better predictions later on.</p>
<p align="center"><img src="http://www.rittmanmead.com/images/rtd6.jpg" /></p>
<p>Note that the above BPEL process uses straight Java calls to invoke the decision engine, send values to the Informants and so on &#8211; in a real deployment, we&#8217;d use Web Service calls, Assign process activities and so on, but the Java client was faster to set up for us so we used it for the initial prototype.</p>
<p>Anyway, that&#8217;s what I&#8217;ve been up to for most evenings over the past few days, and thanks to Michel, Pierre and the RTD team for working with me to get it all up and running. Other than that, as a bit of news I&#8217;ve been made one of those <a href="http://www.oracle.com/technology/community/ofm_directors/index.html#Rittman">Oracle Regional Fusion Middleware Directors</a> (they&#8217;ll obviously let anyone in now&#8230;), Jon&#8217;s Macbook hard disk self-destructed earlier in the week which meant he *had* to go out an get a new 4GB Macbook Pro to replace it, and we&#8217;ve set up a <a href="http://www.rittmanmead.com/subscribe/">mailing list for Rittman Mead Consulting</a> so we can send out the occasional newsletter about what Jon, myself and our team are up to, where we&#8217;re presenting, any consulting and education special offers, and a few &#8220;exclusive tips&#8221; that we&#8217;ll save for newsletter subscribers &#8211; <a href="http://www.rittmanmead.com/subscribe/">sign up here</a> if you&#8217;re interested (promise, no spam).</p>
<p>Apart from that, some more dates are getting added to the <a href="http://www.rittmanmead.com/services/bi-masterclasses-20078/">masterclass agenda</a> &#8211; We&#8217;re doing another date in the Netherlands, so that&#8217;s 6th and 7th September, and the 25th and 26th October, plus we&#8217;re also doing Hungary on the 11th and 12th October &#8211; contact the local Oracle University offices for booking details, once URLs are available we&#8217;ll put them on the Masterclasses page. Also, if you&#8217;re thinking of coming to one of the one-day events in Hong Kong, Singapore, Austrialia or New Zealand, make sure you book up soon as Oracle will either give the events the go or no-go at the end of July, depending on numbers &#8211; so don&#8217;t leave signing up too late otherwise it might get cancelled. For me now though, it&#8217;s a weekend of kids&#8217; parties &#8211; it&#8217;s our son&#8217;s fifth birthday party on Saturday, there&#8217;s one to go to before that, and two on Sunday, so no doubt getting to work on Monday&#8217;s going to be a bit of a rest.</p>
<p>Have a good weekend&#8230;.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rittmanmead.com/2007/07/oracle-real-time-decisions-and-bpel/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

