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

<channel>
	<title>Blog Homsys &#187; median</title>
	<atom:link href="http://blog.homsys.com/tag/median/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.homsys.com</link>
	<description>Business Intelligence</description>
	<lastBuildDate>Tue, 10 Aug 2010 13:10:40 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>SSAS : Aggréger des mesures de cube sous forme de médiane</title>
		<link>http://blog.homsys.com/retours-experience-cas-client/ssas-aggreger-des-mesures-de-cube-sous-forme-de-mediane</link>
		<comments>http://blog.homsys.com/retours-experience-cas-client/ssas-aggreger-des-mesures-de-cube-sous-forme-de-mediane#comments</comments>
		<pubDate>Tue, 05 Jan 2010 15:48:33 +0000</pubDate>
		<dc:creator>Clément Lefaure</dc:creator>
				<category><![CDATA[Retours d’expérience / Cas client]]></category>
		<category><![CDATA[Trucs & astuces]]></category>
		<category><![CDATA[agrégation]]></category>
		<category><![CDATA[median]]></category>
		<category><![CDATA[médiane]]></category>
		<category><![CDATA[mesure]]></category>
		<category><![CDATA[SSAS]]></category>

		<guid isPermaLink="false">http://blog.homsys.com/?p=152</guid>
		<description><![CDATA[Lors d&#8217;une récente mission chez un client nous avons été confronté au besoin d&#8217;agréger des mesures de cube sous forme de médiane.
Intérêt d&#8217;agréger une mesure en médiane
Concrètement, ce besoin revient à retourner la valeur médiane d&#8217;une mesure pour les dimensions en cours, plutôt que classiquement la somme ou la moyenne.  Sur un exemple basique, pour [...]]]></description>
			<content:encoded><![CDATA[<p>Lors d&#8217;une récente mission chez un client nous avons été confronté au besoin d&#8217;<strong>agréger</strong> des mesures de cube sous forme de <strong>médiane</strong>.</p>
<h4>Intérêt d&#8217;agréger une mesure en médiane</h4>
<p>Concrètement, ce besoin revient à retourner la <em>valeur médiane</em> d&#8217;une mesure pour les dimensions en cours, plutôt que classiquement la somme ou la moyenne.  Sur un exemple basique, pour une mesure Chiffre d&#8217;Affaire, autour d&#8217;un axe d&#8217;analyse Région, le besoin client est de retourner la valeur médiane du CA de chacune des régions :</p>
<p style="padding-left: 30px">EX :   <span style="color: #000080"> [</span><span style="color: #000080">Bretagne=10M€,   Sud Ouest=17M€, </span><span style="color: #000080">PACA=23M€,   Rhone Alpes=31M€,   IDF=51M€ ]</span></p>
<p style="padding-left: 30px">Le CA au niveau national sera la valeur médiane de la liste des valeurs régions, soit 23M€.</p>
<p>Fonctionnellement prendre la valeur médiane (plutôt que la valeur moyenne) a pour effet de minimiser l&#8217;impact des valeurs extrêmes, et donc de <strong>minimiser le &laquo;&nbsp;bruit&nbsp;&raquo;</strong> que pourrait provoquer des erreurs de saisie ou de chargement.</p>
<p style="padding-left: 30px">EX : Si l&#8217;on rajoute <span style="color: #000080">[Alsace=300M€]</span> à la liste précédente (ce qui pourrait correspondre à une erreur de saisie &#8211; avec un zéro de trop)</p>
<p style="padding-left: 30px">La valeur médiane au niveau national est 27M€</p>
<p style="padding-left: 30px">=&gt; L&#8217;impact de l&#8217;erreur de saisie de l&#8217;opérateur Alsacien sur le CA national est minimisé. Une agrégation en moyenne aurait &laquo;&nbsp;tiré vers le haut&nbsp;&raquo; le CA national (moyenne = 72M€)</p>
<p>Sur l&#8217;exemple donné &#8211; qui est volontairement simpliste &#8211; le bénéfice de l&#8217;agrégation en médiane est plutôt léger, mais sur une liste de valeurs plus importante, il y a de nombreux cas fonctionnels où la médiane d&#8217;une liste de valeurs est bien plus représentative (et intéressante pour l&#8217;utilisateur) que la moyenne .</p>
<h4>Problématique</h4>
<p>Le problème vient du fait que les agrégation de type médiane <strong>n&#8217;est pas supporté nativement </strong>par Analysis Services.</p>
<div id="attachment_156" class="wp-caption aligncenter" style="width: 296px"><img class="size-full wp-image-156" src="http://blog.homsys.com/wordpress/wp-content/uploads/2010/01/median.jpg" alt="Type d'agrégation supportés par SSAS" width="286" height="248" /><p class="wp-caption-text">Types d&#39;agrégation supportés par SSAS</p></div>
<h4>Solution</h4>
<p><span style="color: #000000">La solution que nous avons proposée est d&#8217;utiliser la <strong>fonction MDX  MEDIAN</strong>(). C&#8217;est une fonction mathématique de base qui retourne la valeur médiane d&#8217;une mesure pour un &laquo;&nbsp;set&nbsp;&raquo; donné.<br />
</span></p>
<p><span style="color: #000000">Elle doit être appelée avec 2 paramètres :</span></p>
<ul>
<li><span style="color: #000000">L&#8217;ensemble de valeurs sur lequel &laquo;&nbsp;ventiler&nbsp;&raquo; la valeur médiane, le &laquo;&nbsp;set&nbsp;&raquo;<br />
</span></li>
<li><span style="color: #000000">et la mesure à agréger</span></li>
</ul>
<p><span style="color: #000000">Dans le cas du CA par région cela donnerait une mesure calculée du style  :</span></p>
<p style="padding-left: 30px"><span style="color: #000080"><span style="color: #0000ff">CA_National =     MEDIAN( [Geography].[Region].Members</span><span style="color: #000000"><span style="color: #0000ff">, </span>(= liste de valeurs)</span><br />
<span style="color: #0000ff">[Measures].[CA])</span> <span style="color: #000000">(= mesure à agréger)</span></span></p>
<p>=&gt; Cette solution fonctionne et retourne effectivement la valeur médiane du CA de chaque région</p>
<h4>En allant plus loin</h4>
<p>On remarquera qu&#8217;<strong>en réalité la solution proposée n&#8217;agrège pas &#8211; à proprement parler &#8211; en médiane</strong> : elle calcule la valeur médiane d&#8217;une mesure existante. Et ce n&#8217;est pas tout à fait la même chose ! Car cette mesure existante a son propre type d&#8217;agrégation&#8230;</p>
<p>C&#8217;est à dire, qu&#8217;elle calcule la valeur médiane, d&#8217;une liste de valeurs qui restent à leur type d&#8217;agrégation par défaut. Dans l&#8217;exemple, la formule d&#8217;agrégation ne fonctionne qu&#8217;au niveau national : la valeur retournée est la médiane des valeurs CA au niveau région, valeurs qui sont elle même agrégées&#8230; dans leur type d&#8217;agrégation par défaut définit dans SSAS (c&#8217;est à dire Somme, Moyenne etc&#8230;)</p>
<p>Le besoin de notre client était plus complexe que cela : il souhaitait une valeur médiane d&#8217;une mesure quelque soit l&#8217;axe d&#8217;analyse et quelque soit le niveau de navigation dans la dimension.</p>
<p>Par exemple sur une mesure <span style="color: #000080"><em>DélaisRésolutionIncident</em></span>, le souhait est de voir retournée la valeur médiane (de toute les valeurs disponibles) <strong>quelque soit l&#8217;axe d&#8217;analyse</strong> : que ce soit au niveau d&#8217;un mois, d&#8217;une année, d&#8217;un service, d&#8217;une région, d&#8217;une sous région etc.</p>
<p>Nous avons proposé une solution calée sur la précédente : utiliser la fonction MEDIAN en passant cette fois comme &laquo;&nbsp;set&nbsp;&raquo;  l&#8217;ensemble des lignes  de faits disponibles. Cela donne quelque chose comme :</p>
<p style="padding-left: 30px"><span style="color: #0000ff">MEDIAN_DelaisResIncident =     MEDIAN( [DimFait].[DimFait hierarchy].[DimFait fact line].Members,<span style="color: #000000"> (= ensemble des lignes de fait)</span><br />
[Measures].[ValDelaisResolutionIncident])<span style="color: #000000"> (= mesure à agréger)</span></span></p>
<p>Pour cette formule nous avons du créer dans le cube &#8211; via le DSV &#8211; une dimension de fait dont le nombre de lignes au niveau le plus fin est exactement le même que celui de la table de fait. Cette dimension &laquo;&nbsp;virtuelle&nbsp;&raquo; ne sert qu&#8217;à définir le &laquo;&nbsp;set&nbsp;&raquo; de valeurs.</p>
<p>=&gt; Cette solution fonctionne et permet une réelle agrégation de mesure sous forme de médiane.</p>
<p>PS : Ce second exemple illustre bien l&#8217;intérêt de la médiane évoqué en introduction : si par exemple un incident est resté non clôturé plusieurs mois, alors que généralement ils le sont en quelques minutes, cette anomalie &laquo;&nbsp;pourrira&nbsp;&raquo; l&#8217;indicateur de moyenne. L&#8217;indicateur de médiane en revanche sera bien plus pertinent pour l&#8217;utilisateur.</p>
<h4>Temps de réponse</h4>
<p>Si la solution proposée fonctionne sur le papier et avec nos jeux de tests, elle s&#8217;est révélée un peu décevante dans la pratique. Avec l&#8217;augmentation du nombre de lignes de faits, <strong>le temps de réponse du cube explose</strong> lorsque l&#8217;on fait appel à la mesure utilisant la médiane.</p>
<p>En effet, avec un nombre de ligne de l&#8217;ordre de plusieurs dizaines de milliers d&#8217;enregistrements, le temps de réponse dépasse les 2 minutes (le &laquo;&nbsp;time out&nbsp;&raquo; de notre outil de restitution). A titre de comparaison, l&#8217;agrégation classique en moyenne, sur les mêmes données met moins d&#8217;une seconde&#8230;</p>
<p><strong>=&gt; Cette solution est donc à utiliser avec précaution.</strong></p>
<h4>Analyse</h4>
<p><span style="color: #000000"> <span style="color: #333333">Mais pourquoi cela prend-t-il autant de temps ?<br />
</span> </span></p>
<p><span style="color: #333333">Cette fonction MDX  MEDIAN est à l&#8217;origine une fonction mathématique, pas une fonction d&#8217;agrégation. Les valeurs ne sont donc pas pré-calculées avec cette médiane comme elles le seraient avec les agrégations en Moyenne ou en Somme. La solution proposée est en réalité <strong>une utilisation détournée de la fonction</strong> MEDIAN</span></p>
<p><span style="color: #333333">Dans tous les exemples d&#8217;utilisation que l&#8217;on trouve de cette fonction,  le premier paramètre (le &laquo;&nbsp;set&nbsp;&raquo;) est de cardinalité très faible. Alors que dans le cas exposé ci-dessus l&#8217;ensemble de &laquo;&nbsp;ventilation&nbsp;&raquo; est l&#8217;ensemble des lignes de faits, donc un ensemble à cardinalité plutôt élevée.</span></p>
<p><span style="color: #333333">La <strong>fonction Median ne permet pas de pré-aggrégation </strong>dans la mesure ou son algorithme de résolution nécessite 2 &laquo;&nbsp;passages&nbsp;&raquo; sur la liste de valeur (là où la Moyenne n&#8217;en nécessite qu&#8217;un) : un passage pour trier toutes les valeurs, un autre pour prendre la moyenne des deux valeurs du milieu de la liste triée.</span></p>
<p><span style="color: #333333">Dans le premier exemple avec le CA par région, en réalité le cube se base sur les pré-agrégations sous forme de Somme du CA stockées pour chaque région, et calcule ensuite la médiane de ces pré-agrégations. L&#8217;algorithme des 2 &laquo;&nbsp;passages&nbsp;&raquo; n&#8217;est en fait déroulé que sur une liste de 22 valeurs. Tandis que dans notre cas il est déroulé sur le nombre de lignes de fait.</span></p>
<p><span style="color: #000000"><span style="color: #333333"><strong>=&gt; La fonction MDX  MEDIAN n&#8217;est donc à utiliser pour agréger une mesure que sur des tables de faits de faible population.</strong></span><br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.homsys.com/retours-experience-cas-client/ssas-aggreger-des-mesures-de-cube-sous-forme-de-mediane/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
