<?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: MERCY MUMBI WAHOME</title>
    <description>The latest articles on DEV Community by MERCY MUMBI WAHOME (@mercie_wahome_819901ac530).</description>
    <link>https://dev.to/mercie_wahome_819901ac530</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%2F4071766%2Fc1da3ee7-15bb-438d-ba82-9b1b7956506a.png</url>
      <title>DEV Community: MERCY MUMBI WAHOME</title>
      <link>https://dev.to/mercie_wahome_819901ac530</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mercie_wahome_819901ac530"/>
    <language>en</language>
    <item>
      <title>From Raw Data to Business Decisions: Building a Power BI Solution for JCars Logistics</title>
      <dc:creator>MERCY MUMBI WAHOME</dc:creator>
      <pubDate>Sat, 03 Oct 2026 14:07:56 +0000</pubDate>
      <link>https://dev.to/mercie_wahome_819901ac530/from-raw-data-to-business-decisions-building-a-power-bi-solution-for-jcars-logistics-6a1</link>
      <guid>https://dev.to/mercie_wahome_819901ac530/from-raw-data-to-business-decisions-building-a-power-bi-solution-for-jcars-logistics-6a1</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A dashboard can look impressive, but its real value depends on what happens before the first chart is created. For this project, I worked with a raw JCars Logistics dataset containing information on vehicle sales, customers, branches, sales representatives, payments, deliveries, logistics costs, returns, and customer experience. At first glance, it looked like a straightforward dataset ready for analysis. However, a closer look revealed a much bigger challenge: the data was not yet ready to be trusted.&lt;br&gt;
