<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: GAURANGSURTE</title>
    <description>The latest articles on DEV Community by GAURANGSURTE (@gaurangsurte).</description>
    <link>https://dev.to/gaurangsurte</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F733185%2F6b8466af-f968-41b6-8451-2293157a618e.png</url>
      <title>DEV Community: GAURANGSURTE</title>
      <link>https://dev.to/gaurangsurte</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gaurangsurte"/>
    <language>en</language>
    <item>
      <title>Self-Healing Data: How Two-Dimensional Parity Lets a Network Fix Its Own Mistakes</title>
      <dc:creator>GAURANGSURTE</dc:creator>
      <pubDate>Mon, 19 Oct 2026 19:46:25 +0000</pubDate>
      <link>https://dev.to/gaurangsurte/self-healing-data-how-two-dimensionalparity-lets-a-network-fix-its-own-mistakes-2273</link>
      <guid>https://dev.to/gaurangsurte/self-healing-data-how-two-dimensionalparity-lets-a-network-fix-its-own-mistakes-2273</guid>
      <description>&lt;p&gt;&lt;strong&gt;The parity trick that answers “exactly where?” and not just “something is wrong”&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Why should you care?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Every frame crossing a cable or the air faces noise from interference, loose connectors or even a microwave oven. One flipped bit can turn a transfer of 100 into 900. The link layer’s first duty is to notice damage, and the receiver usually discards the frame and asks for a resend. On satellite or noisy wireless links, resending is slow and may fail again, so it would be better if the receiver could repair the damage itself. Two-dimensional parity shows that idea in its simplest form.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Step 0: the one-bit recap&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;In simple parity, the sender appends one extra bit so that the total number of 1s is even. If the receiver counts an odd number, it knows a bit has flipped. The scheme has two weaknesses that our course slides point out: two flipped bits cancel each other and slip through unnoticed, and even when a flip is caught, the receiver has no idea which bit went bad. Detection without location means no repair.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A quick illustration&lt;/strong&gt;: the data &lt;code&gt;101010&lt;/code&gt; has three 1s, so the sender appends a 1 and transmits &lt;code&gt;1010101&lt;/code&gt;. If noise flips two bits and the receiver sees &lt;code&gt;1111101&lt;/code&gt;, it counts six 1s, an even number, and wrongly accepts the frame.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;The big idea: arrange the bits in a grid&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Instead of guarding one long row of bits, write the data as a small table. Then protect it twice, once along every row and once along every column. It works like naming a cell in a spreadsheet: a row number and a column number together point to exactly one cell, so two failing checks reveal the damaged bit.&lt;/p&gt;

&lt;p&gt;Why does this work? A single flipped bit changes the count in exactly one row and exactly one column, and in no other. Every bit sits at a unique row-and-column crossing, so the pair of failing checks narrows the error down to a single bit.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sender&lt;/strong&gt;: arrange the data in rows, add an even-parity bit at the end of each row, add an even-parity bit under each column, and send the whole block.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Receiver&lt;/strong&gt;: recount every row and every column of the block that arrived.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decision&lt;/strong&gt;: if every count is even, accept. If exactly one row and one column are odd, the bit where they cross is the culprit, so flip it back.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmght0kqsjoeiq4oxbrpb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmght0kqsjoeiq4oxbrpb.png" alt=" " width="800" height="295"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 1. Row and column parity on a 4×4 block; the failing row 3 and column 2 expose the flipped bit.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Worked example, step by step&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Take the four data rows &lt;code&gt;1011&lt;/code&gt;, &lt;code&gt;0110&lt;/code&gt;, &lt;code&gt;1100&lt;/code&gt;, &lt;code&gt;0001&lt;/code&gt;. Their row-parity bits are &lt;code&gt;1&lt;/code&gt;, &lt;code&gt;0&lt;/code&gt;, &lt;code&gt;0&lt;/code&gt;, &lt;code&gt;1&lt;/code&gt;(row one has three 1s, so we add a 1 to make four; row four has one 1, so we add another). The column-parity bits all come out as 0, and so does the corner bit. Now suppose noise flips the second bit of the third row from 1 to 0. At the receiver, row 3 now holds a single 1, which is odd, and column 2 also holds a single 1, which is odd. Every other row and column still has an even count. The receiver points at row 3, column 2, flips that bit back to 1, and the original block is restored without asking for a retransmission.&lt;/p&gt;

&lt;p&gt;Notice what the receiver never needed: a second copy of the data. It only checked the rule “every row and every column must hold an even number of 1s”. That makes correction cheap to compute, just a few additions and one bit flip, which is why the idea is so easy to build into hardware.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;What it can and cannot do&lt;/strong&gt;
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Error pattern&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Outcome&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1 bit flipped&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Detected and corrected&lt;/strong&gt; (row + column cross at the bad bit)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2 or 3 bits flipped&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Detected, but not correctable&lt;/strong&gt;. Two errors at (1,1) and (2,2) leave the same failing rows and columns as two errors at (1,2) and (2,1), so the receiver cannot tell which pair is real&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4 bits at the corners of a rectangle&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Slips through&lt;/strong&gt;. Every affected row and column sees an even number of changes, so all parities still look fine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Burst of consecutive bits in one row&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Usually detected&lt;/strong&gt; (each column sees one change) but not repairable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;There is also a price. A grid with &lt;em&gt;r&lt;/em&gt; rows and &lt;em&gt;c&lt;/em&gt; columns needs &lt;em&gt;r&lt;/em&gt; + &lt;em&gt;c&lt;/em&gt; + &lt;em&gt;1&lt;/em&gt; extra bits. For our 4×4 block that is 9 extra bits on top of 16, which is heavy. For an 8×8 block it is 17 on top of 64, about 27 percent. This overhead is why modern links such as Ethernet rely on a CRC to detect trouble and on retransmission to repair it, and keep heavier correcting codes for places where resending is painful.&lt;/p&gt;

&lt;p&gt;Burst errors deserve a mention. Real noise often damages several neighboring bits at once. If a burst lands inside one row, the row parity may miss it (an even number of flips cancels), but each affected column sees one change, so the damage is still detected. Correction is impossible, however, which is why long bursts are the natural job of CRC.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Real-world case study: rebuilding a dead disk&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The same “parity lets you recover missing data” principle runs inside the storage servers behind everyday cloud services. In RAID 5 (and its simpler cousin RAID 4), the system stores data blocks on several disks plus a parity block, calculated using XOR, which is just even parity applied bit by bit. If one disk dies, the controller already knows which disk is missing, so it XORs the surviving blocks to reconstruct the lost one. Figure 2 shows the idea with two data disks. Real RAID 5 rotates the parity block across all disks so that no single disk becomes a bottleneck.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyrksaqsqqbmck0v45o9y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyrksaqsqqbmck0v45o9y.png" alt=" " width="800" height="224"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 2. Parity-based recovery, simplified.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;One subtle point: this rebuild works because the failed disk is known. Recovering a known missing piece is easier than finding an unknown flipped bit, which is what the crossing in Figure 1 solves.&lt;/p&gt;

