tag:blogger.com,1999:blog-62480431240252837182024-03-07T00:57:32.073-05:00Tableau FrictionExploring and explaining Tableau's not-so-easy or -obvious bits.
And hopefully finding solutions.Chris Gerrardhttp://www.blogger.com/profile/01598731155784487000noreply@blogger.comBlogger124125tag:blogger.com,1999:blog-6248043124025283718.post-85081200041429518892019-02-27T22:56:00.000-05:002019-03-11T23:20:00.470-04:00Calculations ComplaintsThis is a quick and dirty post of my reactions as I work through the <a href="https://www.tableau.com/about/blog/LOD-expressions">Top 15 LOD Expressions</a> on Tableau's site. Not much, if any, of it is news.<br />
<h3>
Calculation Composer </h3>
The Calculation composer is extremely primitive, any decent text editor is more capable than it is.<br />
<ol>
<li>It's missing auto completion, any decent text editor has better abilities.</li>
<li>The formula reference gets lost when one is editing the formula contents, exactly when it's needed most.</li>
<li>The formula descriptions and examples are generally not as good as they could be, are quite poor in some cases, leaving out relevant information, e.g. just what are the allowable datepart parts? </li>
<li>applying the FIXED/INCLUDE/EXCLUDE formulas to an existing field in the editor provides an opening { but not a closing one, nor does it provide the essential ':' the User needs to know how LOD calcs work in order to complete the formula, which is particularly difficult given #2.</li>
</ol>
<h3>
LOD Calculations</h3>
Working through the <a href="https://www.tableau.com/about/blog/LOD-expressions">Top 15 LOD Expressions</a> on Tableau's site:<br />
<ol>
<li>The Workbooks are Tableau version 9.0, they'd be more useful (at least less distracting) if they were kept up to date with Tableau's current version.</li>
<li>The data used for the examples is not explicitly identified.</li>
<li>The data used isn't the same for the various example, making it difficult to keep track of.</li>
<li>The data is old, covers years 2010-2013 in one source, 2011-2014 in another, which doesn't provide any confidence that the information is important enough to keep up to date.</li>
<li>The different time periods for Sales data - two different year ranges above, causes confusion; even if the reader isn't aware of it there's a cognitive dissonance that impedes learning the fundamental material.</li>
</ol>
<br />
<br />Chris Gerrardhttp://www.blogger.com/profile/01598731155784487000noreply@blogger.com0tag:blogger.com,1999:blog-6248043124025283718.post-59207385872795769042018-11-30T12:54:00.001-05:002018-11-30T12:54:44.545-05:00Tableau's Lost The Helping-People Path<p>
This post is a continuation of a discussion about Tableau's seeming reluctance to improve the product's ease of use.
</p>
<hr/>
<p>
...
</p>
<p>
It might be obvious, but I'm also disappointed that Tableau has effectively abandoned ease of analysis as a primary product principle. <a href="https://tableaufriction.blogspot.com/2018/11/a-list-of-ways-in-which-tableau-can.html">My list</a> is only a mere scuff on the onion skin of things that would make Tableau a much better product. Some of them are so simple and easily fixed that their persistence is irritating—it's almost as if Tableau doesn't take the things that bug mere humans seriously. I know this isn't totally true; there are people at Tableau who really do care about these things, which makes the situation more mysterious and, oddly, more vexing.
</p>
<p>
At its core, the things that Tableau makes really easy to use for analyzing one's data are the handful of operational functions—field selection, sorting, aggregation, calculating new fields, and filtering—that 4GLs made easy in the 1970s, albeit in a mainframe character-mode terminal and line printer world.
</p>
<p>
Tableau extends this model by providing visual forms appropriate to the analytical context and makes it easy to apply visual characteristics, e.g. colors; although it's always been poor at clarifying its operating principles, e.g. why does the order of double-clicking fields produce different effects.
</p>
<p>
That pretty much covers Tableau's "best-ever" space.
</p>
<p>
There are a number of dead simple things that could make Tableau better even in this space, e.g.
<ul>
<li>Getting rid of the default cells' 'Abc' label – it's pretty silly, since the by far dominant purpose of the cell is to contain quantities, and the 'Abc' implies that text is the normal content. Even '123' would be preferable, although it's not without problems.</li>
<li>Adding scrolling to the dimensions' part of the viz – the 'Ideas' topic that prompted this discussion.</li>
</ul>
</p>
<p>
There's a vast space for improvements in expanding the functional easy-to-do analytical operations horizon: making more things simple, easy, and straightforward.
</p>
<p>
I spent a lot of time trying to get Tableau to hire me to help, and gave up when they were pointedly not interested.
</p>
<p>
It seems pretty clear that Tableau's been working very hard to make itself into an enterprise platform - there's a Motley Fool interview with Christian Chabot from a number of years ago (can't quickly find it) where he talks about Tableau's objective being to maximize its market potential in the context of enterprise platform software sales. This has never been a secret. Even as a new company Tableau used an enterprise sales approach: when I bought my Tableau license (money well spent) in 2006 I had to purchase it from an actual salesman who was primarily interested in how many other copies he could sell into the organization I was part of.
</p>
<p>
Bald-faced self-promotion here.
</p>
<div style="margin-left:5em; margin-right:5em;">
<p>
A couple of years ago I took the opportunity to put together a product proposal and some initial prototypes for a visual data analysis tool targeted at individuals with data they need to understand.
</p>
<p>
It addresses Tableau's shortcomings, with the advantage of over thirty years' experience in helping people with their data analysis needs—including stints as Product Manager for PC/FOCUS and FOCUS for Unix where we created the first generation of visual data analysis tools (alas, IBI did what Tableau's doing and looked to be more 'technology' than 'human' oriented)
</p>
<p>
It took the better part of a year and I'm pretty pleased with the product concept and design.
Sadly, I'm not part of the 'business' side of this business, and the limited pathways to the resources required to build a real, live tool I've had access to haven't proved fruitful.
</p>
<p>
So... I'm open to any opportunities to collaborate in creating the next great human-oriented data analysis tool. One that's affordable and makes it simple, easy, and straightforward for non-technical people to connect with and understand the data that matters to them.
</p>
</div>
<p>
Given that Tableau's history strongly suggests that it's not going to revisit its basics and improve its fundamental functionality,
I'm waiting for the next great tool to arrive, one that addresses Tableau's friction points and expands the range of what's is simple and easy to do data-analytically.
</p>
<p>
In the meantime Tableau remains the best tool I've ever found for basic data sense-making and I'll keep happily using it.
</p>
Chris Gerrardhttp://www.blogger.com/profile/01598731155784487000noreply@blogger.com0tag:blogger.com,1999:blog-6248043124025283718.post-65510132973234490712018-11-29T15:41:00.001-05:002018-11-29T17:03:57.471-05:00A list of ways in which Tableau can -should- be improved.<p>
Tableau's in need of a reworking, a redesign of it's fundamental data analysis interactive model. The original design concept worked well in the original functional space, but it's been left languishing and is in real danger of becoming left behind by new innovators.
</p>
<p>
It's been quite a while since I've spend much time and effort into advocating for improvements to Tableau's support for ordinary humans' data-analytical abilities.
</p>
<p>
At this time I'd like to present a compilation of material I've previously published, augmented with a wee bit of explanatory information.
</p>
<p>
I'm motivated to do this because I hear whispers that Tableau is maybe taking a look at how they can improve things.
</p>
<hr/>
<p>
Here's a list of references to material describing some ways in which Tableau could be improved; it covers a pretty broad span, partly because everything's related, partly because it's worth taking advantage of every opportunity to advocate for making Tableau a better product for helping people see and understand their data.
</p>
<p>
<a href="https://tableaufriction.blogspot.com/2016/01/nuggets-and-seeds.html">
<fs125> Nuggets and Seeds </fs125>
</a><br/>
A compendium of thoughts and musings about data analysis, effective data-analytical software tools, and Tableau's position as a premier tool for helping people see and understand data.<br/>
Is Tableau in danger of becoming just another enterprise platform? I hope not and fear so.<br/>
<i> January, 2016 </i>
</p>
<p>
<a href="https://tableaufriction.blogspot.com/2013/09/rethinking-analysis-frame-1-row-folding.html">
<fs125> Rethinking The Analysis Frame #1 - Row Folding </fs125>
</a><br/>
Directly related to improving Tableau's table(ish) abilities.<br/>
<i> September, 2013 </i>
</fs125>
</p>
<p>
<a href="https://tableaufriction.blogspot.com/2013/11/precision-inputs-required-in-addition.html">
<fs125> Precision Inputs Required In Addition To Analog Controls </fs125>
</a><br/>
Precise control of the geometries of the various structural elements, e.g. column width would go a long way to making Tableau better.</br>
Related: make it possible to select and adjust multiple elements at once - the current select/fiddle/repeat interaction model is tedious, tiresome, boring, and error-prone.<br/>
<i> November, 2013 </i>
</p>
<p>
<a href="https://tableaufriction.blogspot.com/2012/10/inconsistent-charttable-formatting.html">
<fs125> Inconsistent Chart/Table Formatting </fs125>
</a><br/>
<i> October, 2012 </i>
</p>
<p>
<a href="https://tableaufriction.blogspot.com/2014/10/towards-better-formatting-notes-on.html">
<fs125> Towards Better Formatting - Notes on Alignment </fs125>
</a><br/>
Specifically about text alignment, it lays out a robust set of options for formatting and aligning text.<br/>
Related: text should be formattable wherever it appears, this includes field labels, where it would be incredibly valuable to have control over folding, new lines, etc.
</p>
<p>
<a href="http://betterbizintel.blogspot.com/2012/08/tao-of-tableau-deciphering-tables-1.html">
<fs125> Problematic Table Formatting When Deployed in Dashboard </fs125>
</a><br/>
<i> July, 2013 </i>
</p>
<p>
<a href="https://tableaufriction.blogspot.com/2013/01/jittery-charts-and-how-to-fix-them.html">
<fs125> Jittery Charts - Why They Dance and How to Stop Them </fs125>
</a><br/>
<i> January, 2013 </i>
</p>
<p>
<a href="https://tableaufriction.blogspot.com/2013/05/failure-to-identify-or-who-is-that.html">
<fs125> Failure to Identify -or- Who is that mystery measure? </fs125>
</a><br/>
<i> May, 2013 </i>
</p>
<p>
<a href="https://tableaufriction.blogspot.com/2013/07/from-chart-white-space-to-need-for.html">
<fs125> From Chart White Space to (the need for) Architecture </fs125>
</a><br/>
General thoughts on the need to implement a coherent visual architecture underpinning Tableau's visualization space and data-analytical interactive functionality.<br/>
<i> July, 2013 </i>
</p>
<p>
<a href="https://tableaufriction.blogspot.com/2013/07/enhanced-chart-design-adding-white.html">
<fs125> Enhanced Chart Design - Adding White Space to Bar Charts </fs125>
</a><br/>
Visually separating elements grouped by Dimension members makes it much easier to identify these groupings than Tableau's current identically-sized matrix layout paradigm.<br/>
<i> July, 2013 </i>
</p>
<p>
<a href="https://tableaufriction.blogspot.com/2013/08/dual-axis-visibility-configuration.html">
<fs125> Dual Axis Visibility Configuration Explained - Is Not What It Should Be </fs125>
</a><br/>
<i> August, 2013 </i>
Dual axis charts' axes should be independently and rationally controllable. They're not.<br/>
While we're at it: axes should be top-level objects, not subordinate to Headers, which means that one needs to have the Header visible in order to manipulate the axis. Which is bad, but worse: one needs to know that's how to get to the axis, and that's an impediment for non experts.
</p>
<p>
<a href="https://tableaufriction.blogspot.com/2013/12/is-it-transparency-is-it-opacity.html">
<fs125> Is it Transparency? Is it Opacity? Labeled one, works like the other. </fs125>
</a><br/>
A little thing, but important in that 1) it works contradictory to expectations (that it established), and 2) plants a seed of mistrust in Tableau (if it's wrong here, where else is it?)<br/>
<i> December, 2013 </i>
</p>
<fs125p>
Additional Improvement Opportunities
</fs125p>
<p>
<a href="https://tableaufriction.blogspot.com/2013/04/needed-more-file-names-and-better.html">
<fs125> Needed: More File Names and Better Interaction </fs125>
</a><br/>
<i> April, 2013 </i>
</p>
<p>
<a href="https://tableaufriction.blogspot.com/2014/03/tableau-needs-new-windowing-scheme.html">
<fs125> Tableau Needs a New Windowing Scheme </fs125>
</a><br/>
<i>(a bookmark article)</i><br/>
Essentially, Tableau's current application UI is horribly constrained by the fixed configuration of its component windows/panels.<br/>
The UI architecture made a little sense when Tableau was initially introduced, a legacy of the project Poseidon UI, but it's been outmoded for a decade.<br/>
Modern application UIs are much more modular and flexible, letting one have the tools necessary for the job at hand readily available without opening, closing. collapsing, expanding structural, modal components.
<i> March, 2014 </i>
<br/>
Speaking of modality: the mishmash of modal/non-modal sub-windows and dialogs is a mess. Wherever possible, dialogs need to be non-modal.
</p>
Chris Gerrardhttp://www.blogger.com/profile/01598731155784487000noreply@blogger.com0tag:blogger.com,1999:blog-6248043124025283718.post-59967669152741304502018-09-10T17:45:00.000-04:002018-09-10T18:14:10.393-04:00Documenting Dashboards and their Worksheets<h1>
Objective</h1>
Document the Dashboards, and the Worksheets they contain, in one or more Workbooks, making it possible to use Tableau to see things like this:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAuo1XrW5xuVq6D2yw-yPeClIt2intu46Zw6x06DqjAaNLKvv3luR1SG9JT8NLQ6fXKY1Nui5333c9zlwOPaBT4GzBbuy3vZhWsYpl9Yk_Ib14UspWfK5Dmo1pvhfnlKGMqPLsLesxyLg/s1600/TwbDashboardWorksheets+--+Workbooks+-+Dashboards+-+Worksheets.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="864" data-original-width="574" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAuo1XrW5xuVq6D2yw-yPeClIt2intu46Zw6x06DqjAaNLKvv3luR1SG9JT8NLQ6fXKY1Nui5333c9zlwOPaBT4GzBbuy3vZhWsYpl9Yk_Ib14UspWfK5Dmo1pvhfnlKGMqPLsLesxyLg/s1600/TwbDashboardWorksheets+--+Workbooks+-+Dashboards+-+Worksheets.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRS2mUuvcC3uYVUOQy_9pIvS51KrId0mI0g7eCCr1YEyUUZ9kY82MIQjrmHZookO4_OPKItDmBMlhdv7LWZF1yNQ5HnAIuXonX7QQ7LGgDH0KFaVxjxQNBSpdXzelk4q7mHUcNhZ8VVsU/s1600/TwbDashboardWorksheets+--+Workbooks+-+Dashboards.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="374" data-original-width="703" height="340" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRS2mUuvcC3uYVUOQy_9pIvS51KrId0mI0g7eCCr1YEyUUZ9kY82MIQjrmHZookO4_OPKItDmBMlhdv7LWZF1yNQ5HnAIuXonX7QQ7LGgDH0KFaVxjxQNBSpdXzelk4q7mHUcNhZ8VVsU/s640/TwbDashboardWorksheets+--+Workbooks+-+Dashboards.png" width="640" /></a></div>
<p>
Tableau Tools make it simple and easy to accomplish this. All of your Workbook's Dashboards can be documented so that it's easy to see and understand where they are and the Worksheets they contain.
</p>
<h1>
Tableau Tool – Recipe</h1>
<ol>
<li>Prepare the ingredients – make sure that:<br />
<ol>
<li>Ruby is installed</li>
<li>The Twb gem is installed</li>
<li>The Ruby script <code>analyzeDashboardSheets.rb</code> is available </li>
</ol>
</li>
<li>Open a console / command / terminal session<br /> <code> > _ </code><br />
</li>
<li>Navigate to the directory or folder containing the Workbooks you want to document<br /> <code> > cd {path to Workbooks} </code></li>
<li>Run <b>analyzeDashboardSheets.rb</b><br /> <code> > ruby '{path to Workbooks}\analyzeDashboardSheets.rb' </code></li>
<li>Examine the CSV file containing the information, normally<br /> <code> > ./ttdoc/TwbDashboardSheets.csv </code><br />—preferably with Tableau</li>
</ol>
<h1>
Why This Tool</h1>
<h2>
Problem Addressed</h2>
One of the challenges faced with Tableau once it's been in use for a while is in understanding where things are and how they're related.<br />
<h2>
Information Requirements</h2>
Individual and organizational interests have a common set of information requirements that can be framed as questions about how Tableau's being used. Being able to get answers to these questions is essential to being able to understand what's been created with Tableau. The questions include:<br />
<ul>
<li>Where's that Dashboard, in which Workbook or Workbooks?</li>
<li>How many versions are there of it?</li>
<li>What Worksheets does it contain?</li>
<li>Are the Worksheets the same in the different versions?</li>
<li>Which Dashboards does this Worksheet appear in?</li>
</ul>
Individuals and an Organization's Managers have concerns and responsibilities regarding the effective use of Tableau, covering the spectrum from individuals' dynamic data analysis to construction, delivery, and consumption of informative analytics via Dashboards. (<i>recognizing that Dashboards aren't the only information delivery mechanism, this post is specific to them</i>) <br />
A normal working Tableau person can be involved with many, many Workbooks. It's not unusual for there to be hundreds, even into the thousands of Workbooks to be present in an Organization where Tableau's been in use for any length of time.<br />
<b>Individual Tableau User</b><br />
Broadly speaking, there are two main uses of Tableau. Some people use it primarily for their own data analysis, some use it to create analytics for others to consume, with many or most people with some mixture of the two. As an individual, once you've created a number of Workbooks it can become difficult to remember which Workbook a Dashboard is in, or Workbooks if there are versions and copies of it.<br />
<b>Organization</b><br />
Organizations have multiple people with interests that are well served by being able to identify the content of Tableau Workbooks, including those responsible for:<br />
<ul>
<li>Intellectual Property Guardianship</li>
<li>Data & Analytics Governance </li>
<li>Analytics Management</li>
</ul>
<h3>
Tableau Doesn't Help (Much)</h3>
Tableau provides very little assistance in helping answer these and related questions. If the Workbooks are published to Tableau Server or Tableau Online there are some views that provide partial information, but it's a very limited perspective lacking real analytical flexibility.<br />
<h3>
Solution: Documenting the Dashboards and Worksheets</h3>
This Tableau Tool will examine a collection of Workbooks and record the information about their Dashboards, and the Dashboards' Worksheets. By default the Workbooks will include all the normal and packaged Workbooks in the current directory/folder—this can be easily configured to include as many or as few Workbooks as desired.<br />
The information is captured in a CSV file, making it analytically useful with Tableau (or other data analysis tool).<br />
<h2>
analyzeDashboardSheets.rb</h2>
is a Ruby script that accesses Workbooks, locates the Dashboards, their Worksheets, and records the information in a CSV file. It can be run as-is, and is <a href="https://gist.github.com/ChrisGerrard/fd9d9c88643e3cfe89e178f2d4c5b10b">available as a Gist from GitHub here</a>.<br />
<h2>
analyzeDashboardSheets.rb – How to Use</h2>
<h3>
Prerequisites</h3>
<h4>
Ruby is installed</h4>
Ruby is available for all of the platforms that Tableau runs on. It's available by default on Macs, and is easily installed on Windows.<br />
<h4>
The twb gem is installed</h4>
normally via:<br />
<pre><code> > gem install twb
</code></pre>
<h4 id="analyzedashboardsheets-rb-is-available">
analyzeDashboardSheets.rb is available</h4>
at <code> {path}\analyzeDashboardSheets.rb </code><br />
<h4>
The Workbooks to document are available</h4>
Normally and most conveniently collected into a single directory, they can be located in multiple directories identified with a set of file naming patterns <i>details below</i><br />
The directory contains the Workbooks to analyze — we're using the Tableau Sample Workbooks here<br />
<pre><codeblock>
> cd '{directory/folder containing the Workbooks}'
> ...
> dir *.t*
Volume in drive C is Windows7_OS
Volume Serial Number is F861-CE43
Directory of {...}\Tableau Sample Workbooks
09/06/2018 04:28 PM 627,531 Regional.twb
09/05/2018 09:34 PM 605,080 Regional.twbx
09/05/2018 09:34 PM 1,091,332 Superstore.twbx
09/05/2018 09:34 PM 533,181 World Indicators.twbx
4 File(s) 2,857,124 bytes
0 Dir(s) ... bytes free
</codeblock></pre>
Note: <i>Regional.twb</i> is a copy of the sample <i>Regional.twbx</i> Workbook that's been edited and saved as a normal <i>.twb</i> file. <br />
<h3>
run 'analyzeDashboardSheets.rb'</h3>
most commonly, from the terminal command line like so:<br />
<pre><codeblock>
> ...
> ruby '{path}\analyzeDashboardSheets.rb'
</codeblock></pre>
As it runs <code> analyzeDashboardSheets.rb </code> provides information about its operation:<br />
<pre><codeblock>
Analyze Dashboard Sheets from Tableau Workbooks.
Processing Workbooks matching: '["*.twb", "*.twbx"]'
- Regional.twb
- Regional.twbx
- Superstore.twbx
- World Indicators.twbx
Analysis complete, found: 4 Workbooks
For documentation and generated data see the following:
- ./ttdoc/TwbDashboardSheets.csv Workbooks, Dashboards, and their Worksheets
That's all, folks.
</codeblock>
</pre>
The CSV file <code>TwbDashboardSheets.csv</code> can now be used to identify and analyze the Dashboards and Worksheets. <br />
<h3>
TwbDashboardWorksheets.twb</h3>
connects to the CSV file and has a number of starter Worksheets that provide basic information, including those shown above. It can be downloaded from GitHub as <a href="https://github.com/ChrisGerrard/Tableau-Tools/blob/master/Ruby/analysis/twbs/TwbDashboardWorksheets.zip" title="abc">'TwbDashboardWorksheets.twb.zip' from here</a>. <br />
Workbook notes:<br />
<ul>
<li>Zipped: the Workbook is zipped simply have GitHub provide a download link to it instead of presenting it as an XML file. Unzip it to use it.</li>
<li>CSV file: The Workbook is configured to pick up the CSV file from the current directory.<br />This is normally the <code>./ttdoc</code> subdirectory of the directory from which <code>analyzeDashboardSheets.rb</code> was run.<br />If the workbook is opened from this directory it will automatically find the CSV file, otherwise you'll need to point Tableau to it.<br />When the Workbook is saved it will remember this location, so if you want to use the Workbook with another CSV file you will need to edit the data connection to identify the new file's location.</li>
</ul>
<h3>
Configuration:</h3>
By default, <code> analyzeDashboardSheets.rb </code> analyzes all of the normal and packaged Workbooks in the current directory/folder.<br />
It can be told to analyze any Workbooks of interest by providing their names on the command line, either as specific names or as one or more patterns that <code> analyzeDashboardSheets.rb </code> will use to locate matching Workbooks.<br />
<h4>
Identifying Workbooks by Names & Patterns</h4>
The analysis is conducted on Workbooks identified by name, which can be literal names, e.g. 'Regional.twbx'; or by patterns, e.g. '*.twb', which may contain replaceable parts of file names—wild card characters.<br />
The default pattern has two parts: <code> <i>.twb,</i>.twbx </code>. This is equivalent to<br />
<code> ruby '{path}\analyzeDashboardSheets.rb' '<i>.twb,</i>.twbx' </code> and is interpreted as two individual patterns:<br />
<ul>
<li><code>*.twb </code> identifies files ending in '.twb' – normal Workbooks</li>
<li><code>*.twbx </code> identifies files ending in '.twbx' – packaged Workbooks</li>
</ul>
<i>note</i>: there's a comma separating the individual patterns, with no spces between them.<br />
Other patterns can be provided to identify any Workbooks of interest. Some examples:<br />
<ul>
<li><code>'*.twb' </code> – only the normal Workbooks in the current directory</li>
<li><code>'<b>/*.twb,</b>/*.twbx' </code> – all the Workbooks in the current and all subdirectories</li>
<li><code>'{path}/*.twb' </code> – all the normal Workbooks in the directories named by {path}; where {path} can be relative or absolute </li>
</ul>
<i>note</i>: it's not necessary to put the patterns in quotes; they'll be handled either way, but it may make things clearer in some circumstances.<br />
<h3>
Data notes:</h3>
The CSV file contains this header record:<br />
<pre><code>Workbook,Workbook Dir,Modified,Dashboard,Worksheet,Hidden,Visible
</code></pre>
identifying these fields:<br />
<table>
<thead>
<tr>
<th>Field</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>Workbook</td>
<td>the Workbook's name</td>
</tr>
<tr>
<td>Workbook Dir</td>
<td>the directory/folder the Workbook is in – useful when processing multiple directories that may contain Workbooks with the same name</td>
</tr>
<tr>
<td>Modified</td>
<td>the Workbook's modification date</td>
</tr>
<tr>
<td>Dashboard</td>
<td>the Dashboard's name</td>
</tr>
<tr>
<td>Worksheet</td>
<td>the name of a Worksheet contained in the Dashboard</td>
</tr>
<tr>
<td>Hidden</td>
<td>whether or not the Worksheet is hidden</td>
</tr>
<tr>
<td>Visible</td>
<td>whether or not the Worksheet's visible (opposite of 'Hidden'</td>
</tr>
</tbody>
</table>
<h1>
Getting Started</h1>
It's simpler and easier to get started than you may think. If you're using Windows getting Ruby installed is straightforward, Google "Ruby on Windows". Ruby is included on standard Mac installations, and Google is again your friend.<br />
Installing the twb gem, grabbing and running analyzeDashboardSheets.rb takes only a few minutes. <br />
Download the starter Workbook into the 'ttdoc' subdirectory, open it up and start exploring your Dashboards and their Worksheets.Chris Gerrardhttp://www.blogger.com/profile/01598731155784487000noreply@blogger.com0tag:blogger.com,1999:blog-6248043124025283718.post-71296759949712391512018-08-30T12:07:00.002-04:002018-08-30T12:08:57.164-04:00Tableau Online Locations & IP Addresses<p>
From Tableau doc found here: <a href="https://onlinehelp.tableau.com/current/online/en-us/to_keep_data_fresh.htm#safelist">Tableau Online IP addresses for data provider authorization</a>
</p>
<table style="margin-left: 0; margin-right: auto; valign:top;">
<tr>
<th>Host Name (Instance)</th>
<th>Site Location</th>
<th>IP Address or Range</th>
</tr>
</thead>
<tbody>
<tr>
<td>10ax.online.tableau.com</td>
<td>N. America</td>
<td>34.208.207.197<br /> 52.39.159.250</td>
</tr>
<tr>
<td>10ay.online.tableau.com</td>
<td>N. America</td>
<td>34.218.129.202<br /> 52.40.235.24</td>
</tr>
<tr>
<td>10az.online.tableau.com</td>
<td>N. America</td>
<td>34.218.83.207<br /> 52.37.252.60</td>
</tr>
<tr>
<td>us-east-1.online.tableau.com</td>
<td>N. America</td>
<td>50.17.26.34<br /> 52.206.162.101</td>
</tr>
<tr>
<td>us-west-2b.online.tableau.com</td>
<td>N. America</td>
<td>34.214.85.34<br /> 34.214.85.244</td>
</tr>
<tr>
<td>dub01.online.tableau.com</td>
<td>EU</td>
<td>185.92.123.0/29</td>
</tr>
<tr>
<td>eu-west-1a.online.tableau.com</td>
<td>EU</td>
<td>34.246.62.141<br /> 34.246.62.203
</td>
</tr>
</tbody>
</table>
Chris Gerrardhttp://www.blogger.com/profile/01598731155784487000noreply@blogger.com0tag:blogger.com,1999:blog-6248043124025283718.post-71743656210711882712018-08-18T20:57:00.000-04:002018-08-21T16:40:18.576-04:00Calculated Fields Analysis with Tableau Tools — getting started <p>
It's pretty handy to be able to be able to see and analyze the Calculated Fields in your Workbooks without the tedious bother of manually inspecting them by opening up the Workbooks and looking at them one at a time. Even writing that sentence was boring.
</p>
<p>
Imagine how much better it would be to be able to use Tableau to see the Fields, all brought together so that they can be scanned, filtered, sorted, and otherwise freely investigated.
</p>
<p>
Here's a screen shot of a Tableau Worksheet showing the Calculated Fields from Tableau's Sample Workbooks.<br />
<i>Note: the data window and controls – shelves, filters, etc. have been hidden for clarity.</i>
</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8z6CuXb68MvCtXFDkByDe0xWqYvKKm6uJzO5d0HISUeRFH8P_YdFeVF4SAsBJHhJ-Od6GkJY9w68-Ftw2PKy9OOEAWmHjLYIUrd2Cr6ItSwslXutyQMmzjoK0zd5518SEMAzqPAB9YGU/s1600/Calculated+Fields+-+Base+Data%252C+Calculated+Field+Formulas.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="900" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8z6CuXb68MvCtXFDkByDe0xWqYvKKm6uJzO5d0HISUeRFH8P_YdFeVF4SAsBJHhJ-Od6GkJY9w68-Ftw2PKy9OOEAWmHjLYIUrd2Cr6ItSwslXutyQMmzjoK0zd5518SEMAzqPAB9YGU/s1600/Calculated+Fields+-+Base+Data%252C+Calculated+Field+Formulas.png" /></a></div>
<p>
Tableau Tools makes it simple and easy to analyze the Calculated Fields in your Workbooks.
</p>
<p>
This post describes the basics of analyzing the Workbooks and accessing the generated CSV data files.
</p>
<fs125p>First Step — Parsing the Workbooks</fs125p>
<pre>analyzeCalculatedFields.rb</pre> is a Ruby script that accesses Workbooks, locates the Calculated Fields, and records the information in CSV files.<br />
It's self-contained, can be run as-is, and is <a href="https://github.com/ChrisGerrard/Tableau-Tools/blob/master/Ruby/analysis/analyzeCalculatedFields.rb">available from GitHub here</a>.
<fs115p>Usage</fs115p>
<p/>
<fs110>Prerequisites:</fs110>
<br />
<ul>
<li>Ruby is installed</li>
<li>The twb gem is installed - normally via<br />
<pre>
<code>
> gem install twb
</code>
</pre>
</li>
<li>analyzeCalculatedFields.rb is available at <b>{path}</b></li>
<li>The directory contains the Workbooks to analyze — we're using the Tableau Sample Workbooks here
<pre><code>
> dir *.t*
Volume in drive...
Volume Serial Number is...
Directory of {path}\Tableau Sample Workbooks
06/27/2018 10:32 PM 605,080 Regional.twbx
06/27/2018 10:32 PM 1,091,332 Superstore.twbx
06/27/2018 10:32 PM 533,181 World Indicators.twbx
3 File(s) 2,229,593 bytes
</code>
</pre>
</li>
</ul>
<fs115p>run analyzeCalculatedFields.rb</fs115p>
most commonly, from the terminal command line like so:
<br />
<pre><code>
> ruby '{path}\analyzeCalculatedFields.rb'
</code>
</pre>
As it runs analyzeCalculatedFields.rb provides information about its operation:
<br />
<pre><code>
Twb::Analysis::CalculatedFieldsAnalyzer
Analyze Calculated Fields from Tableau Workbooks.
Processing Workbooks matching: '["*.twb", "*.twbx"]'
- Regional.twbx
- Superstore.twbx
- World Indicators.twbx
Analysis complete, identified
# of Workbooks : 3
# of Calculated Fields : 43
# of Referenced Fields : 84
For documentation and generated data see the following:
- ./ttdoc/TwbCalculatedFieldFormulaLines.csv Calculated fields and their formulas' individual lines.
- ./ttdoc/TwbCalculatedFields.csv Calculated fields and their formulas.
- ./ttdoc/TwbCalculatedFieldsReferenced.csv Calculated fields and the fields their formulas reference.
That's all, folks.
</code>
</pre>
The CSV files can now be used to identify the Calculated Fields, their Formulas, the fields they reference, the Workbooks and Data Sources they are from.
The provided Tableau Workbook: 'Calculated Fields - Base Data.twbx' connects to each of the CSV files and has a
starter Worksheet for each, <a href="https://github.com/ChrisGerrard/Tableau-Tools/blob/master/Ruby/analysis/ttdoc/Calculated%20Fields%20-%20Base%20Data.twbx" title="abc">downloadable from here</a>.
<p>
Another view of the Worksheet shown above is here:<br/>
<i>Note: the data controls have been restored to show the more familiar Tableau user interface.</i>
</p>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZV6DF6D1cq_aolo1OZLMwrGI1CrokCQ3I0jqW6AGb8ZbS19yOAVeQaSXlyAvrMVwuCENy7IUCroJ7FKsBnO1ui0WYkOO7Ugcl657C1Vwe6PEjnJBiAlzZh2cwaZdmzE4N6PSAUuNb1dQ/s1600/Calculated+Fields+-+Base+Data%252C+Calculated+Field+Formula+Lines+sheet+1000w.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="584" data-original-width="1000" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZV6DF6D1cq_aolo1OZLMwrGI1CrokCQ3I0jqW6AGb8ZbS19yOAVeQaSXlyAvrMVwuCENy7IUCroJ7FKsBnO1ui0WYkOO7Ugcl657C1Vwe6PEjnJBiAlzZh2cwaZdmzE4N6PSAUuNb1dQ/s1600/Calculated+Fields+-+Base+Data%252C+Calculated+Field+Formula+Lines+sheet+1000w.png" /></a>
<br />
Data notes:<br />
<ul>
<li>As shown, formulas are available in two forms:
<ul>
<li>as single elements, with all lines combined, and</li>
<li>in their original lines as coded.</li>
</ul>
<li>"Formula Line #" is used to order the lines into their correct order, it can be hidden for clarity.</li>
<li>The TwbCalculatedFieldFormulaLines data source is more generally useful than TwbCalculatedFields, although TwbCalculatedFields contains technical information about the calculated fields that is useful for advanced technical analysis.</li>
</ul>
<br />
Workbook notes:<br />
<ul>
<li>The Workbook is configured to pick up the CSV files from the current directory; this will be hard wired to whichever directory the Data Sources are using when the Workbook is saved.</li>
<li>The Workbook is packaged simply to avoid GitHub from presenting it as XML text by default – this can be confusing to people who aren't aware of or used to seeing Workbooks as XML.</li>
</ul>
<p/>
<fs125p>Recommendations</fs125p>
It's simpler and easier to get started than you may think. If you're using Windows getting Ruby installed is straightforward, Google "Ruby on Windows". Ruby is included on standard Mac installations, and Google is again your friend.
Installing the twb gem, grabbing and running analyzeCalculatedFields.rb takes only a few minutes.
Download the starter Workbook into the 'ttdoc' subdirectory, open it up and start exploring your Calculated Fields.
<fs125p>Coming soon.</fs125p>
Future posts will expand upon using Tableau to explore the CSV data prepared so far, showing how to accomplish things such as how to trace where specific fields are used.
We'll also go over the other documentation produced, including maps of the Calculated Fields' relationships to one another and to the Data Sources' database fields.
Further on, other tools will be introduced, expanding the scope of how Tableau things can be related to one another, e.g. identifying which Dashboards contain data from specific databases, which makes it possible to assess the impact of database changes—something that Tableau doesn't natively support.
Chris Gerrardhttp://www.blogger.com/profile/01598731155784487000noreply@blogger.com0tag:blogger.com,1999:blog-6248043124025283718.post-47186539590635267152017-05-29T20:06:00.000-04:002017-05-29T20:06:12.015-04:00Another Step in Tableau's Evolution?Tableau broke new ground when it was introduced. The best tool for simple, straightforward visual data analysis then, it remains unsurpassed in this space today, even as it's striving to be a player in the enterprise marketplace where, to paraphrase Christian Chabot, it can maximize its market potential.<br /><br />
Tableau always wanted to be more than a personal product. The early Polaris project at Stanford pursued the ability to visualize "large multi-dimensional databases [that] have become common in a variety of applications such as data warehousing and scientific computing." When introduced Tableau was a simple tool, but beautiful in its simple elegance, particularly compared to the options then available.<br />
<br />
Even though it was predominantly useful only as a personal tool, when I bought my license in 2006 to use in my BI consulting work I had to purchase it from my assigned sales representative, who was keenly interested in leveraging my use of Tableau to penetrate my clients' organizations. And the price was exorbitant for a personal product in a world where Borland had introduced the model of highly functional low and moderately priced products that could be impulse-purchased.<br />
<br />
Over the years Tableau added more features and functionality, often layering them on top of its base, leveraging existing functionality rather than implementing new and better ways of doing things. Dashboards were a big step. Tableau Server arguably a bigger one. Always moving forward, Tableau addressed the concerns of "enterprise" people pointing out its shortcomings from their perspective.<br />
<br />
The IPO was a big deal. It meant that Tableau had grown up in meaningful ways. Made it easier to raise capital and expand its visibility in the marketplace.<br />
<br />
Making Gartner for the first time was huge. Now Tableau was visible to the top executives who look to Gartner to see what other top executives think, and Tableau was at a stroke a presence in the mindspace of enterprise business decision makers, a legitimate option for big corporate dollars to be spent on. Things were moving forward, life was good, especially for Tableau's founders and executives. They had made the world a better place, and reaped handsome rewards in return.<br />
<br />
Then the haircut. The stock price dropped 50% in February, 2016. Moving into the enterprise marketplace was more difficult than disrupting a moribund personal tool space had been. Elegance and effectiveness of design had profoundly improved people's data-analytical lives in a burst, and Tableau became the darling of individual analysts. But big, serious, enterprise customers moved in response to a different set of forces. Conservative to the core, they needed to be convinced that Tableau could "be like" their existing heavily invested data processing tools and platforms. They didn't care that Tableau offered opportunities that could, if taken advantage of, dramatically change their entire approach to business data analysis, inverting it from a top-down industrial model to an organic model where the right data was available for use and analysis throughout the organization. Enterprise executives didn't want to do things better, they wanted to do the same things cheaper, and hopefully faster. Tableau announced that it was concentrating on high-value deals, with their longer lead times and associated complexity. The company that had succeeded because it sold individual licenses to people, making a difference in their lives, was now concentrating on big, impersonal deals. A different world indeed.<br />
<br />
Tableau was in a vice. Its strengths had earned it a seat at the table, with a window of opportunity to demonstrate that it was an enterprise player like the big companies it had disrupted at the personal end of the spectrum. What to do?<br />
<br />
Six months after the haircut Christian Chabot stepped aside as
Tableau's leader after shepherding the company from frisky upstart to
market leader, and then through the penetration of and acceptance in the enterprise market.<br />
<br />
Tableau has been busy releasing new versions adding additional features that improve its enterprise offering. More data sources connected, more Server functionality, more stuff.<br />
<br />
Tableau has not been busy improving its core ease of use, or of expanding the horizon of the things made simple and easy. It's almost as if Tableau believes that the 'low' end, the one where it stands out and is truly special, isn't the place to invest its time, energy, effort, and money.<br />
<br />
Which brings is to the present, and the trigger of this post. According to reports Chris Stolte has sold of a bunch of Tableau stock, e.g.<br />
<ul>
<li>Monday, May 15th, 75,000 shares at an average price of $61.69, for a
total of $4,626,750 </li>
<li>Monday, May 8th, 150,000 shares at an average price of $60.15, for a
total of $9,022,500 </li>
</ul>
As of this information, Chris directly owns 78,805 shares valued at appx. $4,861,480<br />
<br />
What does this mean? I have no idea. I don't know Chris, although I've met him a couple of times at Tableau functions.<br />
<br />
But I'm worried. Worried that one of Tableau founders has stepped out of the direct line of effect, and another appears to be shedding himself of his investment in the company. Worried that Tableau is moving more purposefully towards concentrating on the enterprise market and maximizing its market potential, aka capitalization/shares value, and that this means that will move even farther from its roots as the best-ever tool for visual data analysis. Worried that the chances to revisit its core functionality, fill in the holes, correct the flaws, adjust the oddities, sand off the warts, improve its deficiencies, and extend its ease of use into new areas, are vanishing in the rear view mirror.<br />
<br />
On the other hand, maybe Chris is looking for a new challenge. Maybe he's interesting in picking up again the mantle of champion of the visual analyst and work towards creating the next great visual data analytical tool, the one that is what Tableau could have become. If so, I've been working on some ideas.Chris Gerrardhttp://www.blogger.com/profile/01598731155784487000noreply@blogger.com2tag:blogger.com,1999:blog-6248043124025283718.post-18424562729462689682016-09-26T23:56:00.000-04:002016-09-26T23:56:21.938-04:00Why no, Tableau, I don't want you reading my mail.<p>
I was excited about being able to use Tableau with my Google sheets' data. The ability to connect directly to them with Tableau 10 was really appealing.
</p>
<p>
My enthusiasm dissipated quickly when this showed up:
</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXAyj30xPJdoynKXQs3BzsCQFr2N2ZAx-AiuYDYaTKRmy9KjCIabNpmrNwEmagp1B7k96iFEgrhiVYvgjcaFnvX-wHT1ZuVFZyobQsPQwzWN8zlfIZBjqFroEwKfiGIKwWt0KRdtIM2Ys/s1600/Tableau+10+Google+Sheets+Connection+Permissions.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXAyj30xPJdoynKXQs3BzsCQFr2N2ZAx-AiuYDYaTKRmy9KjCIabNpmrNwEmagp1B7k96iFEgrhiVYvgjcaFnvX-wHT1ZuVFZyobQsPQwzWN8zlfIZBjqFroEwKfiGIKwWt0KRdtIM2Ys/s1600/Tableau+10+Google+Sheets+Connection+Permissions.png" /></a></div>
<p style=margin-top:1em;"><fs125>
Really, Tableau?
<br />
You want to view my email address and basic profile info?
</fs125>
</p>
<p>
What possible reason could there be for needing this information to establish a connection to my Google sheets? I can't think of a single one.
</p>
<p>
Whose idea was this?
</p>
<p>
Frankly, the whole thing is offensive, and I'm very put out.
</p>Chris Gerrardhttp://www.blogger.com/profile/01598731155784487000noreply@blogger.com5tag:blogger.com,1999:blog-6248043124025283718.post-8022538197614139402016-07-11T00:38:00.000-04:002016-07-11T00:38:14.142-04:00On the virtues of simpler and easier.<div style="margin-left:2em;margin-right:2em;">
<p>
"Creeping featurism is a disease, fatal if not treated promptly. There are some cures, but, as usual, the best approach is to practice preventative medicine."
</p>
<p style="margin-left:2em;">
— Donald Norman, The Design of Everyday Things 2002 Basic Books edition ISBN 0465067107 Ch. 6, p. 173.
</p>
<p style="margin-top:2em;">
"The best software for data analysis is the software you forget you're using. It's such a natural extension of your thinking process that you can use it without thinking about the mechanics."
</p>
<p style="margin-left:2em;">
— <a href="http://www.tableau.com/blog/stephen-few-data-visualization">Stephen Few on Data Visualization: 8 Core Principle</a>
</p>
</div>Chris Gerrardhttp://www.blogger.com/profile/01598731155784487000noreply@blogger.com1tag:blogger.com,1999:blog-6248043124025283718.post-62990397090807686862016-05-31T15:24:00.000-04:002016-05-31T15:24:04.726-04:00Please stop spamming the comments.<p>
To those of you who submit comments with zero content other than soliciting for your Tableau training, consulting, or other commercial purposes: you might as well stop.
<p/>
<p>
Your comments will not be published.
<p/>
<p>
I find it offensive that you're spamming the comments, contributing nothing to the topic at hand but looking to advertise your wares.
<p/>
<p>
It offends me personally in that I need to spend time attending to your crass, pushy, rudeness.
<p/>
<p>
It offends those of us who have put in the time, energy, and effort to become competent professionals.
Your pushing the idea that simply taking a short Tableau training course, of dubious quality, is enough to get someone to pay you to work with it is at best naive, misleading, and reflective of the race to the bottom that values a smear of exposure to real competence.
<p/>
<p>
Examples of comments I will not publish:
<p/>
<div style="margin-left:5em; margin-right:5em">
<p>
Nice Article !!! Thanks for sharing with us !!! Visit - http://[spammer 1].in/
</p>
<p>
http://www.[spammer 2].com[...]tableau-online-training-in-[...]/
</p>
<p>
great post i read from start to end its awesome, keep on writing more about TABLEAU. we are one of the leading TABLEAU online trainers.. Visit - http://[spammer 1].in/
</p>
<p>
your blog is such a wonderful and nice library which filled with lot of technical stuff please share with us http://www.[spammer 3].com/tableau-training.html
</p>
<p>
Nice Article Thanks for sharing with us !!! Visit - http://[spammer 1].in/
</p>
<p>
This is a Good blog. Thank you for your very useful information. I appreciate that you looked it up to share with us all!.... Tableau online training on
</p>
</div>Chris Gerrardhttp://www.blogger.com/profile/01598731155784487000noreply@blogger.com5tag:blogger.com,1999:blog-6248043124025283718.post-62514104760463997632016-05-03T19:11:00.000-04:002016-05-03T19:19:21.442-04:00Dashboard Improvement Opportunities - Surface Observations<fs125p>
Tableau Dashboards need improvements.
</fs125p>
<p>
I've been beating the drum for improvements to Tableau's dashboards ever since they were introduced. As a way to get more than one worksheet into the same visual space they were adequate, and they still work OK/tolerably/nottoobad/betterthannothing, etc. for those situations where you only want to double-click 2, 3, or 4 worksheets and have Tableau put them into a grid-based layout.
</p>
<p>
But this isn't good enough.
</p>
<p>
Over the years I've been using Tableau there's been far too much time consumed with fiddling, faking, fooling, and futzing around with dashboards. Time that takes away from the real value of helping people discover, understand, and communicate useful and valuable information in the data that matters to them.
</p>
<p>
Yes, Tableau has made improvements to Dashboards and dashboard creation and maintenance. And some of these are really welcome, as far as they go. For example, the introduction of the Layout control in the Dashboard Window was a half-quantum leap forward. For the first time we could see, without use of external tools, how the elements in a Dashboard related structurally to one another. But as good as it was, as much a leap, it was still only a half-step forward: the Layout control is so small, and it's selection management abilities so poor, that using it is an exercise in multi-click hell. And it's still easier to get a comprehensive view of Dashboard contents with external tools.
</p>
<p>
It was at this point of describing my frustrations with a colleague who was relatively new to Tableau, and didn't have any experience in more sophisticated tools, that she said, in effect: "well, I don't see what's wrong with it, so why don't you show me?"
</p>
<p>
Hence the following diagram. I created a simple, two-sheet dashboard and used it to illustrate some of the problems that jumped out. It's in no way comprehensive—I tried to keep it relatively simple.</p>
<p>
</p>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj37n1zZfsIxTH7ygxpRJ_O-Y2-azXB45KDyh4ORs_x_FNTUQn1jOFNP9cJmnDyDf-ljr8vkv8kN-0E03edv1ptw0DVGfSaj0etEVeaFIkR01-ZQ24WvaZCWAvexmIdblLdpHjtO9pf9T8/s1600/Initial+Dashboard+Critique+980w.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj37n1zZfsIxTH7ygxpRJ_O-Y2-azXB45KDyh4ORs_x_FNTUQn1jOFNP9cJmnDyDf-ljr8vkv8kN-0E03edv1ptw0DVGfSaj0etEVeaFIkR01-ZQ24WvaZCWAvexmIdblLdpHjtO9pf9T8/s1600/Initial+Dashboard+Critique+980w.png" /></a>
<p>
The Tableau Public published version of this workbook is <a href="https://public.tableau.com/views/InitialDashboardCritique/Filtertesting?:embed=y&:display_count=yes&:showTabs=y">here</a>.
</p>
<p>
A concrete example. Have you ever been wrestling with a dashboard, trying to get things nicely organized and arranged, only to have Tableau seemingly go insane, moving things around that you haven't touched, making it difficult to place and resize things that only a moment ago were all nice and tidy? The following example shows one of the things that can contribute to the chaos.
</p>
<div style="float: left; width: 370px;">
<!-- LEFT -->
<fs125p>
Multiplying Containers.
</fs125p>
<p>
Start with a newly created dashboard.
</p>
<p>
Then click "<fs110>Show Title</fs110>" 5 times,<br/>i.e. issue this command sequence:
<ol>
<li>Show Title</li>
<li>Unshow Title</li>
<li>Show Title</li>
<li>Unshow Title</li>
<li>Show Title</li>
</ol>
</p>
</div>
<div style="float: left; margin-left: 20px; width: 530px;">
<!-- RIGHT -->
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtRQaQGKdIfK5r9NBTJzHXVbXC4OQJuILB9aHI96DmYtfCM6Q4t7ixT-zDWW8PpVy4XNvG1R8L7DiFbCSmaLE_VM-LfwmZKoG9_RU2_9mIDZYGhkUEVKgweE0Hoo7DOp8HI3taA_QGdHM/s1600/Newly+Created+Dashboard+3.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtRQaQGKdIfK5r9NBTJzHXVbXC4OQJuILB9aHI96DmYtfCM6Q4t7ixT-zDWW8PpVy4XNvG1R8L7DiFbCSmaLE_VM-LfwmZKoG9_RU2_9mIDZYGhkUEVKgweE0Hoo7DOp8HI3taA_QGdHM/s1600/Newly+Created+Dashboard+3.png" /></a>
</div>
<div class="separator" style="clear: both; text-align: center;"></div>
<p> </p>
<div class="separator" style="clear: both; text-align: center;"></div>
<div style="float: left; width: 370px;">
<!-- LEFT -->
<p>
After all the Title Showing and Unshowing you should see that Tableau has gone ahead and created this container structure for you.
</p>
<p>
This is bad. But it gets worse—once a Dashboard is populated with actual (human) content Tableau will insert containers as you, the dashboard author, do your authoring. This can make for extremely messy situations.
</p>
</div>
<div style="float: left; margin-left: 20px; width: 530px;">
<!-- RIGHT -->
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx-hNrY9I1zw-E0nGQOq0VMCqeNXLi3UUbZHJ2lgW8r4BFGGFWaUiHq3q4-GRAs4scCA4XJgcVbtwNZuxOBw1oj8iMzYS90d5cvKWGqhic0d76XYBK1Xac03KuKUaGX-YWgPjMIKE5nJ0/s1600/Newly+Created+Dashboard+3+with+5+Show+Titles.png"
imageanchor="1" >
<img border="0"
src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx-hNrY9I1zw-E0nGQOq0VMCqeNXLi3UUbZHJ2lgW8r4BFGGFWaUiHq3q4-GRAs4scCA4XJgcVbtwNZuxOBw1oj8iMzYS90d5cvKWGqhic0d76XYBK1Xac03KuKUaGX-YWgPjMIKE5nJ0/s1600/Newly+Created+Dashboard+3+with+5+Show+Titles.png" />
</a>
</div>
<div class="separator" style="clear: both; text-align: center;"></div>
Chris Gerrardhttp://www.blogger.com/profile/01598731155784487000noreply@blogger.com4tag:blogger.com,1999:blog-6248043124025283718.post-7451575063022593832016-01-11T14:26:00.001-05:002016-05-31T15:17:22.255-04:00Nuggets and Seeds<fs125p>
Preamble
</fs125p>
<p>
This post presents a collection of thoughts covering some of the idea space I've developed over nearly ten years of using Tableau,
largely framed within the context of its existence of a data analytical tool suitable for use in the modern enterprise.
</p>
<p>
There's no real intentional organization; although there are commonalities, themes, and overlaps, no narrative is intended.
Some of the nuggets and seeds have been fleshed out to some degree in working notes, but not to the point where I'm comfortable publishing them.
Part of the purpose of listing them here and now is to experiment, get them out and see if it helps stimulate generating a broader synthesis.
</p>
<p>
One of my motivations is that I've become increasingly concerned with the direction the field I've made my profession is taking.
At heart I believe that data analysis should be part of everyone's intellectual toolbox, that being able to explore the data relevant to one's area of interest provides the opportunity to achieve a deeper and richer understanding of the state of things.
We use tools to augment our intellect—our knowledge and expectations of our environments.
Data analytical tools are, or should be, like other tools: providing useful functional features that maximize their usefulness while minimizing the concessions the person using it must make.
</p>
<hr />
<fs125p>
What's the Point?
</fs125p>
<fs125p>
A Brief History of Computer-Assisted Data Analysis
</fs125p>
<div style="margin-left: 2em;">
<p style="margin-top: .5em;">
– FORTRAN, COBOL, 4GLs (e.g.
<a href="https://en.wikipedia.org/wiki/FOCUS">FOCUS</a>,
<a href="https://en.wikipedia.org/wiki/FOCUS#Relation_to_other_4GLs">RAMIS</a>,
<a href="https://en.wikipedia.org/wiki/Nomad_software#Capabilities">Nomad</a>), {the dark ages}, ... Tableau, ...? <br/>
– terminals, line printers, GUIs, touch-sensitive surfaces, ? <br />
</p>
</div>
<fs125p>
Data Analysis is Not Just Visualization
</fs125p>
<i>or</i>,<br />
<fs125>Visualization Is (Only) The Thin Outer Layer of Analysis</fs125><br />
<div style="margin-left: 2em;">
<p style="margin-top: .5em;">
"Visualization" is the currently popular term, used far and wide as the tag for the new wave of tools, technologies, and activities that provide the means to access and present data in a form that people can interpret and derive information from.<br />
<p style="margin-top: .5em;">
But it's misleading, a gross simplification that ignores the primary role context plays in forming and communicating data's information value.<br />
</p>
</div>
<fs125p>
"123.45" is a data visualization
</fs125p>
<div style="margin-left: 2em;">
<p style="margin-top: .5em;">
just as much as is <span style="padding: 0px 3em 0px 5px; width: 5em; background: #5F9EA0;">this bar</span>,
and "123.45" is more effective in communicating the quantity to boot <br />
</p>
<p style="margin-top: .5em;">
<a href="https://en.wikipedia.org/wiki/Decimal#Decimal_notation">decimal notation</a> using the <a href="https://en.wikipedia.org/wiki/Arabic_numerals">Arabic-Hindu numerals</a>
is in this context a time-proven, highly effective method of visually representing numeric quantities to an arbitrary level of precision in a small space <br />
</p>
<p style="margin-top: .5em;">
thinking that quantitative data visualization is restricted to geometric forms is a handicap
</p>
</div>
<fs125p>
Decision-Making Benefits From Analysis of Available Data
</fs125p>
<fs125p>
Data Analysis is (or should be) a Cognitive and Intellectual Skill
</fs125p>
<div style="margin-left: 2em;">
<p style="margin-top: .5em;">
supported as much as possible with tools and technologies that augment, not inhibit, or erect unnecessary barriers to human abilities <br />
</p>
<p style="margin-top: .5em;">
unfortunately, there are forces that continually work to shape data analysis as a primarily technical undertaking—these forces are to be resisted,
but must be understood in order to be overcome
</p>
</div>
<fs125p>
For Whom the Tool Toils
</fs125p>
<div style="margin-left: 2em;">
<p style="margin-top: .5em;">
data analysis is for everyone, not just the executives at the top, or the line-of-business people on the surface
</p>
</div>
<fs125p>
The Right Tool for the Job
</fs125p>
<div style="margin-left: 2em;">
<p style="margin-top: .5em;">
there's no golden hammer
</p>
</div>
<fs125p>
Why Only Tables?
</fs125p>
<div style="margin-left: 2em;">
<p style="margin-top: .5em;">
Tableau can only access and analyze data in tabular form.
(<i>with the limited exception of cubes, which are infrequent targets for Tableau analysis, perhaps because Tableau's analytically retarded here</i>)
</p>
<p style="margin-top: .5em;">
To the best of my knowledge the decision to restrict analysis to tabular data has never been explained.<br />
But, it's a severe limitation, and one that is difficult to understand.
</p>
<p style="margin-top: .5em;">
Granted, at the time Tableau came into existence, and Polaris before it, organizing data had become the de facto norm.
There are a lot or historical reasons for this, a discussion of them is beyond the scope of this post.
But the truth is that table-based data organizing, even when Relational (and by far most real world systems aren't proper Relational models),
is a terrible way to store data for human understanding (and I've had some people take real umbrage at this statement).
</p>
<p style="margin-top: .5em;">
Historically, before tables became the norm, data was stored in structures that matched the information model the data was persisting information about.<br />
Hierarchical databases were everywhere, and network databases weren't so rare as to be alien.<br />
Even more relevant to this discussion, the 4GL data-analytical tools from the 1970s could understand these structures and analyze them correctly in context, providing the human-correct results.
</p>
<p style="margin-top: .5em;">
In the present, the growth in the number of non-tabular data sources that people are interested in exceeds that of standard tabular sources.
NoSQL, JSON, XML, YAML, and many other formats and structures have emerged and taken root.
</p>
<p style="margin-top: .5em;">
Tableau's inability to recognize and analyze non-tabular data leaves a huge hole in the data analysis tool marketplace. Who's going to fill it?
</p>
</div>
<fs125p>
No One Ever Got Fired For Quoting Gartner</fs125p>
<div style="margin-left: 2em;">
<p style="margin-top: .5em;">
Back in the way back, when IBM dominated the business automation universe, when mainframes ruled the roost the conventional wisdom held that "<i>No one ever got fired for buying IBM"</i>.
</p>
<p style="margin-top: .5em;">
There's a similar knee-jerk reflex conditioned into today's executive managers responsible for selecting strategic information
technology for their organizations—they rely upon Gartner, particularly it's Magic Quadrant, and similar research firms
to tell them which companies are positioned where in the marketplace.
Many, too many, managers take these fora as trustworthy guides for their purchasing decisions, essentially abdicating some level of responsibility for conducting their own
research into the technological space wherein may lie tools, products, etc that could be useful and valuable. <br />
(<i>the validity and shortcomings these market analyses is well documented and argued elsewhere</i>)
</p>
<p style="margin-top: .5em;">
Getting recognition in these fora is a huge leap up the food chain for vendors.
Being identified as a viable product in the Magic Quadrant is a threshold event that exposes the vendor and product to the widest, deepest-pocketed audience/market in existence.
Being recommended is a quantum leap forward.
Which is all fine and good if one's trying to build one's company into the largest, most lucrative entity possible.
</p>
<p style="margin-top: .5em;">
But.
</p>
<p style="margin-top: .5em;">
Is it that what a truly innovative company interested in providing the best possible product that helps the greatest number of people should be striving for;
to simply grow, and grow, and grow?
</p>
</div>
<fs125p>
Just analyze it.
</fs125p>
<div style="margin: 0px 0px 0px 2em;">
<p style="margin-top: .5em;">
Many organizations that are trying to adopt Tableau as a BI tool or technology are going about it the wrong way.
They're using Tableau in the traditional SDLC model, and are as a result missing the greatest part of the value Tableau offers.
</p>
<p style="margin-top: .5em;">
Software isn't material, so there's little cost to trying something to see if it works.
Experiments can occur almost at the speed of thought, dramatically closing the gap between conception and creation
</p>
<p style="margin-top: .5em;">
The traditional approach of concept, analysis, design, build, deliver is mired in a model of work
that's rooted in the industrial production paradigm that underlies modern business management theory and practice (I have a BBA and MBA).
This model worked extremely well during the industrial age, when producing large numbers of physical goods was the organization's work.
It's not only of little value in the non-physical world, it is actively detrimental to the good conduct of work that's predominately centered around fluid cognition and creation.
</p>
</div>
<fs125p>
Tableau's Arc
</fs125p>
<div style="margin-left: 2em;">
<p style="margin-top: .5em;">
Tableau has occupied a shifting position in the data analysis pantheon over the past decade. This is the story of my experience with it,
the ways in which it's been employed, and its presence in the broader worlds in which its taken root.
</p>
</div>
<fs125p>
Thinking About What Makes Good Data Analytical Tools
</fs125p>
<span style="margin-left:3em;">looking to Bret Victor's <a href="http://worrydream.com/#!/LearnableProgramming">Learnable Programming</a></span>
<div style="margin-left:3em; margin-right:6em; border: 1px solid lightgrey;">
<div style="margin-top:1em; margin-left:1em; margin-right:1em;">
...two thoughts about learning:
<ul>
<li><b>Programming is a way of thinking, not a rote skill.</b> Learning about "for" loops is not learning to program, any more than learning about pencils is learning to draw.</li>
<li><b>People understand what they can see.</b> If a programmer cannot see what a program is doing, she can't understand it.</li>
</ul>
Thus, the goals of a programming system should be:
<ul>
<li>to support and encourage powerful ways of thinking</li>
<li>to enable programmers to see and understand the execution of their programs</li>
</ul>
</div>
</div>
<div style="margin: .5em 6em 0px 3em;">
<p style="margin-top: .5em">
There's a lot to learn from these thoughts, directly relatable to using technology for data analysis. For example:<br />
</p>
<p style="margin: 5px 0px 0px 2em;">
Data analysis is a way of thinking about the nature of things: their identities, quantities, measurements/metrics, and relationships to other things.<br />
</p>
<p style="margin: 5px 0px 0px 2em;">
Learning about the technical properties of specific technical implementations of analytical operations is not learning about data analysis.
</p>
<p style="margin: 5px 0px 0px 2em;">
If people cannot see into the machine, it's very difficult to achieve a robust understanding of what the machine is doing,
how it does it, how to imagine the things it can do, and how to set it up so that it does what one wants.
</p>
</div>
<fs125p>
Design Rot: Tableau's Usability Has Stalled
</fs125p>
<div style="margin-left: 2em;">
<p style="margin-top: .5em;">
<i>For years, Apple followed user-centered design principles. Then something went wrong.</i></br />
In their article
<a href="http://www.fastcodesign.com/3053406/how-apple-is-giving-design-a-bad-name">How Apple Is Giving Design A Bad Name</a>
Don Norman and Bruce Tognazzini argue that Apple has abandoned the principles of usability in its product designs
in favor of a beautiful aesthetic experience
that hinders rather than helps users' ability to accomplish the things they want to.
</p>
<p style="margin-top: .5em;">
In its own way, Tableau has similarly failed to continue to pursue the same elegant usability at its heart.
</p>
<p style="margin-top: .5em;">
When Tableau appeared its design was revolutionary, providing simple, intuitive objects,
and interactions with those objects, that surfaced data and fundamental data-analytical operations,
very closely matching a the human view of a particular and useful analytical model.
</p>
<p style="margin-top: .5em;">
This was Tableau's genius.
For the first time people could -do- simple, basic data analysis with a tool that made it simple and easy.
</p>
<p style="margin-top: .5em;">
Since then, Tableau hasn't followed through with its initial promise.
The simple and easy things are still simple and easy, but pretty much everything else beyond this space is
too complex, complicated, confusing, obscure, and unnecessarily hard to figure out.
</p>
<p style="margin-top: .5em;">
The list of Tableau's design faux pas has become too large to catalog.
At one time I had hopes that Tableau would recognize it had accumulated too much bad design and take steps to remedy the situation.
I no longer believe this; Tableau appears to have invested so much into its current way of doing things,
and reaped so many rewards for doing things the way it has, that there's no motivation or incentive for it to change its stripes.
</p>
</div>
<fs125p>
Side Effects, Tips, Tricks, and Techniques: Useful Aids or (Un)Necessary Evils?
</fs125p>
<div style="margin-left: 2em;">
<p style="margin-top: .5em;">
Does the need to learn, master, and employ these to accomplish useful analytical effects add or detract from Tableau's overall utility and value?<br />
</p>
<p style="margin-top: .5em;">
It's not a simple black or white situation, but there's an inverse relationship between the quantity and complexity of the technical things one needs to learn to accomplish useful things
and overall utility. The more tricky things one needs to know, the harder the tool is to use from a human perspective, and the further from the primary goal one needs to work.
</p>
</div>
<fs125p>
On the Consequences of the Exaltation of Complexity
</fs125p>
<div style="margin-left: 2em;">
<p style="margin-top: .5em;">
what happens when mastery of arcane technical matters is elevated and praised above sense-making
</p>
</div>
<fs125p>
Tableau's Salad Days
</fs125p>
<div style="margin-left: 2em;">
<p style="margin-top: .5em;">
are the best behind us?
</p>
</div/>
<fs125p>
The Perils of Ossification
</fs125p>
<div style="margin-left: 2em;">
<p style="margin-top: .5em;">
what happens when a tool freezes, welding into place aspects that could be improved through continual evolution
</p>
</div>
<fs125p>
Suffering the Innovator's Dilemma<br />
</fs125p>
<i>or</i>,<br />
<fs125>The Rise and Fall of a Disruptive Innovator</fs125>
<fs125p>
Beware the Cuckoo's Egg
</fs125p>
<p style="margin: 0px 0px 0px 2em;">
considering the consequences when one tool pushes out others
</p>
<fs125p>
Yes, You can do that in Tableau. So what?
</fs125p>
<div style="margin-left: 2em;">
<p style="margin-top: .5em;">
just because it <i>can</i> be done, <i>should</i> it be?
</p>
<p style="margin-top: .5em;">
Tableau is a terrific tool for accomplishing basic data analysis quickly and easily, and for communicating interesting findings, also quickly and easily.
</p>
<p style="margin-top: .5em;">
There are, however, limitations in what Tableau does simply and easily, and more limitations in what Tableau can be coerced into doing.
When faced with situations where needs fall outside Tableau's capabilities,
or where the effort to satisfy the needs with Tableau exceeds the effort to satisfy them with another tool or technology,
it's a good idea to at least entertain the notion that Tableau should not be used.
</p>
</div>
<fs125p>
Velocity, Value, Volume
</fs125p>
<fs125p>
Pervasive Data Analysis - a Promise As Yet Unfulfilled
</fs125p>
<div style="margin-left: 2em;">
<p style="margin-top: .5em;">
it's been over thirty years since the idea of making analysis of one's own data possible and as seamless and easy as possible surfaced <br/>
there was a flourishing of the concept for a while; business people could analyze their data with minimal involvement and support from their data processing organizations, br />
but it didn't last
</p>
<p style="margin-top: .5em;">
there was a decline <br />
along with a dramatic increase in the size, wealth, and power of the database and BI platform vendors
</p>
<p style="margin-top: .5em;">
a decade ago Tableau appeared, and made it possible for nontechnical people to access and conduct their own fundamental data analysis,
achieving previously unthinkable insights immediately with little or no technical intervention or support—it was a revelation,
and carried the hope that pervasive data analysis could become a reality
</p>
<p style="margin-top: .5em;">
so... why haven't things progressed all that much in the ten years since?
</p>
</div>
<fs125p>
Self-Service BI – it ain't what you think
</fs125p>
<div style="margin-left: 2em;">
<p style="margin-top: .5em;">
<b>Anecdote:</b>
Several years ago I was talking to a friend, a Senior Information Officer at The World Bank about Tableau's benefits, how it had the potential to change everything,
describing how it could, if adopted effectively, be the path to helping 'ordinary' people obtain the insights and information from the data that mattered to them,
much of which lay outside the boundaries of the Bank's institutional data hoard.
</p>
<p style="margin-top: .5em;">
Her response was that they didn't need it, their needs were being satisfied through the self-service Business Objects environment they'd set up. <br />
As it turned out, the BO solution didn't gain much traction.
</p>
</div>
<fs125p>
Deliver Value Early and Often
</fs125p>
<fs125p>
Do the Right First Thing First
</fs125p>
<i>or</i>,<br />
<fs125>Start With Data Analysis</fs125> <br />
<p style="margin: 0px 0px 0px 2em;">
it seems obvious, almost not not worth mentioning<br />
but far too many BDA efforts ignore, or are ignorant of, the opportunity to start with data analysis,
often in the mistaken and disastrous belief that data analysis is something that happens <b>after</b> precursor activities take place
</p>
<fs125p>
You Can't Start With Everything
</fs125p>
if you try to, you'll never have anything <br />
<i>or</i>,<br />
<fs125>The Big Bang Delivery Model is a Recipe for Failure</fs125>
<fs125p>
Diminishing I<span style="font-size: 85%;"><sub>V</sub></span>/E
</fs125p>
<div style="margin-left: 2em;">
<p style="margin-top: .5em;">
the effort to achieve information value from data increases more than linearly,<br />
or,<br />
it gets harder and harder to obtain the next level of value from data, along multiple dimensions
</p>
</div>
<fs125p>
Does Deep Tableau Expertise Lead to Diminished Value?
</fs125p>
<div style="margin-left: 2em;">
<p style="margin-top: .5em;">
do the demands and difficulties involved in developing the skills necessary to wield Tableau successfully across a broad spectrum of analytical purposes and outcomes
detract from the value that could be delivered with it?
</p>
</div>
<fs125p>
Beware Re-branded Big BI</fs125p>
<div style="margin-left: 2em;">
<p style="margin-top: .5em;">
several years ago it wasn't uncommon for Tableau advocates to contrast Tableau to Big BI
</p>
<p style="margin-top: .5em;">
Tableau was seen as the 'anti-BI', the human-oriented tool that would be an antidote to Big BI's ills
</p>
<p style="margin-top: .5em;">
then Tableau gained traction, became better-known, then popular; it surfaced into the corporate executive mindspace through reviews including Gartner, Forrester, etc.,
and to some extent from the bottom up as people discovered its benefits and used it to good effect
</p>
<p style="margin-top: .5em;">
once this happened things began to change
</p>
<p style="margin-top: .5em;">
traditional vendors started to come out with data visualization components and tools as their "New!", "Improved!" offerings, trying to capitalize on the market Tableau had pioneered
</p>
<p style="margin-top: .5em;">
the Data Warehousing folks, the very same ones who had, for almost two full decades, been preaching to the faithful of the need to devote themselves to building
enterprise-spanning industrial-strength universal conformed data repositories and associated answer-all-questions analytical platforms,
crashed the party declaring their allegiance with the new agile, adaptable BI world <br/>
but they were still selling their same old wares with a fresh coat of paint slapped on
</p>
</div>
<fs125p>
Don't Struggle Alone with Your Data Analysis, Struggle with Tableau
</fs125p>
<fs125p>
Tableau is Bleeding
</fs125p>
<fs125p>
Contemplating Complexity's Consequences
</fs125p>
<div style="margin-left: 2em;">
<p style="margin-top: .5em;">
some problems are inherently complex, but the means of addressing them should be no more complicated than necessary
</p>
</div>
<fs125p>
Baroque is Broken
</fs125p>
<div style="margin-left: 2em;">
<p style="margin-top: .5em;">
ornamentation and elaborate constructions can be superficially attractive but they are often at odds with, even detrimental to, real usefulness
</p>
</div>
<fs125p>
Tableau's Data Blending: is it really a Good Thing?
</fs125p>
<div style="margin-left: 2em;">
<p style="margin-top: .5em;">
legend has it that data blending was a hack by one of Tableau's developers; true or not it has the feel of one<br />
hack or not, it's a very useful mechanism, and has been leveraged by very clever people to achieve all sorts of very useful analytical outcomes<br />
but... it has limitations that leverage its usefulness in many real world situations—the question here is to what degree they render it irrelevant for real world purposes
</p>
</div>
<fs125p>
Misalignment of Focus
</fs125p>
<fs125p>
Analytical Types
</fs125p>
<div style="margin-left: 2em;">
<p style="margin-top: .5em;">
– Curiosity vs Confirmation <br />
– Explainers vs Confirmers <br />
– Explorers vs Justifiers <br />
</p>
</div>
<fs125p>
Zombie BI
</fs125p>
<div style="margin-left: 2em;">
<p style="margin-top: .5em;">
we thought Big BI was dead, or at least on life support, but it's showing signs of resurrecting
</p>
</div>
<fs125p>
Enterprise Data Analysis is Fractal
</fs125p>
<div style="margin-left: 2em;">
<p style="margin-top: .5em;">
self-similar at all scales
</p>
</div>
<fs125p>
All Data is Valid
</fs125p>
<i>or</i>,<br />
<fs125>There's no bad data,</fs125><br />
<div style="margin-left: 2em;">
<p style="margin-top: .5em;">
but much of it is misunderstood and/or it tells unpalatable truths.
</p>
</div>
<fs125p>
Scaling Mount Simplicity
</fs125p>
<div style="margin-left: 2em;">
<p style="margin-top: .5em;">
keeping things simple isn't easy, but it's worth striving for
</p>
</div>
<fs125p>
Whither Data Analysis Tools?
</fs125p>
<fs125p>
Rethinking the Data Warehouse
</fs125p>
<div style="margin-left: 2em;">
<p style="margin-top: .5em;">
storing, safeguarding, and provisioning an enterprise's data isn't what it used to be<br />
(<i>and the traditional model didn't work all that well anyway</i>)
</p>
</div>
<fs125p>
Your Tableau Are Doomed
</fs125p>
<fs125p>
Pursuit of Maximizing Market Potential Considered Harmful
</fs125p>
<i>or</i>,<br />
<fs125>Maximizing Market Potential, a Cautionary Tale</fs125>
<fs125p>
The New Hope Fades
</fs125p>
<fs125p>
Entropy in the Tableau Universe
</fs125p>
<fs125p>
Clarity, Coherence, Completeness are Virtues
</fs125p>
<div style="margin-left: 2em;">
<p style="margin-top: .5em;">
determining whether data analytical efforts are worth pursuing
</p>
</div>
<fs125p>
Development is Best Served in Minimal Portions
</fs125p>
<div style="margin-left: 2em;">
<p style="margin-top: .5em;">
determining whether data analytical efforts are worth pursuing
</p>
</div>
<fs125p>
Development is the technical implementation of someone else's ideas
</fs125p>
<div style="margin-left: 2em;">
<p style="margin-top: .5em;">
using a traditional SDLC as the default approach to providing actionable information to business decision makers is a very bad idea
(unless you're a software vendor or otherwise benefit from the expenditure of too much time, money, attention, energy, and other resources)
</p>
</div>
<fs125p>
Requiem for a Once Noble Tool
</fs125p>
<div style="margin-left: 2em;">
<p style="margin-top: .5em;">
Once upon a time a very clever young man thought up a new and improved way for nontechnical people to analyze their data.
This required a re-conception of "data analysis", moving away from the prevailing paradigm of technologically-centered programmatic creation of artifacts that, hopefully, conveyed useful information.
The young man's innovation took a different approach.
Tt provided mechanisms that tightly coupled the basic data analysis operations:
field selection; data filtering; sorting; and aggregation, with intuitive system-presented data and analytical operation avatars familiar to 'real' (i.e. nontechnical) people.
These mechanisms, when combined within the operational environment by these people, caused the system to generate and present the appropriate analytic.
</p>
<p style="margin-top: .5em;">
This was a revolution, and it changed everything.
For the first time people could interact with their data directly, without enlisting the assistance of other people with specialized technical skills, and do their own data analysis.
For the first time there was the very real hope that things would continue to get better, that with the barrier to data analysis now breached the breadth, depth, and reach of human-centered data analysis tools would continue to blossom.
</p>
<p style="margin-top: .5em;">
There were limitations, of course, as there always is in the first conception of a solution to a simple subset of a very large, intrinsically complex problem space.
Data analysis is almost unbounded in it's full range, from the types of things that can reasonably be thought of as data, to the analyses that can be conducted.
One rough analogy is to consider the initial tool as providing arithmetic functionality and the full potential space the full range of mathematical analysis, e.g. number theory, calculus, etc.
<!--
Think of numbers used for counting: 0, 1, 2, 3, ...<br />
Think of basic arithmetic: 1+4=5, 24/3=8, etc.<br />
– the basic tool covers the space to here, for simply-structured homogeneous data.<br />
... a bit more complexity here<br />
Contemplate complex data <br />
Consider the full
-->
</p>
<p style="margin-top: .5em;">
Sadly, the goodness failed to fulfill its promise. <br />
It stalled out early. <br />
Instead of continuing to expand the realm of easy, nontechnical, human-centered analysis into the analytical universe it expanded its functionality by adding technical, deeply mysterious features that left mere 'real' people on the outside looking in.
</p>
<p style="margin-top: .5em;">
And in due time it became, first, something some people had some familiarity with, then one that some had heard of, then a ghost of a past that didn't matter to most people.
</p>
</div>
Chris Gerrardhttp://www.blogger.com/profile/01598731155784487000noreply@blogger.com8tag:blogger.com,1999:blog-6248043124025283718.post-42781308467190101942015-12-02T13:41:00.000-05:002015-12-02T13:41:57.251-05:00The Fallacy of The Canonical Dashboard(s)<p>
I've once again come across an article promulgating the conventional wisdom that runs along the lines of: "Important information about the Dashboard (or two, or three) your business needs."
<br/>
It's here: <a href="https://www.hiscox.co.uk/business-blog/why-every-business-needs-two-dashboards-for-clear-flying-bernard-marr/">Why every business needs two dashboards for clear flying</a>, and contains this passage:
</p>
<div style="margin-left:3em; margin-right:6em; border: 1px solid lightgrey;">
<div style="margin-top:1em; margin-left:1em; margin-right:1em;">
<fs125p>
The two dashboards every business needs
</fs125p>
<p>
"But it actually isn’t enough to have just one dashboard; I believe every business needs two dashboards: strategic and operational. Like the cockpit instruments in a fighter jet, they allow the executive to know exactly where he or she is at any given time and focus on getting to the destination in one piece."
</p>
</div>
</div>
<p>
Putting aside the unfortunate, and by now antiquated, fighter jet cockpit metaphor, the article recognizes that one dashboard isn't enough.
But it continues to promote the idea that there is a small set (in this case: two) dashboards that, if carefully considered,
can provide the information decision makers need to run their business.
</p>
<p>
This is an anachronistic view of the world of business data analysis that doesn't recognize developments of the past decade that have moved beyond its limitations.
</p>
<p>
In the real world, any small set of canonical dashboards is limited in the information they can convey, and don't extend more than a step or two towards the horizon of useful information.
</p>
<p>
The idea that there's a limited view of one's information space that's adequate for monitoring and decision-making is rooted in historical factors.
Briefly: because it took very substantial amounts of time, energy, money, and other resources required to create information delivery artifacts, e.g. dashboards,
people became conditioned to the idea that there was a limited view that, once identified, designed, built, and delivered, would be adequate for their information needs.
This was always an artificial limitation, an unfortunate (and in reality unnecessary) consequence of and concession to the deficiencies of the business data management and analysis environment. </p>
<p>
The past decade has seen the emergence of better, faster, low-friction, tools, technologies, and practices that dramatically narrow the gaps between data and the people who need to understand it.
</p>
<p>
The past five years has seen the increasing awareness of these tools, particularly with Tableau's recognition by Gartner, Forrester, TDWI, and related media and general audience channels.
</p>
<p>
The implications of the new opportunities have, as in all paradigm shifts, been slower to bubble to the surface, but they're starting to become part of the discourse,
even as the traditional message that there's a canonical set of dashboards that's sufficient for running a business persists.
</p>
<p>
The modern reality is that it's possible to discover and deliver data-based information on an ongoing basis,
including but not limited to a small set of pre-identified KPIs in one or two dashboards.
There's a very small distance between dynamic data discovery and the composition of relevant analyses into dashboards—this is a fundamental departure from the traditional BI world,
and marks a qualitative shift in how effective business data analysis can be pursued.
It's now possible to provide the information people need to make decisions from the relevant data as they need it,
even if it's not previously been formalized in pre-constructed forms: dashboards, scorecards, etc.
</p>
<p>
Organizations that recognize that they're no longer constrained by the traditional limitations can take advantage of the new opportunities and dramatically improve their data-based decision making abilities.
One of the first steps is recognizing that they can access, analyze, and understand their data as needed, rather than speculating about future information needs and
spending time, energy, and effort tackling technical implementation efforts for potential payoff.
As they absorb this concept, people recognize that they no longer need be shackled to one, two, or some small number of discrete dashboards.
</p>
Chris Gerrardhttp://www.blogger.com/profile/01598731155784487000noreply@blogger.com0tag:blogger.com,1999:blog-6248043124025283718.post-55305785548265301262015-11-24T17:28:00.000-05:002015-12-22T15:33:53.922-05:00Hack Academy - Multiple Moving Averages<p>
<fs110>Hack Academy</fs110> – explaining how Tableau works in real world examples.
</p>
<p>
Note: this post is a work in progress.
</p>
<p>This session delves into the workings behind the solution to this Tableau Community request for assistance:
<a href="http://community.tableau.com/message/406184#406184">Showing maximum and minimum with a calculated moving average</a>.
Please refer to the Tableau Community posting for the full details.
</p>
<p>
In the post the person asking for help explained that she was looking to have a chart like this:
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggOB3F60PFBZi9LAouhbDFuS1xQu2wpvLH9hSAyZxX83hm31WxU-6YCCVyPuCiaWLK3HSuq3eBgCM4V0E4Tp7RAbffO73OgCN-QCoRkUafZw6JOhPw3P-2uD8M25AHwDjUtQIFh7YTDVE/s1600/Moving+Averages+-+Original+image+cropped.jpg" imageanchor="1" >
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggOB3F60PFBZi9LAouhbDFuS1xQu2wpvLH9hSAyZxX83hm31WxU-6YCCVyPuCiaWLK3HSuq3eBgCM4V0E4Tp7RAbffO73OgCN-QCoRkUafZw6JOhPw3P-2uD8M25AHwDjUtQIFh7YTDVE/s1600/Moving+Averages+-+Original+image+cropped.jpg" />
</a>
<br/>
and described her goal thus:
<div style="margin-left:3em; margin-right:5em;">
"So I want to aggregate the previous 4 years worth of data (and not show as individual years), average it for each week and then display it as a 3 week rolling average (which I've done) and also calculate and display the maximum rolling average and the minimum one too. That way it can be easily seen if the rolling average for this current year falls within the expected range as calculated from the previous 4 years worth of data."
</div>
</p>
<div style="margin-top:2em;">
<fs125>The Solution</fs125>
<p style="margin-bottom:0px;">
One of Tableau's Technical Support Specialists—<a href="http://community.tableau.com/people/esther.aller">community page here</a>,
provided a workbook containing a solution; it's attached to the original post.
She also provided a step-by-step recipe for building the solution worksheet. <i>Cosmetic adjustments to the solution to make it easier to identify and track the Tableau elements have been made.</i>
<br/>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiw1xQHO3g7l7oG_QuUzhaCBz7OlpD_fOGvPByNeeZmpyuPI6k7k3TbycZc2Jgrhu8yRWgHS4q7Fp4UF5602J6WWlO10kDkQgSZfW_F-EaOQqe2mY-4DGmEApemERVFUyheIABez17BZaI/s1600/Moving+Averages+Viz+-+annotated.png" imageanchor="1" >
<img border="1" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiw1xQHO3g7l7oG_QuUzhaCBz7OlpD_fOGvPByNeeZmpyuPI6k7k3TbycZc2Jgrhu8yRWgHS4q7Fp4UF5602J6WWlO10kDkQgSZfW_F-EaOQqe2mY-4DGmEApemERVFUyheIABez17BZaI/s1600/Moving+Averages+Viz+-+annotated.png" />
</a>
</p>
<div style="margin-top:0px; margin-right:5em; margin-left:3em;">
<p style="margin-top:0px;">
The blue lines identify the parts and something of the relationships between them.
The complexity of the parts and their relationships is difficult for inexperienced people to wrap their heads around.
</p>
<p>
This post expands upon the solution by looking behind the curtain, showing the Tableau mechanisms employed—what they do and how they work.
It does this by providing a Tableau workbook, an annotated set of diagrams showing how the worksheets' parts relate to one another, and explanatory information.
</p>
</div>
</div>
<div style="margin-top:2em;">
<fs125>The Solution Recipe</fs125>
<br/>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLntjF6Orbz13LjbEXhW90aZ_Zo83mw82fKarkBO3YWmo6XCRsgV0Afx1a5zNNBM2beIzoWBrZyCpG_VsvCXsWygxRH_jXyjbSTCCfUdANT3lu9M7Bd0ywW5R9I1i-lyxA_Ukr9Mcc_Cs/s1600/Running+Average+-+Esther%2527s+Solution.png" imageanchor="1" >
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLntjF6Orbz13LjbEXhW90aZ_Zo83mw82fKarkBO3YWmo6XCRsgV0Afx1a5zNNBM2beIzoWBrZyCpG_VsvCXsWygxRH_jXyjbSTCCfUdANT3lu9M7Bd0ywW5R9I1i-lyxA_Ukr9Mcc_Cs/s1600/Running+Average+-+Esther%2527s+Solution.png" />
</a>
<div style="margin-top:0px; margin-right:5em; margin-left:3em;">
The worksheet's caption lays out the steps for generating the desired visualization.
This is helpful in getting to the solution, but doesn't surface the Tableau mechanisms involved.
<br/>
The rest of this post lays out the Tableau mechanisms, how they work, and by extension how they can be understood and assimilated
so they can become tools in one's Tableau toolbox, available for use when the needs and opportunities arise.
</div>
</div>
<div style="margin-top:2em;">
<fs125>The Solution Recipe, annotated</fs125>
<br/>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiroqNT4gX7i84uDMalI0ojpFj7aqHCX4tXm8G1WNf5xg4oRfPgFbWh8qoHLejcwl4L2jykevaSV9aoxeeMTOlA1BJ7ZF37DbPFSFf_IkTbf9PbLHXakaTTwrSN2bmLDTAhqziTAcoi9I8/s1600/Esther%2527s+Recipe.png" imageanchor="1" >
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiroqNT4gX7i84uDMalI0ojpFj7aqHCX4tXm8G1WNf5xg4oRfPgFbWh8qoHLejcwl4L2jykevaSV9aoxeeMTOlA1BJ7ZF37DbPFSFf_IkTbf9PbLHXakaTTwrSN2bmLDTAhqziTAcoi9I8/s1600/Esther%2527s+Recipe.png" />
</a>
<div style="margin-top:1em; margin-right:5em; margin-left:3em;">
In this diagram the arrows indicate the instructions' targets and the effects of the recipe's steps.<br/>
– The <b><span style="color:green">green</span></b> arrows indicate record-level calculated fields<br/>
– The <b><span style="color:red">red</span></b> arrows indicate Tableau Calculation fields<br/>
– The <span style="color:blue">thin blue</span> lines show how fields are moved
</div>
<div style="margin-top:1em; margin-right:5em; margin-left:3em;">
The first thing that jumps out is just how fiendishly complicated this is.
Even though less than half of the instructions have been annotated the number and complexity of the relationships is almost overwhelming.
In order to achieve analytical results like this, the analyst must first be able to understand this complexity well enough to be able to generate from it the specific desired effects.
One of Tableau's deficiencies is that all of this mastering and managing this complexity is left up to the analyst, i.e. Tableau provides virtually nothing in the way of surfacing the
parts and their relationships in any way that reveals their relationships in a way that allows for easy comprehension and manipulation.
</div>
<div style="margin-top:1em; margin-right:5em; margin-left:3em;">
Once the instructions reach the "<b>2015 Sales</b>" step the diagram doesn't show the Measures in the location the recipe indicates.
Instead of them being on the Rows shelf (where the recipe puts <b>!Sales = 2015</b>) they're on the Measure Values card.
This is because once there are multiple Measures in play, organized in this manner, they're configured via the Measure Values card and the <b>Measure Names</b> and <b>Measure Values</b> pills.
This is one of the things that makes it difficult for people new to Tableau to puzzle out what the parts are and how they work and interact.
</div>
</div>
<div style=" background-color: lightgrey; margin-top:2em; margin-bottom:2em; border: 1px solid grey;">
<div style="margin-left:2em;">
<fs150p>Implementing the Solution</fs150p>
</div>
</div>
<p>
The following <fs125>Tableau Public</fs125> workbook is an implementation of the Recipe.
</p>
<script type='text/javascript' src='https://public.tableau.com/javascripts/api/viz_v1.js'>
</script>
<div class='tableauPlaceholder' style='width: 904px; height: 695px;'>
<noscript>
<a href='#'>
<img alt=' ' src='https://public.tableau.com/static/images/Ha/HackAcademy-MultipleMovingAveragesEsthersSolution/AddOrderDateWeekstoColumns/1_rss.png'
style='border: none' />
</a>
</noscript>
<object class='tableauViz' width='904' height='695' style='display:none;'>
<param name='host_url' value='https%3A%2F%2Fpublic.tableau.com%2F' />
<param name='site_root' value='' />
<param name='name' value='HackAcademy-MultipleMovingAveragesEsthersSolution/AddOrderDateWeekstoColumns' />
<param name='tabs' value='yes' />
<param name='toolbar' value='yes' />
<param name='static_image' value='https://public.tableau.com/static/images/Ha/HackAcademy-MultipleMovingAveragesEsthersSolution/AddOrderDateWeekstoColumns/1.png' />
<param name='animate_transition' value='yes' />
<param name='display_static_image' value='yes' />
<param name='display_spinner' value='yes' />
<param name='display_overlay' value='yes' />
<param name='display_count' value='yes' />
<param name='showVizHome' value='no' />
<param name='showTabs' value='y' />
<param name='bootstrapWhenNotified' value='true' />
</object>
</div>
<fs150p>The Inner Workings</fs150p>
<p>
Although the Public Workbook above implements the solution and is annotated with descriptive information it doesn't go very deep in surfacing and explaining the Tableau mechanisms being taken advantage of—how they work and deliver the results we're looking to achieve.
This section lifts Tableau's skirts, revealing the behind the scenes goings on.
</p>
<p>
<fs125>Tableau's Data Processing Pipeline</fs125>
<br />
One of the things that can be difficult to wrap one's head around is Tableau's mechanisms for accessing and processing data, from the underlying data source through to the final presentation.
Tableau processes data in (largely) sequential stages, each operating upon the its predecessor's data and performing some operations upon it.
This solution employs multiple stages; this section lays out their basics, illustrating how they're employed to good effect.
</p>
<p>
Tableau applies different data processes and operations at different stages—in general, corresponding to the different 'kind' of things that are present in the UI.
These stages are largely invisible to the casual user, and their presence can be difficult to detect, but understanding them is critical to being able to understand how Tableau works well enough to generate solutions to novel situations.
</p>
<p>
<fs110><b>The main mechanism: selective non-Null Measures presentation</b></fs110>
<br />
At the core of the solution is the distinction between data structure and presentation. In this situation there are, in effect, two data layers in play;
we represent the stages as layers in order to help visualize them.
</p>
<p>
The basic ideas are: when displaying data Tableau will only present Marks for non-Null values; and Table Calculations can be used to selectively instantiate values in different layers.
The underlying layer is where the data is stored upon retrieval from the database.
The surface layer is where presents selected data from the underlying layer to the user.
The key to this solution is that Tableau only presents some of the underlying layer's data—that required to show the user what s/he's asking to see.
</p>
<div class="separator" style="clear: both; text-align: center; margin-bottom: 10px;"> </div>
<!-- TWO COLUMNS START HERE -- NOTE: best when the total width, LEFT & RIGHT is 860px -->
<div style="float: left; width: 500px;"> <!-- LEFT -->
<!-- LEFT CONTENT HERE -->
<fs125p>
Demonstration Tableau Public workbook.
</fs125p>
<p>
This Workbook contains a series of Worksheets that demonstrate these Tableau mechanisms.
</p>
<p>
This Worksheets are shown below, along with descriptions of what's going on.
</p>
<p>
Download the Workbook to follow along.
</p>
</div>
<div style="float: left; width: 400px; margin-left: 20px;">
<script type='text/javascript' src='https://public.tableau.com/javascripts/api/viz_v1.js'>
</script>
<div class='tableauPlaceholder' style='width: 350px; height: 300px;'>
<noscript>
<a href='#'>
<img alt=' ' src='https://public.tableau.com/static/images/Ha/HackAcademy-DataStructuresandNULLvNON-NULLdatapresentation/DataStructure/1_rss.png'
style='border: none' />
</a>
</noscript>
<object class='tableauViz' width='350' height='300' style='display:none;'>
<param name='host_url' value='https%3A%2F%2Fpublic.tableau.com%2F' /> <param name='site_root' value='' />
<param name='name' value='HackAcademy-DataStructuresandNULLvNON-NULLdatapresentation/DataStructure' />
<param name='tabs' value='yes' />
<param name='toolbar' value='yes' />
<param name='static_image'
value='https://public.tableau.com/static/images/Ha/HackAcademy-DataStructuresandNULLvNON-NULLdatapresentation/DataStructure/1.png' />
<param name='animate_transition' value='yes' />
<param name='display_static_image' value='yes' />
<param name='display_spinner' value='yes' />
<param name='display_overlay' value='yes' />
<param name='display_count' value='yes' />
<param name='showVizHome' value='no' />
<param name='showTabs' value='y' />
<param name='bootstrapWhenNotified' value='true' />
</object>
</div>
</div>
<div class="separator" style="clear: both; text-align: center; margin-bottom: 10px;"> </div>
<fs125p>Setting up the data.</fs125p>
<!-- TWO COLUMNS START HERE -- NOTE: best when the total width, LEFT & RIGHT is 860px -->
<div style="float: left; width: 300px;"> <!-- LEFT -->
<!-- LEFT CONTENT HERE -->
The fields used to illustrate the data processing:
<pre><code>
<fs125><b>!Sales = 2015</b></fs125>
IF DATEPART('year',[Order Date])=2015
THEN [Sales]
END
<fs125><b>!Sales = 2015 (Null)</b></fs125>
IF DATEPART('year',[Order Date])=2015
THEN [Sales]
ELSE NULL
END
<fs125><b>!Sales = 2015 (0)</b></fs125>
IF DATEPART('year',[Order Date])=2015
THEN [Sales]
ELSE 0
END
</code></pre>
</div>
<div style="float: left; width: 610px; margin-left: 20px;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkQf00UywYCuJYSBPYmsuJH_9kXFbJeJPAkfmToweoaFFKwgdnzg7voPf7iEExEsYw75Ar6fgGG7Kgit91rXlTtD-dS1JyT3gs7EBD_m308sRwdL-11IonBlmUq5YBDhv7IHwexOJigmk/s1600/Layers+-+Data.png" imageanchor="1" >
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkQf00UywYCuJYSBPYmsuJH_9kXFbJeJPAkfmToweoaFFKwgdnzg7voPf7iEExEsYw75Ar6fgGG7Kgit91rXlTtD-dS1JyT3gs7EBD_m308sRwdL-11IonBlmUq5YBDhv7IHwexOJigmk/s1600/Layers+-+Data.png" />
</a>
</div>
<p>
The major difference between the fields is whether they evaluate to Null or 0 (zero) when Order Date's Year is not 2015.
The first two fields evaluate to Null—the first implicitly, the second explicitly.
The third evaluates to 0.
</p>
<p>
This is the distinction upon which the solution's deep functionality depends.
Recall that Tableau only presents non-Null data; this solution takes advantage of this by selectively constructing the Null and non-Null presentation Measures we need.
</p>
<div class="separator" style="clear: both; text-align: center; margin-bottom: 2em;"> </div>
<!-- TWO COLUMNS START HERE -- NOTE: best when the total width, LEFT & RIGHT is 860px -->
<div style="float: left; width: 320px;"> <!-- LEFT -->
<!-- LEFT CONTENT HERE -->
<fs125p>The data structure.</fs125p>
<p>
This viz shows the basic data structure needed to support our goal of comparing Weekly Moving Averages for each of the Order Date Years:
<ul>
<li>there are columns for each Week (<i>filtered here to #s 1-5</i>); and</li>
<li>each week has 'slots' for each of the four Order Date Years.</li>
</ul>
Tableau shows Marks for each combination of Order Date Year and Week for which there's data, in this case the Marks are squares.
This is one of Tableau's magic abilities that really adds tremendous value in assisting the analytical process (<i>and in many cases is itself a very valuable diagnostic tool</i>).
</p>
</div>
<div style="float: left; width: 590px; margin-left: 20px;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBtCz4BwUepj-1Aq1aXw4pAd6dibDGoEcHlXrw-gMLgx9bbDYH6P2xX9cnuOBt4j4HvZ5LSjInGVPXTykH-x9ReIHME5LSARzqloEpuomDDj7GNIcz2Po9D11vkeXlRhrFrZ7n8dA0wb0/s1600/Layers+-+Data+Structure.png" imageanchor="1" >
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBtCz4BwUepj-1Aq1aXw4pAd6dibDGoEcHlXrw-gMLgx9bbDYH6P2xX9cnuOBt4j4HvZ5LSjInGVPXTykH-x9ReIHME5LSARzqloEpuomDDj7GNIcz2Po9D11vkeXlRhrFrZ7n8dA0wb0/s1600/Layers+-+Data+Structure.png" />
</a>
</div>
<div class="separator" style="clear: both; text-align: center; margin-bottom: 2em;"> </div>
<!-- TWO COLUMNS START HERE -- NOTE: best when the total width, LEFT & RIGHT is 860px -->
<div style="float: left; width: 320px;"> <!-- LEFT -->
<!-- LEFT CONTENT HERE -->
<fs125p>Showing the Years.</fs125p>
<p>
Right-clicking <b>Year (Order Date)</b> in the Marks card and selecting "Label" tells Tableau to show the Year for each Mark.
</p>
<p>
This confirms the data structure, and is one of the basic steps in building complex visualizations.
</p>
</div>
<div style="float: left; width: 590px; margin-left: 20px;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUtaMnhIuP0035CsbEMQkwDr5WnUMXq7iNik3_nQ9SHFrpiz9P8Bsc7tVwNPuz603q6tleDaQ6ZWKWgZk-bRK6sqSgIc7yaCE3UUlhXWGiBWWJRXJf1YBUksH7yKeleERgRYogqgi6K7o/s1600/Layers+-+Years.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUtaMnhIuP0035CsbEMQkwDr5WnUMXq7iNik3_nQ9SHFrpiz9P8Bsc7tVwNPuz603q6tleDaQ6ZWKWgZk-bRK6sqSgIc7yaCE3UUlhXWGiBWWJRXJf1YBUksH7yKeleERgRYogqgi6K7o/s1600/Layers+-+Years.png" /></a>
</div>
<div class="separator" style="clear: both; text-align: center; margin-bottom: 2em;"> </div>
<!-- TWO COLUMNS START HERE -- NOTE: best when the total width, LEFT & RIGHT is 860px -->
<div style="float: left; width: 320px;"> <!-- LEFT -->
<!-- LEFT CONTENT HERE -->
<fs125p>The Yearly Sales.</fs125p>
<p>
In this viz <b>Sales</b> has been added to the Marks card—Tableau applies its default SUM aggregation and configured to be used as the Marks' labels.
</p>
<p>
As shown, Tableau uses the Sales sum for each Year and Week as the label.
<br/>
<i>This can be confirmed to show the accurate values, if desired, via alternate analyses.</i>
</p>
<p>
Note that the viz shows the actual Year & Week Tales totals, not the Sales compared to the same Week in 2015.
</p>
</div>
<div style="float: left; width: 590px; margin-left: 20px;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyPBy4lnuMuKZMLcSxKcgiG19NFxHDF5jo5JemTUhvbQ8BzW0NP-uZsv4t7Zct6P-d92SZzF1xTRGM4gibey-vRAoDbyF59fJS2BU-zIboBOw0eMFEQcQEq0My_hGBCGQ_jZzIgAdP9QA/s1600/Layers+-+Sales.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyPBy4lnuMuKZMLcSxKcgiG19NFxHDF5jo5JemTUhvbQ8BzW0NP-uZsv4t7Zct6P-d92SZzF1xTRGM4gibey-vRAoDbyF59fJS2BU-zIboBOw0eMFEQcQEq0My_hGBCGQ_jZzIgAdP9QA/s1600/Layers+-+Sales.png" /></a>
</div>
<div class="separator" style="clear: both; text-align: center; margin-bottom: 2em;"> </div>
<!-- TWO COLUMNS START HERE -- NOTE: best when the total width, LEFT & RIGHT is 860px -->
<div style="float: left; width: 320px;"> <!-- LEFT -->
<!-- LEFT CONTENT HERE -->
<fs125p>Measures on the Marks card.</fs125p>
<p>
In this viz <b>Sales</b> has been replaced on the Marks card by the three Measures shown.
</p>
<p>
Our objective is to see how Tableau presents each of them vis-a-vis the base data structure.
</p>
</div>
<div style="float: left; width: 590px; margin-left: 20px;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYtvQoFwJt86bJv7RBmjjGuTGuV_XGsjdL02ZUSLvJcvAR_d9a3ZyHpPdelU1ROXwmmjJczuFQ2-KK4crr1n0nBEq7-PD_NiclVNjBOlZhzJaQD_5CqfURftwqP6akUBaelZ2UUBkfDPw/s1600/Layers+-+Measures+in+Details.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYtvQoFwJt86bJv7RBmjjGuTGuV_XGsjdL02ZUSLvJcvAR_d9a3ZyHpPdelU1ROXwmmjJczuFQ2-KK4crr1n0nBEq7-PD_NiclVNjBOlZhzJaQD_5CqfURftwqP6akUBaelZ2UUBkfDPw/s1600/Layers+-+Measures+in+Details.png" /></a>
</div>
<div class="separator" style="clear: both; text-align: center; margin-bottom: 2em;"> </div>
<!-- TWO COLUMNS START HERE -- NOTE: best when the total width, LEFT & RIGHT is 860px -->
<div style="float: left; width: 320px;"> <!-- LEFT -->
<!-- LEFT CONTENT HERE -->
<fs125p>Presenting the 2015 Sales.</fs125p>
<p>
<b>SUM(!Sales = 2015)</b> has been used as the Marks' label.
As we can clearly see, there's only one Mark presented for each Week.
One may wonder: <i>why is only one Mark shown for each week when we know from above that there are four Years with Sales data for each?</i>
</p>
<p>
In this case, Tableau is only presenting the Marks for the non-Null measures in each Year/Week cell,
because the <b>!Sales = 2015</b> calculation
<code><br/>
IF DATEPART('year',[Order Date])=2015<br/>
THEN [Sales]<br/>
END<br/>
</code>
results in Null values for each Year other than 2015, so there's nothing for Tableau to present.
</p>
<p>
One potential source of confusion is that the "Null if Year <> 2015" result for the <b>!Sales = 2015</b> calculation is implicit,
i.e. Tableau provides the Null result by default in the absence of a positive assignment of a value when the Year is not 2015.
</p>
</div>
<div style="float: left; width: 590px; margin-left: 20px;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpPq8DlsGRiZ49dbr3ed5lfLHU4vAjoQSeVivNgX6dtwB67kLm34qXLKjbvpKjT_lnc-Exg7an53xZl66QoUR8u0g_Y5L1tgb-xKOSvAG0BQxpd8oXR6Qf2gIRYFq1D6i451dAF7GB_Uc/s1600/Layers+-+2015+Sales.png" imageanchor="1" >
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpPq8DlsGRiZ49dbr3ed5lfLHU4vAjoQSeVivNgX6dtwB67kLm34qXLKjbvpKjT_lnc-Exg7an53xZl66QoUR8u0g_Y5L1tgb-xKOSvAG0BQxpd8oXR6Qf2gIRYFq1D6i451dAF7GB_Uc/s1600/Layers+-+2015+Sales.png" />
</a>
</div>
<div class="separator" style="clear: both; text-align: center; margin-bottom: 2em;"> </div>
<!-- TWO COLUMNS START HERE -- NOTE: best when the total width, LEFT & RIGHT is 860px -->
<div style="float: left; width: 320px;"> <!-- LEFT -->
<!-- LEFT CONTENT HERE -->
<fs125p>Presenting the 2015 or Null Sales.</fs125p>
<p>
This viz has the same outcome as the one above.
</p>
<p>
The difference is that the calculation for
<code><br/>
IF DATEPART('year',[Order Date])=2015<br/>
THEN [Sales]<br/>
ELSE NULL<br/>
END<br/>
</code>
explicitly assigns NULL (<i>also Null</i>) to the non-2015 Years' values.
</p>
<p>
Using an explicit NULL assignment is advised as it minimizes the cognitive burden on whomever needs to interpret the calculation in the future.
</p>
</div>
<div style="float: left; width: 590px; margin-left: 20px;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjf93Eo4obu_b97Rq__imbqZ-ZS1XQ1pvWll6pfnBOZAqRFga63HpBM28I112GfdmKf_kfyGKprVKHT4fPBRZgSlP1WJenFNUqB9qXH7s_K1gjIfsG9JBhMI2N2iz8XO9oDwPT-D8KikI8/s1600/Layers+-+2015+Sales+Null.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjf93Eo4obu_b97Rq__imbqZ-ZS1XQ1pvWll6pfnBOZAqRFga63HpBM28I112GfdmKf_kfyGKprVKHT4fPBRZgSlP1WJenFNUqB9qXH7s_K1gjIfsG9JBhMI2N2iz8XO9oDwPT-D8KikI8/s1600/Layers+-+2015+Sales+Null.png" /></a>
</div>
<div class="separator" style="clear: both; text-align: center; margin-bottom: 2em;"> </div>
<!-- TWO COLUMNS START HERE -- NOTE: best when the total width, LEFT & RIGHT is 860px -->
<div style="float: left; width: 320px;"> <!-- LEFT -->
<!-- LEFT CONTENT HERE -->
<fs125p>Presenting the 2015 or 0 Sales.</fs125p>
</div>
<div style="float: left; width: 590px; margin-left: 20px;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbTREopp1MDLS_u5Jxwdyh41NpOwIOAl5x0rvKzMfWhPGMxJyGkgjWRYrQd7-gAEP6y9f68vQUzKKKQYQM6slUKsldY_Ep5Mt-CsfgnqHIpSlEvg9l5N0afZuBSE2I-BkzGvq77hmshiw/s1600/Layers+-+2015+Sales+0.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbTREopp1MDLS_u5Jxwdyh41NpOwIOAl5x0rvKzMfWhPGMxJyGkgjWRYrQd7-gAEP6y9f68vQUzKKKQYQM6slUKsldY_Ep5Mt-CsfgnqHIpSlEvg9l5N0afZuBSE2I-BkzGvq77hmshiw/s1600/Layers+-+2015+Sales+0.png" /></a>
</div>
<div class="separator" style="clear: both; text-align: center; margin-bottom: 2em;"> </div>
<div style=" background-color: lightgrey; margin-top:1em; margin-bottom:2em; border: 1px solid grey;">
<div style="margin-left:2em;">
<fs150p>Recreating the viz – an alternate method.</fs150p>
</div>
</div>
<p>
From this point we're going to be building the viz from the bottom up, showing how the constituent parts operate and interact with each other.
</p>
<div style="margin-top:1em;">
<fs125>Sales – Total, 2015, & pre-2015</fs125>
<br/>
First up: making sure that the Sales calculations for Sales for pre-2015 and 2015 are correct.
<br/>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkJDQeF-eB5oIckfhw1rmm5gynWWJUD6crVvOgCwyiz0IBLYq7Vc59HV7Qa06MzbNZDnEDxI9QvaoaQdHBPSsu1PPiuOIFYqFrZiltLDsPzw_NTYl0n7Z5TrW_vpkCeLaoU5IMudHT8o0/s1600/1.+Sales+-+Field+and+Row+level+Calcs+-+annotated.png" imageanchor="1" >
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkJDQeF-eB5oIckfhw1rmm5gynWWJUD6crVvOgCwyiz0IBLYq7Vc59HV7Qa06MzbNZDnEDxI9QvaoaQdHBPSsu1PPiuOIFYqFrZiltLDsPzw_NTYl0n7Z5TrW_vpkCeLaoU5IMudHT8o0/s1600/1.+Sales+-+Field+and+Row+level+Calcs+-+annotated.png" />
</a>
<div style="margin-top:0px; margin-right:5em; margin-left:3em;">
The calculations are correct—they sum up to the total of all Sales.
</div>
</div>
<div style="margin-top:2em;">
<fs125>Configure 2015 Sales to be the 3-week Moving Average</fs125>
<br/>
The moving average for 2015 Sales is generated by configuring the <b>SUM(!Sales = 2015)</b> measure as a Quick Table Calculation <b>in</b> the viz.
<br/>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixtsNyry6L147tk7MLf_nTXv5sBlbQZxX4GTo4UUYKRXfjcPkZWpsVU9dblPFutt9-YGREEp9aGqyKBdS7F2SqG28AijywHLd0WMWf6-lOzhWmTclykZGOZ0Zw8UC0vMqo2LokXgLEr_w/s1600/2.+Sales+%253D+2015+Moving+Average%252C+in-sheet+annotated.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixtsNyry6L147tk7MLf_nTXv5sBlbQZxX4GTo4UUYKRXfjcPkZWpsVU9dblPFutt9-YGREEp9aGqyKBdS7F2SqG28AijywHLd0WMWf6-lOzhWmTclykZGOZ0Zw8UC0vMqo2LokXgLEr_w/s1600/2.+Sales+%253D+2015+Moving+Average%252C+in-sheet+annotated.png" /></a>
<div style="margin-top:0px; margin-right:5em; margin-left:3em;">
<fs125>The Steps:</fs125>
<ol>
<li>
Activate the <b>SUM(!Sales = 2015)</b> field's menu
</li>
<li>
Select "Quick Table Calculation", then choose "Moving Average" <br/>
Tableau will set up the standard Moving Average Table Calculation, which uses the two previous and current values as the basis for averaging. <br>
Since this isn't what we're after, we need to edit the TC.
</li>
<li>
Select "Edit Table Calculation" (after activating the field menu again) <br>
Configure as shown, so that Tableau will average the Pre<u>v</u>ious, current, and Ne<u>x</u>t values. <br>
Note: The meaning of "Pre<u>v</u>ious Values", "current", and "Ne<u>x</u>t Values" is inferred from the "Moving <u>a</u>long: - <b>Table (Across)</b>"
</li>
<li>
The "Compute using" field option shows the same "Table (Across)" value as the "Moving <u>a</u>long" option in the Edit Table Calculation dialog.
</li>
<li>
Add <b>!2015 Sales</b> back to the viz.
<br/>
There are a number of ways to accomplish this—most common are dragging it from the data window, and using the Measure Names quick filter.
<br/>
<fs110>Why do this?</fs110>
<br/>
Configuring the Table Calculation in steps 1-4 changed the <b>SUM(!Sales = 2015)</b> field in the Measures Value shelf from a normal field
to a Table Calculation field (indicated by the triangle in the field's pill).
Adding <b>SUM(!Sales = 2015)</b> back to Measures Values provides the opportunity to use its values in illustrating how the Moving Averages are calculated.
</li>
</ol>
<fs125>How it works:</fs125>
<br/>
For each Moving Average value, Tableau identifies the individual <b>SUM(!Sales = 2015)</b> values to be used then averages them.<br/>
The blue rectangles in the table show individual Moving Average values, pointing to the referenced "<b>SUM(!Sales = 2015)</b>" values.<br/>
There are three different scenarios presented:
<ul>
<li>
Week 1 — there is no Previous value, so only the current and Next values are averaged.
</li>
<li>
Week 4 — averages the Week 3 (Previous), Week 4 (Current), and Week 5 (Next) values.
</li>
<li>
Week 7 — there is no Next value, so only the Previous and current values are averaged.
</li>
</ul>
<fs125>Note:</fs125>
<br/>
There's no need to include <b>SUM(!Sales = 2015)</b> in the visualization to have the Moving Average Table Calculation work.
I've added it only to make explicit how Tableau structures, accesses, and interprets the data it needs for the presentation it's being asked to deliver.
</div>
</div>
<div style="margin-top:2em;">
<fs125>Pre-2015 Sales 3-week Moving Average - the default configuration</fs125>
<br/>
Please note: this is implemented using a persistent Calculated field coded as a Table Calculation: <b>!Sales < 2015 Moving Avg</b><br/>
This is a different approach than using the in-viz configuration of the 2015 Sales shown above. There are differences in the two approaches, some obvious, some subtle.
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3FHkzlcPaw52uvLQJAg_66nJPqKuHbDdl5NdgPZrYxVGVfzUi1D3d-X_UjS2DopX596-LnpbWweDWciHcz53t7yCWfHkx-gce7HKik8H24YxMkyt_04AyZQEqEkNYGkndjfW1sA2U26k/s1600/2.+Sales+prior+to+2015+Moving+Average%252C+persistent+-+annotated.png" imageanchor="1" >
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3FHkzlcPaw52uvLQJAg_66nJPqKuHbDdl5NdgPZrYxVGVfzUi1D3d-X_UjS2DopX596-LnpbWweDWciHcz53t7yCWfHkx-gce7HKik8H24YxMkyt_04AyZQEqEkNYGkndjfW1sA2U26k/s1600/2.+Sales+prior+to+2015+Moving+Average%252C+persistent+-+annotated.png" />
</a>
<div style="margin-top:0px; margin-right:5em; margin-left:3em;">
<fs125>The Steps:</fs125>
<ul>
<li>
Add <b>!Sales < 2015 Moving Avg</b> to the Measures Shelf as shown.<br/>
As mentioned above, it can be dragged in from the Data Window, or selected in the Measure Names quick filter.
</li>
</ul>
<fs125>How it works:</fs125>
<br/>
When Tableau puts <b>!Sales < 2015 Moving Avg</b> in the viz it applies the default configuration as shown.
In this viz the use of <b>Table (Across)</b>, as shown in both the Table Calculation dialog and the field's 'Compute using' submenu,
provides the desired functionality, i.e. averaging the appropriate <b>!Sales < 2015</b> values, based upon the field's formula: <br/>
<code>WINDOW_AVG(SUM([!Sales < 2015]),-1,1)</code>, <br/>resulting in:
<ul>
<li>
Week 1 — only the current and Next values are averaged.
</li>
<li>
Week 4 — averages the Week 3 (Previous), Week 4 (Current), and Week 5 (Next) values.
</li>
<li>
Week 7 — only the Previous and current values are averaged.
</li>
</ul>
</div>
</div>
<div style="margin-top:2em;">
<fs125>Add Order Date Year to Rows</fs125>
<br/>
Adding the Order Date Year to Rows instructs Tableau to construct a set of the Measures for each individual Year in the Order Date data.
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNBXT5a0xzyZWtnwtbg9n7eEdoUA5KSATBvBw42KDzXNr60c88K7aW_DxyswRc5RcdMeoG5Y_n_jvdfLwamMF8fucWIvx2gswbHgaBf74bU80J3WCanc95MT-cwwrQxEYTzdp-L0OW7gw/s1600/4.+Add+Year+to+Rows%252C+annotated.png" imageanchor="1" >
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNBXT5a0xzyZWtnwtbg9n7eEdoUA5KSATBvBw42KDzXNr60c88K7aW_DxyswRc5RcdMeoG5Y_n_jvdfLwamMF8fucWIvx2gswbHgaBf74bU80J3WCanc95MT-cwwrQxEYTzdp-L0OW7gw/s1600/4.+Add+Year+to+Rows%252C+annotated.png" />
</a>
<div style="margin-top:0px; margin-right:5em; margin-left:3em;">
<p>
Note that the Measures are only instantiated for those Years for which they are relevant, i.e.
the pre-2015 Measures only have values for the years prior to 2015,
and the 2015 Moving Average only has values for 2105.
</p>
<p>
Having these Year-specific values sets the stage for the next part: identifying the Minimum, Average, and Maximum of the pre-2015 Yearly Moving Averages.
</p>
<p>
For example, as shown in the viz, these values and Min/Max for Week 1 occur thus:
<br/> 2012 – 36,902 - Max
<br/> 2013 – 30,669 - Min
<br/> 2014 – 34,707
<br/>and the Average of the Yearly Moving Averages is: 102,278 / 3 = 34,093
</p>
<p>
<i>How Tableau accomplishes constructing the Measures for this viz is beyond the scope of this post, and it can get complicated.</i>
</p>
</div>
</div>
<div style="margin-top:2em;">
<fs125>Add the pre-2015 Sales Moving Average Minimum</fs125>
<br/>
<fs110>Part 1 - add the Field</fs110>
<br/>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiT3mZjMG-Yl-I-J0ziKZrjaqrqCGCTzcE9ghgQTIy2i2TpL9N7sRCfhm-1wT79GkrpAP_J22mikfhv-D5WzUmy4Ju9i6fIT1rI6bx5Rh971gKSzbgj4hxcxIBU9e0PONWIIco6WN3zJQ4/s1600/3.+Sales+-+Adding+prior+MovAvg+-+Min+to+viz%252C+annotated.png" imageanchor="1" >
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiT3mZjMG-Yl-I-J0ziKZrjaqrqCGCTzcE9ghgQTIy2i2TpL9N7sRCfhm-1wT79GkrpAP_J22mikfhv-D5WzUmy4Ju9i6fIT1rI6bx5Rh971gKSzbgj4hxcxIBU9e0PONWIIco6WN3zJQ4/s1600/3.+Sales+-+Adding+prior+MovAvg+-+Min+to+viz%252C+annotated.png" />
</a>
<div style="margin-top:0px; margin-right:5em; margin-left:3em;">
Drag <b>!Sales < 2015 Moving Avg - Min</b> from the <b>Data</b> window to the Measure Values shelf as shown.
<p>
Tableau generates a value for each Week for each Year—for the Years prior to 2015.
<br/>
<i>This image has been cropped to show only 2012 & 2013.</i>
</p>
<p>
As shown in this image, for each Year, all of the <b>!Sales < 2015 Moving Avg - Min</b> values is that of the minimum of the Weeks' values for
<b>!Sales < 2015 Moving Avg</b> for that Year. This is because Tableau's default configuration for a Table Calculation Measure added to a viz is <b>Table (Across)</b>.
</p>
<p>
In order to achieve the desired calculation - that each Week's value for <b>!Sales < 2015 Moving Avg - Min</b> reflect the minimum of the values for that Week for the individual Years,
we need to configure <b>!Sales < 2015 Moving Avg - Min</b> in the viz, directing Tableau to perform the calculation in the desired manner.
</p>
</div>
<fs110>Part 2 - configure the Field</fs110>
<br/>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTXwPsZp1GiLUMmFPgo0t-b814kw-RAf5mDH4zxzHq3RSTEGR4XP5SE4B9Crl4LJYq6kEMpzObp9uYCtsoNbhDpWEkK2NiFSJ3hi2VtO06WwqXGSe2V_uyR2qoGbTvnNyabB98QAnQeeE/s1600/5.+Configure+Minimum%252C+annotated.png" imageanchor="1" >
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTXwPsZp1GiLUMmFPgo0t-b814kw-RAf5mDH4zxzHq3RSTEGR4XP5SE4B9Crl4LJYq6kEMpzObp9uYCtsoNbhDpWEkK2NiFSJ3hi2VtO06WwqXGSe2V_uyR2qoGbTvnNyabB98QAnQeeE/s1600/5.+Configure+Minimum%252C+annotated.png" />
</a>
<div style="margin-top:0px; margin-right:5em; margin-left:3em;">
<fs125>The Steps:</fs125>
<ul>
<li>
1..2 – operate as shown
</li>
<li>
3..4 – select the "Compute using: | Advanced" option
<br/>
Note the active/default <b>Table (Across)</b> option; as explained above, this is why the default calculation finds the minimum value among the Weeks for each Year.
</li>
<li>
5 – move "Year of Order Date" from "Partitioning:" to "Addressing:"
<br/>
Partitioning and Addressing are fundamental aspects of how Tableau evaluates and calculates Table Calculations. Covering them is beyond the scope of this post.
<br/>
Googling "Tableau partitioning and addressing" will lead to a robust set of references.
</li>
<li>
6..7 – "OK" & "OK" to apply the configuration.
</li>
</ul>
</div>
</div>
<div style="margin-top:2em;">
<fs125>title</fs125>
<br/>
image
<div style="margin-top:0px; margin-right:5em; margin-left:3em;">
...
</div>
</div>
Chris Gerrardhttp://www.blogger.com/profile/01598731155784487000noreply@blogger.com3tag:blogger.com,1999:blog-6248043124025283718.post-66617702623791119482015-06-15T03:38:00.000-04:002015-06-15T10:11:55.631-04:00Make Dashboards' formatting consistent.
<div style="float: left; width: 380px">
<!-- LEFT -->
<p>
Has this ever happened to you?
</p>
<p>
In the course of normal events dashboards get built with a hodgepodge of styles.
</p>
<p>
For example, in the Workbook to the right the
</p>
<ul>
<li><b>default</b> dashboard has not had any formatting applied, while the</li>
<li><b>formatted</b> dashboard has been formatted.</li>
</ul>
<p>
It's sometimes desirable to have a consistent Dashboard look and feel without going through the tremendously tedious manual process of configuring them individually.
</p>
<p>
Tableau lacks the ability to enable this, either by setting the defaults you want, or by applying formatting to Dashboards in bulk.
</p>
</div>
<div style="float: left; margin-left: 15px; width: 525px">
<!-- RIGHT -->
<script type='text/javascript' src='https://public.tableau.com/javascripts/api/viz_v1.js'></script><div class='tableauPlaceholder' style='width: 454px; height: 455px;'><noscript><a href='#'><img alt=' ' src='https://public.tableau.com/static/images/Ex/ExampleDashboards-DashboardFormatting/default/1_rss.png' style='border: none' /></a></noscript><object class='tableauViz' width='454' height='455' style='display:none;'><param name='host_url' value='https%3A%2F%2Fpublic.tableau.com%2F' /> <param name='site_root' value='' /><param name='name' value='ExampleDashboards-DashboardFormatting/default' /><param name='tabs' value='yes' /><param name='toolbar' value='yes' /><param name='static_image' value='https://public.tableau.com/static/images/Ex/ExampleDashboards-DashboardFormatting/default/1.png' /> <param name='animate_transition' value='yes' /><param name='display_static_image' value='yes' /><param name='display_spinner' value='yes' /><param name='display_overlay' value='yes' /><param name='display_count' value='yes' /><param name='showVizHome' value='no' /><param name='showTabs' value='y' /><param name='bootstrapWhenNotified' value='true' /></object></div>
</div>
<div class="separator" style="clear: both; text-align: center;"></div>
<p style="margin-top:2em; margin-bottom:2em;">
<fs125>But you can now do it, simply and easily.</fs125><br/>
There's a Tableau Tool for applying the formatting from a template dashboard to all of the dashboards in a set of workbooks.
</p>
<div style="float: left; width: 275px">
<!-- LEFT -->
<p>
Here's a dashboard with the formatting to apply to a selected set of Workbooks.
</p>
<p>
We'll see below how to make this happen–it's a pretty simple matter of running the appropriate Tableau Tool in the directory where the Workbooks are.
</p>
<p>
The tool will take the Template formatting and apply it to all the dashboards it's pointed at.
</p>
<p>
For the tool to work there are two important aspects to this Workbook:
</p>
<ul>
<li>The Workbook is named <br/><b>Template.twb</b></li>
<li>The Dashboard is also named <br/><b>Template</b>.</li>
</ul>
<p>
Of course, if one wants to use another Workbook and Dashboard name, it's easy to reconfigure the tool to accommodate them.
</p>
</div>
<div style="float: left; margin-left: 10px; width: 630px">
<!-- RIGHT -->
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxdjwVirJja6rnKflN5tMwHEXfWB-feteFQNpZtxb-QCRZHCLgE2887kgQylp4EdCLztMTghbZhPRNbGRmikx34am_lccXLjwCuboCWg05IkTuDYjZi647epGir4LwO0dBcWJGbBN5hdY/s1600/DashboardFormattingTemplate.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxdjwVirJja6rnKflN5tMwHEXfWB-feteFQNpZtxb-QCRZHCLgE2887kgQylp4EdCLztMTghbZhPRNbGRmikx34am_lccXLjwCuboCWg05IkTuDYjZi647epGir4LwO0dBcWJGbBN5hdY/s1600/DashboardFormattingTemplate.png" /></a>
</div>
<div class="separator" style="clear: both; text-align: center;"></div>
<p style="margin-top:2em; margin-bottom:2em;">
<fs125>The formatted Dashboards.</fs125>
</p>
<div style="float: left; width: 380px;">
<!-- LEFT -->
<p>
Here are the <b>default</b> and <b>formatted</b> dashboards re-formatted with the Template formatting.
</p>
<p>
Important points about the formatting:
</p>
<ul>
<li>Only the formatting shown above will be applied;<br/>
there are other things one might wish to configure, but there are complications that go along with them.</li>
<li>All of the Template Dashboard's formatting will be applied, even if some part of it hasn't been configured;<br/>
it's possible to implement finer-grained control of what formatting gets applied, but that gets complicated, beyond the scope of this initial formatting approach.</li>
</ul>
</div>
<div style="float: left; margin-left: 20px; width: 525px;">
<!-- RIGHT -->
<script type='text/javascript' src='https://public.tableau.com/javascripts/api/viz_v1.js'></script><div class='tableauPlaceholder' style='width: 454px; height: 455px;'><noscript><a href='#'><img alt=' ' src='https://public.tableau.com/static/images/Ex/ExampleDashboards__styled_/default/1_rss.png' style='border: none' /></a></noscript><object class='tableauViz' width='454' height='455' style='display:none;'><param name='host_url' value='https%3A%2F%2Fpublic.tableau.com%2F' /> <param name='site_root' value='' /><param name='name' value='ExampleDashboards__styled_/default' /><param name='tabs' value='yes' /><param name='toolbar' value='yes' /><param name='static_image' value='https://public.tableau.com/static/images/Ex/ExampleDashboards__styled_/default/1.png' /> <param name='animate_transition' value='yes' /><param name='display_static_image' value='yes' /><param name='display_spinner' value='yes' /><param name='display_overlay' value='yes' /><param name='display_count' value='yes' /><param name='showVizHome' value='no' /><param name='showTabs' value='y' /><param name='bootstrapWhenNotified' value='true' /></object></div>
</div>
<div class="separator" style="clear: both; text-align: center;"></div>
<hr style="margin-top:2em; margin-bottom:2em;"/>
<p style="margin-top:2em; margin-bottom:2em;">
<fs125>The tool: SetDashboardFormatAll.rb</fs125><br/>
is available on <a href="https://raw.githubusercontent.com/ChrisGerrard/Tableau-Tools/master/Ruby/SetDashboardFormatAll.rb">
GitHub here</a>, or can be copy/pasted from below.
</p>
<div style="border: 1px solid grey; margin: 0 2em 2em 2em;">
<pre>
<code>
# Copyright (C) 2014, 2015 Chris Gerrard
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
require 'twb'
require 'nokogiri'
require 'csv'
$templateTwb = 'Template.twb'
$templateDash = 'Template'
$twbAppend = '_styled_'
puts "\n\n"
puts " Setting Workbook dashboard formatting, using the formatting"
puts " from the #{$templateDash} dashboard"
puts " in the #{$templateTwb} workbook\n\n"
$csv = CSV.open("TT-FormattedWorkbooks.csv", "w")
$csv << ["Workbook","Dashboard"]
def loadTemplate
return 'Template.twb not found' unless File.file?('Template.twb')
twb = Twb::Workbook.new('Template.twb')
dash = twb.dashboards['Template']
return 'Template dashboard not found' if dash.nil?
style = dash.node.at_xpath('./style')
return ' ERROR - no style available from Template dashboard.' if style.nil?
puts " Dashboard styling:"
styleRules = style.xpath('./style-rule')
if styleRules.empty?
puts "\n\t Template dashboard formatting is default style."
else
styleRules.each do |rule|
puts "\n\t Element: #{rule['element']}"
formats = rule.xpath('./format')
formats.each do |f|
puts sprintf("\t -- %-16s : %s \n", f['attr'], f['value'])
end
end
end
puts "\n"
return style
end
def processTwbs
path = if ARGV.empty? then '*.twb' else ARGV[0] end
puts " Looking for TWBs using: #{ARGV[0]} \n\n"
Dir.glob(path) do |fname|
setTwbStyle(fname) unless fname.eql?($templateTwb) || !fname.end_with?('.twb')
end
end
def setTwbStyle fname
return if fname.eql?($templateTwb) || fname.include?($twbAppend + '.twb')
twb = Twb::Workbook.new(fname)
dashes = twb.dashboards.values
puts sprintf("\t%3d in: '%s' ", dashes.length, fname)
return if dashes.empty?
dashes.each do |dash|
node = dash.node
style = node.at_xpath('./style')
tmpStyle = $templateStyle.clone
style.replace(tmpStyle)
$csv << [fname, dash.name]
end
twb.writeAppend($twbAppend)
end
$templateStyle = loadTemplate
if $templateStyle.class == 'String'.class
puts "\t #{$templateStyle}\n\n"
else
processTwbs
end
$csv.close unless $csv.nil?
</code>
</pre>
</div>
<div class="separator" style="clear: both; text-align: center;"></div>
<div style="float: left; margin-left: 20px; width: 300px;">
<!-- LEFT -->
<p>
<fs125>The Tool in action</fs125><br/>
Here's the code being run.
</p>
<p>
In this case the execution command specifies that only the single Workbook <b>ExampleDashboards.twb</b> will have its Dashboard(s) formatted.
</p>
<p>
Upon startup, the tool looks for the Template Workbook and Dashboard and, assuming it finds them, prints out the formatting found there.
</p>
<p>
It then looks for Workbooks, either all of them, or those matching the single command line parameter. Those that it finds have any Dashboards they contain formatted to the Template configuration.
</p>
<p>
It then looks for Workbooks, either all of them, or those matching the single command line parameter. Those that it finds are listed with the number of their Dashboards, if any, and have their Dashboards formatted to the Template configuration.
</p>
<p>
By default, the Template-formatted dashboards are written to a copy of the original, with '._styled_' appended to the name.
This is a precaution, ensuring that the original Workbook isn't harmed in the process. Adjusting the Tool to apply the formatting directly to the Workbook is a small change, easily made.
</p>
</div>
<div style="float: left; width: 600px;">
<!-- RIGHT -->
<terminal style="border-radius: 15px;">
<pre>
<code>
...$ ls -1 ExampleDashboards*.twb
ExampleDashboards.twb
...$ ruby "{path to}\SetDashboardFormatAll.rb" ExampleDashboards.twb
Setting Workbook dashboard formatting, using the formatting
from the Template dashboard
in the Template.twb workbook
Dashboard styling:
Element: table
-- background-color : #fae7c8
Element: dash-title
-- font-weight : normal
-- color : #000000
-- font-size : 14
-- background-color : #f0d9b6
-- border-color : #b40f1e
-- border-style : solid
Element: dash-subtitle
-- font-size : 11
-- font-weight : normal
-- color : #b40f1e
-- background-color : #d7d7d7
Element: dash-text
-- text-align : center
-- color : #b40f1e
-- background-color : #e1e8fa
-- border-color : #1b1b1b
-- border-style : solid
-- font-family : Comic Sans MS
Looking for TWBs using: ExampleDashboards.twb
2 in: 'ExampleDashboards.twb'
...$ ls -1 ExampleDashboards*.twb
ExampleDashboards._styled_.twb
ExampleDashboards.twb
...$
</code>
</pre>
</terminal>
</div>
<div class="separator" style="clear: both; text-align: center;"></div>
Chris Gerrardhttp://www.blogger.com/profile/01598731155784487000noreply@blogger.com5tag:blogger.com,1999:blog-6248043124025283718.post-24271584916679499952015-06-05T00:47:00.000-04:002015-06-23T13:10:47.663-04:00This changes everything - Autodocumenting Workbooks<p>
Your Workbooks can document themselves, now that programmatically creating and injecting Dashboards that document Workbooks into them is a reality. And it's free.
</p>
<p>
Consider the Regional Sample Workbook. It has six separate vizzes, but one easily can't tell whether any of them is a Dashboard without visually inspecting it. Nor can we see which Worksheets a Dashboard includes without opening it, and there's no way to tell how all the Dashboards relate to all the Worksheets, or the Worksheets to the Data Sources they access.
</p>
<script type='text/javascript' src='https://public.tableau.com/javascripts/api/viz_v1.js'></script><div class='tableauPlaceholder' style='width: 804px; height: 695px;'><noscript><a href='#'><img alt=' ' src='https://public.tableau.com/static/images/Re/RegionalSampleWorkbook/Obesity/1_rss.png' style='border: none' /></a></noscript><object class='tableauViz' width='804' height='695' style='display:none;'><param name='host_url' value='https%3A%2F%2Fpublic.tableau.com%2F' /> <param name='site_root' value='' /><param name='name' value='RegionalSampleWorkbook/Obesity' /><param name='tabs' value='yes' /><param name='toolbar' value='yes' /><param name='static_image' value='https://public.tableau.com/static/images/Re/RegionalSampleWorkbook/Obesity/1.png' /> <param name='animate_transition' value='yes' /><param name='display_static_image' value='yes' /><param name='display_spinner' value='yes' /><param name='display_overlay' value='yes' /><param name='display_count' value='yes' /><param name='showVizHome' value='no' /><param name='showTabs' value='y' /><param name='bootstrapWhenNotified' value='true' /></object></div>
<p>
Imagine, if you please, what it would look like if there was a way to have the Workbook -> Dashboards -> Worksheets -> Data Sources relationships teased out of the Workbook, rendered graphically, and then added back into the Workbook as a self-documenting Dashboard.
</p>
<p>
Would you like that? Would it be handy? Useful? Maybe?
Until now, this sort of thing has been difficult, awkward, and manually intensive. If it was doable at all.
</p>
<p>
Not any longer. It's now simple and straightforward, with a minimum of fuss, for one workbook, or a whole boatload of them.
</p>
<p>
<fs125>Here it is — the Regional Workbook, autodocumented, </fs125><br/>
with the map of its Dashboards, Worksheets, and Data Sources automatically generated and injected into it.
</p>
<script type='text/javascript' src='https://public.tableau.com/javascripts/api/viz_v1.js'></script><div class='tableauPlaceholder' style='width: 982px; height: 745px;'><noscript><a href='#'><img alt=' ' src='https://public.tableau.com/static/images/Re/RegionalSampleWorkbook-AutodocDSDGraph/DashboardsWorksheetsandDataSources/1_rss.png' style='border: none' /></a></noscript><object class='tableauViz' width='982' height='745' style='display:none;'><param name='host_url' value='https%3A%2F%2Fpublic.tableau.com%2F' /> <param name='site_root' value='' /><param name='name' value='RegionalSampleWorkbook-AutodocDSDGraph/DashboardsWorksheetsandDataSources' /><param name='tabs' value='yes' /><param name='toolbar' value='yes' /><param name='static_image' value='https://public.tableau.com/static/images/Re/RegionalSampleWorkbook-AutodocDSDGraph/DashboardsWorksheetsandDataSources/1.png' /> <param name='animate_transition' value='yes' /><param name='display_static_image' value='yes' /><param name='display_spinner' value='yes' /><param name='display_overlay' value='yes' /><param name='display_count' value='yes' /><param name='showVizHome' value='no' /><param name='showTabs' value='y' /><param name='bootstrapWhenNotified' value='true' /></object></div>
<p>
Adding documentation to Workbooks, where it really matters, has always been a manual, laborious process, with so much friction that it hasn't been feasible at scale. No more. <fs110>Tableau Tools'</fs110> now has the ability to inject dashboards into existing dashboards automatically. Coupled with its existing abilities to generate useful content about Workbooks, this opens entire new horizons for enriching Workbooks with surprisingly little effort.
</p>
<fs125p>
How the magic happens.
</fs125p>
<p>
The simple version: run a simple Ruby script in a directory containing Workbooks to be documented, and <fs110>presto!</fs110> the Workbook(s) are documented with the desired content; in this case the D->W->DS maps for each.
</p>
<fs125p>
Run this code in a directory containing Workbooks.
</fs125p>
<hr/>
<pre><code><blockquote>
# Copyright (C) 2014, 2015 Chris Gerrard
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
require 'twb'
puts "\n\n\t Documenting Workbooks with Tableau Tools"
puts "\n\t Adding Dashboard -> Worksheet -> Data Source graphs"
puts "\n\t https://github.com/ChrisGerrard/Tableau-Tools"
puts "\n"
path = if ARGV.empty? then '*.twb' else ARGV[0] end
puts "\n\t Files matching: '#{path}'"
Dir.glob(path) do |twb|
puts "\t -- #{twb}"
twb = Twb::Workbook.new(twb)
dotBuilder = Twb::Util::TwbDashSheetDataDotBuilder.new(twb)
dotFile = dotBuilder.dotFileName
renderer = Twb::Util::DotFileRenderer.new
imageFile = renderer.render(dotFile,'png')
dash = Twb::DocDashboardImageVert.new
dash.image=(imageFile)
dash.title=('Dashboards, Worksheets, and Data Sources')
twb.addDocDashboard(dash)
twb.writeAppend('dot')
end
</blockquote></code></pre>
<hr/>
<p>
The code is <a href="https://github.com/ChrisGerrard/Tableau-Tools/blob/master/Ruby/TwbDoc-DashSheetDataGraph.rb">available on GitHub here</a>.
<br/>
Not much to it, is there?<br/>Tableau Tools does the work, needing only a little glue code to compose the specific functionality.
</p>
<fs125p>
Here's the code running in a directory containing Tableau Sample Workbooks.
</fs125p>
<div style="float: left; width: 535px;">
<!-- LEFT -->
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfzkXJJC4knQGGdLU03oKVfYiKHnOQM0EUOety-Et4czqV_ud0F3JwmGZ9kBIBlpgOy_stQ9OwCznIYa5Lqnu1-4uExzsMPUvjHG_ORr18Gd3oyehoos253hj7s4-wX2BWSQv9rpTyNcg/s1600/TwbDoc-DashSheetDataGraph.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfzkXJJC4knQGGdLU03oKVfYiKHnOQM0EUOety-Et4czqV_ud0F3JwmGZ9kBIBlpgOy_stQ9OwCznIYa5Lqnu1-4uExzsMPUvjHG_ORr18Gd3oyehoos253hj7s4-wX2BWSQv9rpTyNcg/s1600/TwbDoc-DashSheetDataGraph.png" /></a></div>
</div>
<div style="float: left; margin-left: 20px; width: 300px;">
<!-- RIGHT -->
<p>
As the code runs it picks up all the *.twb files in the directory and processes each in turn.
</p>
<pre style="margin:-1em 0 -1em 0; font-size: 85%">
<code>
Dir.glob(path) do |twb|
puts "\t -- #{twb}"
twb = Twb::Workbook.new(twb)
</code>
</pre>
<p style="margin-bottom:5px;">
Each file has its D->W->DS map built with:
</p>
<pre style="margin:-1em 0 -1em 0; font-size: 85%">
<code>
dotBuilder = Twb::Util::TwbDashSheetDataDotBuilder.new(twb)
dotFile = dotBuilder.dotFileName
renderer = Twb::Util::DotFileRenderer.new
</code>
</pre>
<p style="margin-bottom:5px;">
The D->W->DS map image file is added to a Dashboard which is then injected into the Workbook with:
</p>
<pre style="margin:-1em 0 -1em 0; font-size: 85%">
<code>
dash = Twb::DocDashboardImageVert.new
dash.image=(imageFile)
dash.title=('Dashboards, Worksheets, and Data Sources')
twb.addDocDashboard(dash)
</code>
</pre>
<p style="margin-bottom:5px;">
The Workbook is written out, as a copy with '.dot' added to its name with:
</p>
<pre style="margin:-1em 0 -1em 0; font-size: 85%">
<code>
twb.writeAppend('dot')
</code>
</pre>
</div>
<div class="separator" style="clear: both; text-align: center;"></div>
<p>
There's no technical reason to create a new copy of the Workbook, and in a production environment the Workbooks are mostly documented in place, i.e. keeping their own names.
</p>
<fs150p>
Dependencies
</fs150p>
<div style="margin-left:2em;">
<p>
<fs125>Ruby 1.9.3</fs125><br/>
is preferred, almost exclusively because the Nokogiri gem that's required under the covers works seamlessly with 1.9.3 (on Windows), and not so seamlessly with Ruby 2.x. See the Nokogiri section below for more information.
</p>
<hr style="margin-top:1em; margin-bottom:1em;"/>
<p>
<fs125>The Twb gem</fs125><br/>
is required, and is declared as such via "<code>require 'twb'</code>", the first executable (non-comment) line.
<br>
The gem is installable via "<code>...> gem install twb</code>", which assumes that "<code>gem</code> " is installed, which should have happened when Ruby was installed.
</p>
<terminal>
<pre>
<code>
... Tableau Sample Workbooks> gem install twb
Successfully installed twb-0.3.2
1 gem installed
Installing ri documentation for twb-0.3.2...
Installing RDoc documentation for twb-0.3.2...
... Tableau Sample Workbooks> gem list twb
*** LOCAL GEMS ***
twb (0.3.2)
... Tableau Sample Workbooks>
</code>
</pre>
</terminal>
<p style="margin-left: 2em;">
(post-publishing) note: <br/>
The correct gem version is 0.3.2 (as of this writing) – there was a glitch in the gem publishing that I didn't catch at the time of the original post resulting in an obsolete version of it being installed.<br/>
Thanks to Philip, Vishwanath, and Matthew for reporting this.
</p>
<hr style="margin-top:1em; margin-bottom:1em;"/>
<p>
<fs125>The Nokogiri gem</fs125><br/>
Nokogiri is an XML and HTML parsing gem that's used by the Twb gem. If it's not installed the 'require' statement in Twb will fail.
<br>
Nokogiri is installable thus:
</p>
<terminal>
<pre>
<code>
... Tableau Sample Workbooks> gem install nokogiri
Fetching: mini_portile-0.6.2.gem (100%)
Fetching: nokogiri-1.6.6.2-x86-mingw32.gem (100%)
Nokogiri is built with the packaged libraries: libxml2-2.9.2, libxslt-1.1.28, zlib-1.2.8, libiconv-1.14.
Successfully installed mini_portile-0.6.2
Successfully installed nokogiri-1.6.6.2-x86-mingw32
2 gems installed
Installing ri documentation for mini_portile-0.6.2...
Installing ri documentation for nokogiri-1.6.6.2-x86-mingw32...
Installing RDoc documentation for mini_portile-0.6.2...
Installing RDoc documentation for nokogiri-1.6.6.2-x86-mingw32...
... Tableau Sample Workbooks>
</pre>
</code>
</terminal>
<p style="margin-left: 2em;">
note: <br/>
Nokogiri is sensitive to the Ruby version being used.<br/>
I'm using Ruby 1.9.3, mostly because: it's stable; suitable for my purposes; inertia; and Nokogiri didn't work with 2.x Ruby in the limited testing I did. <br/>
There's some documentation online about Nokogiri and Ruby 2.x but I've not had the time to puzzle out how to get them to play nice together.
</p>
<hr style="margin-top:1em; margin-bottom:1em;"/>
<p>
<fs125>Graphviz</fs125><br/>
The diagrams are created using <a href="http://www.graphviz.org">Graphviz</a> - open source graphing software, which can be downloaded and installed from <a href="http://www.graphviz.org/Download..php">here</a>.
</p>
<p><b>Graphviz location</b>
In order for the graphs to be rendered, Graphviz needs to be available for use by the Twb <code>Twb::Util::DotFileRenderer</code> object, which assumes the default Graphviz installation:
'<b><code>C:\tech\graphviz\Graphviz2.38\bin\dot.exe</code></b>'.
<br> '<b><code>dot.exe</code></b>' is the Graphviz program that renders this particular graph type—there are many other types, each with their specific rendering program.
</p>
<p style="margin-bottom:5px;">
If Graphviz is installed into another directory, it can be communicated to the Twb rendered by adding the following line to the code (new line bold):
</p>
<pre style="margin:-1em 0 -1em 0; font-size: 85%">
<code>
renderer = Twb::Util::DotFileRenderer.new
<b>renderer.gvDotLocation=('dot.exe location')</b>
</code>
</pre>
</div>
<hr style="margin-top:1em; margin-bottom:1em;"/>
<fs150p>
To infinity, and beyond.
</fs150p>
<p>
With the Workbook injecting nut cracked, there's no end to the things that can be done. Whatever can be thought up can be created and added to your Workbooks.
</p>
<fs125p>
But wait, there's more.
</fs125p>
<p>
Workbook autodocumenting relies upon Tableau Tools' ability to modify and write Workbooks. This core feature makes it possible to compose functionality to accomplish pretty much anything you could want to do with and to your Workbooks. The door is open, the future beckons, and it going to be a fun ride.
</p>
<fs125p>
About Tableau Tools
</fs125p>
<p>
Tableau Tools is open source software for interrogating and manipulating Tableau Workbooks and other artifacts. It has two main parts as of this writing:
</p>
<ul>
<li>
The TWB Ruby gem, available on Github at: <a href="https://github.com/ChrisGerrard/TWB">https://github.com/ChrisGerrard/TWB</a>, is the core element. It models Workbooks and their major components, allowing for easy access to and control of them. Based on Nokogiri, it provides the opportunity to employ Nokogiri when access and manipulation of deeper components for specific uses is needed.
</i>
<li>
The Tableau Tools project, also available on GitHub: <a href="https://github.com/ChrisGerrard/Tableau-Tools">https://github.com/ChrisGerrard/Tableau-Tools</a> contains tools for Tableau assessment and manipulation, including all manner of useful tools that can be composed into richly functional suites with minimal fuss and bother.
</i>
</ul>
Chris Gerrardhttp://www.blogger.com/profile/01598731155784487000noreply@blogger.com12tag:blogger.com,1999:blog-6248043124025283718.post-10881096496642939922015-05-12T23:37:00.001-04:002015-05-12T23:38:36.788-04:00Need to know your Custom SQL? Use the new Tableau Tool - ExtractCustomSQL.rb<fs125p>
ExtractCustomSQL.rb
</fs125p>
<p>
Will scan your Workbooks and TDS files, searching out, extracting, and recording the Custom SQL they contain.
</p>
<p>
It's available on <a href="https://github.com/ChrisGerrard/Tableau-Tools/blob/master/Ruby/ExtractFieldComments.rb">GitHub here</a>.
</p>
<p>
It's Tableau Tools wiki page is <a href="https://github.com/ChrisGerrard/Tableau-Tools/wiki/ExtractCustomSQL.rb">here</a>, providing the basic information about it.
</p>
<p>
There's not much in the way of visuals to show for this tool. The Tableau Sample Workbooks don't use Custom SQL, and most of the Custom SQL in my usual Tableau archive isn't something that can be released into the wild.
</p>Chris Gerrardhttp://www.blogger.com/profile/01598731155784487000noreply@blogger.com1tag:blogger.com,1999:blog-6248043124025283718.post-30145426511252401112015-05-12T20:14:00.000-04:002015-05-12T20:14:15.171-04:00Tableau Wasted?<fs124p>
It's not development, dagnabbit.
</fs124p>
<p>
I've been working with this client for several weeks. They've bought into Tableau as a really good and valuable thing, and are moving ahead like gangbusters. Tableau Desktop licenses are being distributed like Hallowe'en lollipops. Things are happening, people are excited and engaged. We're building out the Tableau Server environments, putting 9.0.1 into production this weekend.
</p>
<p>
It's a good, robust environment, where people are taking advantage of Tableau to help improve their data sense-making abilities. Everything's good.
</p>
<fs115p>
Or is it?
</fs115p>
<p>
This came in an email today from someone who's been involved with Tableau for a while and recently received a Desktop Tableau license:
</p>
<p style="margin: 0 2em 0 2em;"> "<i>Do you need a different license to do Tableau development? Or is the desktop license what you need?</i>"
</p>
<fs115p style="margin-top:1em;">
Whoa, mule!
</fs115p>
<p>
This is alarming. This little piece of information is highly revealing, it reinforces one of my suspicions; that overall, even though the company is rapidly adopting Tableau as if it was the best and greatest thing to come down the pike (and it is), they really don't have any idea what it's about and are missing the big point, and along with it the opportunity to take advantage of most of Tableau's value.
</p>
<p>
Here's my reply to the email:
</p>
<div style="margin: 0 3em 0 3em;">
<p>
It’s actually more helpful to think of working with Tableau as authoring rather than as development.
</p>
<p>
In traditional software development the “development” activity is at the tail end of the production process, largely divorced from the real analytical work of coming up with the valuable outcome: analyses that reveal and communicate information. Development is the technical implementation of someone else’s ideas.
</p>
<p>
Tableau provides the opportunity for one to work at the creative intersection of cognitive, intellectual, and experiential factors that, when working in harmony, can synthesize the information needs of the person seeking to understand the data and the immediacy of direct data analysis. This mode of Tableau use can eliminate the lags and friction involved when there are multiple people between the person who needs to understand the data and the person who creates the vehicle for delivering the information from which insights are gleaned.
</p>
<p>
It –is– possible to use Tableau as a traditional development tool, one that enables technicians to develop dashboards and other analytics faster than with many other technologies. And this use has a valuable place in the overall data analytical environment, but limiting Tableau to this role, or even employing it predominantly in this way, misses the great bulk of the opportunities Tableau provides to help people understand their data with a minimum of fuss and bother.
</p>
<p>
When someone works with Tableau to explore and understand their data, or in intimate collaboration with the information-seeker, Tableau use becomes a dynamic, creative, cognitive and intellectual exercise, and the creation of analyses that reveal and communicate valuable information and insights is an act of authorship.
</p>
</div>
<p>
Helping people and organizations take advantage of what Tableau offers is a very satisfying way to earn a living. But it's not without its speed bumps and detours. History and experience are very sticky and persistent. Sometimes helping clients recognize that there are new ways of thinking about the world, of the possibilities that exist, the new ways of doing things, can be a bigger challenge than is obvious at the start of the relationship. Fortunately, most people aren't unwilling to get better results quicker, easier, and with less cost, but it can take time and familiarization for the possibility to be recognized.
</p>
<p>
I love my work.
</p>Chris Gerrardhttp://www.blogger.com/profile/01598731155784487000noreply@blogger.com2tag:blogger.com,1999:blog-6248043124025283718.post-131514159075081292015-05-11T23:21:00.000-04:002015-05-12T08:18:28.060-04:00New Tableau Tool - Extract and Record Field Comments<p>
It was a dark and lazy evening. Nothing much happening. Then things got Interesting. Inspiration knocked on the door, and without waiting for Invitation walked right in.
</p>
<p>
Seems that Tableau's been keeping some information to itself: comments. Comments about Fields. Information that could, in the right hands prove very useful, even valuable. Inspiration wanted me to come up with a way to get Tableau to give up its comments, and who can resist Inspiration?
</p>
<p>
The thing is, Tableau doesn't give up its secrets easily. Sure, you can open up a Workbook, then a Worksheet, pick a Data Source, right-click on a Field, navigate down into its menu items and convince it to fess up, spill the beans, give up the goods, sing. But this isn't efficient, and it makes is hard to get the whole story, the straight dope, the full shenanigan. Looking as isolated comments is no way to build a comprehensive integrated overview of the entire metadata landscape.
</p>
<p>
It didn't take much coaxing; I always was a sucker for an insistent Inspiration. So I pulled out my trusty Twb gem and whipped up a brand spanking new Tableau Tool—ExtractFieldComments.rb, custom crafted to scan a set of Workbooks and locate and record the comments for all the fields that have them. Didn't take long, I was eager to get back to finding out what Inspiration had in store for me next.
</p>
<p>
<fs125>Get it here</fs125>
<br />at Tableau Tools on GitHub: <a href="https://github.com/ChrisGerrard/Tableau-Tools/blob/master/Ruby/ExtractFieldComments.rb">https://github.com/ChrisGerrard/Tableau-Tools/blob/master/Ruby/ExtractFieldComments.rb</a>
</p>
<div style="float: left; width: 350px;">
<fs125p>
ExtractFieldComments.rb in action.
</fs125p>
<p>
Here's what it looks like when it's run in a directory containing the Tableau Sample Workbooks from versions 8 and 9:
</p>
<p>
As we see, ExtractFieldComments.rb walks through the Workbooks. While it doing so it's showing the different Data Sources as they're encountered. It's not showing the Fields as they're examined–doing so would produce too much output with too little information–but it's recording all the Fields that have comments, along with those comments into the CSV file <code><fs125>TT-FieldComments.csv</fs125></code>.
</p>
<p>
Being a CSV file, <code><fs110>TT-FieldComments.csv</fs110></code> can easily be opened and analyzed with Tableau. Which is, after all the point.
</p>
</div>
<div style="float: left; margin-left: 20px; width: 400px;">
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6wxqB1qv_vnM3UvFnmXS4oQAupNkLEWkQi-ZQEQbiouBVWyjgoyr-t9OKpX5O6bZYBsUv5Ht5hzjzbRQ3fe71zinsLcpVABAGuXE_II5MJmFN_lPtQZSzAEs63eIuJcP20_mEdgR_dW0/s1600/ExtractFieldComments+Execution.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6wxqB1qv_vnM3UvFnmXS4oQAupNkLEWkQi-ZQEQbiouBVWyjgoyr-t9OKpX5O6bZYBsUv5Ht5hzjzbRQ3fe71zinsLcpVABAGuXE_II5MJmFN_lPtQZSzAEs63eIuJcP20_mEdgR_dW0/s1600/ExtractFieldComments+Execution.png" /></a></div>
</div>
<div class="separator" style="clear: both; text-align: center;"></div>
<fs125p>
Understanding the Comments
</fs125p>
<p>
This Tableau Public published Workbook provides a sampling of the ways in which the comments for your Workbooks can be collected, organized, analyzed, and understood. And all comments want to be understood. One of my mentors was fond of saying: "There aren't any bad comments, just some that are misunderstood."
</p>
<script type='text/javascript' src='https://public.tableau.com/javascripts/api/viz_v1.js'></script><div class='tableauPlaceholder' style='width: 779px; height: 695px;'><noscript><a href='#'><img alt=' ' src='https://public.tableau.com/static/images/Ta/TableauTools-FieldComments/CommentsDistribution/1_rss.png' style='border: none' /></a></noscript><object class='tableauViz' width='779' height='695' style='display:none;'><param name='host_url' value='https%3A%2F%2Fpublic.tableau.com%2F' /> <param name='site_root' value='' /><param name='name' value='TableauTools-FieldComments/CommentsDistribution' /><param name='tabs' value='yes' /><param name='toolbar' value='yes' /><param name='static_image' value='https://public.tableau.com/static/images/Ta/TableauTools-FieldComments/CommentsDistribution/1.png' /> <param name='animate_transition' value='yes' /><param name='display_static_image' value='yes' /><param name='display_spinner' value='yes' /><param name='display_overlay' value='yes' /><param name='display_count' value='yes' /><param name='showVizHome' value='no' /><param name='showTabs' value='y' /><param name='bootstrapWhenNotified' value='true' /></object></div>
<div class="separator" style="clear: both; text-align: center; margin-bottom: 2em;"></div>
<fs125p>
What's next?
</fs125p>
<p>
There are plenty of additional Tableau Tools in the pipeline. Many of them are versions of scripts I've published here reworked to take advantage of the Twb gem. Some of them are brand spanking new. I'd really like to hear any ideas from the community about useful tools. And I'd really like it if anyone else want to take a stab at building your own Tableau Tools — that's what the project's all about.
</p>
Chris Gerrardhttp://www.blogger.com/profile/01598731155784487000noreply@blogger.com1tag:blogger.com,1999:blog-6248043124025283718.post-67989225711218172662015-05-04T23:19:00.000-04:002015-05-04T23:24:10.838-04:00New Tableau Tool – Reset Field Names<p>
This tool was prompted by this Tableau community forum discussion: <a href="http://community.tableau.com/thread/144816">In 8.2 - how do I stop Tableau from renaming all my fields?</a>
</p>
<p>
The person who posted the original discussion was complaining that Tableau was automatically renaming the fields upon first connection to the data, e.g. the field <b><fs110>was_this_visit_callable</fs110></b> was renamed <b><fs110>Was This Visit Callable</fs110></b>.
</p>
<p>
The behavior was introduced in Tableau 8.1 (per Tableau support via Tom W).
</p>
<p>
It's not unreasonable to think that renaming fields from their technical names to user-friendly names has value, particularly in those environments where the database people don't want to, or can't, give human-oriented names to the database fields. But there are circumstances where it's not appropriate and when done forces people to either live with field names they'd prefer not to have, or exert the time, energy, and effort to undo the changes Tableau automagically made.
</p>
<p>
Adjusting field names to make them more human-oriented isn't in itself a bad thing, but Tableau's implementation of the feature is lacking in several important ways, including:
</p>
<ul style="margin: 0 0 0 0;">
<li style="margin: 0 0 0 0;">it happens invisibly—Tableau changes the names without informing the person who connected to the data that it's done so; </li>
<li style="margin: 0 0 0 0;">it's an imposed functionality without an opt-out ability—there's no mechanism whereby the User can choose for this to happen, or not;</li>
<li style="margin: 0 0 0 0;">there's no way to control the adjustments that Tableau makes, which are (at least, and in this order)</li>
<ul style="margin: 0 0 0 0; padding: 0 0 0 2em;">
<li style="margin: 0 0 0 0;">replacing underscores '_' with blanks ' '</li>
<li style="margin: 0 0 0 0;">upper-casing the first letter of each discrete word </li>
</ul>
</ul>
<p>
<fs125> We can't fix Tableau </fs125> but we can fix the names.
</p>
<p>
<fs150>ResetFieldNames.rb </fs150>
<br/>
is a Tableau Tool that will find all of the renamed fields in your workbooks and remove the customized names, leaving the database names as the ones the User sees.
</p>
<fs110p>
About ResetFieldNames.rb:
</fs110p>
<ul>
<li>It's written in Ruby and is available from <a href="https://github.com/ChrisGerrard/Tableau-Tools/blob/master/Ruby/ResetFieldNames.rb">GitHub here</a>. </li>
<li>It uses the Twb Ruby gem, available via RubyGems.</li>
<li>It's surprisingly small, only 34 functional (not comments) lines.
<li>Is run from the command line:
<br/><fs110><b><code>ruby ResetFieldNames.rb</code></b></fs110></li>
<li>Will reset the field names in selected Workbooks:</li>
<ul>
<li>by default – all of the Workbooks in the current directory; </li>
<li>the Workbooks can be identified on the command line, e.g.:
<br/><fs110><b><code>ruby ResetFieldNames.rb 'some*.twb'</code></fs110></b>
<br/>using file patterns to identify groups of fields.
</li>
</ul>
<li>Will not reset Calculated field names; although they have technical and User names, they aren't database fields and their technical names are undecipherable for normal humans. </li>
<li>By default writes the reset fields to a copy of the original Workbook with '.reset' appended to the Workbook's name, e.g.
<br>
<fs110><b><code>Science.twb -> Science.reset.twb</code></b></fs110>
<br/>this can be changed so that the Workbook will be replaced when written, or other text can be provided for appending.
</li>
<li>The reset fields will be recorded in the CSV <fs110><b><code>ResetFields.csv</code></b></fs110> with the fields:
<br/><fs110><b><code>Workbook,Data Connection,Field Name,Field Caption</code></b></fs110>
<br/>making it easy to determine which fields were changed, in which Workbooks.
</li>
</ul>
<p> </p>
<fs125p>
Considerations and potential enhancements.
</fs125p>
<div style="margin-left: 1em">
<p><fs125>Indiscriminate</fs125>
<br/>ResetFieldNames resets all the fields to their database names. It would be really helpful if the fields could be selectively reset, making it easier to get them configured just right. There are many ways to accomplish this, one easiest and most transparent method would be to use an Excel/CSV file as the input identifying the field names to reset.
</p>
</div>
<fs125p>
Considerations and potential enhancements.
</fs125p>
<p>
Please add your comments here, or to <a href="https://github.com/ChrisGerrard/Tableau-Tools/wiki/ResetFieldNames.rb">ResetFieldNames.rb's Tableau Tools wiki page on GitHub</a>
</p>
<hr/>
<p>
I hope you find this Tableau Tool useful and valuable.
</p>Chris Gerrardhttp://www.blogger.com/profile/01598731155784487000noreply@blogger.com2tag:blogger.com,1999:blog-6248043124025283718.post-24957221644610554852015-04-27T21:18:00.000-04:002015-04-27T21:18:43.505-04:00Dear Mr. or Ms. Recruiter<p>
I get calls all the time from recruiters wanting to know if I'm interested in this or that Tableau job. Most often it involves the opportunity to go and be a Tableau developer somewhere. It's even possible to triangulate which company is moving forward with their Tableau efforts from the three very similar calls I get within a 24 hour period. They go like this:
</p>
<div style="margin-left:2em;">
<p>
Ring, Ring<br/><i>me</i>: Hello
</p>
<p><i>them</i>: Hello, I'd like to speak to Chris, please.</p>
<p><i>me</i>: That's me.</p>
<p><i>them</i>: Hello, Chris. My name is Lotso Letters, how are you today.</p>
<p><i>me</i>: I've very well, how are your?
<p><i>them</i>: I'm very well Chris thankyouforasking.
<Br/>Chris, I'm calling because there is an opportunity for a Tableau developer and can I submit you for the position and how little will you work for?</p>
<p><i>me</i>: To tell the truth, I'm probably not interested, but if it's a truly exceptional opportunity I may be.
<Br/>What are the particulars?
</p>
<p><i>them</i>: SDLC, process, development, build dashboards, support Tableau Server, etc.</p>
<p><i>them</i>: How much is your rate?</p>
<p><i>me</i>: My rate is $X<Br/>...<Br/>...
</p>
<p><i>them</i>: Let me talk to my manager and see if the client is willing to pay that.
</p>
</div>
<p>
At which point the conversation is essentially dead.
</p>
<p>
I can appreciate that people are trying to make money off of the commoditization of my profession, and it's been coming for a long time, but it still stings that Tableau is being misused to the degree that it is.
</p>
<p>
So when I received another missive from someone wanting to know if I was interested in a Tableau developer position, I wrote the following.
</p>
<div style="margin-left:2em;">
Hello {name}. Thanks for your note, but I'm not interested in being a developer of any kind.
</p>
<p>
I've been doing business data analysis for a long, long time, and I'm firmly convinced that the idea that satisfying business needs for information from data is an activity that ends up with someone developing something someone else thought up in response to someone else's thoughts about what yet another person needs, in the traditional SDLC paradigm, is just flat wrong.
</p>
<p>
My career started with establishing direct intimate relationships with business people, using 4GLs to create the reports they needed. Without developers (COBOL programmers in those days). I was lucky enough to get to work for the leading 4GL software vendor, for managers who knew that business consulting is more important than technical contracting. We got to go to work every single day and deliver the information people needed without layers and layers of people and technology getting in the way.
</p>
<p>
That world faded into obscurity with the advent of Big BI, where building massive data cathedrals became the point. But it's coming back, and Tableau is leading way. In Fact, a very good argument can be made that the good world is coming back because of Tableau's leadership in demonstrating that it's possible.
</p>
<p>
As a Tableau consulting practice manager, and an avid and enthusiastic Tableau devotee since 2006, I get to go to work and help my clients move away from the analysis/design/develop/test/deliver SDLC-based paradigm that at best delivers a very thin slice of the universe of possibilities, and generally does more harm than good. (but it does line the pockets of the traditional Big BI contracting firms who are getting better at "re-purposing" traditional BI people into their clients' organizations as Tableau developers.
</p>
<p>
Although the world is moving in the right directing of bridging, even eliminating the gap between people and the data they need to understand, there are very powerful, very conservative forces, that are trying to maintain the bad old ways and keep as many thumbs in the pie as possible. To the degree they succeed in impeding, co-opting, blunting, or otherwise diminishing the possibilities that Tableau (and its cousins, including those not yet born) brings, they'll make more money even as they fail deliver nearly the value the organization should be receiving.
</p>
<p>
If you're clients are interested in truly taking advantage of the full spectrum of opportunities and possibilities Tableau offers I'd be happy to talk to them and see how I can help. Otherwise, thanks again for your note, but I'm not interested in helping companies do the wrong thing.
</p>
</div>
<p>
Wonder if they'll keep calling.
</p>Chris Gerrardhttp://www.blogger.com/profile/01598731155784487000noreply@blogger.com1tag:blogger.com,1999:blog-6248043124025283718.post-75388991974958479392015-04-26T11:53:00.001-04:002015-04-26T15:39:50.441-04:00Fast, Easy, Free Workbook Documentation and Management with the TWB Gem<p>
<fs150>
Finally.
</fs150>
<br />
After years of asking Tableau to implement mechanisms for documenting Workbooks <i>in</i> the Workbooks, and for automated ways to manage Workbook and their contents the wait is over.
</p>
<p><fs125>We have the technology</fs125>
<br />
to build apps that can access, interrogate, and manipulate Tableau Workbooks in ways that haven't previously been possible.
And the technology is free, as in speech and beer.
</p>
<fs125p style="margin-bottom:0px;">
Up until now
</fs125p>
<div style="float: left; width: 47%; margin-top:0px;">
<!-- LEFT -->
<p style="margin-top:0px;">
there have been ways to document your Workbooks, including:
</p>
<ul style="margin: 0 0 0 0; padding: 0 0 0 2em;">
<li style="margin: 0 0 0 0; padding: 0 0 0 8px;"> my <a href="http://www.betterbi.biz/TWIS.html">TWIS – the Tableau Workbook Inventory System</a> (free); </li>
<li style="margin: 0 0 0 0; padding: 0 0 0 8px;"> Andy Cotgreave's <a href="http://community.tableau.com/thread/118450">The Workbook Auditor</a> (also free)</li>
<li style="margin: 0 0 0 0; padding: 0 0 0 8px;"> Ruby scripts I've published here (still free)</li>
<li style="margin: 0 0 0 0; padding: 0 0 0 8px;"> Interwork's tools ($$$)</li>
</ul>
</div>
<div style="float: left; margin-left: 10px; width: 47%; margin-top:0px;">
<!-- RIGHT -->
<p style="margin-top:0px;">
and to manage them, e.g.
</p>
<ul style="margin: 0 0 0 0; padding: 0 0 0 2em;">
<li style="margin: 0 0 0 0; padding: 0 0 0 8px;"> Ruby scripts I've published here (free)</li>
<li style="margin: 0 0 0 0; padding: 0 0 0 8px;"> Ruby scripts I've created for clients (unavailable to the public)</li>
<li style="margin: 0 0 0 0; padding: 0 0 0 8px;"> Interwork's tools ($$$)</li>
<li style="margin: 0 0 0 0; padding: 0 0 0 8px;"> others (?)</li>
</ul>
</div>
<div class="separator" style="clear: both; text-align: center;"></div>
<p>
TWIS and The Workbook Auditor have been around for a number of years, and provide useful and valuable information about the workbooks they're asked to look at. Andy's Auditor is very polished, with good coverage, and works very well for most people.
TWIS is more of working tool that goes pretty deep, uncovering lots of rich detail, e.g. field calculations, and still works well but it's a monolithic Java app. I've taken a different tack, which has led to this post and am not planning on maintaining TWIS.
</p>
<p>
I'm a bit familiar with Interwork's tools, but haven't had much use for them as I build apps that cover my needs, and can quickly create new ones on demand. And their tools are expensive.
</p>
<p>
<fs110>The existing solutions are deficient</fs110>
<br />
for a number of reasons.
</p>
<div style="margin: 0 0 1em 2em;">
<p>
There's a mismatch between the nature of the information in Workbooks and Tableau's structural model of analyzable data.
</p>
<ul style="margin: 0 0 0 0; padding: 0 0 0 5em;">
<li style="margin: 0 0 0 0; padding: 0 0 0 8px;"> Workbooks are complex multi-segmented, deep XML files with cross-links between the branches, with many individual paths, most of which can be only partially populated.</li>
<li style="margin: 0 0 0 0; padding: 0 0 0 8px;"> Tableau is limited to accessing flat, two-dimensional tabular data. It has no concept of higher-level structures, even something as simple as a two-level master-detail hierarchy, <a href="http://tableaufriction.blogspot.ca/2015/02/on-analysis-of-post-relational-data-1.html">as is discussed here</a>. Further, Tableau shows no sign of recognizing the existence of these structures, or of the value of enabling their transparent analysis. Sadly, we had tools that could do this thirty years ago.</li>
</ul>
<p>
In building TWIS it became clear that any single app that was able to capture the multitude of two-dimensional slices through Tableau workbooks becomes very, very complex very quickly. Building one app to pull all of the interesting data about workbooks out of the them became the chase of a rapidly receding horizon, a pursuit one person, at least this person, couldn't keep up in the long run.
</p>
<p> On top of this, the analyses and documentation generated by these approaches is external to the Tableau Workbooks themselves. As a result, there's a lot of friction in using them — one needs to run the tool and examine the documentation separately from Tableau. This is a suprisingly large hurdle to helping people understand their individual workbooks, which is what most people are concerned with.</li>
</p>
</div>
<hr/>
<fs150p style="margin-top:1em;">
A better way.
</fs150p>
<p>
Several years ago I began writing simple, straightforward Ruby programs to access, analyze, and manipulate Workbooks according to the specific needs at that time. These were rooted in the experience gained from creating TWIS, proved to be good solutions for those cases TWIS didn't cover. Some of them I've published here, many others I haven't.
</p>
<fs150p>
The TWB Ruby gem.
</fs150p>
<p>
After writing lots of these Ruby apps, and writing the same boilerplate code multiple times I decided to create a library that models Workbooks and their components. Being Ruby, it was natural to create this as a Ruby gem, and so Twb, the gem, was born. My hope and ambition is that the Twb gem can and will be used by others to create apps to access, interrogate, and manipulate Workbooks.
</p>
<p>
<fs110>Twb on RubyGems.org</fs110> – ready for use.
<br />
Twb is freely available from <a href="https://rubygems.org/gems/twb">RubyGems.org</a>. Just like any other Ruby gem, it's easy to install and start using. Assuming that you have Ruby and RubyGems installed on your computer, installing Twb is this simple (in Windows):
</p>
<div class="separator" style="clear: both; text-align: center;"></div>
<div style="float: left; width: 450px;">
<!-- LEFT -->
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjd_rd4gHmSkHjt47XYC4cg0yZDTgrLf64AdLUDdjFjvsDTnW6CBFPIoQFyHJqpIjnZGujzZQ5fraaMYATjyKvGCLj6PQ_WFp3brFWPGLwi4Y6aSVyEhui7h9K19wD8tue6JriBlgVuJlM/s1600/gem+install+twb.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjd_rd4gHmSkHjt47XYC4cg0yZDTgrLf64AdLUDdjFjvsDTnW6CBFPIoQFyHJqpIjnZGujzZQ5fraaMYATjyKvGCLj6PQ_WFp3brFWPGLwi4Y6aSVyEhui7h9K19wD8tue6JriBlgVuJlM/s1600/gem+install+twb.png" /></a></div>
</div>
<div style="float: left; margin-left: 20px; width: 300px;">
<!-- RIGHT -->
<p>
That's about as simple as can be. One of the attractions of using Ruby is its emphasis on making things simple, easy and straightforward, with a minimum of fuss and bother.
</div>
<div class="separator" style="clear: both; text-align: center;"></div>
<hr/>
<fs150p>
Twb in use.
</fs150p>
<p>
Once installed, Twb can be used to make writing useful and valuable apps simple and straightforward. Or at least as simple as what you're trying to do can be—the things one wishes to know about and do with Workbooks are as complex as the information models of the Workbook elements one's interested in, and what one wants to do with them. Twb's ambition is to make these apps easy to create and transparent to use.
</p>
<div style="padding: 1em 0 1em 0;">
<hr/>
</div>
<a name="twbversions"> </a>
<fs150p>
What Versions are your Workbooks?
</fs150p>
<p>
At the simple end of the spectrum is a simple app that scans a set of Workbooks and reports the Version and Build information for each. Version and Build are related to the Tableau version last used to save the Workbook. Build is the technical release number that is also available in Tableau's "<u>H</u>elp | <u>A</u>bout" menu option. Version is loosely but not strictly tied to the Tableau version – 8.2, 8.3, 9.0, etc. – I've not puzzled out the real relationship, largely because I've not had the real need to.
</p>
<fs125p>
WorkbookVersion.rb
</fs125p>
<div style="float: left; width: 465px;">
<p>
This Ruby script is available online from Github <a href="https://github.com/ChrisGerrard/Tableau-Tools/blob/master/Ruby/WorkbookVersion.rb">here</a>.
</p>
<hr/>
<pre style="font-size:80%;">
# Copyright (C) 2014, 2015 Chris Gerrard
# (GNU General Public License v3 notice here)
require 'twb'
puts "Identifying the Version and Build of these Workbooks:"
$csv = File.open("WorkbookVersion.csv", "w")
$csv << "Workbook,Version,Build\n"
path = if ARGV.empty? then '*.twb' else ARGV[0] end
Dir.glob(path) do |fname|
twb = Twb::Workbook.new(fname)
puts sprintf(" %-20s %5s %s", twb.name, twb.version, twb.build)
$csv.puts "#{twb.name},#{twb.version},#{twb.build}"
end
</pre>
<hr/>
<p>
When run, the script scans for Workbooks and upon finding some does two things with each:
</p>
<ul>
<li>Prints the Workbook's Name, Version, and Build to the console.</li>
<li>Creates a CSV record in the file "WorkbookVersion.csv" containing the Name, Version, and Build.</li>
</ul>
<p>
This is accomplished with only 10 lines of Ruby code, leveraging Twb to handle the heavy Workbook-parsing lifting.
</p>
</div>
<div style="float: left; margin-left: 20px; width: 400px;">
<p>
Here's the script in use, in a directory containing the Sample Workbooks from Tableau versions 8.3 and 9.0:
</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbwcV0rcrvK-rBhNFGVcBiVXYb0bsc4IpMNXpgaQzYHWKmVVuVPRkKnFZ17PB9OUiwwHIOqx6NyQwLKe0VooR8Oq0E-lCxIW2aYK25c5z4vkGKrBzWTfN9eGMsGOZA6mAHPwicg7o97rk/s1600/WorkbookVersionRun.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbwcV0rcrvK-rBhNFGVcBiVXYb0bsc4IpMNXpgaQzYHWKmVVuVPRkKnFZ17PB9OUiwwHIOqx6NyQwLKe0VooR8Oq0E-lCxIW2aYK25c5z4vkGKrBzWTfN9eGMsGOZA6mAHPwicg7o97rk/s1600/WorkbookVersionRun.png" /></a></div>
</div>
<div class="separator" style="clear: both; text-align: center;"></div>
<div style="float: left; width: 465px;">
<p>
This Tableau Public Dashboard shows a viz of the CSV file generated above.
</p>
<p>
It's an example of the sort of analysis that can be achieved with TWIS, The Workbook Auditor, etc.
</p>
<p>
The Twb gem doesn't really do anything new here, but it does make doing exactly the thing you need done easy.
</p>
<p>
<code>WorkbookVersion.rb</code> can be instructed to scan specific Workbooks by passing the file name pattern on the command line, e.g.:
</p>
<ul>
<li><b>WorkbookVersion.rb 1.twb</b><br/>— will only scan the single workbook <b>Science.twb</b></li>
<li><b>WorkbookVersion.rb '**/*.twb'</b><br/>— will scan all of the Workbooks in the current directory, and in all subdirectories.</li>
</ul>
<p>
Running <b>WorkbookVersion.rb</b> in a directory containing all of your Workbooks makes it very easy to see which Tableau versions created how many of them, and which ones, by building a couple of very simple vizzes.
</p>
</div>
<div style="float: left; margin-left: 20px; width: 400px;">
<!-- RIGHT -->
<script type='text/javascript' src='https://public.tableau.com/javascripts/api/viz_v1.js'></script><div class='tableauPlaceholder' style='width: 369px; height: 354px;'><noscript><a href='#'><img alt='Workbook Versions ' src='https://public.tableau.com/static/images/Wo/WorkbookVersions-viaTwbRubygem/WorkbookVersions/1_rss.png' style='border: none' /></a></noscript><object class='tableauViz' width='369' height='354' style='display:none;'><param name='host_url' value='https%3A%2F%2Fpublic.tableau.com%2F' /> <param name='site_root' value='' /><param name='name' value='WorkbookVersions-viaTwbRubygem/WorkbookVersions' /><param name='tabs' value='no' /><param name='toolbar' value='no' /><param name='static_image' value='https://public.tableau.com/static/images/Wo/WorkbookVersions-viaTwbRubygem/WorkbookVersions/1.png' /> <param name='animate_transition' value='yes' /><param name='display_static_image' value='yes' /><param name='display_spinner' value='yes' /><param name='display_overlay' value='yes' /><param name='display_count' value='yes' /><param name='showVizHome' value='no' /><param name='showTabs' value='y' /><param name='bootstrapWhenNotified' value='true' /></object></div></div>
<div class="separator" style="clear: both; text-align: center;"></div>
<div style="padding: 1em 0 1em 0;">
<hr/>
</div>
<fs150p>
What's next?
</fs150p>
<fs125p>
We're just getting started.
</fs125p>
<p>
I've already used Twb to create a wide variety of apps, which I'll be publishing them here, and their source code to Github, in future posts. Some of them are brand new, some of them are existing apps re-implemented to take advantage of Twb. I hope they're all useful.
</p>
<div style="padding: 1em 0 1em 0;">
<hr/>
</div>
<fs150p>
The Grand Ambition.
</fs150p>
<p>
My intention is to create a vibrant ecosystem of tools for managing Tableau workbooks, and hope that it's a fertile ground for the nurturing a community that uses and advances the tools.
</p>
<p>
Twb and the Tableau Tools will be released as Open Source projects, as soon as I can get the ducks in a row.
</p>
<fs150p>
Everybody's welcome.
</fs150p>
<p>
No matter what your level of experience with Tableau, Ruby, workbook XML munging, open source projects, etc., the Twb gem and related apps are available for your use, and hopefully contribution. Please feel free to join in.
</p>
<p>
Let the fun begin.
</p>
Chris Gerrardhttp://www.blogger.com/profile/01598731155784487000noreply@blogger.com2tag:blogger.com,1999:blog-6248043124025283718.post-16280660392863733842015-03-31T23:53:00.002-04:002015-03-31T23:53:54.851-04:00Tableau and the Golden Tool Rule<fs150>
The Golden Tool Rule
</fs150>
<p>
A golden tool is one that makes doing something useful simple, straightforward, and easy.
</p>
<p>
Golden tools are delights to use. Wielding one establishes a connection with the material one's working with, whether it's a piece of wood being shaped for a custom cabinet, vegetables being diced for the stew pot, or data that's being tossed and turned, flipped, filtered and pulled together into representations that make sense.
</p>
<p>
Tableau is, at its core, a golden tool. It makes the basic data analytical operations simple, straightforward, and easy. Connecting to data is as simple as dragging and dropping a data-containing file onto or into it. Want to see what's in this dimension? Double-click on it. Interested in the sum of Profit? Double-click on it and Tableau shows it to you in the most effective visual form for the current context. Clicking, double-clicking, and dragging and dropping the data fields (and other objects) causes wonderful things to happen — Tableau understands these actions, this language of visual data analysis, and knows how to present the things you've asked it to in ways that make sense.
</p>
<fs125>
Original gold.
</fs125>
<p>
Years ago I spent almost a decade working for the company that invented the business data analytical software product category. With FOCUS–our company's product, it was possible to express the basic data analytical operations in a clear, concise, human-oriented language that anyone could pick up and get started with. FOCUS was a golden tool, in its core and time, and its ability to help forge a close connection with their data made many, many people much happier, and vastly more productive than they'd been before.
</p>
<fs125>
In their bones...
</fs125>
<p>
Tableau and FOCUS are strongly analogous. Each was a quantum step forward from the other tools of its time, making the basic data analytical operations simple, straightforward, and easy. Tableau did this by providing a visual syntax and grammar oriented around organizing data elements as first order user interface objects that represent the data and the analytical operations. FOCUS accomplished this by providing a simple language that used English words to implement the same structure and operations.
</p>
<p>
To illustrate the heart of Tableau and FOCUS, we'll assume that Snow White's Dwarf friends have been keeping track of the number of gems they've mined, and that each of the seven works in a Department.
</p>
<p>
We want to know a simple, basic thing: how many gems in total were mined by the Dwarves working in each Department?
</p>
<!-- TWO COLUMNS START HERE -- NOTE: best when the total width, LEFT & RIGHT is 860px -->
<div style="float: left; width: 575px;"> <!-- LEFT -->
<!-- LEFT CONTENT HERE -->
<fs125>
Finding the sum of Gems mined per Department with Tableau,
</fs125>
</div>
<div style="float: left; width: 315px; margin-left: 25px;">
<fs125>
and with FOCUS.
</fs125>
</div>
<div class="separator" style="clear: both; text-align: center; margin-top:15px;"></div>
<div style="float: left; width: 575px; margin-right: 12px; border-right: 1px solid grey;"> <!-- LEFT -->
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIyCOJkaXjrjjjAekTuiWQ5VSHWJdTS1N4hj6wGHmNat4Q6uDhElMPiBl6Zt3ZIEutmieUi3JrBE1Hy4ZU_ebCroodK4HlE-3pAdmPRwmxkUnfVSnCvC6DpEWHG49BbZjuGXzbvGoBC2s/s1600/Tableau+-+Sum+Gems+by+Dept.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIyCOJkaXjrjjjAekTuiWQ5VSHWJdTS1N4hj6wGHmNat4Q6uDhElMPiBl6Zt3ZIEutmieUi3JrBE1Hy4ZU_ebCroodK4HlE-3pAdmPRwmxkUnfVSnCvC6DpEWHG49BbZjuGXzbvGoBC2s/s1600/Tableau+-+Sum+Gems+by+Dept.png" /></a>
</div>
<p>
Creating the analytic above is a simple two-action process:
</p>
<ol>
<li>Move "Dept" to "Rows"<Br/>
by dragging it as shown, double-clicking it in the data window, or dragging it to the left-side zone of an empty sheet.
</li>
<li>Add "Gems" to the viz<br/>
by double-clicking it in the data window, dragging it to the center zone of an empty sheet, or dragging it to the Text button on the Marks car.
</li>
</ol>
<fs125>
Order of Operations Matters.
</fs125>
<p>
One of the things that confuses people new to Tableau is that it doing things in a different order gets different results.
</p>
<p>
For example, the illustration above shows Dept being put on the Rows shelf first, followed by Gems being added to the viz.
If the order is changed, with Gems first and Dept second, the visualization will be different. It's left to you, dear reader, to give it a go for yourself and see what happens – this little, seemingly innocuous exercise reveals one of the subtle, deep mysteries of Tableau. Understanding it unlocks many Tableau doors.
</p>
</div>
<div style="float: left; width: 315px; margin-left: 25px;">
<p>
This bit of FOCUS:
</p>
<pre style="margin-left: 2em; border: 1px solid grey;">
TABLE FILE Dwarves
SUM Gems
BY Dept
END
</pre>
<p>
provided at the interactive prompt, or run from a file, creates this report:
</p>
<pre style="margin-left: 2em; border: 1px solid grey;">
Dept Gems
======= ====
Medical 34
Mgmt 35
Ops 518
</pre>
<p>
Almost seems too simple, doesn't it?
</p>
<p>
Eight simple, straightforward words to generate the analysis. Even better, the two analytical statements need not be in any particular order:
</p>
<pre style="margin-left: 2em; border: 1px solid grey;">
TABLE FILE Dwarves
BY Dept
SUM Gems
END
</pre>
<p>
Swapping the order of the BY and SUM statements makes no difference.
</p>
<p>
FOCUS was in this sense non-procedural, making it even easier to get results fast because people didn't need to know what order to put them in.
</p>
</div>
<div class="separator" style="clear: both; text-align: center;"></div>
<hr/>
<fs125>
<Br/>
The first gold rush.
</fs125>
<p>
It's very difficult for those who weren't there to understand how golden FOCUS was in its day.
</p>
<p>
Introduced in 1975, FOCUS was astonishing. Instead of waiting for their COBOL developers to program and deliver reports people could now use a simple English language to get reports from their business data immediately. As a FOCUS consultant I was most often able meet with my clients in the morning and have reports ready for review that afternoon.
</p>
<p>
FOCUS was the most successful 4GL, the premier product for conducting business data analysis, used by organizations across the globe to help get information out of data into the minds of the people who needed it.
</p>
<p>
The ability to access and analyze information with minimal intervention by or support from an organization's data processing group (IT's predecessor) changed the world. Business people could make decisions based on their data rather just relying on intuition. FOCUS was used across industries and in the public sector. Life was good. As a FOCUS consultant, and a product manager, with Information Builders, Inc. (IBI)–FOCUS' vendor–I was able to help make a material difference in our clients' use of their data. In the mid-1980s IBI was one of the world's largest independent software companies, with revenues in the hundreds of millions of dollars, many. many loyal customers, and legions of devoted FOCUS users.
</p>
<fs125>
And then things changed.
</fs125>
<p>
FOCUS was conceived in the mainframe world. It thrived in that world, where CRTs and line printers were the human-computer interface, where hierarchical databases were common. Its beauty and grace were of that world. But the world of business computing changed, evolved into a world where FOCUS' mainframe roots were out of step with the emerging models of how people interacted with their computers.
</p>
<p>
Different models of human-computer interaction emerged, replacing the terminal, character-based, block mode mainframe interaction where applications drove the conversation. Minicomputers introduced per-character interaction, allowing finer granularity; every keystroke the user typed could be examined as it was typed. Micro and personal computers took this further, inverting the Human-Computer relationship, allowing for different application models. Then GUIs showed up, providing entire new possibility horizons for creating software tools that support the person who's trying to accomplish their work.
</p>
<p>
The world was full of promise from the mid-80s into the 90s. There was a vibrant environment of innovation within which clever people were trying to figure out how best to take advantage of the new ways of computing to build the next generation of golden tools.
GUI PC applications were becoming well established. Business applications were evolving at a rapid pace, notably word processors and spreadsheets. At IBI we were working across all the platforms – PCs, Unix, VAX, even mainframes, on technologies and designs to create the next-generation tools that would surface the simplicity, elegance, and expressiveness of FOCUS' data analysis language using the modern Human-Computer interfaces. During this period I worked first in the Micro Product division, then in the Unix division, and with others across the divisions to create great new tools. In the Unix division we created an object oriented programming language and platform and used it build a new GUI-based, network-aware FOCUS that surfaced the basic data analytical operations as top-level UI elements. Other divisions in IBI were working on similar projects, each group creating new and wonderful stuff. At the same time other companies were working on and releasing post-mainframe reporting software products.
</P>
</p>
In the early 90s the decision was made to shut down the different divisions' projects and adopt the Microsoft Windows-based approach that eventually became WebFOCUS. It was sad. An entire generation of people left the company.
</p>
<p>
Meanwhile, things were happening, forces were marshaling, that led to the near-extinction of simple, straightforward data analysis as a viable ambition.
</p>
<fs125>
The business data analysis dark age descended.
</fs125>
<p>
For many years things were bad. The environments had changed—the reasons for it are many, and beyond the scope of this post. We, who prided ourselves on our ability to access and understand data, and to help our clients and customers do the same, had to watch helplessly as the giants ran amok, vying with one another to create ever-larger and more monstrous mountains, continents even, of data with little regard for the need to actually understand it at all scales. Consolidation before analysis in the pursuit of the mythical single version of the truth as the fulcrum about which all business data analysis pivoted became the unquestioned paradigm. Billions of dollars were spent and wasted with little to show for it. Life wasn't good. Unless you were profiting from Big BI platform sales and implementation consulting dollars.
</p>
<fs125>
And then, an opportunity.
</fs125>
<p>
In 2006 I was working for a major city government building web applications (hey, one needs to eat) when I was asked to review the ongoing citywide data warehouse project. It had been going on for a long time, eaten through tons 'o money, and had exactly two users, both of who were part of the group creating it.
</p>
<p>
Seemed simple enough: all I needed to do was understand the data as it entered and moved through the system. there were many data feeds being slurped up into staging databases; there were ODSs, ETL processes inputs and output, an EDW, and a Big BI platform, with some ancillary bits. And nobody knew, or could provide, any real transparency into what was going on.
It was an almost perfect situation. All I needed was a way to access and understand the data. All the data, wherever it lived.
</p>
<p>
But how? I needed a good data analysis tool, one that could do the job with a minimum of fuss and bother, that would get let me do my work and stay out of the way.
I wanted–needed–a tool with FOCUS' analytical simplicity and elegance, but in a modern form, ideally an interactive UI with direct-action support for basic data analytical operations.
</p>
<p>
So I started surveying the landscape, looking for something that would fill the bill.
I tried out all the tools I could find. The most promising of the bunch were, in alphabetic order: Advizor, QlikView, Spotfire, and Tableau. They all had their strengths; each of them was an excellent tool within its design space. But which of them were any of them created for the purpose I needed – making it as simple as possible to access and analyze the data I needed to understand? Anything extraneous to this, any extra 'benefits', were of no interest to me, and in fact violated the GTPD (Golden Tool Primary Directive): anything that doesn't provide direct benefit to the specific, immediate need is not only of no value, it's a drag and detriment to getting the real job done. (and it's amazing how may BI technology companies have failed to, and continue to, recognize this simple truth - but that's a topic for other times)
</p>
<fs125>
Eureka! A nugget!
</fs125>
<p>
Only one of the tools was designed specifically to make data analysis a simple, straightforward non-technical activity that was approachable, welcoming, and truly easy to use. Tableau was far and away the best tool for the job I needed to do. And in this space it's still the best tool that's come to market.
</p>
<p>
I love Tableau for the bright light it brought to a dim, drab world. Right out of the box I could see and understand data. What's in this field? How many records are there? How much of this is in here? What's the relationship between this and that? How many permits of each kind of permit have been issued? (it was a city's operational data, remember) It was a great, great, thing then, and for these purposes it remains a great product.
</p>
<fs125>The second gold rush.</fs125>
<p>
For the first few years Tableau was my personal tool, one I used in my work, for my own purposes. For a time I had a steady stream of work rescuing traditional Big BI projects that had gone off the rails by using Tableau to help bring clarity to the entire endeavor. Instead of relying on technical people using SQL query tools to try to make sense out of tables of data Tableau let us see the data as the business information it really was, improving the quality and velocity of the work.
</p>
<p>
It took a few years for it to catch on—people are naturally conservative, particularly those with a vested interest who feel threatened. But as Tableau became used by more and more people it helped them individually, and it demonstrated that there really is a market, a demand, for highly effective tools that let people understand that data to matters to them wit a minimum of fuss.
</p>
<p>
Life was good again.
</p>
<p>
Tableau, and the people who created, supported, championed, and used it to good effect richly deserves the credit for the good done. Now the door is open, the horizons are expanded so far they're almost out of sight.
</p>
<fs125>But...</fs125>
<p>
Tableau is a golden nugget, a shiny, impressive nugget. Which, to stretch the metaphor, was invaluable when there wasn't any other gold to be had.
</p>
<p>
But it's only a nugget.
</p>
<p style="margin-bottom:0px;">
I've mentioned Tableau's core. This is the area where Tableau got it right: providing fundamentally direct and easy to use mechanisms implementing the basic data analytical operations. In this space there's not much room between how good Tableau is and how good it's possible to be. So, what are these basic operations? Simple, they are the things one does to organize, sort, filter, and aggregate data so that it can be observed and assessed in order to understand it. They are, briefly:
</p>
<ul style="margin: 0 0 0 0">
<li style="margin: 0 0 0 0">Choosing which fields to see – e.g. Profit, Region, and Department</li>
<li style="margin: 0 0 0 0">Organizing the fields – e.g. Profit for the individual Departments by Region</li>
<li style="margin: 0 0 0 0">Filtering, choosing which data to see, – e.g. only the West and South Regions; only records with Profit > 12</li>
<li style="margin: 0 0 0 0">Deciding which aggregation to use – Tableau assumes SUM() as the default</li>
</ul>
<p>
In this, the basic data analytical space, that formed the great majority of the product when it was introduced, and when I started using it, Tableau is golden; it makes doing these things about as simple and easy as it can be, and on top of that it provides high quality visualizations of the aggregated values in context, both in the type and rendering. Gold doesn't tarnish, and Tableau's luster here hasn't faded.
</p>
<p>
But this space isn't the whole of it. There's a lot more to the totality of data analysis than the initial data analytical space, and beyond the initial space there are many places and ways in which Tableau isn't as good as it could be. This blog contains some of the areas where Tableau falls short, there are many, many more that I encounter every day. Some of them are just annoying, like the horrible formatting system. Some are application architecture aspects, like the layout and organization of the workspace where the data, dashboard, and formatting panes all share the same space, making for a lot time- and energy-wasting opening and closing. Others are structural, like the leveraging of reference lines to implement pseudo-bullet graphs, which are crude and cartoonish compared to what they could be. The list is very long, and Tableau doesn't seem to be spending any energy fixing what should be better.
</p>
<p>
Viewed broadly, Tableau is a golden nugget embedded in a matrix of cruft and bolted-on, awkward, barnacled machinery that gets much more in one's way than out of it. Worse yet for being largely undocumented—but for the immensely impressive work of people in the Tableau community who've spend vast amounts of time chipping away at it we'd be largely lost in an impenetrable forest.
</p>
<fs125p>He's not handsome, but he sure can hunt.</fs125p>
<p>
You may at this point be thinking: why on earth is this guy still using Tableau, if he's so unhappy with it?
</p>
<p>
I'm glad you asked. It's because, as much as I wish Tableau was better in all the ways I know it could and should be, it's still the best tool ever invented for basic data analysis. Bar none.
</p>
<p>
But for how long? Tableau's opened up the door and shown the world that data isn't just something that lives in corporate closets, mines, or dungeons. People are ready for and receptive to the idea that they should be able to access and analyze their information easily and simply. The horizons are expanding and the world is primed.
</p>
<fs150p>Prospecting.</fs150p>
<p>
Now that there's a bona fide demand for simple, easy, straightforward data analysis, the question is:
</p>
<fs125 style="margin-left:10em;">Where will the next golden tool come from?</fs125>
<p>
Just as Tableau appeared and ushered in a new age, there will be a tool that embraces the principles of easy, simple, straightforward use leading directly to extremely high quality analytical outcomes. One that employs these principles in the basic data analytical space, but expands the operational sphere out and beyond Tableau's ease of use horizons. This new tool will be the next quantum leap forward in data analysis. I'm looking forward to it.
</p>
<p>
The blueprints for the next golden tool, identifying what it needs to be and do, and how, are already out there, if one knows where and how to look. The only real question is: who's going to build it?
</p>
<p style="margin-bottom:15px;">
</p>
Chris Gerrardhttp://www.blogger.com/profile/01598731155784487000noreply@blogger.com4tag:blogger.com,1999:blog-6248043124025283718.post-25045982347324826692015-03-31T03:02:00.000-04:002015-03-31T13:09:09.772-04:00Danger! Don't delete that data source!<p>
Here's a common occurrence (at least for me): I'm working merrily along, having a terrific time with my data, creating all sort of good and valuable stuff. The information and insights are pouring out of Tableau. It's an almost zen state where I'm in the flow and things are humming along with the celestial choir. All is good.
</p>
<p>
After a while I notice that there's a lot of stuff in my workbook that doesn't really need to be there. Experiments, trials, that sort of thing. I've connected to a few fair data sets along the way, some of which aren't really necessary. Some Tableau gardening it in order.
</p>
<div class="separator" style="clear: both; text-align: center; margin-top:3em;"></div>
<div style="float: left; width: 350px;">
<p>
Among the pruning and trimming there's a data connection that's no longer needed, for whatever reason.
So I, thinking it's occupying space that could use freeing up, go ahead and ask Tableau to close it.
</p>
<fs125>
Close it, Dan-o.
</fs125>
<p style="margin-top:3em;">
However, unbeknownst to me the data connection is in use by one or more worksheets, so closing it would leave it or them with nothing to display.
This would not be good.
</p>
</div>
<div style="float: left; margin-left: 20px; width: 460px;">
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7XpXMTNXLerI5_huOJ47N3UnRVXDkyg1M2tJGlyumzmP_JSdtHrXl8w8tFxjqgUNKwtAM_jhUxSW7D6oeZNVd6SdLwozNesQ8WTkT93COwYKsF7ZiuqQp_kYHvm62-HAdaN29Swm-GPQ/s1600/Close+Data+Connection.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7XpXMTNXLerI5_huOJ47N3UnRVXDkyg1M2tJGlyumzmP_JSdtHrXl8w8tFxjqgUNKwtAM_jhUxSW7D6oeZNVd6SdLwozNesQ8WTkT93COwYKsF7ZiuqQp_kYHvm62-HAdaN29Swm-GPQ/s1600/Close+Data+Connection.png" /></a></div>
</div>
<div class="separator" style="clear: both; text-align: center; margin-bottom:3em;"></div>
<div style="float: left; width: 290px;">
<fs125 style="margin-top:12px;">
Um, Boss?
</fs125>
<p>
Fortunately, Tableau recognizes the danger and is more than happy to help me avoid this calamity.
</p>
<p>
So it steps in and provides this very nice message, letting me know that closing the data connection will clear all the worksheets that access it. But Tableau, understanding that I may well want this to happen, offers to go ahead and close it.
</p>
<fs125 style="margin-bottom:0px;">
Hey... just a second there.
</fs125>
<p style="margin-top:0px;">
Something's missing.
</p>
<p>
I really should make sure that these worksheets that will be cleared by closing the data connection aren't important enough to keep. So to hop to it and give them a look see.
</p>
</div>
<div style="float: left; margin-left: 20px; width: 575px;">
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCrucLMq4BvH0NkRlm9v1n6qzGv9T4-YTc3bSgNhBBUAbSi2Ec5STn4jfq_ebxQcuBEd-LxBY1MdRHYB5KSaVVIejF_lcFQuL_zlxyJP9PIj1J6_YDyktLyuuH90SQtKR64PDOiYj75TU/s1600/Danger+DataSource+in+Use.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCrucLMq4BvH0NkRlm9v1n6qzGv9T4-YTc3bSgNhBBUAbSi2Ec5STn4jfq_ebxQcuBEd-LxBY1MdRHYB5KSaVVIejF_lcFQuL_zlxyJP9PIj1J6_YDyktLyuuH90SQtKR64PDOiYj75TU/s1600/Danger+DataSource+in+Use.png" /></a></div>
</div>
<div class="separator" style="clear: both; text-align: center; margin-bottom:3em;"></div>
<fs125 style="margin-bottom:0px;">
<i><a href="https://www.youtube.com/watch?v=K6rLMSxsk4Y">Vaiter! Come taste the soup.</a></i>
</fs125>
<p style="margin-top:0px;">
Tableau's nice enough to tell us that there are workbooks in peril, but not so nice as to tell us which ones they are. For a product devoted to helping access and and understand data this is an unfortunate oversight. (but this horse is well enough beaten by now)
</p>
<fs150>
Wanted:
</fs150>
<fs125 style="margin-top0;">
a quick, simple way to identify the Worksheets.
</fs125>
<p>
It would be really handy if there were only some way to identify which Worksheets were using this data connection. One that didn't take a bunch of setup, that could have the answer lickety-split.
</p>
<p>
Well, as it happens, such a thing has just made its debut.<br/>
Simple to use—no muss, no fuss, just the facts' bare bones.
</p>
<fs125>
Introducing the DataSource—Worksheet showing tool.
</fs125>
<p>
OK, maybe it's not that good a name, but it works, and isn't that the important thing?
</p>
<p>
The tool is a mini-tool written in Ruby that takes advantage of the Ruby gem 'twb' for the heavy lifting of working with Tableau Workbooks. (the gem will be the topic of it's own blog posting very soon)
</p>
<p>
Intended to be fast and simple, the tool is a small Ruby script that's run from the command line. I'm working with Windows but think there should be no trouble running it on your Mac. It's a command line app because that's where I do a lot of my work, and putting a nice, pretty, functional UI on it would take time and effort beyond its utility to me.
</p>
<p>
The tool in action—finding the Worksheets that access the "Sample - Coffee Chain (Access)" data connection.
</p>
<div class="separator" style="clear: both; text-align: center;"></div>
<div style="float: left; width: 350px;">
Here's the Windows command environment showing that the Workbook is in the local directory. The tool can be pointed at another directory, but working local is a good idea.
</div>
<div style="float: left; margin-left: 20px; width: 400px;">
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfu3ul0_FAZRcYawiyrMu4tqmZ2tHxrNRUg7IbcehTENU0ScUVXtmA7ej5kERf4bG4mKR84ijGOmcLpSzv9OVgoyssF1-uWazFoKe6HH67l-D5qlZnlQRyF6z8to0CyDniLmVpCdm9zFU/s1600/lsmulti.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfu3ul0_FAZRcYawiyrMu4tqmZ2tHxrNRUg7IbcehTENU0ScUVXtmA7ej5kERf4bG4mKR84ijGOmcLpSzv9OVgoyssF1-uWazFoKe6HH67l-D5qlZnlQRyF6z8to0CyDniLmVpCdm9zFU/s1600/lsmulti.png" /></a></div>
</div>
<div class="separator" style="clear: both; text-align: center;"></div>
<div style="float: left; width: 350px;">
<fs150>
The simple case.
</fs150>
<p style="margin-bottom:5px;">
The tool is invoked as the Ruby script it is with the command:
</p>
<code style="margin-left:5em;margin-top:5px;">ruby dsinsheets.rb</code>
<p>
In this case the tool is in the local directory, but it can be invoked from wherever it lives. There are three prompts from the tool:
</p>
<ul>
<li><code>In directory? (.):</code><br/>
the directory to look for Workbooks in (default to 'here')
</li>
<li><code>TWB(s) Named? (*):</code><br/>
Which Workbooks to look in?<br/>
in this case we're interested in our workbook, whose name begins with 'multi*'<br/>
if nothing is put here, the tool will look in all the Workbooks in the directory
</li>
<li><code>Data Sources? (*):</code><br/>
Which data connections to look for?<br/>
the default is for all of them, which is what we see here.
</li>
</ul>
<fs150>
Eureka!
</fs150>
<p style="margin-bottom:0px;">
As is clearly shown here our old pal, the "Sample - Coffee Chain (Access)" data connection is used by two worksheets:
</p>
<ul style="margin-top:0px;">
<li style="margin: 0 0 0 0">"Coffee Product Lines", and</li>
<li style="margin: 0 0 0 0">"Sheet 9" </li>
</ul>
</div>
<div style="float: left; margin-left: 20px; width: 525px;">
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmecq3-ClHWpuhal8J33_XUrX0wZRQlL6urdNWPhInMK-C_ahT-QRXobk6ng7SwItfj0JgTNjq53f6wwpAUrJ1tkMv4pPor8BvnGiaXYIDeTTDAKFvGR6XnIryDNtHoX2k1FKjtcZu3Oo/s1600/Tool+all+data+sources.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmecq3-ClHWpuhal8J33_XUrX0wZRQlL6urdNWPhInMK-C_ahT-QRXobk6ng7SwItfj0JgTNjq53f6wwpAUrJ1tkMv4pPor8BvnGiaXYIDeTTDAKFvGR6XnIryDNtHoX2k1FKjtcZu3Oo/s1600/Tool+all+data+sources.png" /></a></div>
</div>
<div class="separator" style="clear: both; text-align: center;"></div>
<p style="font-size:165%">
The tool.
</p>
<p>
The tool is a simple Ruby script, the code for which is below. It's intentionally unsophisticated, intended to be a sharp, precise tool that does one job with a minimum of fuss, with which it's easy to get the desired results.
</p>
<p>
Like many small tools it takes some handling to get a feel for. Written in Ruby, it should be very portable, and run well wherever needed. There is some setup required: Ruby must be installed, of course, and the 'twb' and 'nokogiri' gems must be installed—this is everyday stuff and there should be someone nearby who can help if it's outside your skill set as of now.
</p>
<p>
One potential wrinkle: the tool uses regular expressions to look for data connection names, so if you're interesting in seeing only specific ones you'll need to observer regex conventions when specifying them. Practice makes for easier, more comfortable use.
</p>
<p style="font-size:165%">
The tool's code.
</p>
<hr/>
<pre>
# dsinsheets.rb - Copyright (C) 2014, 2015 Chris Gerrard
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# See <a href="http://www.gnu.org/licenses/"><http://www.gnu.org/licenses/></a> for more information.
require 'nokogiri'
require 'twb'
def init
puts "\n\n\tLooking for Worksheets related to Data Sources.\n\n"
print "\n\tIn directory? (.): "
input = STDIN.gets.chomp
dir = if input == '' then '' else input + "/" end
# -
print "\n\tTWB(s) Named? (*): "
input = STDIN.gets.chomp
twb = if input == '' then '*.twb' else input end
# -
print "\n\tData Sources? (*): "
input = STDIN.gets.chomp
$ds = if input == '' then '.*' else input end
# -
puts "\n\n"
# puts "\n\tLooking for Data Source(s) matching #{$ds}\/ in '#{path}' Workbooks\n\n\n"
dir + twb
end
dataSourceSheets = {}
def processTWB twbWithDir
return unless twbWithDir =~ /.twb$/
puts "\t#{twbWithDir}\n\t=============================="
twb = Twb::Workbook.new twbWithDir
$datasources = {}
twb.worksheets.each do |ws|
ws.datasources.each do |ds|
if ds.uiname =~ /#{$ds}/i then loadSourceSheet(ds.uiname, ws.name) end
end
end
$datasources.each do |dsn, sheets|
puts "\n\t -- #{dsn}\n\t |"
sheets.each { |sheet| puts "\t |-- #{sheet}" }
puts "\n"
end
end
def loadSourceSheet ds, sheet
if $datasources[ds].nil? then $datasources[ds] = [] end
$datasources[ds].push sheet
end
path = init
Dir.glob(path) {|twb| processTWB twb }
puts "\n\n\tThat's all, Folks.\n\n"
</pre>
<hr/>Chris Gerrardhttp://www.blogger.com/profile/01598731155784487000noreply@blogger.com1tag:blogger.com,1999:blog-6248043124025283718.post-25771586602600567242015-03-05T15:10:00.001-05:002015-03-05T15:32:21.023-05:00Tableau Server License Level Capabilities
<!-- TWO COLUMNS START HERE -- NOTE: best when the total width, LEFT & RIGHT is 860px -->
<div style="float: left; width: 475px;">
<script type='text/javascript' src='https://public.tableau.com/javascripts/api/viz_v1.js'></script><div class='tableauPlaceholder' style='width: 454px; height: 770px;'><noscript><a href='#'><img alt=' ' src='https://public.tableau.com/static/images/Ta/TableauServerLicenseLevelCapabilities/LicenseLevelCapabilities/1_rss.png' style='border: none' /></a></noscript><object class='tableauViz' width='454' height='770' style='display:none;'><param name='host_url' value='https%3A%2F%2Fpublic.tableau.com%2F' /> <param name='site_root' value='' /><param name='name' value='TableauServerLicenseLevelCapabilities/LicenseLevelCapabilities' /><param name='tabs' value='yes' /><param name='toolbar' value='yes' /><param name='static_image' value='https://public.tableau.com/static/images/Ta/TableauServerLicenseLevelCapabilities/LicenseLevelCapabilities/1.png' /> <param name='animate_transition' value='yes' /><param name='display_static_image' value='yes' /><param name='display_spinner' value='yes' /><param name='display_overlay' value='yes' /><param name='display_count' value='yes' /><param name='showVizHome' value='no' /><param name='showTabs' value='y' /></object></div>
</div>
<div style="float: left; margin-left: 10px; width: 385px;">
<!-- RIGHT CONTENT HERE -->
<p style="margin-top:15px;">
This Tableau Public viz identifies the capabilities associated with the <b>Viewer</b> and <b>Interactor </b>Tableau Server License Levels.
</p>
<p>
It recaps the information found in <a href="http://kb.tableau.com/articles/knowledgebase/viewer-and-interactor-roles">this Tableau Knowledge Base article</a>.
</p>
<p>
Instead of the KB's static HTML table the information is presented in a dynamic Tableau viz that encourages interaction, which leads to more engagement and better comprehension and retention.
</p>
<p>
I keep hoping that Tableau will start using Tableau to present information in its own online resources - doing so makes a lot of sense in the eating ones own dog food way. So far they're not seeming to see the value in it.
</p>
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<p>
</p>Chris Gerrardhttp://www.blogger.com/profile/01598731155784487000noreply@blogger.com0