The dataset contained missing values, inconsistent categories, different date formats, unusual figures, spelling variations, mixed currencies, and other quality issues that could easily distort business results. This meant that creating visuals immediately would only make the problems look more attractive rather than solving them.&lt;br&gt;
My goal was not simply to build a Power BI dashboard. I wanted to take the data through a complete journey—from raw information and investigation, through cleaning and modelling, to meaningful analysis and business recommendations. The final solution would help JCars Logistics understand its performance, identify areas requiring attention, and turn its data into evidence that can support better business decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Dataset Understanding&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Once the dataset was loaded, the next step was to understand what I was actually working with. I first looked through the JCars data to understand the type of information available, the meaning of each column, and the questions the data could potentially answer.&lt;br&gt;
The dataset contains information about different cars and their characteristics, including details such as the vehicle make, model, year, mileage, fuel type, transmission, engine specifications and selling price. Each row represents a car listing, while the columns describe different attributes of that listing. This helped me see that the dataset could be used to explore patterns in car prices and understand how different vehicle characteristics relate to the asking price.&lt;br&gt;
I also paid attention to the difference between &lt;strong&gt;categorical&lt;/strong&gt; and &lt;strong&gt;numerical&lt;/strong&gt; fields. For example, make, fuel type and transmission describe categories, while price, mileage and year contain values that can be measured or analysed mathematically. Recognising these differences was important because Power BI handles each type of field differently when creating calculations and visualisations.&lt;br&gt;
This initial exploration also helped me think beyond individual columns. I started considering questions that the final dashboard should answer: &lt;strong&gt;Which cars are listed at higher prices?&lt;/strong&gt; &lt;strong&gt;How does mileage vary across vehicles?&lt;/strong&gt; &lt;strong&gt;Which makes appear most frequently?&lt;/strong&gt; &lt;strong&gt;Does the year of manufacture seem to influence price?&lt;/strong&gt; These questions provided a practical direction for the analysis.&lt;br&gt;
Understanding the dataset became the foundation for the rest of the project.&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%2F5xjonco3eanc32e7q01k.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%2F5xjonco3eanc32e7q01k.png" alt=" " width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Data Quality Investigation&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Before transforming the data, I needed to find out whether there were any problems that could affect the analysis. A dashboard is only as reliable as the data behind it, so I checked the dataset for issues such as &lt;strong&gt;missing values&lt;/strong&gt;, &lt;strong&gt;duplicate records&lt;/strong&gt;, &lt;strong&gt;inconsistent formats&lt;/strong&gt; and &lt;strong&gt;unusual entries&lt;/strong&gt;. This was important because even a well-designed visual can give misleading results if the underlying data is incomplete or inconsistent.&lt;br&gt;
There are blank cells in 21 of the 32 columns. The most frequent blanks are in Returned, Review Count, Discount, Vehicle Year, and Customer Rating. Dates and sales values, also contain blanks.&lt;br&gt;
The Order ID field has 257 distinct values across 276 rows, and some IDs repeat. Several entries are &lt;strong&gt;placeholders&lt;/strong&gt; such as &lt;strong&gt;N/A&lt;/strong&gt; or &lt;strong&gt;-&lt;/strong&gt;, so the repeated values need to be checked before using Order ID to count orders.&lt;br&gt;
The file also &lt;strong&gt;mixes formats&lt;/strong&gt; in ways that Power BI may not interpret consistently. Order and delivery dates appear in several formats, including written dates, day/month/year dates, Excel-style serial numbers, and invalid or unclear entries. Price and cost fields mix plain numbers with currency labels, commas, abbreviated values such as 4.2M, and text such as not available, missing, or #VALUE!. Discounts mix percentage signs, decimals, words, and values such as 120%.&lt;br&gt;
Category labels are inconsistent, for example, fuel type includes Petrol, PETROL, Gasoline, and PMS; transmission includes Automatic, AUTO, AT, and A/T. Make, region, status, and other categories also vary in &lt;strong&gt;spelling&lt;/strong&gt; and &lt;strong&gt;capitalization&lt;/strong&gt;. Some apparent variants may mean the same thing, but they should be reviewed before being combined.&lt;br&gt;
I also found values that need &lt;strong&gt;investigation&lt;/strong&gt; rather than automatic deletion. Vehicle Year includes text entries, 1899, and 2032. Customer Rating includes -1, 6, and Excellent, alongside numeric ratings and missing markers. Units Sold includes text such as two and 3 cars, as well as 0 and -1. These values can’t be treated as ordinary numeric entries without checking what they represent.&lt;br&gt;
This check gave me a clearer picture of what needs attention before building the report: &lt;strong&gt;standardise formats&lt;/strong&gt; and categories, decide how to handle missing or invalid values, and confirm which unusual entries are errors. I should keep the original data intact while investigating so I can make and explain those decisions carefully.&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%2Fm3djbznt4y0stbss8318.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%2Fm3djbznt4y0stbss8318.png" alt=" " width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Data Cleaning&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;After preparing the JCars data for review, I began cleaning it in Power Query, working through the columns. The goal was to make values consistent and usable in Power BI while keeping uncertain information available for review.&lt;br&gt;
I started with text fields. &lt;strong&gt;Trim&lt;/strong&gt; removes extra spaces at the beginning or end of a value, while &lt;strong&gt;Clean&lt;/strong&gt; removes hidden characters. These steps help Power BI recognise matching labels consistently. I applied them to fields such as Order ID, customer and location details, lead source, vehicle information, fuel type, transmission, and color.&lt;br&gt;
I checked that each column had a &lt;strong&gt;suitable data type&lt;/strong&gt;. Order IDs, names, and categories are text. Customer Age and valid Units Sold values are &lt;strong&gt;whole numbers&lt;/strong&gt;. I kept Order Date and Delivery Date as &lt;strong&gt;text&lt;/strong&gt; for now because they contain mixed date formats, Excel-style serial numbers, blanks, and unclear entries. Vehicle Year also needs review before conversion because it contains text and unusual values.&lt;br&gt;
I checked for duplicates before removing any records. The file contains no exact duplicate rows—no rows where every field is identical. However, some Order ID values repeat, and some IDs are placeholders such as N/A or -. Removing duplicates based on Order ID alone could delete records that contain different information, so I kept these rows for review.&lt;br&gt;
I also made &lt;strong&gt;capitalization&lt;/strong&gt; consistent where appropriate. This improves the appearance of labels, but it doesn’t correct misspellings or prove that two different labels mean the same thing. Possible variants in fields such as Region, County, City, Car Make, Fuel Type, and Transmission need to be verified before they are combined. Names and model codes also need care because automatic capitalization can change how they should appear.&lt;br&gt;
I reviewed blanks and placeholder text such as N/A, NULL, and -. When a value clearly meant that information was missing, it could be treated as blank. I kept &lt;strong&gt;unclear entries&lt;/strong&gt; for review instead of guessing. A blank can mean different things in different columns, so I need to consider the field before deciding how to handle it.&lt;br&gt;
I checked numerical values against what each field represents. Customer Age includes values such as -5 and 121, so I &lt;strong&gt;filtered&lt;/strong&gt; the data to keep ages from 20 to 65, inclusive. Vehicle Year includes entries such as Twenty Twenty, 202A, 1899, and 2032. Units Sold includes text such as two and 3 cars, as well as 0 and -1. I flagged these for review rather than changing them without checking the source.&lt;br&gt;
When a data type conversion produces an error, the value needs to be checked before the row is removed. If I can verify and correct the source value, I can try the conversion again. If it remains uncertain, I can leave it flagged or treat it as missing where appropriate. Removing &lt;strong&gt;errors or blank rows&lt;/strong&gt; should only happen after checking what information would be lost.&lt;br&gt;
These cleaning steps made the data easier to work with while preserving records that still need investigation. The mixed date formats, placeholder IDs, and uncertain spelling or numerical variants remain items to verify before they are used in analysis.&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%2Fgkme84d0rbp5m470azw2.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%2Fgkme84d0rbp5m470azw2.png" alt=" " width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Data Modelling&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;After cleaning the JCars data, I checked how the table was set up for analysis in Power BI. Each row represents a sales record, and the file currently has one table. That means I don’t need to create relationships between tables at this stage.&lt;br&gt;
I also considered how Power BI should handle each field. Order ID identifies a &lt;strong&gt;record&lt;/strong&gt;, so adding its values together would have no meaning. Units Sold can be &lt;strong&gt;summed&lt;/strong&gt; to show the number of cars sold, while Customer Age can be &lt;strong&gt;averaged&lt;/strong&gt; to compare the ages of customers. Choosing these settings helps prevent Power BI from producing totals that don’t describe the data accurately.&lt;br&gt;
The data model will become more useful as I clean the remaining fields, especially prices, costs, discounts, dates, and revenue. Those columns need &lt;strong&gt;reliable values&lt;/strong&gt; and &lt;strong&gt;suitable data types&lt;/strong&gt; before I use them in calculations. For now, I set the fields I had cleaned to behave appropriately and kept the JCars table ready for the next stage of the project.&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%2Fnxrgx3rof8jrt3lnuigg.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%2Fnxrgx3rof8jrt3lnuigg.png" alt=" " width="799" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Building the First Visuals&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I started building visuals to make the information easier to understand. The first question I wanted the report to answer was how many vehicles were sold in total. From there, I could compare the number of units sold across car makes and explore how the results varied by region or vehicle characteristics.&lt;br&gt;
I began with a Total Units Sold card. A card is useful for a headline figure because it presents one important number clearly. I used the Units Sold field and set it to &lt;strong&gt;Sum&lt;/strong&gt;, so Power BI adds the recorded quantities together. This gives a total of units, rather than simply counting how many rows are in the table.&lt;br&gt;
I then created a &lt;strong&gt;bar chart&lt;/strong&gt; to compare units sold by car make. The &lt;strong&gt;length of each bar&lt;/strong&gt; makes it easy to see which makes have larger or smaller totals. Before using this chart to draw conclusions, I need to make sure each make is represented consistently. &lt;br&gt;
To make the report interactive, I added a &lt;strong&gt;Region slicer&lt;/strong&gt;. A slicer lets the reader choose a region and see the connected visuals update. This gives the reader a way to explore the data without changing the report itself. Vehicle Type, Fuel Type, Transmission, and Vehicle Year can also be used as slicers once their values have been reviewed for consistency.&lt;br&gt;
I kept the page focused on a few visuals with clear purposes: the card &lt;strong&gt;summarises&lt;/strong&gt; the total, the bar chart &lt;strong&gt;compares&lt;/strong&gt; categories, and the slicer helps explore the results. I also checked that the chart and card responded to the slicer selection. This helped confirm that the fields were placed correctly and that the report was filtering as expected.&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%2Faejh8nbm47zg0z8149or.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%2Faejh8nbm47zg0z8149or.png" alt=" " width="800" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Reviewing the Regional Sales Visual&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;With the region names beside the bars, I could compare the sales totals by location directly. Each bar represents one region, and its length shows the sum of Units Sold there. The Total Units Sold card gives me an overall figure to compare with the regional breakdown.&lt;br&gt;
I then used the Region slicer to explore the report. Selecting a region filters the chart and card to that selection; clearing it returns the report to the overall view. This made it easier to focus on one location while keeping the wider picture available.&lt;br&gt;
Before describing what I found, I checked that the chart was grouped by Region, that Units Sold was summarised by Sum, and that the region names were readable. I can now use the chart to identify which regions have higher or lower totals and record those observations from the values shown in Power BI.&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%2Fqfmw7nsxjvi2dihhv8ss.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%2Fqfmw7nsxjvi2dihhv8ss.png" alt=" " width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Analysis&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The dashboard provides an opportunity to examine the business from several perspectives. The purpose of the analysis is to understand the relationships and patterns within the data and what they may indicate about the company's sales and operational performance.&lt;br&gt;
The first area of analysis is &lt;strong&gt;sales volume and revenue&lt;/strong&gt;. Total Units Sold provides an indication of the number of vehicles sold, while Total Revenue measures the financial value generated from those sales. Examining these measures together gives a clearer picture of sales performance than either measure on its own. A high number of units sold does not necessarily translate into the highest revenue, particularly where vehicle prices differ substantially between categories. Therefore, the dashboard should be used to compare sales volume with revenue across vehicle types, regions, and time periods.&lt;br&gt;
The second area is &lt;strong&gt;profitability&lt;/strong&gt;. Gross Profit and Gross Margin % provide a deeper financial perspective by showing what the business retains after relevant costs and how efficiently revenue is converted into gross profit. This distinction is important because strong revenue performance does not automatically indicate strong profitability. A segment may generate considerable sales while operating with a relatively narrow margin. Analysing revenue alongside gross profit and gross margin therefore helps identify areas where sales activity and financial returns do not necessarily move together.&lt;br&gt;
&lt;strong&gt;Regional performance&lt;/strong&gt; is another important part of the analysis. The Western Revenue measure allows the performance of the Western region to be examined specifically and compared with other regions. Differences between regions may reflect variations in customer demand, vehicle availability, pricing, market size, or other business factors. The dashboard does not by itself establish the cause of these differences, but it provides evidence of where further investigation should be concentrated.&lt;br&gt;
The analysis also considers &lt;strong&gt;performance over time&lt;/strong&gt;. Trends in units sold and revenue can reveal periods of growth, decline, or fluctuations in business activity. Looking at these trends can help distinguish an isolated change from a recurring pattern. Where substantial changes are visible, additional analysis of vehicle categories, regions, or operational indicators can help determine what factors coincide with the change&lt;br&gt;
The dashboard provides an opportunity to connect &lt;strong&gt;sales performance with operational outcomes&lt;/strong&gt;. Delivery status, returns, and cancellations can be examined alongside sales and financial measures. This is important because the completion of a sale is only one part of the customer journey. Patterns in cancellations, returns, or delivery performance may indicate areas requiring operational attention and can provide useful context when interpreting overall business performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Insights and Recommendations&lt;/strong&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Measured Insights&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;JCars recorded a strong overall gross profit position.&lt;br&gt;
The business generated &lt;strong&gt;total sales revenue&lt;/strong&gt; of approximately KES 8.21 billion from 255 transactions and 446 units sold. Total recorded cost was approximately KES 1.36 billion, resulting in a gross profit of KES 6.85 billion and a gross profit margin of 83.39%. The figures show that the recorded sales generated substantially more revenue than the associated costs.&lt;br&gt;
Revenue was spread across multiple vehicle models rather than being dominated by one model.&lt;br&gt;
The &lt;strong&gt;Toyota Corolla&lt;/strong&gt; and &lt;strong&gt;Mazda Demio&lt;/strong&gt; each contributed 4.5% of total revenue. The Corolla generated approximately KES 83,600 per car, showing that model-level performance can differ from simply looking at total units sold. Comparing revenue and profitability by vehicle model can therefore provide a more meaningful view of the sales mix.&lt;br&gt;
Revenue per car varied across locations.&lt;br&gt;
&lt;strong&gt;Nairobi HQ&lt;/strong&gt; recorded the highest revenue per car at approximately KES 78,300, followed by Mombasa at KES 74,900 and Athi River at KES 72,300. The difference indicates that location-level performance is not uniform and that factors such as pricing, vehicle mix and customer demand may be influencing revenue generated per vehicle.&lt;br&gt;
&lt;strong&gt;NGOs&lt;/strong&gt; were the most active customer segment by number of orders.&lt;br&gt;
NGOs recorded the highest number of orders, with 58 orders. This makes the segment an important part of JCars' customer base and highlights the value of analysing customer categories separately. However, order volume should also be compared with revenue and profit to determine the financial contribution of each segment.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Recommendations&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Use &lt;strong&gt;profit-based performance measures&lt;/strong&gt; when evaluating sales.&lt;br&gt;
JCars should avoid relying on sales volume or revenue alone when assessing performance. With KES 6.85 billion in gross profit and an 83.39% gross margin, management should continue monitoring revenue alongside costs and gross profit to identify sales that create the greatest financial value.&lt;br&gt;
Develop a &lt;strong&gt;vehicle-level performance strategy&lt;/strong&gt;.&lt;br&gt;
JCars should regularly compare each vehicle model using units sold, revenue per car, total revenue and profit margin. Since the Corolla and Demio each account for 4.5% of revenue, model-level analysis can help management identify which vehicles are generating stronger returns and make better-informed purchasing and sales decisions.&lt;br&gt;
Investigate and address location-level performance differences.&lt;br&gt;
The difference between Nairobi HQ's KES 78,300, Mombasa's KES 74,900 and Athi River's KES 72,300 revenue per car should be investigated further. Management should examine pricing, vehicle mix, customer composition and operating costs at each location and use the findings to improve lower-performing areas.&lt;br&gt;
Strengthen &lt;strong&gt;relationships with high-activity customer segments&lt;/strong&gt;.&lt;br&gt;
Since NGOs generated the highest number of orders at 58, JCars should maintain and develop this customer segment while also examining the revenue and profit generated from it. Customer-segment dashboards can help identify repeat customers, high-value accounts and opportunities for targeted sales or partnership strategies.&lt;br&gt;
Use the dashboard for &lt;strong&gt;continuous performance monitoring&lt;/strong&gt;.&lt;br&gt;
The Power BI dashboard should not be treated only as an assessment deliverable. JCars can use the same approach to monitor revenue, costs, profit margin, vehicle performance, location performance and customer activity on a regular basis. Updating these measures over time would allow management to identify changes early and make decisions based on current business performance rather than relying solely on historical reports.&lt;/p&gt;

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