&lt;p&gt;Two more places where the idea reappears: ECC memory in servers uses Hamming-style codes that locate and fix a flipped bit, much like our row-and-column crossing, and wireless or satellite systems use forward error correction so that receivers can repair small damage without waiting for a retry.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Flip the **last data bit of row 1** in the example. Which row and column fail? Answer: row 1 and column 4.&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Key takeaways&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Simple parity detects errors but cannot locate them.&lt;/li&gt;
&lt;li&gt;Two-dimensional parity corrects one flipped bit, detects up to three, and misses a four-bit rectangle.&lt;/li&gt;
&lt;li&gt;Correction costs extra bits, so real links combine CRC, retransmission and error-correcting codes.&lt;/li&gt;
&lt;li&gt;It also protects RAID storage and ECC memory.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;References and further reading&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Course slides, Unit 5&lt;/strong&gt;: &lt;strong&gt;The Link Layer, Computer Networks, SIT Pune.&lt;/strong&gt;
&lt;u&gt;&lt;a href="https://1drv.ms/p/c/70201b25f03037d4/IQA-NAtD0wsvTL8TOua3pPOdAaMoqMv5jX14hMvdmPymtTY?e=juVfWO" rel="noopener noreferrer"&gt;https://1drv.ms/p/c/70201b25f03037d4/IQA-NAtD0wsvTL8TOua3pPOdAaMoqMv5jX14hMvdmPymtTY?e=juVfWO&lt;/a&gt;
&lt;/u&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kurose, J. and Ross, K., Computer Networking&lt;/strong&gt;: A Top-Down Approach, Pearson (link-layer chapter). &lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://gaia.cs.umass.edu/kurose_ross/" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;gaia.cs.umass.edu&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://www.ijnrd.org/papers/IJNRD2606262.pdf" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;ijnrd.org&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>computernetwork</category>
      <category>parity</category>
      <category>selfhealingdata</category>
      <category>twodimensionalparity</category>
    </item>
    <item>
      <title>Adding R to Power BI: Statistics, Trends and a Six-Month Sales Forecastfor Adventure Works</title>
      <dc:creator>GAURANGSURTE</dc:creator>
      <pubDate>Thu, 15 Oct 2026 05:34:59 +0000</pubDate>
      <link>https://dev.to/gaurangsurte/adding-r-to-power-bi-statisticstrends-and-a-six-month-salesforecastfor-adventure-works-315i</link>
      <guid>https://dev.to/gaurangsurte/adding-r-to-power-bi-statisticstrends-and-a-six-month-salesforecastfor-adventure-works-315i</guid>
      <description>&lt;h2&gt;
  
  
  Aim
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;To integrate R with Power BI, use R for statistical analysis, advanced visualization and timeseries forecasting, and combine the results with Power BI KPI cards, slicers, filters and drilldown in one professional, interactive dashboard.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Objectives&lt;/strong&gt;&lt;br&gt;
Set up R with Power BI and enable R script visuals.&lt;br&gt;
Import and clean the Adventure Works data and calculate summary statistics.&lt;br&gt;
Create at least four R visuals, five KPI cards and four native Power BI visuals.&lt;br&gt;
Run an advanced analysis (a time-series forecast) with an R package.&lt;br&gt;
Add slicers, filters and a drill-down, then write the business insights.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tools&lt;/strong&gt;: Power BI Desktop, R (with RStudio for testing), packages ggplot2 , forecast and scales. &lt;br&gt;
&lt;strong&gt;Dataset&lt;/strong&gt;: Adventure Works sales, product, territory and customer files.&lt;/p&gt;




&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Power BI is excellent at totals and slicers but cannot draw a box plot or fit a forecasting model on its own. R can. I connected R to Power BI and built a dashboard that answers one business question: where is Adventure Works sales heading? The history is $24.91M of
sales and $10.46M of profit (42.0% margin) from January 2020 to June 2022. Monthly sales climbed from about $0.5M to $1.83M, and an ARIMA model projects them to keep rising over the next six months, with a wide band of uncertainty around that path.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why bring R into Power BI?
&lt;/h2&gt;

&lt;p&gt;Power BI’s built-in visuals cover the everyday cases: totals, trends, rankings, shares. They do not show the distribution of a value, test a statistical idea or predict the future. R fills that gap with thousands of packages, and Power BI can run an R script and show the resulting picture as a normal visual on the page.&lt;/p&gt;

&lt;p&gt;An R visual works like this. You drop fields into the visual, Power BI hands those columns to your script as a data frame called dataset , the script draws a plot, and Power BI displays the plot. Because the visual is part of the report, slicers and filters still change it. Two details matter. First, duplicate rows are removed from dataset unless the fields include something unique such as OrderNumber and OrderLineItem . Second, an R visual re-runs its script on every filter change, so it is slower than a native visual and the output is a static image, not a clickable chart.&lt;/p&gt;

&lt;p&gt;The model I used for forecasting is ARIMA (AutoRegressive Integrated Moving Average). It predicts the next value of a series from its own past values and past errors. auto.arima() from the forecast package tries many combinations and keeps the one with the best fit, and forecast() then projects it forward and adds prediction intervals.&lt;/p&gt;




&lt;h2&gt;
  
  
  Task 1: Setting up R with Power BI
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Install R from CRAN and, optionally, RStudio. Install the packages once from the R console: &lt;strong&gt;install.packages(c("ggplot2","forecast","scales"))&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;In Power BI Desktop open &lt;strong&gt;File &amp;gt; Options and settings &amp;gt; Options &amp;gt; R scripting&lt;/strong&gt;. Check that the R home directory points to the R installation, and set RStudio as the external editor if wanted.&lt;/li&gt;
&lt;li&gt;Switch on &lt;strong&gt;Enable script visuals&lt;/strong&gt; when Power BI asks, and add the R visual to the page from the Visualizations pane (the R icon).&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Task 2 and 3: Importing and cleaning the data
&lt;/h2&gt;

