<?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>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>