&lt;p&gt;The JCars Logistics analysis demonstrates the value of turning raw data into a clear business story. By cleaning the dataset, building a structured data model, creating meaningful DAX measures and presenting the results through an interactive Power BI dashboard, complex business information became easier to understand and act on. The findings provide JCars with a clearer view of its revenue, profitability, vehicle performance, locations and customer activity. The project shows how data analytics can move a business from simply recording transactions to using those transactions to support better, evidence-based decisions.&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>data</category>
      <category>software</category>
    </item>
    <item>
      <title>Power BI: Data Modelling, Relationships and Joins</title>
      <dc:creator>MERCY MUMBI WAHOME</dc:creator>
      <pubDate>Sun, 20 Sep 2026 13:07:38 +0000</pubDate>
      <link>https://dev.to/mercie_wahome_819901ac530/power-bi-data-modelling-relationships-and-joins-pij</link>
      <guid>https://dev.to/mercie_wahome_819901ac530/power-bi-data-modelling-relationships-and-joins-pij</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;When I first approached a health dataset in Power BI, I was more interested in the dashboard than the structure behind it. I wanted to create visuals that could answer practical questions such as: &lt;strong&gt;How many patients visited each facility? Which health services were most used? How did patient visits change over time? Which locations recorded the highest activity?&lt;/strong&gt;&lt;br&gt;
I quickly realised that creating a chart was only part of the job. For a visual to answer a question accurately, the data underneath it must also be organised correctly. If tables are poorly structured or relationships are incorrect, a dashboard can look professional while still producing misleading results. This made data modelling an important part of my Power BI project.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Data Modelling&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Data modelling involves organising tables and defining how they connect so that Power BI can correctly interpret and analyse the information. A good model supports accurate calculations, simpler DAX, efficient filtering, better performance and easier maintenance. I therefore began looking at my health dataset not just as rows and columns, but as information representing real-world events and entities. A patient visit, for example, is an event, while a patient, health facility, service or date provides descriptive information about that event.&lt;br&gt;
This article follows my process of turning that health data into a model that can support reliable reporting. I explore fact and dimension tables, grain, flat, star and snowflake schemas, keys, relationships, cardinality, filter direction and referential integrity. I also examine Power Query Merge Queries and the six major join types, while explaining why a join is not the same thing as a Power BI relationship.&lt;br&gt;
The goal is ultimately simple, to build a data model that allows the dashboard visuals to answer health-related questions accurately and flexibly.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Starting with Data Modelling&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Before creating relationships or choosing a schema, I needed to understand what I was actually modelling. For this project, I used a simplified healthcare dataset built around patient visits. The information could be organised into tables such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FactVisits&lt;/strong&gt; – records individual patient visits and numerical information such as visit count or service cost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DimPatient&lt;/strong&gt; – contains patient-related descriptive information.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DimFacility&lt;/strong&gt; – contains health facility information.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DimService&lt;/strong&gt; – describes the health services provided.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DimDate&lt;/strong&gt; – contains dates, months, quarters and years.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DimLocation&lt;/strong&gt; – contains geographical information such as county and sub-county.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This immediately gave me an important modelling question: What should each table represent, and how should the tables communicate with one another? A poor model could result in duplicated information, confusing relationships, inaccurate totals and complicated DAX calculations. It could also make the report harder to expand when new facilities, services or dates are added.&lt;br&gt;
A good model, on the other hand, gives Power BI a clear structure. It also makes visualisation more flexible. For example, I should be able to select a facility from a slicer and have the relevant patient visits and services update automatically.&lt;/p&gt;