&lt;p&gt;The data comes as CSV files. In Power Query I appended the three yearly sales files, joined them with the product, subcategory, category, territory and customer tables, and kept one&lt;br&gt;
flat table with one row per order line (56,046 rows). Sales is not stored in the files, so I calculated it as OrderQuantity × ProductPrice , and cost and profit in the same way.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4f94jnza32ll67avj5sw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4f94jnza32ll67avj5sw.png" alt=" " width="800" height="71"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxswyyot1qy94wlujd5x6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxswyyot1qy94wlujd5x6.png" alt=" " width="800" height="213"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The data stops on 30 June 2022, so all analysis uses January 2020 to June 2022. The final query in Power Query looks like this.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1atitenpvwo7mr7rymij.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1atitenpvwo7mr7rymij.png" alt=" " width="800" height="178"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Task 5: Summary statistics
&lt;/h2&gt;

&lt;p&gt;Before drawing anything I looked at the numbers behind the sales column. In R the one-liner is summary(dataset$Sales) ; the results for the 56,046 order lines are below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9rp73fjbsskeighy29cr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9rp73fjbsskeighy29cr.png" alt=" " width="800" height="243"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The mean is more than twelve times the median and the standard deviation is almost twice the mean. That tells me the data is heavily right-skewed: most order lines are small accessories, and a minority are expensive bikes that pull the average up. It also explains why a log scale is needed on the plots below.&lt;/p&gt;




&lt;h2&gt;
  
  
  Task 4 and 6: The R visuals
&lt;/h2&gt;

&lt;p&gt;Every R visual below uses fields from the same flat table, and each one is a short ggplot2 script.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;R visual 1: Histogram of order-line value&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fields used: Sales . Power BI shows the warning “Duplicate rows will be removed from the data” above the script, which is why unique keys such as OrderNumber and OrderLineItem are worth adding when every order line must count.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fngulob57r28c43jvzs5j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fngulob57r28c43jvzs5j.png" alt=" " width="800" height="140"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzklycfaouure3ttawm68.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzklycfaouure3ttawm68.png" alt=" " width="800" height="360"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The histogram and its script in Power BI’s R script editor. Two separate clusters appear: a large group of small accessory and clothing lines around $10 to $60, and a smaller group of bike lines between about $500 and $3,500.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;R visual 2: Box plot of sales by category&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fields used: CategoryName , Sales.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj0kmee7962ars01mup8v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj0kmee7962ars01mup8v.png" alt=" " width="800" height="113"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fokhqbkjtdim58wb52vsx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fokhqbkjtdim58wb52vsx.png" alt=" " width="800" height="356"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Sales per order line by category. Bikes sit one to two orders of magnitude above accessories and clothing, and the three boxes barely overlap.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;R visual 3: Monthly sales with a smoothed trend&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fields used: Month , Sales . The script adds up sales per month and fits a LOESS smoother, shown as the dashed line.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4ktj6t5w0bb0va9bggkh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4ktj6t5w0bb0va9bggkh.png" alt=" " width="799" height="166"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgk2afru8j5iwie637uu8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgk2afru8j5iwie637uu8.png" alt=" " width="800" height="399"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Monthly sales (red) and the LOESS trend (dashed). Sales slid from about $0.6M in early 2020 to a low near $0.33M in November 2020, stayed flat through mid-2021, and then accelerated to $1.83M in June 2022&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;R visual 4: Six-month ARIMA forecast&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fields used: Month , Sales . This is the advanced analytics task, covered in detail next.&lt;/p&gt;




&lt;h2&gt;
  
  
  Task 7: Advanced analytics, a time-series forecast
&lt;/h2&gt;

&lt;p&gt;The forecast script does five things.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Adds up sales per month and sorts them by date.&lt;/li&gt;
&lt;li&gt;Builds a monthly time series with ts() , using frequency = 12 and a start year and month taken from the data.&lt;/li&gt;
&lt;li&gt;Lets auto.arima() pick the model orders.&lt;/li&gt;
&lt;li&gt;Projects six months ahead with forecast(..., h = 6).&lt;/li&gt;
&lt;li&gt;Draws the history and the forecast with autoplot().&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs4vgrm7jqcoizvic1238.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs4vgrm7jqcoizvic1238.png" alt=" " width="800" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F60to80d780oajkylfwfh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F60to80d780oajkylfwfh.png" alt=" " width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Screenshot 1: steps performed&lt;/strong&gt;. The forecast visual with its R script in the script editor. The blue line is&lt;br&gt;
the point forecast, the dark band is the 80% interval and the light band the 95% interval.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;How to read the forecast&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Direction&lt;/strong&gt;: the forecast starts at roughly $1.9M for July 2022 and rises to roughly $2.4M by December 2022, a continuation of the upward trend.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uncertainty&lt;/strong&gt;: the band fans out with every month. By December the 95% range runs from about $1.6M to $3.2M. The model is confident about next month and honest about how little it knows about month six.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limits&lt;/strong&gt;: the series is only 30 months long, which is short for a seasonal model, and December 2021 was a visible spike of $1.64M. With so little history the model cannot separate a true December effect from a one-off, so the forecast mostly follows the recent trend. It should be read as a planning range, not a promise.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Task 8: Building the interactive dashboard
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Layout&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Title banner across the top&lt;/strong&gt;: “Adventure Works: Sales Analytics with R and Power BI”.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Five KPI cards&lt;/strong&gt;: Total Sales, Total Profit, Total Orders, Total Customers and Profit Margin %.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Three slicers&lt;/strong&gt;: Region, Year and CategoryName. They filter every visual on the page, R visuals included.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Four native visuals&lt;/strong&gt;: a line chart of sales by year and month, a column chart of sales by category with drill-down, a donut chart of profit by category and a bar chart of sales by country.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Four R visuals&lt;/strong&gt;: the histogram, the box plot, the monthly trend and the forecast, on pages 3 and 4.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The pages I built&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2k6q6dfdalfxrmf3574s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2k6q6dfdalfxrmf3574s.png" alt=" " width="800" height="272"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The KPI measures&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjapd9tbx313lszbsgi9m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjapd9tbx313lszbsgi9m.png" alt=" " width="800" height="139"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feumvt2b29lsuxiaqe24f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feumvt2b29lsuxiaqe24f.png" alt=" " width="800" height="465"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;&lt;strong&gt;Screenshot 2: output through cards&lt;/strong&gt;. Five KPI cards (25K orders, 41.97 profit margin %, 17K customers, $10.46M profit, $24.91M sales) with the Region, Year and CategoryName slicers.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fioz5jbxiwl9fkiln7n1w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fioz5jbxiwl9fkiln7n1w.png" alt=" " width="800" height="467"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The Power BI visuals: sales by year and month with drill-down, sales by category, profit by category and sales by country.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Filters and drill-down&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;Sales by Year / Month line&lt;/strong&gt; chart uses a date hierarchy, so the drill arrows move from the yearly view to the monthly one.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Sales by Category (drill down)&lt;/strong&gt; column chart is built on a hierarchy that starts at
category, so it can be drilled into finer levels.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Region, Year and CategoryName&lt;/strong&gt; slicers filter the visuals on the page. Choosing “Bikes” or “2021”, for example, redraws the charts and the R visuals together.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9joup77nbd0uee92ohs1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9joup77nbd0uee92ohs1.png" alt=" " width="799" height="488"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;R visuals page, part one: histogram and box plot as report visuals.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4lu8qo024txe2macp2oh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4lu8qo024txe2macp2oh.png" alt=" " width="800" height="482"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;R visuals page, part two: monthly trend and the six-month forecast.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Task 9: Business insights
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Bikes carry the business&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Bikes are 94.9% of sales ($23.64M) and 93% of profit ($9.73M). Accessories add only $0.57M of profit (5.45%) and clothing $0.16M (1.55%), as the donut chart shows. A small change in bike demand moves the whole company.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Growth is real, and it began in mid-2021&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Yearly sales were $6.40M in 2020 and $9.32M in 2021, and the first half of 2022 alone reached $9.19M. The trend line shows the change clearly: flat at about $0.5M a month until June 2021, then a steady climb. Accessories and clothing started selling in July 2021, which&lt;br&gt;
coincides with the jump.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Order values are split into two worlds&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The histogram and box plot show two kinds of sale: many small lines of $10 to $60 and fewer large bike lines of $500 to $3,500. Averages hide this. The mean line value is $444.54, yet the median is only $34.99. Decisions about average prices or discounts should always be made per category.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Geography is concentrated&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The United States leads with $7.94M and Australia is the biggest single region at $7.42M. Canada is the smallest of the six country markets at about $1.8M, and Germany, France and the United Kingdom each sit between $2.4M and $2.9M.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;The forecast says “keep growing”, with caution&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The model expects monthly sales to rise from about $1.9M to $2.4M by December 2022. The widening band means inventory and staffing plans should be set against the lower and middle parts of the range and reviewed monthly as actual figures arrive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I would do next&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Plan stock around the December peak and the January dip seen in both years.&lt;/li&gt;
&lt;li&gt;Cross-sell accessories with bike orders, since they are cheap and high margin.&lt;/li&gt;
&lt;li&gt;Re-run the forecast every month and compare it with actuals to see whether the model needs a seasonal term once more history exists.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Task 10: Conclusion
&lt;/h2&gt;