&lt;p&gt;A structured data model serves as the foundation for comprehensive analysis, driving success in crucial areas such as:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Accurate Reporting&lt;/strong&gt; – Ensures that visuals and figures reflect the underlying data correctly, reducing errors and misleading results.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DAX Calculations&lt;/strong&gt; – Well-connected tables make it easier to create reliable measures and calculations without unnecessarily complicated formulas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt; – A properly structured model helps Power BI process queries efficiently, allowing dashboards and reports to respond faster.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt; – A good model can accommodate additional patients, facilities, services, and transactions as the health dataset grows without requiring a complete redesign.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintainability&lt;/strong&gt; – Clearly organised tables and relationships make the model easier to understand, troubleshoot, update, and manage over time.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;From a Flat Table to a Data Model&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I started with the idea of storing all the health information in one flat table, where each row contained details about a patient visit, including the patient, facility, service, date, location and cost. Although this approach is simple, information such as facility names and service descriptions would be repeated every time a patient visited.&lt;br&gt;
To make the data easier to analyse and maintain, I moved from a flat table to a structured data model. Instead of keeping everything in one table, the information is separated into a FactVisits table containing the actual visit records and several dimension tables containing descriptive information about patients, facilities, services, dates and locations.&lt;br&gt;
These tables are then connected using keys and relationships. This approach reduces unnecessary duplication and provides a clearer structure for Power BI to filter data, perform DAX calculations and create accurate, flexible visualisations.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Fact Tables, Dimension Tables and Grain&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Once I moved away from the flat table, the next question was how to organise the information. In this health dataset, I separated the data into a central FactVisits table and several dimension tables.&lt;br&gt;
The FactVisits table records the actual events taking place. Each row represents a patient visit and contains measurable information such as the number of visits and cost, together with keys that connect the record to the relevant patient, facility, service and date.&lt;br&gt;
An important concept here is grain, which defines exactly what one row in the fact table represents. For this model, the grain is one patient visit for a particular service, facility and date. Defining the grain clearly helps prevent double-counting and ensures that calculations and visualisations represent the health activity accurately.&lt;br&gt;
The resulting structure can therefore be viewed as:&lt;br&gt;
&lt;strong&gt;DimPatient → FactVisits ← DimFacility&lt;br&gt;
DimService → FactVisits ← DimDate&lt;br&gt;
DimLocation → FactVisits&lt;/strong&gt;&lt;br&gt;
This creates the foundation of a star schema, where the fact table sits at the centre and the dimension tables provide descriptive context around it.&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%2Fep246rcz8dj7onzomenb.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%2Fep246rcz8dj7onzomenb.png" alt=" " width="800" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Relationships in Power BI&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;After separating the health data into fact and dimension tables, the next step was to connect them. In Power BI, a &lt;strong&gt;relationship&lt;/strong&gt; defines how two tables are linked using a common key. This is important because the information needed for analysis is often distributed across different tables rather than stored in one place.&lt;br&gt;
In my model, &lt;strong&gt;FactVisits&lt;/strong&gt; contains the actual patient visit records, while the dimension tables provide additional context. Connecting these tables allows Power BI to identify which patient each visit belongs to without repeatedly storing the patient's name and other details in the fact table.&lt;br&gt;
The same approach is used for facilities, services, dates and locations. The dimension tables contain &lt;strong&gt;unique primary keys&lt;/strong&gt;, while the fact table contains the corresponding &lt;strong&gt;foreign keys&lt;/strong&gt;, which may appear multiple times because the same patient, facility or service can be associated with many visits.&lt;br&gt;
These relationships allow filters and calculations to move between the tables. For example, selecting a particular facility can filter the visits recorded for that facility, allowing a visual to show the number of visits or total cost associated with it.&lt;br&gt;
For this health dataset, the relationships form a &lt;strong&gt;star schema&lt;/strong&gt;, with FactVisits at the centre and the dimension tables surrounding it. This structure keeps the model organised and makes it easier to create accurate and flexible reports.&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%2Fbne2ts4diwozlhi2y0xv.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%2Fbne2ts4diwozlhi2y0xv.png" alt=" " width="800" height="368"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Cardinality&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;With the relationships established, I then considered &lt;strong&gt;cardinality&lt;/strong&gt;, which describes how many records in one table can relate to records in another table. Understanding cardinality is important because it determines how Power BI interprets the connections between tables.&lt;br&gt;
The most common types are &lt;strong&gt;one-to-many (1:*)&lt;/strong&gt;, &lt;strong&gt;one-to-one (1:1)&lt;/strong&gt; and &lt;strong&gt;many-to-many (&lt;em&gt;:&lt;/em&gt;)&lt;/strong&gt;.&lt;br&gt;
In my health data model, the main relationship is &lt;strong&gt;one-to-many (1:*)&lt;/strong&gt;. For example, one patient appears once in DimPatient, but that patient can have many records in FactVisits. Similarly, one facility can have many patient visits, and one service can be recorded across many visits. This makes the 1:* relationship appropriate for the star schema.&lt;br&gt;
A &lt;strong&gt;one-to-one (1:1)&lt;/strong&gt; relationship means that each record in one table corresponds to only one record in another table. This can occur when information about the same entity has been separated into two tables, although combining the information may sometimes be simpler.&lt;br&gt;
A &lt;strong&gt;many-to-many (&lt;em&gt;:&lt;/em&gt;)&lt;/strong&gt; relationship occurs when multiple records on both sides can correspond to multiple records on the other side. For example, if patients could be associated with multiple health programmes and each programme could include multiple patients, a many-to-many relationship would exist. In Power BI, these relationships need to be handled carefully because they can create ambiguous filtering and unexpected results.&lt;br&gt;
For this dataset, &lt;strong&gt;one-to-many relationships are the natural choice&lt;/strong&gt; because the dimension tables contain unique identifiers while the fact table records repeated business events.&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%2Fa5ofrsh4x7nollkhtcuj.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%2Fa5ofrsh4x7nollkhtcuj.png" alt=" " width="799" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Active and Inactive Relationships&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A relationship in Power BI can be either &lt;strong&gt;active or inactive&lt;/strong&gt;. An active relationship is the default connection Power BI uses when filtering data and performing calculations. Inactive relationships are created when there is more than one possible relationship between the same tables, but only one can normally be active at a time.&lt;br&gt;
A common example involves dates. A health organisation may want to analyse visits using both the &lt;strong&gt;visit date&lt;/strong&gt; and a &lt;strong&gt;follow-up date&lt;/strong&gt;. Both dates could connect to the same DimDate table. Power BI can keep one relationship active and the other inactive to avoid ambiguity.&lt;br&gt;
In my model, the current DimDate to FactVisits relationship is active because DateID represents the date of the patient visit. If another date were added, such as a follow-up date, that second relationship could be inactive and activated only when specifically required in a DAX calculation.&lt;br&gt;
This approach allows the same date dimension to support different types of date analysis without creating unnecessary tables or ambiguous filter paths.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Referential Integrity&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Referential integrity means that the keys used to connect related tables should correctly correspond. In this health model, every foreign key in FactVisits should have a matching primary key in its related dimension table.&lt;br&gt;
For example, if FactVisits contains FacilityID = F001, then F001 must exist in DimFacility. If a visit contains a facility ID that does not exist in the dimension table, Power BI may not be able to associate that visit with the correct facility. This can lead to blank categories, incorrect filtering or unexpected results in reports.&lt;br&gt;
Maintaining referential integrity therefore improves the reliability of the data model. Before creating relationships, I would check that the IDs in the fact table have corresponding values in the dimension tables. This is particularly important in health reporting, where inaccurate or unmatched records could affect the interpretation of service utilisation and facility performance.&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%2Fyf87pv2q8lptiru2k9sj.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%2Fyf87pv2q8lptiru2k9sj.png" alt=" " width="645" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Filter Direction&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;After creating the relationships, I also needed to consider filter direction, which determines how filters move between related tables. In Power BI, filters can generally flow in one direction or in both directions.&lt;br&gt;
For this health model, I used &lt;strong&gt;Single&lt;/strong&gt; filter direction. This means a filter flows from the dimension table to the fact table. For example, if I select &lt;strong&gt;Nanyuki County Hospital&lt;/strong&gt; from &lt;code&gt;DimFacility&lt;/code&gt;, Power BI filters FactVisits to show only the visits associated with that facility.&lt;br&gt;
This approach works well with a star schema because the dimension tables provide descriptive context while the fact table contains the events being analysed. It also keeps the model easier to understand and reduces the risk of creating ambiguous filter paths.&lt;br&gt;
A &lt;strong&gt;Both&lt;/strong&gt; or bidirectional filter allows filters to travel in both directions between tables. Although this can be useful in specific situations, it should be used carefully. In a larger model, bidirectional filtering can create multiple paths through which a filter can travel, potentially producing ambiguity and unexpected results.&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%2Fu2qbolow9op877aolx1a.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%2Fu2qbolow9op877aolx1a.png" alt=" " width="705" height="613"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;A Join Is Not a Relationship&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Although both a join and a relationship connect tables, they serve different purposes and happen at different stages of working with data.&lt;br&gt;
A &lt;strong&gt;join&lt;/strong&gt; is used in &lt;strong&gt;Power Query&lt;/strong&gt; to combine data from two tables based on a matching column. For example, I could merge &lt;strong&gt;FactVisits&lt;/strong&gt; with &lt;strong&gt;DimFacility&lt;/strong&gt; using &lt;strong&gt;FacilityID&lt;/strong&gt; to bring the facility name into the visit data. The result is a physically combined table containing columns from both sources.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;relationship&lt;/strong&gt;, on the other hand, is created in the &lt;strong&gt;Power BI data model&lt;/strong&gt;. It does not physically combine the tables. Instead, it tells Power BI how the tables are connected so that filters, calculations and visualisations can work across them.&lt;br&gt;
This distinction is important because merging everything into one table can create unnecessary duplication and make the model harder to maintain. Keeping fact and dimension tables separate and connecting them through relationships is often more appropriate for a star schema.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;1. Left Outer Join&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;It keeps all records from the left table and adds matching records from the right table. If there is no match, the right-side information is returned as blank.&lt;br&gt;
Using the health facility example, &lt;strong&gt;Facilities&lt;/strong&gt; is the left table and &lt;strong&gt;FacilityInspections&lt;/strong&gt; is the right table. The result keeps all four facilities, while inspection information is added where a matching FacilityID exists.&lt;br&gt;
Therefore, F001 and F002 receive their inspection status, while F003 and F004 remain in the result with blank inspection information. This type of join is useful when the records in the left table must be retained regardless of whether matching information exists in another 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%2Flk1yd56nhe02de4uzn2z.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%2Flk1yd56nhe02de4uzn2z.png" alt=" " width="697" height="623"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;2. Right Outer Join&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;It keeps all records from the right table and adds matching records from the left table. This join is useful when the right-hand table represents the records that must all be preserved.&lt;br&gt;
The Left and Right Anti joins are particularly useful for data-quality checks because they can identify records that exist in one dataset but are missing from another.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;3. Inner Join&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;It keeps all records from the right table and adds matching records from the left table. This is useful when the analysis requires only records that exist in both datasets.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;4. Full Outer Join&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;It keeps every record from both tables. Matching records are combined, while unmatched records from either table are retained with blank values on the opposite side.&lt;br&gt;
In this example, the result would contain F001, F002, F003, F004 and F005. This provides a complete view of facilities appearing in either dataset.&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%2Fp0ohxwht9yam6b9trj8w.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%2Fp0ohxwht9yam6b9trj8w.png" alt=" " width="800" height="210"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;5. Left Anti Join&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This returns records that exist in the left table but have &lt;strong&gt;no matching record&lt;/strong&gt; in the right table.&lt;br&gt;
Using the facility data, F003 and F004 would be returned because they exist in Facilities but not in FacilityInspections.&lt;br&gt;
This type of join is particularly useful for &lt;strong&gt;data-quality checks&lt;/strong&gt;, such as identifying facilities that have not yet appeared in an inspection dataset.&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%2Ffx8eo5x42s7xqe6340ul.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%2Ffx8eo5x42s7xqe6340ul.png" alt=" " width="800" height="78"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;6. Right Anti Join&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;It returns records that exist in the right table but have &lt;strong&gt;no matching record&lt;/strong&gt; in the left table.&lt;br&gt;
In this example, F005 would be returned because it appears in FacilityInspections but does not exist in Facilities.&lt;br&gt;
This can help identify records that need investigation before being incorporated into a reporting model.&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%2F7igldqbf3hyt90l5u0nm.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%2F7igldqbf3hyt90l5u0nm.png" alt=" " width="572" height="88"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Where Merge Queries Fits into the Data Model&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Merge Queries&lt;/strong&gt; belongs to the &lt;strong&gt;Power Query stage&lt;/strong&gt;, before the data reaches the final Power BI model. It is useful when columns from one table need to be brought into another table as part of data preparation.&lt;br&gt;
Not every table needs to be merged. In my health dataset, keeping &lt;strong&gt;FactVisits&lt;/strong&gt; and the dimension tables separate allows the model to retain a clear star-schema structure. A relationship can then connect the tables without physically duplicating their columns.&lt;br&gt;
I would use Merge Queries when data needs to be transformed or combined, but use relationships when separate tables need to work together during analysis. Excessive merging could create wider tables, duplicate information and make the model more difficult to maintain.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Model That Fits the Data Set&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;After comparing the different modelling approaches and applying relationships and joins to the health dataset, I selected a &lt;strong&gt;star schema&lt;/strong&gt; as the final model. The reason is that the dataset is centred around patient visits, making &lt;code&gt;FactVisits&lt;/code&gt; a natural fact table surrounded by descriptive dimensions.&lt;br&gt;
The model contains &lt;strong&gt;FactVisits&lt;/strong&gt; at the centre, connected directly to &lt;strong&gt;DimPatient&lt;/strong&gt;, &lt;strong&gt;DimFacility&lt;/strong&gt;, &lt;strong&gt;DimService&lt;/strong&gt;, &lt;strong&gt;DimDate&lt;/strong&gt; and &lt;strong&gt;DimLocation&lt;/strong&gt;. The fact table stores measurable events such as visit count and cost, while the dimensions provide the context needed to analyse those events.&lt;br&gt;
The star structure also makes the model easier to understand. Each dimension has a unique key, while the corresponding key can appear multiple times in &lt;code&gt;FactVisits&lt;/code&gt;, creating one to many relationships. Filters flow from the dimensions towards the fact table using single-direction filtering.&lt;br&gt;
This structure supports &lt;strong&gt;DAX calculations&lt;/strong&gt;, &lt;strong&gt;report creation&lt;/strong&gt; and &lt;strong&gt;filter propagation&lt;/strong&gt; without requiring all the information to be physically combined into one table. It also reduces unnecessary duplication and makes the model easier to maintain if additional facilities, services or visits are added later.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;flat table&lt;/strong&gt; would be simpler initially but would contain repeated descriptive information. A &lt;strong&gt;snowflake schema&lt;/strong&gt; could further separate dimensions into additional related tables, but that would introduce more relationships and complexity than this relatively straightforward dataset requires. The star schema therefore provides a clear balance between simplicity, performance, scalability and maintainability for this analysis.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Dashboard Visualisation&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I could now use Power BI visuals to answer practical questions from the health data. The purpose of a dashboard is not simply to display charts, but to present information in a way that makes patterns and comparisons easy to understand.&lt;br&gt;
For this dataset, the visuals can answer questions such as: &lt;strong&gt;How many visits were recorded? Which facilities had the most visits? Which services were most used? How did visits change over time?&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%2Fxhalzqz3wibrzgcfswe0.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%2Fxhalzqz3wibrzgcfswe0.png" alt=" " width="485" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The data model makes these visuals interactive. For example, selecting a facility or service can automatically filter the relevant visit records through the established relationships. This demonstrates how good data modelling supports accurate and flexible dashboard visualisation.&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%2Fxhclku3fsj8iywhkg4a1.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%2Fxhclku3fsj8iywhkg4a1.png" alt=" " width="631" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Lessons Learned&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This project taught me that effective data analysis starts with a well-structured model, not the visual itself. I learned how identifying the grain of a fact table, separating facts from dimensions, and creating the right relationships can improve the accuracy and clarity of a report.&lt;br&gt;
I also gained a practical understanding of the difference between &lt;strong&gt;Power Query joins and Power BI relationships&lt;/strong&gt;. Testing the different join types helped me see how data can be combined during preparation, while relationships allow separate tables to work together during analysis.&lt;br&gt;
Coming from a public-health background, I found it useful to connect technical concepts to real health information. I could see how a well-designed model can turn records about patients, facilities, services and dates into information that is easier to interpret and use.&lt;br&gt;
My biggest takeaway is that a good dashboard begins with good data modelling. When the foundation is accurate and organised, analysis becomes clearer, more flexible and more reliable.&lt;/p&gt;

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

&lt;p&gt;This project has given me more confidence in using Power BI and has made data analytics feel more practical and achievable. I am beginning to see how I can combine what I already know about health with the technical skills I am developing. This experience has encouraged me to keep learning and to explore how I can use data to solve real problems and create meaningful insights in my future work.&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>data</category>
      <category>database</category>
      <category>learning</category>
    </item>
    <item>
      <title>Building an Interactive Excel Dashboard for E-commerce Product Analysis: A Case Study of Jumia Products</title>
      <dc:creator>MERCY MUMBI WAHOME</dc:creator>
      <pubDate>Mon, 07 Sep 2026 15:38:33 +0000</pubDate>
      <link>https://dev.to/mercie_wahome_819901ac530/building-an-interactive-excel-dashboard-for-e-commerce-product-analysis-a-case-study-of-jumia-53gi</link>
      <guid>https://dev.to/mercie_wahome_819901ac530/building-an-interactive-excel-dashboard-for-e-commerce-product-analysis-a-case-study-of-jumia-53gi</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Introduction: Turning Jumia Product Data into Business Insights&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;E-commerce platforms generate a lot of product data, but raw numbers become useful only when they can support better decisions. For Jumia sellers, prices, discounts, ratings and customer reviews can provide clues about product performance, customer engagement and possible pricing strategies.&lt;br&gt;
For this project, I worked with a dataset of 112 Jumia products to explore these relationships using Microsoft Excel. I wanted to find out whether higher discounts are associated with more customer reviews, whether highly rated products receive stronger engagement, and whether product price is related to rating. I also wanted to identify the products performing best and those that may require a different pricing or marketing approach. I followed a complete data-analysis workflow:&lt;/p&gt;

&lt;p&gt;Raw Data → Cleaning → Transformation → Analysis → Visualization → Insights → Recommendations&lt;/p&gt;

&lt;p&gt;The project uses Excel Tables, Power Query, formulas and functions, PivotTables, PivotCharts, slicers and dashboard techniques. This article documents that process and shows how the raw Jumia data was transformed into an interactive dashboard and, ultimately, evidence-based business recommendations.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Understanding the Dataset and Its Initial Problems&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Before cleaning the data, I first needed to understand what I was working with. The dataset contains 112 Jumia products and six main fields: Product, Current Price, Old Price, Discount, Review and Rating. Current Price and Old Price represent product pricing, Discount captures the promotional percentage, Review represents the number of customer reviews, while Rating records the average customer rating out of 5. I treated this stage as a data-quality audit rather than immediately changing anything. The purpose was to identify issues that could affect calculations and visualizations later.&lt;br&gt;
The raw dataset contained formatting and consistency issues that needed attention, particularly around numerical fields. Prices could contain currency symbols or unnecessary characters, while ratings and review counts needed to be standardized into usable numerical values. I also needed to check systematically for missing values, duplicates and other inconsistencies before beginning the analysis.&lt;br&gt;
This preliminary inspection was important because reliable analysis depends on reliable input data. Instead of correcting problems as I encountered them later, I first established what needed to be fixed and why.&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%2Fykagwza2yl3znod7b5o8.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%2Fykagwza2yl3znod7b5o8.png" alt=" " width="687" height="590"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Data Cleaning and Preparation&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The initial dataset contained 115 products, but some records were duplicates. The Balloon Insert product appeared three times, while the 6 Layers Steel Pipe Shoe Cabinet appeared twice. I removed the duplicate records so that each product was represented only once, leaving the required 112 products for analysis.&lt;br&gt;
The Review column also contained negative values such as -2, -14 and -55. Since review counts cannot be negative, I removed the minus signs and converted the values into positive numbers. At the same time, 58 products had missing review counts and ratings, so I kept these as missing rather than incorrectly treating them as zero.&lt;br&gt;
The rating field was stored as text, for example 4.5 out of 5, and the column itself was labelled Ratingd. I renamed the column to Ratings and extracted the numerical rating. Price values also contained KSh and commas, so I removed these characters and converted the prices into numerical values. One product used a price range rather than a single price, which required special handling before numerical analysis.&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%2Fvub5hs3cc6eft8pnomq4.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%2Fvub5hs3cc6eft8pnomq4.png" alt=" " width="587" height="597"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Data Enrichment&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I added calculated columns to support deeper analysis. These additional fields transformed the original variables into useful measures and categories that could later be used in PivotTables, charts, slicers and the dashboard. I created a &lt;strong&gt;Discount Amount&lt;/strong&gt; column to measure the absolute difference between the Old Price and Current Price. I used the Excel formula*&lt;em&gt;=C2-B2&lt;/em&gt;*&lt;br&gt;
I also created a &lt;strong&gt;Rating Category&lt;/strong&gt; column to classify products as Poor, Average or Excellent according to the project criteria. I used the logical IF and AND functions with the formula &lt;strong&gt;=IF(G2="","Not Rated",IF(G2&amp;lt;3,"Poor",IF(G2&amp;lt;=4,"Good","Excellent")))&lt;/strong&gt; .&lt;br&gt;
A &lt;strong&gt;Discount Category&lt;/strong&gt; column was added to group products into Low Discount, Medium Discount and High Discount based on the required percentage thresholds. The formula used was &lt;strong&gt;=IF(E2&amp;lt;20%,"Low Discount",IF(E2&amp;lt;=40%,"Medium Discount","High Discount"))&lt;/strong&gt;.&lt;br&gt;
Finally, I added a &lt;strong&gt;Price Category&lt;/strong&gt; column to segment products into Low, Medium and High price groups using the formula &lt;strong&gt;=IF(B2&amp;lt;=1275,"Low",IF(B2&amp;lt;=2512,"Medium","High"))&lt;/strong&gt; for the price thresholds established for the analysis. These enriched variables provided a stronger foundation for comparing product behaviour and developing the later seller-performance analysis.&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%2Fe81fl0x5vtj72hfkp6ro.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%2Fe81fl0x5vtj72hfkp6ro.png" alt=" " width="800" height="518"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Excel Techniques and Descriptive Analysis&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;After completing the cleaning and enrichment stages, I created a separate Analysis sheet to calculate the key descriptive statistics for the cleaned dataset. I started by determining the &lt;strong&gt;total number of products&lt;/strong&gt; using the formula &lt;strong&gt;=COUNTA('Cleaned Data'!A2:A113)&lt;/strong&gt;, which confirmed that the cleaned dataset contained 112 products.&lt;br&gt;
I then calculated the &lt;strong&gt;total number of reviews&lt;/strong&gt; using the formula &lt;strong&gt;=SUM('Cleaned Data'!H2:H113)&lt;/strong&gt;, which added the available review counts while leaving missing values as blanks rather than treating them as zero. &lt;br&gt;
To understand the overall pricing level, I calculated the** average current price** using &lt;strong&gt;=AVERAGE('Cleaned Data'!B2:B113)&lt;/strong&gt; and the &lt;strong&gt;average old price&lt;/strong&gt; using &lt;strong&gt;=AVERAGE('Cleaned Data'!C2:C113)&lt;/strong&gt;. &lt;br&gt;
I also calculated the &lt;strong&gt;average discount&lt;/strong&gt; using &lt;strong&gt;=AVERAGE('Cleaned Data'!E2:E113)&lt;/strong&gt; and the &lt;strong&gt;average rating&lt;/strong&gt; using &lt;strong&gt;=AVERAGE('Cleaned Data'!G2:G113)&lt;/strong&gt;. &lt;br&gt;
To identify the &lt;strong&gt;most expensive product&lt;/strong&gt;, I first used &lt;strong&gt;=MAX('Cleaned Data'!B2:B113)&lt;/strong&gt; to find the highest Current Price, then used** =INDEX('Cleaned Data'!A2:A113,MATCH(MAX('Cleaned Data'!B2:B113),'Cleaned Data'!B2:B113,0))** to return the product associated with that price. &lt;br&gt;
I followed the same approach for the &lt;strong&gt;least expensive product&lt;/strong&gt;, using &lt;strong&gt;=MIN('Cleaned Data'!B2:B113)&lt;/strong&gt; to identify the lowest Current Price and &lt;strong&gt;=INDEX('Cleaned Data'!A2:A113,MATCH(MIN('Cleaned Data'!B2:B113),'Cleaned Data'!B2:B113,0))&lt;/strong&gt; to return the corresponding product name.&lt;br&gt;
These calculations gave me the initial numerical summary of the dataset and established a foundation for investigating relationships between pricing, discounts, customer reviews and ratings.&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%2Fcbcnwuf7rvbtdmta9rhh.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%2Fcbcnwuf7rvbtdmta9rhh.png" alt=" " width="799" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Correlation Analysis&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;To investigate whether pricing, discounts and customer engagement were related, I used correlation analysis. Correlation measures the direction and strength of a linear relationship between two variables, with values ranging from -1 to +1. A value close to +1 indicates a strong positive relationship, a value close to -1 indicates a strong negative relationship, while a value close to 0 indicates little or no linear relationship. I conducted three correlation tests using the Excel **CORREL **function.&lt;/p&gt;