&lt;p&gt;This practical showed me what each tool is best at. Power BI handled the KPIs, slicers and drill-down well, and R handled the distribution plots and the forecast that Power BI cannot do natively. Getting the two to work together took more care than I expected: the R path had to match the installed libraries, duplicate rows are silently removed unless unique keys are included, and R visuals refresh more slowly than native ones. The final dashboard combines five KPI cards, four native visuals and four R visuals, shows a business that grows fast and depends on bikes, and gives a six-month outlook with an honest measure of uncertainty.&lt;/p&gt;




</description>
      <category>r</category>
      <category>productivity</category>
      <category>powerbi</category>
      <category>businessintelligence</category>
    </item>
    <item>
      <title>From Raw Sales to KPIs: DAX, DAX Studio and a Power BI Dashboard on Adventure Works</title>
      <dc:creator>GAURANGSURTE</dc:creator>
      <pubDate>Tue, 13 Oct 2026 19:04:42 +0000</pubDate>
      <link>https://dev.to/gaurangsurte/from-raw-sales-to-kpis-daxdax-studio-and-a-power-bidashboard-on-adventure-works-c0k</link>
      <guid>https://dev.to/gaurangsurte/from-raw-sales-to-kpis-daxdax-studio-and-a-power-bidashboard-on-adventure-works-c0k</guid>
      <description>&lt;p&gt;&lt;strong&gt;The short version&lt;/strong&gt;&lt;br&gt;