&lt;p&gt;Discount vs. Reviews&lt;br&gt;
The first test examined whether products offering higher discounts received more customer reviews. I used the Excel formula &lt;strong&gt;=CORREL('Cleaned Data'!E2:E113,'Cleaned Data'!H2:H113)&lt;/strong&gt;. The resulting correlation coefficient was &lt;strong&gt;-0.14&lt;/strong&gt;, indicating a very weak negative relationship. In the Jumia dataset, this means that products with higher discounts tended to have slightly fewer reviews, but the relationship was too weak to indicate a meaningful pattern. Therefore, the data does not support the assumption that increasing a product's discount automatically leads to greater customer engagement through reviews.&lt;/p&gt;

&lt;p&gt;Rating vs. Reviews&lt;br&gt;
The second test investigated whether products with higher customer ratings also attracted more reviews. I used the formula &lt;strong&gt;=CORREL('Cleaned Data'!I2:I113,'Cleaned Data'!H2:H113)&lt;/strong&gt;. The result was &lt;strong&gt;0.06&lt;/strong&gt;, which is very close to zero and indicates an almost nonexistent linear relationship. Within this dataset, highly rated products were therefore not necessarily the products with the highest number of reviews. This suggests that customer satisfaction, represented by rating, and customer engagement, represented by review volume, were largely independent of each other among the products analysed.&lt;/p&gt;

&lt;p&gt;Current Price vs. Rating&lt;br&gt;
The final test examined whether the price of a product was associated with its customer rating. I used the formula &lt;strong&gt;=CORREL('Cleaned Data'!B2:B113,'Cleaned Data'!I2:I113)&lt;/strong&gt;. The resulting coefficient was &lt;strong&gt;0.11&lt;/strong&gt;, showing a very weak positive relationship. This indicates that more expensive products tended to have slightly higher ratings, but the relationship was not strong enough to suggest that price was an important predictor of customer satisfaction. In this dataset, a higher-priced product was therefore not necessarily better rated than a lower-priced product.&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%2F1lqsavsb4qho5371dhk1.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%2F1lqsavsb4qho5371dhk1.png" alt=" " width="707" height="597"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Top 5 Highest and Lowest Rated Products&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;To identify the products with the strongest and weakest customer ratings, I used Excel's &lt;strong&gt;LARGE&lt;/strong&gt; and &lt;strong&gt;SMALL&lt;/strong&gt; functions. These functions were appropriate because they allowed me to rank the numerical ratings and identify the highest and lowest values directly from the cleaned dataset.&lt;br&gt;
For the &lt;strong&gt;top 5 highest-rated products&lt;/strong&gt;, I first used &lt;strong&gt;=LARGE('Cleaned Data'!G2:G113,1)&lt;/strong&gt; to identify the highest rating, which was &lt;strong&gt;5&lt;/strong&gt;. I then used the &lt;strong&gt;FILTER&lt;/strong&gt; function to retrieve the products associated with this rating. Five products achieved the maximum rating of 5, making them the highest-rated products in the dataset and potential indicators of strong customer satisfaction.&lt;br&gt;
For the &lt;strong&gt;top 5 lowest-rated products&lt;/strong&gt;, I used the &lt;strong&gt;SMALL&lt;/strong&gt; function to rank the ratings from lowest upward. The five lowest ratings was &lt;strong&gt;2.0&lt;/strong&gt; . I then used &lt;strong&gt;FILTER&lt;/strong&gt; to identify the products corresponding to these ratings. These products represent the weakest-rated products in the dataset and may require further investigation into product quality, customer expectations or seller performance.&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%2Frg762hg8ry24niz1rt6f.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%2Frg762hg8ry24niz1rt6f.png" alt=" " width="799" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Top 10 Products with the Highest Discounts&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;To identify the products receiving the highest discounts, I ranked the discount percentages from highest to lowest using Excel's &lt;strong&gt;LARGE&lt;/strong&gt; function. I used &lt;strong&gt;=LARGE('Cleaned Data'!D2:D113,1)&lt;/strong&gt; to identify the highest discount and adjusted the ranking number to retrieve the top 10 values. I then used &lt;strong&gt;FILTER&lt;/strong&gt; to identify the products corresponding to these discounts. This showed which products were being promoted most heavily and provided a basis for comparing high discounts with reviews and ratings.&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%2Fldtekwv4snb1piikc8pi.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%2Fldtekwv4snb1piikc8pi.png" alt=" " width="784" height="599"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Top 10 Products by Customer Reviews&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;To identify the products with the strongest customer engagement, I ranked the review counts from highest to lowest using Excel's &lt;strong&gt;LARGE&lt;/strong&gt; function. I used &lt;strong&gt;=LARGE('Cleaned Data'!H2:H113,1)&lt;/strong&gt; to find the highest review count and then ranked the remaining values from 2 to 10. I used XLOOKUP to match each review count to its corresponding product with &lt;strong&gt;=XLOOKUP(F61,'Cleaned Data'!H2:H113,'Cleaned Data'!A2:A113)&lt;/strong&gt;.&lt;br&gt;
The highest review count was 69, and the Top 10 results identified the products receiving the most customer reviews. These products represent the strongest customer engagement in the dataset and can later be compared with their ratings, prices and discount levels to understand what may be associated with stronger customer interaction.&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%2F1qim4xm1jxybal4ldenw.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%2F1qim4xm1jxybal4ldenw.png" alt=" " width="800" height="509"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;High Discounts with Low Ratings&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I also investigated products that were receiving high discounts but poor customer ratings. I used the &lt;strong&gt;FILTER&lt;/strong&gt; function with two conditions: &lt;strong&gt;a discount above 40%&lt;/strong&gt; and &lt;strong&gt;a rating below 3&lt;/strong&gt;. The formula was** =FILTER('Cleaned Data'!A2:A113,('Cleaned Data'!F2:F113&amp;gt;40%)&lt;em&gt;('Cleaned Data'!I2:I113&amp;lt;3),"No matching products")&lt;/em&gt;*. This was useful because it highlighted products where heavy price reductions were not translating into strong customer satisfaction, providing potential areas for sellers to review product quality, pricing or marketing strategies.&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%2F1rn6ei0znhollq4dkco2.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%2F1rn6ei0znhollq4dkco2.png" alt=" " width="799" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Products Requiring Better Pricing or Marketing Strategies&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I then identified products that may require a different pricing or marketing strategy by combining three indicators: poor ratings, low review activity and discounts above 20%. I used the FILTER function with the formula &lt;strong&gt;=FILTER('Cleaned Data'!A2:A113,('Cleaned Data'!I2:I113&amp;lt;3)*('Cleaned Data'!H2:H113&amp;lt;5)*('Cleaned Data'!F2:F113&amp;gt;20%),"No matching products")&lt;/strong&gt;. I chose these conditions because they highlight products that have low customer satisfaction, limited engagement and are already being discounted. The analysis returned several products, suggesting that discounting alone may not be sufficient for this group and that sellers may need to review their pricing, product quality, positioning or marketing approach.&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%2Fa1kwgydhte9uviffl8iz.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%2Fa1kwgydhte9uviffl8iz.png" alt=" " width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;The Jumia dataset reveals that customer response is more complicated than simply offering a cheaper price. Despite discounts reaching as high as 64%, the relationship between discounts and reviews was almost nonexistent (-0.14). This suggests that aggressive promotions may attract attention, but they do not automatically create lasting customer engagement.&lt;br&gt;
A particularly interesting pattern is the separation between popularity and satisfaction. With a rating-review correlation of only 0.06, products generating reviews are not necessarily the products customers rate highly. This means a seller could have a product that attracts considerable attention while still failing to deliver a satisfying experience.&lt;br&gt;
The data also shows that price is a poor substitute for perceived value. The price-rating correlation of 0.11 indicates that paying more does not guarantee a better customer experience. At the same time, the presence of products rated 5.0 alongside products rated as low as 2.0 suggests that product-level factors can create much larger differences in customer satisfaction than price alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Business Recommendations&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Turn discounts into a targeted tool, not a rescue strategy. Sellers should use large discounts strategically on products that already demonstrate good customer response, rather than repeatedly discounting poorly rated products. A product with a 64% discount and weak customer feedback should trigger investigation before another promotion.&lt;br&gt;
Build around the products customers already love. The five products achieving 5.0 ratings provide potential benchmarks. Sellers should examine what makes these products successful such as product quality, presentation, value or reliability and replicate those strengths across weaker products.&lt;br&gt;
Treat poor ratings as a product problem first. Products falling around 2.0–2.2 should be reviewed for quality issues, misleading descriptions, poor fulfilment or unmet customer expectations. Reducing their price further may increase sales temporarily but could worsen customer dissatisfaction if the underlying problem remains.&lt;br&gt;
Use different strategies for different products. The absence of products with more than 40 reviews and average ratings of 3–4 shows that highly engaged products in this dataset tend to fall outside that specific middle-rating segment. Sellers should therefore segment products by both engagement and satisfaction instead of applying one marketing strategy to the entire catalogue.&lt;/p&gt;

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

&lt;p&gt;Working on the Jumia dataset was more interesting than I expected. At the beginning, I thought I would simply clean the data, apply a few Excel formulas, create some charts and be done. But as I worked through the dataset, I started noticing things that made me question my own assumptions. I expected bigger discounts to attract more customers and expensive products to have better ratings, but the data did not always support that. That was probably the biggest surprise for me.&lt;br&gt;
I also realised how much the quality of the data matters. Removing duplicates, organising the information and creating useful categories may seem like small steps, but they made a big difference in how confidently I could interpret the results. I started seeing Excel differently too. It was no longer just about knowing which formula to use; it was about knowing what question I was trying to answer and what the result was actually telling me.&lt;br&gt;
The part I found most interesting was watching ordinary rows of data turn into something that could tell a business story. A rating represents a customer's experience, a review shows engagement, a discount reflects a seller's strategy, and the price gives another piece of the picture. Putting all these pieces together made the dataset feel much more real.&lt;/p&gt;

</description>
      <category>analysis</category>
      <category>data</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Getting Started with Excel for Data Analytics: From Basics to Data Cleaning.</title>
      <dc:creator>MERCY MUMBI WAHOME</dc:creator>
      <pubDate>Mon, 31 Aug 2026 08:57:23 +0000</pubDate>
      <link>https://dev.to/mercie_wahome_819901ac530/getting-started-with-excel-for-data-analytics-from-basics-to-data-cleaning-2pkm</link>
      <guid>https://dev.to/mercie_wahome_819901ac530/getting-started-with-excel-for-data-analytics-from-basics-to-data-cleaning-2pkm</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;When I began my journey into data science and analytics, Excel was one of the first tools I encountered. Week 1 changed my perspective by showing me that Excel is much more than a platform for entering and storing information. It can be used to organize, validate, transform, and prepare data for meaningful analysis. In this article, I explore the fundamental Excel concepts I learned and apply them to an HR dataset containing employee information. I demonstrate how to work with an Excel workbook, understand cells and data types, navigate the Ribbon and Home tab, use functions and operators, and identify common data-quality problems. &lt;br&gt;
The main focus is data cleaning, since reliable analysis begins with reliable data. Using the HR dataset, I demonstrate how seemingly small inconsistencies—such as incorrect formatting, duplicate records, missing values, inconsistent text, and invalid dates; can affect the quality of information produced from a dataset. The process therefore moves from understanding Excel → entering and examining data → identifying problems → cleaning the data → preparing it for analysis.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What is Excel&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Microsoft Excel is a spreadsheet application used to organize, calculate, analyze, and present data. It provides a structured environment in which information can be stored in rows and columns, with each intersection forming a cell. For data analytics, Excel is particularly useful because it combines data storage with tools for calculations, filtering, sorting, visualization, and data cleaning. It also provides functions that can transform raw information into useful insights. My first important realization was that good analysis does not begin with immediately calculating results. It begins with understanding the data and ensuring that the data is accurate, consistent, and suitable for analysis.&lt;br&gt;
To begin working with Excel, I installed and opened Microsoft Excel on my computer. When Excel opens, it provides options for creating a new workbook or opening an existing one. An Excel workbook is the main file that contains one or more worksheets. A worksheet is the individual spreadsheet where data is entered and manipulated. Each worksheet consists of rows, columns, and cells. A cell can contain different types of information, including text, numbers, dates, percentages, and currency values. Recognizing these data types is important because Excel handles each type differently. For example, a date should be stored as a date rather than ordinary text if I want to sort dates chronologically or perform calculations involving time.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Exploring the Excel Interface&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Excel organizes its tools through the Ribbon, which appears at the top of the workbook. The Ribbon contains tabs such as Home, Insert, Page Layout, Formulas, Data, Review, and View, with each tab grouping related commands. The Home tab is especially useful when working with data. It contains options for formatting text and numbers, changing alignment, inserting or deleting cells, sorting and filtering data, and finding or replacing information. These features make it possible to improve both the appearance and quality of a dataset without leaving the worksheet. An Excel workbook also has several useful features, including multiple worksheets, formulas, functions, formatting tools, tables, sorting, filtering, and conditional formatting. Together, these features allow Excel to support the entire journey from raw data to analysis.&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%2F4j870gndmgwchuwlni16.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%2F4j870gndmgwchuwlni16.png" alt=" " width="800" height="216"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Data Entry and Understanding the Dataset&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Data entry involves recording information into the appropriate cells while maintaining consistency in how the information is represented. For example, numbers should remain numerical, dates should use a consistent date format, and text should be entered consistently. For my practical exercise, I used the HR_Dataset_Dirty.xlsx dataset. It contains employee information such as Employee ID, names, department, salary, hire date, age, gender, performance score, work experience, employee type, location, and training hours. Before making any changes, I examined the dataset to understand its structure and identify possible data-quality issues.&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%2F3muss4ypqxee0dhz2z1n.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%2F3muss4ypqxee0dhz2z1n.png" alt=" " width="800" height="293"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Data Cleaning&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Before cleaning the data, I made a copy of the original dataset. This is an important data-management practice because the original data should always be preserved in case I need to compare changes or recover information. I created a separate worksheet for the cleaned data and worked on the copy rather than altering the original dataset. This allowed me to distinguish between the raw data and the cleaned data.&lt;br&gt;
Data cleaning is the process of identifying and correcting inaccurate, incomplete, inconsistent, or incorrectly formatted data. It is an essential stage of data analytics because poor-quality data can produce misleading results. While examining my dataset, I found several examples of these problems. For instance, employee names appeared with inconsistent capitalization, departments were represented in different ways, and some dates were invalid or inconsistently formatted.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Text Cleaning and Standardization&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Text cleaning involves correcting inconsistencies in text so that similar information is represented in a uniform way. Common examples include inconsistent capitalization, extra spaces, spelling variations, and different labels referring to the same category. Excel provides several useful text functions for this. &lt;strong&gt;PROPER&lt;/strong&gt; capitalizes the first letter of each word, &lt;strong&gt;UPPER&lt;/strong&gt; converts text to uppercase, and &lt;strong&gt;LOWER&lt;/strong&gt; converts text to lowercase. &lt;strong&gt;TRIM&lt;/strong&gt; removes unnecessary spaces, while &lt;strong&gt;Find and Replace&lt;/strong&gt; can be used to replace inconsistent words or labels throughout a dataset.&lt;br&gt;
For example, the names JOHN, john, and JoHn represent the same person but have different formatting. Using PROPER standardizes them to John. Similarly, department labels such as HR, H.R, and Hr may need to be standardized to one consistent value. In my HR dataset, I identified inconsistent capitalization in the First Name column. Some names appeared entirely in uppercase while others were lowercase or mixed. I therefore applied the PROPER function to standardize the names.&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%2F17bdy9utenj0dz8p2c82.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%2F17bdy9utenj0dz8p2c82.png" alt=" " width="739" height="282"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Removing Duplicates&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Duplicate data occurs when the same record, or an identifier that should be unique, appears more than once. Duplicates can distort analysis by causing certain employees or observations to be counted multiple times. Excel provides &lt;strong&gt;Remove Duplicates **under the **Data&lt;/strong&gt; tab. Duplicates should be reviewed before deletion because two records may share one value while still representing different records. For my HR dataset, Employee ID is particularly useful for checking duplicates because it should uniquely identify an employee. We found repeated Employee IDs, so this gives us a real example of why duplicate checking is necessary. &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%2Fh6znzgewsksnwpf16em9.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%2Fh6znzgewsksnwpf16em9.png" alt=" " width="799" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Formatting and Data Types&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Data formatting ensures that information is displayed consistently and that Excel recognizes each value according to its correct data type. Common types include &lt;strong&gt;text&lt;/strong&gt;, &lt;strong&gt;numbers&lt;/strong&gt;, &lt;strong&gt;dates&lt;/strong&gt;, &lt;strong&gt;percentages&lt;/strong&gt;, and &lt;strong&gt;currency&lt;/strong&gt;. Correct data types are important because Excel performs calculations and sorting differently depending on how a value is stored. For example, a salary should be &lt;strong&gt;numerical&lt;/strong&gt; so that it can be calculated, while a hire date should be recognized as a date so that employees can be sorted &lt;strong&gt;chronologically&lt;/strong&gt;. &lt;br&gt;
Common Excel tools for this include Number Format, Currency, Date, and Format Cells. In my HR dataset, I found inconsistencies in the Salary and Hire Date columns. Some salary values used different currency representations, while some dates were entered in different formats. I standardized these values so that the dataset would use consistent formats.&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%2F67ayce8fw2y9cccrqema.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%2F67ayce8fw2y9cccrqema.png" alt=" " width="800" height="253"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For valid dates, I standardized the display format so that all dates follow the same pattern.&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%2Fy7ou0gcfpoqagqobe4he.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%2Fy7ou0gcfpoqagqobe4he.png" alt=" " width="799" height="247"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Missing Values and Blank Cells&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Missing data occurs when information expected in a dataset has not been provided. A blank cell and a zero should not automatically be treated as the same because a blank may indicate unavailable information, while zero can be a valid value depending on the field. Excel tools such as &lt;strong&gt;Filter&lt;/strong&gt;, &lt;strong&gt;Find&lt;/strong&gt; &amp;amp; &lt;strong&gt;Select&lt;/strong&gt;, and functions such as &lt;strong&gt;COUNTBLANK&lt;/strong&gt; can help identify missing values. For example, a missing salary or department requires investigation, while a project count of zero may be a legitimate record. In my HR dataset, I checked for blank values and considered the meaning of each field before deciding how the missing information should be handled. This approach helped ensure that cleaning my data did not introduce new errors by replacing meaningful values unnecessarily.&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%2F62glivwz66us9zqkjcg9.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%2F62glivwz66us9zqkjcg9.png" alt=" " width="799" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Find and Replace&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This is used to locate a particular value or text and replace it with a consistent or corrected value. It is especially useful when the same inconsistency appears many times in a dataset. For example, HR, Hr, and H.R may all refer to the same department, but Excel treats them as different text values. In our HR dataset, we can standardize such department names using Find and Replace so that the same department has one consistent label. This improves filtering, grouping, counting, and later analysis.&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%2Fu9bkreaxeugh53pvf34h.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%2Fu9bkreaxeugh53pvf34h.png" alt=" " width="800" height="332"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Data Validity and Logical Checking&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Data validity means checking whether values are reasonable and make sense within the context of the dataset. It involves checking whether values fall within an expected and reasonable range. In an HR dataset, age is a good example because employees would generally be expected to fall within the defined working-age range. For this exercise, I used 19 to 65 years as the acceptable range. Excel's logical functions, particularly IF, together with comparison operators such as &amp;gt;= and &amp;lt;=, can be used to identify values outside this range. This allows unusual records to be flagged for investigation rather than automatically deleted. Applying this check helps improve the reliability of the dataset before analysis.&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%2Fcorg828svsl8xvf9ix2j.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%2Fcorg828svsl8xvf9ix2j.png" alt=" " width="800" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Conditional Formatting&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;It is an Excel feature that automatically changes the appearance of cells when they meet a specified condition. It helps identify unusual values quickly without manually checking every record. For example, it can highlight high salaries, low performance scores, missing values, or unusually long work experience. In our HR dataset, I used conditional formatting to highlight employees with more than 25 years of work experience. This makes potentially unusual records easier to identify and investigate before analysis.&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%2Ftb8fn2pa3yzenfhs0zio.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%2Ftb8fn2pa3yzenfhs0zio.png" alt=" " width="800" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Operators and Functions&lt;br&gt;
Excel uses operators and functions to transform and analyze data. Operators are symbols that tell Excel how to perform an operation or comparison. Arithmetic operators include addition, subtraction, multiplication, and division, while comparison operators include equal to, greater than, less than, greater than or equal to, less than or equal to, and not equal to. In my dataset, I applied PROPER for name standardization and used IF and AND to validate employee ages against the 19–65 range. I also used comparison operators to identify work experience exceeding 25 years. These examples demonstrated how functions and operators can turn simple spreadsheet values into useful data-quality checks.&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%2F5mlaay4g2eniokbnok0l.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%2F5mlaay4g2eniokbnok0l.png" alt=" " width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;My first week with Excel showed me that effective data analytics begins with clean, reliable data. By working with the HR dataset, I learned how to identify and correct inconsistencies, duplicates, missing values, formatting issues, and invalid information using Excel's tools and functions. Most importantly, I learned to look beyond the numbers and question the quality and meaning of the data before analysing it. This experience has given me a stronger foundation and greater confidence as I continue my journey in data science and analytics.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Understanding the Git Workflow: Working Directory, Staging, Commit and Push</title>
      <dc:creator>MERCY MUMBI WAHOME</dc:creator>
      <pubDate>Mon, 24 Aug 2026 18:03:00 +0000</pubDate>
      <link>https://dev.to/mercie_wahome_819901ac530/understanding-the-git-workflow-working-directory-staging-commit-and-push-87d</link>
      <guid>https://dev.to/mercie_wahome_819901ac530/understanding-the-git-workflow-working-directory-staging-commit-and-push-87d</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Beginner friendly explanation of Git and GitHub: Kenya Hospital Health Records&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;When I started learning Git and GitHub, I was completely new to them and the terms used like repository. I slowly began to understand how these tools work together. Git helps track and manage changes to a project while GitHub allows us to store the project online. &lt;br&gt;