Adventure Works sold $24.91M of goods between January 2020 and June 2022 and kept&lt;br&gt;
$10.46M of it as profit, a margin of 42.0%. Bikes bring in 95% of sales, Australia is the&lt;br&gt;
biggest single region, and December is the strongest month every year. The rest of this post&lt;br&gt;
shows how I built every number with DAX, checked it in a query editor, and put it on a&lt;br&gt;
dashboard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aim&lt;/strong&gt;: To design KPIs and custom DAX calculations on the Adventure Works dataset, validate them&lt;br&gt;
with DAX Studio, and present them in an interactive Power BI dashboard with KPI cards, at&lt;br&gt;
least four visuals and slicers for year, product category and region.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A quick DAX primer&lt;/strong&gt;&lt;br&gt;
A calculated column is worked out row by row when the data loads and takes up space in&lt;br&gt;
the model. A measure is worked out when a visual asks for it, using whatever filters that&lt;br&gt;
visual applies. Almost every KPI should be a measure.&lt;br&gt;
Two ideas explain most of DAX. Row context means “this one row”, which is what SUMX uses&lt;br&gt;
when it multiplies quantity by price line by line. Filter context means “the rows the visual lets&lt;br&gt;
through”, such as one year or one region. CALCULATE changes the filter context, which is why&lt;br&gt;
it sits behind most of the interesting measures below.&lt;br&gt;
DAX Studio is a separate tool that connects to the open Power BI model. You write a DAX&lt;br&gt;
query, run it, and see the result as a table, which makes it a good place to test a measure&lt;br&gt;
before trusting a card.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The data&lt;/strong&gt;&lt;br&gt;
The dataset arrives as a set of CSV files that together describe a bicycle company: three&lt;br&gt;
sales files (one per year), lookup tables for products, categories, subcategories, customers&lt;br&gt;
and territories, and a returns table.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F22kuwmjzubm9hs0j4vzo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F22kuwmjzubm9hs0j4vzo.png" alt=" " width="800" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The relationships are simple one-to-many links from each lookup table into Sales :&lt;br&gt;
Products[ProductKey] , Territories[SalesTerritoryKey] , Customers[CustomerKey] and&lt;br&gt;
Calendar[Date] to Sales[OrderDate] . Subcategories link to Products and Categories link to&lt;br&gt;
Subcategories. The three sales files are appended into one Sales table in Power Query.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cleaning checks&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The combined sales table has 56,046 rows with no blank cells and no duplicate rows.&lt;/li&gt;
&lt;li&gt;Every ProductKey and TerritoryKey in Sales finds a match in its lookup table, so nothing drops out of a relationship.&lt;/li&gt;
&lt;li&gt;The customer file is not UTF-8, so I loaded it with the Western European encoding to keep names with accents intact.&lt;/li&gt;
&lt;li&gt;The Sales data stops on 30 June 2022, so 2022 is only a half year. I keep that in mind whenever I compare years.&lt;/li&gt;
&lt;li&gt;The Components category exists in the lookup table but has no sales, so it never shows up in the charts.
The calendar file has only a Date column, so I added four calculated columns to give the&lt;/li&gt;
&lt;li&gt;slicers and the monthly axis something to use. The table is marked as the date table, which the time functions need.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdgvh1mgy0tryc8wlwjq3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdgvh1mgy0tryc8wlwjq3.png" alt=" " width="800" height="104"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: The ten KPI measures&lt;/strong&gt;&lt;br&gt;
The data has no sales amount column, so Sales is worked out as quantity times the product price, row by row. RELATED pulls the price from the Products table into each sales row. Cost works the same way, and everything else builds on those two.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbgpopc26iwhhs4jfzzsu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbgpopc26iwhhs4jfzzsu.png" alt=" " width="800" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Two choices worth stating. Average Sales is the average value of one order line ($444.54),&lt;br&gt;
while Average Order Value is total sales divided by the number of distinct orders ($990.09),&lt;br&gt;
because one order can hold several lines. Average Product Price averages the price list of all 293 products, not the prices of what actually sold.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Seventeen more measures&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The brief asks for at least twenty measures. These seventeen take the total to twenty-seven.&lt;br&gt;
They cover returns, share of total, filtered totals, ranking and the time-based set used in the next step.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fucotyyusalt4nfnbb74x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fucotyyusalt4nfnbb74x.png" alt=" " width="800" height="517"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqfsfwdxiv88apbuq2g0i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqfsfwdxiv88apbuq2g0i.png" alt=" " width="800" height="275"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The functions the brief asked for all appear: SUM , AVERAGE , COUNT , DISTINCTCOUNT, CALCULATE, DIVIDE, FILTER and RANKX . I used DIVIDE instead of the / operator&lt;br&gt;
everywhere, since it returns blank instead of an error when the denominator is zero. That matters for the first month of data, which has no previous month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Time-based analysis&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Four measures make up the month-over-month view. Monthly Sales is the sales in the month on the axis. Previous Month Sales shifts the date filter back one month with PREVIOUSMONTH .&lt;br&gt;
Sales Variance is the difference, and Sales Growth % is that difference as a share of the previous month.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxckqn7nafsd1dh2lfg3z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxckqn7nafsd1dh2lfg3z.png" alt=" " width="800" height="395"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxvgi8hiusyelsa0nkeg4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxvgi8hiusyelsa0nkeg4.png" alt=" " width="800" height="375"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Monthly sales against the previous month. Sales stayed near $0.5M a month through mid-2021, then climbed to $1.83M in June 2022.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs44vrmr5qjabfv30xjq7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs44vrmr5qjabfv30xjq7.png" alt=" " width="799" height="338"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Sales growth % by month. Blue is growth, orange is decline. The same pattern repeats: a big jump in December and a drop in January.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Checking everything in DAX Studio&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open the Power BI file, then open DAX Studio and choose PBI / SSDT Model to connect to it.&lt;/li&gt;
&lt;li&gt;In the left pane, confirm the eight tables and the measures from steps 1 to 3 are listed.&lt;/li&gt;
&lt;li&gt;Write one query that returns all ten KPIs in a single row using EVALUATE ROW(...) .&lt;/li&gt;
&lt;li&gt;Run it with F5 and compare each value with the matching card in Power BI.&lt;/li&gt;
&lt;li&gt;Run a second query with SUMMARIZECOLUMNS to get monthly sales, previous month, variance
and growth, and compare it with the table above.&lt;/li&gt;
&lt;li&gt;To look at performance, switch on Server Timings, run the query again, and see how the time splits between the Storage Engine and the Formula Engine. &lt;/li&gt;
&lt;li&gt;A measure that needs a lot of Formula Engine time is the first place to simplify.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ferw241nlcu7vhf79tmqc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ferw241nlcu7vhf79tmqc.png" alt=" " width="735" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F70on02nhloxegxzychla.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F70on02nhloxegxzychla.png" alt=" " width="799" height="404"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Screenshot 1: steps performed. The query that returns the ten KPI measures, with the model tables and measures in the left pane and the result grid below.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: The Power BI dashboard&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layout&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Top row&lt;/strong&gt;: KPI cards for Total Sales, Total Profit, Total Orders, Total Customers and Profit Margin %.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slicers down the side&lt;/strong&gt;: Year (from Calendar[Year] ), Product Category and Region.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trend&lt;/strong&gt;: line chart with Month Year on the axis and Monthly Sales and Previous Month Sales as values.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comparison&lt;/strong&gt;: a column chart of Total Sales by category, a bar chart of Total Sales by region, and a bar chart of the top 10 products by Total Sales (a Top N filter on ProductName ).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How I built it&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Load the CSV files from a folder, append the three Sales files, and set column types in Power Query.&lt;/li&gt;
&lt;li&gt;Create the relationships in Model view and mark Calendar as the date table.&lt;/li&gt;
&lt;li&gt;Add the calculated columns to Calendar, then write the measures from steps 1 to 3 in a dedicated measures table.&lt;/li&gt;
&lt;li&gt;Insert one Card visual per KPI and format the numbers: currency for money, whole numbers for counts, two decimals for percentages.&lt;/li&gt;
&lt;li&gt;Add the line, column and bar charts, then three slicers. Slicers filter every visual on the page at once.&lt;/li&gt;
&lt;li&gt;Keep one colour theme: a single accent for the main metric, grey for comparison series, and the same font throughout.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6mnu7pk9n1exk4burgw2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6mnu7pk9n1exk4burgw2.png" alt=" " width="800" height="406"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Screenshot 2: output through cards. The ten KPI measures as cards with no slicer applied. They match the DAX Studio result exactly.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What the numbers say
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Sales stepped up in mid-2021, and 2022 is on track to be the biggest year&lt;/strong&gt;&lt;br&gt;
Sales were $6.40M in 2020 and $9.32M in 2021, an increase of 46%. The half year of 2022 already reached $9.19M, almost the whole of 2021. Comparing the same six months, January to June 2022 is 211% higher than January to June 2021 ($9.19M against $2.95M).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp2581m64nzosbrnaf4ct.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp2581m64nzosbrnaf4ct.png" alt=" " width="800" height="314"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Sales and profit by year. 2022 covers January to June only.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Bikes are the revenue, accessories are the margin&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Bikes produce 94.9% of sales ($23.64M) at a 41.1% margin. Accessories are 69% of all units sold but only 3.6% of sales, and they earn the highest margin at 62.8%. Clothing is the smallest category at $0.37M. Accessories and clothing first appear in the data in July 2021, so they only explain a small part of the growth since then. Most of it comes from bikes: bike sales in the second half of 2021 were nearly double those of the first half.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F00k6ojawvkstutywv28h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F00k6ojawvkstutywv28h.png" alt=" " width="798" height="251"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Sales and profit margin by category.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Top-selling products&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;All six Mountain-200 variants sit at the top of the revenue list and together bring in $7.17M.&lt;br&gt;
The Mountain-200 Black, 46 is the number one product at $1.24M. By units it is a different list: the 30 oz water bottle leads with 7,967 units, followed by the patch kit and the mountain tyre tube. Cheap accessories give volume, expensive bikes give revenue.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs7bqui792nvo6qja1j7w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs7bqui792nvo6qja1j7w.png" alt=" " width="800" height="345"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Top 10 products by sales&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Australia leads, and two US regions carry the United States&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Australia is the largest region with $7.42M, which is 29.8% of sales. The Southwest ($4.82M) and Northwest ($3.10M) are next, and together they make up almost all US sales. The Central, Northeast and Southeast US regions are almost empty, each under $12K. Canada, France and Germany are mid-sized, and the United Kingdom is the strongest European region.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frnsglj3aimfp78zvmtj6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frnsglj3aimfp78zvmtj6.png" alt=" " width="800" height="344"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Sales by region&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Seasonality, order value and returns&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;December is the peak&lt;/strong&gt;: sales rose 73% over November in 2020 and 44% in 2021. January then fell 23% and 22%.&lt;br&gt;
&lt;strong&gt;Average order value fell **from $2,435 in 2020 to $872 in 2021 and $776 in 2022. Orders more than quadrupled once accessories and clothing arrived, and those orders are small.&lt;br&gt;
**Profitability is steady&lt;/strong&gt;: the margin was 40.6% in 2020, 42.5% in 2021 and 42.3% in 2022.&lt;br&gt;
&lt;strong&gt;Returns are low&lt;/strong&gt;: 1,828 units came back, which is 2.17% of units sold.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would do next
&lt;/h2&gt;