In this project, I applied what I learned by creating &lt;strong&gt;Kenya Hospital Health Records&lt;/strong&gt; and moved it from my local computer to GitHub. So this article explains my journey from the start to successfully uploading my project to GitHub, explaining each step in a simple way.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;1.Understanding the Git Workflow&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I learnt the basics of a G it workflow: working directory where I create and edit files, staging where I prepare selected changes, commit to save them as a checkpoint and pushing to send the work from my computer to GitHub.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;2.Connecting Git to GitHub Using SSH&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I first confirmed that Git was installed on my computer, then checked for an existing SSH key and found mine &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%2F3jpbl8aj19cr5wq5aqb1.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%2F3jpbl8aj19cr5wq5aqb1.png" alt=" " width="799" height="256"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;3.Creating the project locally&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I created a folder named &lt;strong&gt;Kenya Hospital Health Records&lt;/strong&gt; and opened it in GitHub, then created the project files that would make my hospital records project. I then checked the folder to confirm the files have been created successfully. This gave me the basic project structure that I would later track using Git.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;4.Initializing Git and Checking the Project&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Now that my files were ready, I needed to introduce Git to the project by creating a local repository that would allow me to track changes to my files. Then I checked the Git status to see how it viewed the files. They appeared as untracked. &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%2F412cyukct3be0uyytvka.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%2F412cyukct3be0uyytvka.png" alt=" " width="721" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, I staged the files which tells Git which changes I want to include in my next commit. I then created my first commit, the &lt;strong&gt;initial commit&lt;/strong&gt;. A commit is like a checkpoint that saves the current state of my project in Git's history.&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%2Ft8y21g4j77983igzlazj.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%2Ft8y21g4j77983igzlazj.png" alt=" " width="684" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;5.Creating the GitHub Repository&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;After creating and committing my project locally, I needed an online place to store it, so I created a new repository on GitHub and gave it a name similar to my local project. I kept the repository empty because the project and its initial commit were already on my computer which will allow me to connect to the existing local project to the new GitHub repository &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%2F65p0dzagfngfupdymrur.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%2F65p0dzagfngfupdymrur.png" alt=" " width="629" height="256"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;6.Connecting the Local Project to GitHub&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I then connected my local Git repository to the GitHub repository using the SSH address I had copied from GitHub. I gave this remote connection the name** origin**, the standard name for the main remote repository. I checked the remote connection to confirm that the GitHub SSH address had been saved correctly for both fetching and pushing.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;7.Setting the main branch&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The next step was to make sure my project used the main branch. A branch is a separate line of development where changes to a project can be managed.&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%2F3g0tosvf5e9xog74eyxp.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%2F3g0tosvf5e9xog74eyxp.png" alt=" " width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;8.Pushing the project to GitHub&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I used the push command to send my committed files from the local repository to the GitHub repository. The command also connected my local main branch with the remote main branch so that Git would know where to send future updates. Git confirmed the main branch was successfully set up to track origin. This was an important moment in my learning because I could see the work I had created and saved locally could finally appear online.&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%2Fgn6jucmhy4w8hmxrf3q1.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%2Fgn6jucmhy4w8hmxrf3q1.png" alt=" " width="799" height="271"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After the push was done, I opened my GitHub repository and I could see my project files online confirming that the local project had been successfully uploaded. &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%2Fo3ae1wrifp130mrng20a.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%2Fo3ae1wrifp130mrng20a.png" alt=" " width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;This project helped me understand Git and GitHub by actually using them. I learned how to create a local project, track it with Git, connect it securely to GitHub using SSH and upload online.&lt;br&gt;
The workflow:** Working Directory &amp;gt; Staging &amp;gt; Commit &amp;gt; Push &amp;gt; GitHub** may seem complicated at first but once each stage is understood, it becomes easier to follow.&lt;/p&gt;

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