&lt;p&gt;Stock up and promote ahead of December, and plan for the January dip instead of being surprised by it.&lt;br&gt;
Push accessories alongside bike orders. Their margin is 22 points higher than bikes and they already sell in volume.&lt;br&gt;
Look into why the Central, Northeast and Southeast US regions sell almost nothing, since the product clearly sells in the Southwest and Northwest.&lt;br&gt;
Review jersey pricing or cost, as their margin is well below everything else.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Writing the measures taught me that most of the work in a KPI dashboard is deciding what each number means. Sales had to be built from quantity and price, an order and an order line are not the same thing, and a growth percentage on a half year is easy to misread. &lt;br&gt;
Checking the same values in DAX Studio and on the cards made me trust them. The result is a set of 27 measures, a dashboard that answers the six questions in the brief, and a clear picture of a business that grows fast, depends on bikes, and peaks every December.&lt;/p&gt;

</description>
      <category>powerbi</category>
      <category>dev</category>
      <category>analytics</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Power Query Deep Dive — Transforming &amp; Analyzing the AdventureWorks</title>
      <dc:creator>GAURANGSURTE</dc:creator>
      <pubDate>Fri, 21 Aug 2026 06:44:50 +0000</pubDate>
      <link>https://dev.to/gaurangsurte/power-query-deep-dive-transforming-analyzing-the-adventureworks-34k2</link>
      <guid>https://dev.to/gaurangsurte/power-query-deep-dive-transforming-analyzing-the-adventureworks-34k2</guid>
      <description>&lt;h1&gt;
  
  
  Power Query Deep Dive: Transforming &amp;amp; Analyzing the AdventureWorks Sales Dataset in Power BI
&lt;/h1&gt;

&lt;p&gt;If you've ever wondered how a pile of raw CSV exports turns into a clean, business-ready Power BI dashboard, this post walks through exactly that — using Power Query's four core transformation techniques (&lt;strong&gt;Grouping, Pivoting/Unpivoting, Appending, and Merging&lt;/strong&gt;) on the classic &lt;strong&gt;AdventureWorks&lt;/strong&gt; retail dataset, then layering on DAX measures and a full sales-analysis report.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe74d3qqbkaz2saifdjkl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe74d3qqbkaz2saifdjkl.png" alt=" " width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The dataset
&lt;/h2&gt;

&lt;p&gt;AdventureWorks is a sample dataset for a fictional bicycle manufacturer: Internet Sales order lines joined to Product, Subcategory, Category, Customer, and Territory lookup tables — a textbook star schema with one fact table and several dimension tables.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1 — Grouping
&lt;/h2&gt;

&lt;p&gt;Grouping collapses transaction-level rows into summarized metrics. A few of the groupings I built:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Category → Sum of Sales Amount&lt;/strong&gt; — total sales per product category&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customer → Average of Sales Amount&lt;/strong&gt; — average spend per customer, plus a Top N filter for the top 10 customers by total sales&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subcategory → Sum of Order Quantity&lt;/strong&gt; — units sold per subcategory&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Territory → Average of Order Quantity&lt;/strong&gt; — average basket size by region&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customer → Count Distinct of Order Number&lt;/strong&gt; — orders placed per customer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Category → Max of Sales Amount&lt;/strong&gt; — highest single sale per category&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Territory → Sum of Tax Amount&lt;/strong&gt; — total tax collected per region&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmqre59ci25k59yqovu4j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmqre59ci25k59yqovu4j.png" alt=" " width="220" height="132"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzlgvmeebfbcgp6zn2rxm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzlgvmeebfbcgp6zn2rxm.png" alt=" " width="217" height="142"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg130l6dxzilw14rfn5ul.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg130l6dxzilw14rfn5ul.png" alt=" " width="218" height="133"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk6nbq5xlyhrdute9dfwx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk6nbq5xlyhrdute9dfwx.png" alt=" " width="217" height="128"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb18fnt0is5nod2nmlily.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb18fnt0is5nod2nmlily.png" alt=" " width="217" height="126"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe07htykv9q1icptrwhn4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe07htykv9q1icptrwhn4.png" alt=" " width="217" height="120"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2 — Pivoting &amp;amp; Unpivoting
&lt;/h2&gt;

&lt;p&gt;To prove the transformation is lossless, I built a small reference table with Category, Sales Amount, Tax Amount, and Order Quantity, then:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Unpivoted&lt;/strong&gt; the three numeric columns into a tall &lt;code&gt;Attribute&lt;/code&gt; / &lt;code&gt;Value&lt;/code&gt; layout&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Renamed&lt;/strong&gt; them to &lt;code&gt;Metric&lt;/code&gt; / &lt;code&gt;Amount&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pivoted&lt;/strong&gt; the &lt;code&gt;Metric&lt;/code&gt; column back on &lt;code&gt;Values = Amount&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The row and column counts matched the original table exactly after the round trip — confirming nothing was lost in translation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3 — Appending
&lt;/h2&gt;

&lt;p&gt;I split Internet Sales into two queries by Order Date/Year (&lt;strong&gt;First Half&lt;/strong&gt; and &lt;strong&gt;Second Half&lt;/strong&gt;) and combined them with &lt;strong&gt;Append Queries → Append as New&lt;/strong&gt;. The resulting row count matched the sum of both halves exactly, with no duplicates or schema mismatches.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4 — Merging
&lt;/h2&gt;

&lt;p&gt;This is where the star schema comes together:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Merge &lt;code&gt;FactInternetSales&lt;/code&gt; with &lt;code&gt;DimProduct&lt;/code&gt; on &lt;code&gt;ProductKey&lt;/code&gt; (Left Outer Join) → expand Product Name, Color, Standard Cost&lt;/li&gt;
&lt;li&gt;Merge the result with &lt;code&gt;DimProductSubcategory&lt;/code&gt; → expand Subcategory Name&lt;/li&gt;
&lt;li&gt;Merge again with &lt;code&gt;DimProductCategory&lt;/code&gt; → expand Category Name&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After &lt;code&gt;Close &amp;amp; Apply&lt;/code&gt;, &lt;strong&gt;Manage Relationships&lt;/strong&gt; confirmed every fact-to-dimension link was Active with the correct cardinality.&lt;/p&gt;

&lt;h2&gt;
  
  
  DAX measures
&lt;/h2&gt;

&lt;p&gt;With a clean star schema in place, six measures power the whole report:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Total Sales =
SUMX(
    'Sales Data',
    RELATED('AdventureWorks Product Lookup'[ProductPrice]) *
    'Sales Data'[OrderQuantity]
)

Total Cost =
SUMX(
    'Sales Data',
    RELATED('AdventureWorks Product Lookup'[ProductCost]) *
    'Sales Data'[OrderQuantity]
)

Total Profit = [Total Sales] - [Total Cost]

Total Orders = DISTINCTCOUNT('Sales Data'[OrderNumber])

Total Customers = DISTINCTCOUNT('Sales Data'[CustomerKey])

Total Quantity = SUM('Sales Data'[OrderQuantity])
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The results
&lt;/h2&gt;

&lt;p&gt;Once the model was built, the numbers told a clear story:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Total Sales&lt;/td&gt;
&lt;td&gt;24.91M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total Cost&lt;/td&gt;
&lt;td&gt;14.46M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total Profit&lt;/td&gt;
&lt;td&gt;10.46M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total Orders&lt;/td&gt;
&lt;td&gt;25,164&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total Customers&lt;/td&gt;
&lt;td&gt;17K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total Quantity Sold&lt;/td&gt;
&lt;td&gt;84K&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A few standout findings from the sales analysis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bikes dominate&lt;/strong&gt; — the category alone drives roughly &lt;strong&gt;95%&lt;/strong&gt; of total revenue.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Territory 9 leads by a mile&lt;/strong&gt; — 29.8% of total sales, about 54% ahead of the second-place territory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mountain-200 Black, 46&lt;/strong&gt; is the single highest-selling product/size, at ~1.24M in sales.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sales peak in June&lt;/strong&gt; (~3.0M) then fall off a cliff in July (~1.15M) before slowly recovering into December — a pattern that repeats across all three years in the data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weekday vs weekend basket size is nearly identical&lt;/strong&gt; (~446 vs ~441 average sale), so weekday revenue is simply higher because there are more weekdays, not because people spend more on them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3e3u9nmmvl6hp5bkepu1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3e3u9nmmvl6hp5bkepu1.png" alt=" " width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F12yl4skjafrjg57d07wh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F12yl4skjafrjg57d07wh.png" alt=" " width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Advanced tasks
&lt;/h2&gt;

&lt;p&gt;On top of the core analysis, I added a few DAX/Power-Query extras:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ranking&lt;/strong&gt; product categories by total sales&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Above-average product detection&lt;/strong&gt; — 39 of 130 products (~30%) sit above the average of ~191,650 in cumulative sales&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conditional-Column customer bands&lt;/strong&gt; — Low / Medium / High spending tiers based on the 25th/75th percentile of customer spend (17,343 customers)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conditional-Column sales bands&lt;/strong&gt; — Low / Medium / High per order line based on Sales Amount&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fru1poa68mfdqnwpuurn3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fru1poa68mfdqnwpuurn3.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1vsduibwvj4fffq7ba2c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1vsduibwvj4fffq7ba2c.png" alt=" " width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;Grouping, Pivoting/Unpivoting, Appending, and Merging cover almost everything you need to turn messy multi-table exports into a trustworthy star schema — and once that's in place, a handful of DAX measures is enough to power a complete sales dashboard. If you're learning Power BI, working through all four transformations on a real dataset like AdventureWorks (rather than just one) is the fastest way to actually understand &lt;em&gt;why&lt;/em&gt; each one exists.&lt;/p&gt;

&lt;h1&gt;
  
  
  The Territory
&lt;/h1&gt;

&lt;p&gt;The Mountain-200 family dominates the top of the ranking, led by Mountain-200 Black, 46 at roughly 1.24M in total sales the single highest-selling product/size combination in the catalogue. Road-250 and Road-150 variants fill most of the remaining top-20 slots, with Touring-1000 models appearing further down. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe9o396943cq7l3zvz3yb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe9o396943cq7l3zvz3yb.png" alt=" " width="247" height="115"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  The Calendar Sales
&lt;/h1&gt;

&lt;p&gt;Aggregated across the full 2020–2022 date range, monthly sales climb steadily from January (~2.3M) through a June peak (~3.0M), then drop sharply in July (~1.15M) and stay low through Q3 before recovering toward year-end, closing December at roughly 2.2M. This first-half-heavy, third-quarter-dip pattern is consistent across the three years in the underlying data. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa3ao2tvvakovka4gs8k9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa3ao2tvvakovka4gs8k9.png" alt=" " width="227" height="102"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmjynowai7fy4ge9r6dig.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmjynowai7fy4ge9r6dig.png" alt=" " width="225" height="88"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;*Full write-up with all steps and screenshots: see my &lt;a href="https://1drv.ms/w/c/70201b25f03037d4/IQCfxH5eIuXtSKltpP5bKTA2AaY4gLJKsGtUgg4PeX8eFg8?e=HTC7T2" rel="noopener noreferrer"&gt;https://1drv.ms/w/c/70201b25f03037d4/IQCfxH5eIuXtSKltpP5bKTA2AaY4gLJKsGtUgg4PeX8eFg8?e=HTC7T2&lt;/a&gt; *&lt;/p&gt;

</description>
      <category>powerbi</category>
      <category>dataanlysis</category>
      <category>dax</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>24 Years of Climate Data, Cleaned and Built a Dashboard and Here is the analysis of What I Found</title>
      <dc:creator>GAURANGSURTE</dc:creator>
      <pubDate>Wed, 15 Jul 2026 20:07:59 +0000</pubDate>
      <link>https://dev.to/gaurangsurte/24-years-of-climate-data-cleaned-and-built-a-dashboard-and-here-is-the-analysis-of-what-i-found-34mn</link>
      <guid>https://dev.to/gaurangsurte/24-years-of-climate-data-cleaned-and-built-a-dashboard-and-here-is-the-analysis-of-what-i-found-34mn</guid>
      <description>&lt;p&gt;&lt;strong&gt;Climate change is no longer a prediction&lt;/strong&gt;;&lt;br&gt;
it's something we experience every year. Rising temperatures, increasing sea levels, extreme weather events, and changing forest cover are all interconnected. While reports and datasets contain enormous amounts of information, understanding the relationship between these indicators becomes much easier through interactive visualizations.&lt;/p&gt;

&lt;p&gt;For this project, I built a Climate Change Dashboard in Power BI that combines multiple environmental indicators into a single analytical view. Instead of focusing on one metric, the dashboard brings together temperature trends, carbon emissions, renewable energy adoption, sea level rise, forest coverage, population, and extreme weather events to help identify patterns across countries and over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Why I Built This Dashboard&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Are countries investing more in renewable energy?&lt;/li&gt;
&lt;li&gt;Does higher renewable energy usage always correspond to lower carbon emissions?&lt;/li&gt;
&lt;li&gt;How has average temperature changed over time?&lt;/li&gt;
&lt;li&gt;Which countries experience more extreme weather events?&lt;/li&gt;
&lt;li&gt;Is forest cover changing alongside emissions?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The primary challenge:&lt;/strong&gt; involved selecting visualizations capable of representing multiple environmental indicators without overwhelming users.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Preventing information overload.&lt;/li&gt;
&lt;li&gt;Ensuring readability across multiple countries.&lt;/li&gt;
&lt;li&gt;Balancing analytical depth with dashboard simplicity.&lt;/li&gt;
&lt;li&gt;Data visualization addresses this challenge by presenting multiple variables simultaneously in a structured and interactive format. Rather than displaying numerical values in tables, dashboards enable users to identify trends, compare countries, explore geographical distributions, and investigate the interaction between different environmental factors.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I built a simple dashboard that contains the all required information and relevance with the components of PowerBI with visualization as the image are the simplest but technical things that humans are mastered to figure and identify patterns from them the current tools such as PowerBI does the same with the low efforts and efficient way&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxg6gbplpflzqfvnbgqs4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxg6gbplpflzqfvnbgqs4.png" alt=" " width="799" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Performance Indicators (KPI Cards)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;KPI cards provide an overview of the most important environmental metrics within the dataset.&lt;/p&gt;

&lt;p&gt;The dashboard displays:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Average Temperature&lt;/li&gt;
&lt;li&gt;Sea Level Rise&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These metrics function as summary indicators, allowing users to understand the current state of environmental conditions before exploring detailed visualizations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scatter Plot Analysis&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The scatter chart represents one of the most informative visualizations within the dashboard.&lt;/p&gt;

&lt;p&gt;It establishes a relationship between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Renewable Energy Percentage (X-axis)&lt;/li&gt;
&lt;li&gt;CO₂ Emissions per Capita (Y-axis)&lt;/li&gt;
&lt;li&gt;Population (Bubble Size)&lt;/li&gt;
&lt;li&gt;Year (Animation)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This visualization enables multidimensional analysis by simultaneously displaying four variables.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Line Chart for Temperature Trends&lt;/strong&gt;&lt;br&gt;
Temperature values are visualized using a line chart to represent changes across multiple years.&lt;/p&gt;

&lt;p&gt;Each line corresponds to a country, enabling direct comparison of warming patterns over time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Filled Map for CO₂ Emissions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Geographical visualization is achieved through a filled map representing CO₂ emissions across countries, the map introduces spatial context that cannot be captured using conventional charts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Forest Area Comparison&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Forest coverage is displayed using a horizontal bar chart, countries are ranked according to their forest area percentage, allowing users to compare environmental resources efficiently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decomposition Tree&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The decomposition tree is used to analyze Extreme Weather Events through hierarchical exploration.&lt;/p&gt;

&lt;p&gt;Users can progressively drill down by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Country&lt;/li&gt;
&lt;li&gt;Year&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This transforms static reports into an interactive analytical experience.&lt;/p&gt;

&lt;p&gt;Analytical Interpretation: Trend Analysis, Correlation Analysis, Comparative Analysis, Spatial Analysis, Hierarchical Analysis&lt;/p&gt;

&lt;p&gt;The Climate Change Dashboard illustrates how Business Intelligence tools can be applied to environmental datasets to support data-driven analysis. By integrating multiple climate indicators into a single interactive platform, the dashboard enables users to explore relationships, compare countries, investigate trends, and gain a comprehensive understanding of global environmental changes.&lt;/p&gt;

&lt;p&gt;Rather than functioning as a static reporting system, the dashboard promotes exploratory analysis through interactive filtering, hierarchical drill-down, and multidimensional visualization. This approach not only improves accessibility but also enhances the ability to derive actionable insights from complex climate data.&lt;/p&gt;

&lt;p&gt;Ultimately, the project demonstrates that effective dashboard design is not solely about creating visually appealing charts but about selecting appropriate visualizations that communicate information clearly, support analytical thinking, and facilitate informed decision-making.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
