<?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: Tracy K</title>
    <description>The latest articles on DEV Community by Tracy K (@tracy_k).</description>
    <link>https://dev.to/tracy_k</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%2F4071730%2Fba5d14e1-379e-48fc-b850-e23065fe683b.png</url>
      <title>DEV Community: Tracy K</title>
      <link>https://dev.to/tracy_k</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tracy_k"/>
    <language>en</language>
    <item>
      <title>Power Bi: Data Modelling, Relationships and Joins</title>
      <dc:creator>Tracy K</dc:creator>
      <pubDate>Wed, 23 Sep 2026 18:29:41 +0000</pubDate>
      <link>https://dev.to/tracy_k/power-bi-data-modelling-relationships-and-joins-1om5</link>
      <guid>https://dev.to/tracy_k/power-bi-data-modelling-relationships-and-joins-1om5</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Picture this measures that return the wrong totals, slicers that don't filter what you expect, and reports that slow down as data grows, this can usually be traced back to how tables were shaped and connected. Most Power BI issues that look like DAX problems are mostly caused by flaws in the data model. &lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Data modelling in power bi is the process of organizing your data into tables and defining how those tables relate to each other so you can analyze it accurately and efficiently. Think of it as drawing the blueprint for your data before you build anything on top of it.&lt;/li&gt;
&lt;li&gt;You may be wondering why a well designed data model matters. The key reasons are explained below:

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Reporting and accuracy&lt;/strong&gt; - correct relationships ensure visuals pull the right data and also prevents duplicating values in reports.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt; - well structured model reduces query complexity and speeds up reports load time with quicker dashboard interactions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analytics&lt;/strong&gt; - selecting the appropriate data model with the right relationships minimizes logic errors, ensuring that every derived metric produces accurate insights.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DAX Calculations&lt;/strong&gt; - a good model makes it easy to write, interpret, and maintain calculations since the calculations rely heavily on good relationships in order to function correctly.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintainability&lt;/strong&gt; - makes it easy to edit, and troubleshoot errors when need be without the hustle of making changes in individual records&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt; - clean models handle growing data volumes well without major rework ensuring that new data can be integrated smoothly.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Data Modelling Approaches in Power Bi
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Refers to the process of organizing tables and defining the relationships between tables so that you can use Power Bi to analyze, filter and summarize data correctly . &lt;/li&gt;
&lt;li&gt;Reasons for structuring are:&lt;/li&gt;
&lt;li&gt;Clean business structure- splits data and puts it in places based on the business it self&lt;/li&gt;
&lt;li&gt;To ensure information shared on Power Bi can enable it work efficiently and correctly so that you get fast performance and nice response&lt;/li&gt;
&lt;li&gt;I will describe the three main approaches frequently used:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Flat Table&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It refers to a single table that stores all the data together, both the facts and descriptive context with no relationships to other tables.&lt;/li&gt;
&lt;li&gt;It is mostly appropriate when dealing with a small simple dataset where data does not require complex relationships
&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%2Fdrmuzl4nv3tgbg0m160b.png" alt=" " width="544" height="292"&gt;
&lt;em&gt;The table above represents a flat table containing the details of customers who bought products in a store&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Advantages of  Flat Table&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It is simple to build and understand.&lt;/li&gt;
&lt;li&gt;It is easy to import and load data since its a single table.&lt;/li&gt;
&lt;li&gt;No relationships created hence no relationship errors.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Disadvantages of a Flat Table&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;High data redundancy due to repeated values across rows.&lt;/li&gt;
&lt;li&gt;DAX functions are difficult to manage since data is not separated.&lt;/li&gt;
&lt;li&gt;Slower performance on large datasets due to the file size and lack of compression efficiency.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Star Schema&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It is represented by one fact table connected to dimension tables that are directly connected to the facts table.&lt;/li&gt;
&lt;li&gt;The main structure is that it radiates outward like a "star" comprises of a fact table with several dimension tables surrounding it, each having a particular relationship.
&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%2Fk4s000q7zc3hrskwd9do.png" alt=" " width="648" height="406"&gt;
&lt;em&gt;The diagram represents an example of a star schema where the Sales is the fact table while the other tables are dimensional tables&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Advantages of Star Schema&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Gives a clean way to filter data that is a clean filter path.&lt;/li&gt;
&lt;li&gt;Makes it easy to use DAX functions since data is well stored in different tables.&lt;/li&gt;
&lt;li&gt;Makes it easy to build visuals (charts) since numbers are all found in facts table while the labels are in dim table.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Disadvantages of Star Schema&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Can have data redundancy within dimension tables when they are not properly normalized&lt;/li&gt;
&lt;li&gt;Requires the user to have knowledge on building and managing relationships for efficient use.&lt;/li&gt;
&lt;li&gt;Requires the user to understand concepts on grains, keys, cardinality and filter direction in order to build the model correctly.&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;The star schema is mostly appropriate to use on standard business reporting scenarios such as sales operations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Snowflakes Schema&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It is similar to a star schema however, the  dimension tables are further broken down into smaller sub dimension tables giving more information about them.&lt;/li&gt;
&lt;li&gt;It creates a branching "snowflake-like" structure since the fact table connects to primary dimension tables which link further to smaller tables.
&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%2Fmg5qh1wkxf1xlvjcjbik.png" alt=" " width="297" height="195"&gt;
&lt;em&gt;The diagram  represents a snowflakes schema where the Sales is the fact table while the rest are dimension tables where product and customer tables have sub-dimensional tables&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Advantages of Snowflakes Schema&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reduces data redundancy through normalization of all the tables across multiple levels.&lt;/li&gt;
&lt;li&gt;Makes it easy to edit data since changes are made in the respective tables in stead of interfering with the whole dataset.&lt;/li&gt;
&lt;li&gt;Organizes complex hierarchies clearly for large datasets.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Disadvantages of Snowflakes Schema&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Increased query complexity due to more table and joins required for instance an error in one dimension table affects the entire dataset.&lt;/li&gt;
&lt;li&gt;It can be harder to write and understand DAX calculations due to the added table layers.&lt;/li&gt;
&lt;li&gt;It is more complicated to understand and work with.&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;The snowflakes schema is most appropriate to use for complex hierarchical data with many sub-levels.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Facts and Dimension Tables
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Facts Tables&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;It is a table that stores quantitative records of a business events or transactions. It tends to describe what happened.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The facts table mainly contains: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The foreign keys linking it to other dimension tables for example CustomerId, ProductId&lt;/li&gt;
&lt;li&gt;Numeric data that can be used to perform calculations using DAX functions such as &lt;code&gt;Sum&lt;/code&gt;, &lt;code&gt;Count&lt;/code&gt; and &lt;code&gt;Average&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Dates marking when the event/transaction occurred.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It is important to note that the duplicates in the facts table are not removed because every record in it is unique.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It is usually the largest table in the model since it grows continuously with new transactions.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Examples of a Fact Table&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;FactSales&lt;/code&gt; — contains sales amount, quantity sold, discount, date key, product key, customer key&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;FactOrders&lt;/code&gt; — contains order value, order quantity, order date, customer key&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;FactTransactions&lt;/code&gt; — contains transaction amount, transaction type, date, account key
&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%2Fmwpedb4azire8aqx69b4.png" alt=" " width="800" height="202"&gt;
&lt;em&gt;The above shows a simple fact table showing sales made&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Dimension Table&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It stores attributes that describes the context about the business events/transactions. That is, it explains the who, what, where, and when behind the facts.&lt;/li&gt;
&lt;li&gt;The dimension table mainly contains:

&lt;ol&gt;
&lt;li&gt;Text based descriptive fields eg names, categories and labels&lt;/li&gt;
&lt;li&gt;Primary keys which are the unique identifiers which connect to the fact table as foreign keys.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Always remove duplicate records in the dimension table to avoid data redundancy. &lt;/li&gt;
&lt;li&gt;Attributes are used for filtering, grouping, and slicing data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Examples of a Dimension Table&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;DimCustomer&lt;/code&gt; — contains customer name, age, gender, location&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DimProduct&lt;/code&gt; — contains product name, category, brand, color, size
&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%2Fvleugxo6f5nc8f6t9uri.png" alt=" " width="544" height="186"&gt;
&lt;em&gt;The above shows a dimension table showing customer details&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Granularity/Grains&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It is the lowest level of detail represented by a single row in a data table describing what each record of a table consists of.&lt;/li&gt;
&lt;li&gt;The granularity of the table below indicates that each record represents a unique store, described by its storeId, storeName, city, and country of location.
&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%2Fvqgla1wqpok2j227cl9m.png" alt=" " width="489" height="67"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Relationships in Power Bi
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Refer to connection between two tables that defines the rules, helping Power Bi combine data from both tables in the visual layer(front end).&lt;/li&gt;
&lt;li&gt;We establish relationships by matching primary keys of a dimension table to the corresponding foreign key in a facts table.&lt;/li&gt;
&lt;li&gt;In order to build relationships, you have to define the keys, the cardinality(values inside the keys) and filter direction.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why are relationships necessary?&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Avoids data duplication eg a product's category will not be repeated in every sales row.&lt;/li&gt;
&lt;li&gt;Easier maintenance for instance you update a customer's address once not in every transaction row.&lt;/li&gt;
&lt;li&gt;Enables cross table analysis by allowing you to filter data by different categories.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Cardinality In Data Modelling
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Refers to how data in one table relates to data in another table based on the numerical count of the matching rows.&lt;/li&gt;
&lt;li&gt;There are two main types:&lt;/li&gt;
&lt;li&gt;Column cardinality which is the uniqueness of data in a single column&lt;/li&gt;
&lt;li&gt;Relationship cardinality describes how many instances one entity can be associated another entity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;One-to-One (1:1)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It exists when a single row in a table only links to one row in another table and vice versa.&lt;/li&gt;
&lt;li&gt;A real life example is where one person can hold only one active passport at a time and that specific passport belongs to only one person.
&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%2Fduolpf73ixqepc4jdqse.png" alt=" " width="800" height="277"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;One-to-Many (1:*)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It is the most common type of relationship used.&lt;/li&gt;
&lt;li&gt;It exists when a single row in a table matches multiple rows in another table.&lt;/li&gt;
&lt;li&gt;The "one" side is typically the dimension table (Products, Customers) while the "many" side is the fact table (Sales, Transactions).
&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%2Ffpfbxl0najdoi2jh6x2h.png" alt=" " width="610" height="250"&gt;
&lt;em&gt;The above illustration implies that one customer in the dimension table can have multiple purchases in the sales table.&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Many-to-Many (:)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It exists when several rows in one table can link to multiple rows in another table.&lt;/li&gt;
&lt;li&gt;The main challenge is that Power BI struggles to determine clear filter paths for this relationship type which leads to unexpected aggregation errors.&lt;/li&gt;
&lt;li&gt;The best solution for this is creation of a separate bridge/join table containing unique values of the linking ID from both original tables.&lt;/li&gt;
&lt;li&gt;A real world example is a school scenario where one student can take many courses and one course can have many students. Connecting Students and Courses directly isn't ideal, since it creates ambiguous filtering. Instead, a bridge table (course roster)is introduced to link them, turning the single many to many relationship into two well defined one to many relationships.
&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%2F0p4mf76msuvv8b7p824p.png" alt=" " width="586" height="292"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key Concepts In Power Bi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Primary keys&lt;/strong&gt; - a column that uniquely identifies each record in a table, no two rows can share one key and it can't be null.&lt;/li&gt;
&lt;li&gt;In DimCustomer table, CustomerID is the primary key — one row per customer, each ID appears exactly once.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Foreign keys&lt;/strong&gt; - a column in one table that refers to the primary key of another table. &lt;/li&gt;
&lt;li&gt;In FactSales, CustomerID is a foreign key referencing DimCustomer table ID.
Unlike in the dimension table, this same CustomerID can and should appear many times in FactSales, because a customer places many orders.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unique values&lt;/strong&gt; - describes a column where no value repeats.&lt;/li&gt;
&lt;li&gt;In a one to many relationship, the "one" side needs unique values, while the "many" side can repeat those values multiple times.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Referential integrity&lt;/strong&gt; - is the rule that a foreign key value must always correspond to an existing primary key value in the referenced table, orphan keys result to blank rows or missing matches in  your dataset.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Active and Inactive Relationships&lt;/strong&gt; - for power bi, two tables can be connected through more than one path but only one relationship can be "active" at a time to avoid ambiguity.&lt;/li&gt;
&lt;li&gt;Active relationships are shown as a solid line in the model view while inactive ones are shown as a dashed line.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Filter Direction
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Filter propagation shows that relationships between tables control how a choice made in one table affects the data shown in related tables that is, when data is filtered in a table the changes also affect the other table.&lt;/li&gt;
&lt;li&gt;In power bi, there are two main types of filters namely:
&lt;strong&gt;Single-Direction Filtering&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Here filters move from the "one" side of the relationship to the "many" side, but not the other way. 
&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%2Fyq2h799grv7wkjrabp22.png" alt=" " width="588" height="270"&gt;
The above model demonstrates a single filter from &lt;code&gt;ProductsTable&lt;/code&gt; to &lt;code&gt;SalesTable&lt;/code&gt;. When a user filters a product such as "milk" from ProductTable, Power BI narrows &lt;code&gt;ProductsTable&lt;/code&gt; down to that product (milk) and passes this filter across to &lt;code&gt;SalesTable. As a result, any chart or total based on&lt;/code&gt;SalesTable, such as total revenue or units sold, now only shows data for the "milk" product.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Both/Bidirectional filtering&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Here filters move in both directions from the dimension table to the fact table, and back again from the fact table to the dimension table.&lt;/li&gt;
&lt;li&gt;Though this may seem convenient for filtering, it poses possible problems such as:

&lt;ol&gt;
&lt;li&gt;Confusing paths – With multiple bidirectional relationships, Power BI may not know which route a filter should take, leading to blocked relationships or unexpected results.&lt;/li&gt;
&lt;li&gt;Harder to follow – It becomes difficult to predict how selecting one value affects the rest of the report, unlike single-direction filtering, which always flows the same way.&lt;/li&gt;
&lt;li&gt;Slower performance – Checking filters in both directions takes more processing power, which can slow down larger reports.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Joins in Power Query
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Joins combine two tables using matching columns, the matching columns are identified using primary and foreign keys.&lt;/li&gt;
&lt;li&gt;In Power Query joins are performed using &lt;code&gt;merge queries&lt;/code&gt; tool. To demonstrate this I will use two table, the first one a &lt;code&gt;CustomerTable&lt;/code&gt; and the second one an &lt;code&gt;OrdersTable&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;CustomersTable&lt;/code&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F90j67rv4oice6az55sk3.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%2F90j67rv4oice6az55sk3.png" alt=" " width="570" height="235"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;OrdersTable&lt;/code&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3nl9cckhpogz0k62z7g0.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%2F3nl9cckhpogz0k62z7g0.png" alt=" " width="799" height="234"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Left Outer Join&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keeps all the rows from the first table and the matching rows from the second table&lt;/li&gt;
&lt;li&gt;Records retained- all of &lt;code&gt;Customers&lt;/code&gt;, plus matching &lt;code&gt;Orders&lt;/code&gt; data. Unmatched customers get blanks (null) for the order columns.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Right Outer Join&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keeps all the rows from the second table and only the matching rows from the first table&lt;/li&gt;
&lt;li&gt;Records retained- all the data from &lt;code&gt;Orders&lt;/code&gt;, plus matching &lt;code&gt;Customers&lt;/code&gt; data. Unmatched orders get blanks for the customer columns.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Inner Join&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keeps only the rows where the key exists in both tables.&lt;/li&gt;
&lt;li&gt;Records retained- just the matched intersection hence no blanks anywhere in the result.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Full outer Join&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keeps every row from both tables, matching where possible and filling blanks where there is no match on either side.&lt;/li&gt;
&lt;li&gt;Records retained- the union of both tables that is everything from &lt;code&gt;Customers&lt;/code&gt; and everything from &lt;code&gt;Orders&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Left Anti Join&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keeps only the rows in the first table that have no match in the second table.&lt;/li&gt;
&lt;li&gt;Records retained- customers with zero orders and no columns from &lt;code&gt;Orders&lt;/code&gt; are brought in at all since there is nothing to match.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Right Anti Join&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keeps only the rows from the second table that have no match in the first table&lt;/li&gt;
&lt;li&gt;Records retained- Orders that do not belong to any known customer in the &lt;code&gt;Customers&lt;/code&gt; table. This is useful for spotting orphaned or bad data.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Power Query Joins vs Power BI Relationships
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A merge combines data from two tables during the data preparation stage in Power Query meaning it physically combines data while a relationship connects two separate tables in the data modelling stage. It does not physically combine the tables.&lt;/li&gt;
&lt;li&gt;You chose merging over relationships when the two tables describe the same entities eg customer_email and customer_info while yo chose to build relationships if the tables describe different entities eg sales and customer_info.&lt;/li&gt;
&lt;li&gt;Excessive merging affect the data model by making it larger, more complicated, and harder to maintain due to: 

&lt;ul&gt;
&lt;li&gt;More data redundancy since the same information is repeated many times&lt;/li&gt;
&lt;li&gt;Poor readability as it becomes harder to understand what each column represents.&lt;/li&gt;
&lt;li&gt;Harder maintenance as changes to one type of information may require changes to a large table.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Recommended Power BI Model
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;For a real world business intelligence project, I would have the Star Schema as my modelling approach of choice while for the relationship choice, I would use the One to Many relationship with Single direction filtering. This is because of the following reasons:&lt;/li&gt;
&lt;li&gt;Query and report performance- a well designed star schema model works efficiently on power bi because of its ability to keep dimensions relatively wide and the fact table focused on transactional data.&lt;/li&gt;
&lt;li&gt;DAX simplicity- measures are easier to write because dimensions provide clear filtering paths to the fact table&lt;/li&gt;
&lt;li&gt;Data redundancy- descriptive attributes are stored once in each dimension, not repeated in the fact table.&lt;/li&gt;
&lt;li&gt;Scalability  - new dimensions or additional fact tables can be added without redesigning the entire model with ease.&lt;/li&gt;
&lt;li&gt;Maintainability- separating business events from descriptive information makes it easier to modify dimensions and fact tables independently.&lt;/li&gt;
&lt;li&gt;Ease of creating reports- report developers can drag fields from dimensions into slicers and filters and use measures from fact tables for calculations.&lt;/li&gt;
&lt;li&gt;Model Readability- a star schema is easy to understand since the user can immediately identify which tables contain facts and which contain descriptive attributes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Effective Power BI modelling is the foundation of a reliable and maintainable report. A well-designed star schema, clear relationships, and properly structured fact and dimension tables simplify DAX, improve performance, and support accurate business insights. Ultimately, a strong data model turns raw data into trusted decisions&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>data</category>
      <category>datamodel</category>
      <category>powerbi</category>
    </item>
    <item>
      <title>Building an Interactive Excel Dashboard for E-commerce Product Analysis: A Case Study of Jumia Products</title>
      <dc:creator>Tracy K</dc:creator>
      <pubDate>Sun, 06 Sep 2026 12:29:03 +0000</pubDate>
      <link>https://dev.to/tracy_k/building-an-interactive-excel-dashboard-for-e-commerce-product-analysis-a-case-study-of-jumia-521f</link>
      <guid>https://dev.to/tracy_k/building-an-interactive-excel-dashboard-for-e-commerce-product-analysis-a-case-study-of-jumia-521f</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;I have now successfully completed my training in Microsoft Excel at LuxDev HQ. Before the training, I viewed Excel mainly as a tool for viewing and organizing spreadsheets. However, I soon discovered that Excel is far more powerful and versatile than I had initially imagined.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Throughout the training, I gained practical skills in data cleaning and analysis using a variety of tools, including text and arithmetic functions, formatting and sorting techniques, and methods for correcting and managing data types. I also learned how to create pivot charts and interactive dashboards, which provided me with a better understanding of how raw data can be transformed into meaningful and actionable insights.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Upon completion of the course, it was time to move from theory to practice. The practical assignment was to develop an interactive dashboard to analyze the Jumia product dataset and uncover insights that could be be driving the pricing, promotions and customer-engagement.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Project Objective
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The key questions this project aims to address are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;whether larger discounts are associated with more reviews;&lt;/li&gt;
&lt;li&gt;whether highly rated products attract stronger engagement;&lt;/li&gt;
&lt;li&gt;whether price and rating move together;&lt;/li&gt;
&lt;li&gt;which products perform best based on ratings and reviews; and&lt;/li&gt;
&lt;li&gt;which products may need a different pricing or marketing strategy.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The provided dataset consists of 116 products listed on the rows while the columns showcasing the product name, current price, old price, the discount, customer reviews and customer ratings. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The dataset may seem virtually okay but there are some inconsistencies within it. For example, there are duplicated rows, cells are written using wrong data types and some cells are left blank. Let's work through this systematically moving from data cleaning to dashboard development and ultimately to translating the results into clear and actionable business insights.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Data-Quality Audit and Cleaning
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;I first downloaded the Jumia dataset file in csv format then I imported it into excel via clicking on &lt;code&gt;Data&lt;/code&gt; tab➡️ &lt;code&gt;get data&lt;/code&gt;➡️&lt;code&gt;from text/csv&lt;/code&gt;. Excel displays a preview of the imported data then the content is loaded in a new worksheet. I then duplicated the query in a new sheet and renamed it as desired, this prevented me from tampering with the original data. I was now ready to begin data cleaning.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6jirm7vo7pshu1jxzmoh.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%2F6jirm7vo7pshu1jxzmoh.png" alt=" " width="800" height="404"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The above shows the dataset in its original form prior to any cleaning&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I carried out a comprehensive data-quality audit on the raw dataset. This step allowed me to systematically identify inconsistencies such as missing values, duplicate rows, non-numeric entries, and out of range values. The findings from this audit are clearly shown in my jumia_project_dashboard.xlsx file&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Next step, I clicked on the Cleaned_Data worksheet then activated &lt;code&gt;Power Query&lt;/code&gt; in order to use it in cleaning my data since this is simpler than having to write multiple function for cleaning.  On the top left there is a &lt;code&gt;Query&lt;/code&gt; icon then clicked on &lt;code&gt;Edit&lt;/code&gt; and performed the changes shown below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First I check for any duplicates- I highlighted the first three columns then clicked on &lt;code&gt;Remove Duplicates&lt;/code&gt; this ensured that only exact-match rows were removed. Three duplicated rows were found and deleted.&lt;/li&gt;
&lt;li&gt;On the Product column, I used &lt;code&gt;Transform&lt;/code&gt; then &lt;code&gt;Trim&lt;/code&gt; to remove any unnecessary spaces in the cells while still retaining meaningful punctuation.
&lt;/li&gt;
&lt;li&gt;To finish I used &lt;code&gt;Close &amp;amp; Load&lt;/code&gt; and my dataset was loaded.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Current Price column, I used &lt;code&gt;ctrl+h&lt;/code&gt; then replaced  "KSh" with "  ", now changed the data type from General to &lt;code&gt;Currency&lt;/code&gt; ie Ksh2,199.00 for computation purposes. I then repeated the same process for the Old Price column.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The header Ratingd is misspelled, I also use &lt;code&gt;ctrl+h&lt;/code&gt; to change "Ratingd➡️Rating".&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For the Discount column, my observation was that once I imported my dataset from Csv format to Excel, the values were automatically converted to decimals. Therefore, the next thing was to change the data type into Percentage i.e 0.38➡️38%.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Review Column, all the values were negatives, I therefore treated the sign as a scraping artifact since review counts cannot be negative. Next I used &lt;code&gt;If&lt;/code&gt; function to convert the numbers to absolute values as shown below.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb39lzya5gfwhulund573.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%2Fb39lzya5gfwhulund573.png" alt=" " width="213" height="132"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Rating Column, the rates were written as "4.5 out of 5" though I wanted to only have the value without the "out of 5". Hence I used the &lt;code&gt;IF&lt;/code&gt; function to make the changes as shown&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpeo2fadw9fncvrumncz4.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%2Fpeo2fadw9fncvrumncz4.png" alt=" " width="475" height="126"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The current price for Seater Elastic Sofa (row 52) is given as a range (Ksh1,620–1,980). I used the midpoint as the expected price, since it is a safer estimate than picking from either extreme. Using the formula:&lt;br&gt;
&lt;code&gt;=IF(B52="","",AVERAGE(VALUE(TEXTBEFORE(B52,"")),VALUE(TEXTAFTER(B52,"-"))))&lt;/code&gt;&lt;br&gt;&lt;br&gt;
The midpoint value is Ksh1,800. Repeating the same process in order to find the midpoint value of the old price which is Ksh2,700. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Data cleaning is now complete i.e ratings and prices have been standardized, validation checks are in place, and Raw_Data remains untouched.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Data Enrichment
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Data Enrichment is the next step which refers to enhancing the existing dataset by adding extra useful information to it to make it more complete and accurate for analysis. For my dataset I decided to add some columns as explained below.&lt;/li&gt;
&lt;li&gt;Data Status column that would help users understand coverage of whether a product is "Complete" i.e has both review and rating or missing either of the field using the formula: &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;=IF(E2="","Missing Review/Rating","Complete")&lt;/code&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fus4b5dx9q8uof197fzr1.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%2Fus4b5dx9q8uof197fzr1.png" alt=" " width="328" height="135"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Discount Amount column so that I could compare the advertised discount with the calculated discount. Formula used to calculate discount was:
&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%2Frdr2beyki0dih4bkqaqo.png" alt=" " width="508" height="109"&gt;
Further analysis confirmed that the two values were aligned, and therefore no discrepancy was flagged.&lt;/li&gt;
&lt;li&gt;Rating Category column that would group the ratings was either "Poor" if below 3, "Average" that is between 3–4, and Excellent if above 4.5. This left the values between 4.1 and 4.4 as unclassified, as instructor clarification was not available, I chose to apply the working assumption of Poor &amp;lt; 3, Average 3–4.5, Excellent &amp;gt; 4.5 to ensure an exhaustive three-category classification.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;=IF([@Rating]="","Missing",IF([@Rating]&amp;lt;3,"Poor",IF([@Rating]&amp;lt;=4.5,"Average","Excellent")))&lt;/code&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa9wb3wgka9h9wchgiz8x.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%2Fa9wb3wgka9h9wchgiz8x.png" alt=" " width="351" height="186"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Discount Category column to to group the discounts as either "Low" if its below 20%, "Medium" if its between 20%-40% and "High" if above 40%. Formula used was:
&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%2Ft9drszow34hicw9wwz6v.png" alt=" " width="800" height="153"&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Price Category, deriving this required the identification of the first(Q1) and third(Q3) quartile prices first. This means finding the price below which the lowest 25% of products fall and the price below which 75% of products fall i.e. the top 25% lie above this value. Formulas used were:&lt;br&gt;
&lt;code&gt;=QUARTILE.INC(tb1Products[Current Price],1)&lt;/code&gt;   - for Q1 price&lt;br&gt;
&lt;code&gt;=QUARTILE.INC(tb1Products[Current Price],3)&lt;/code&gt;   - for Q3 price&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I then renamed the Q1 price cell as Product_Q1 which was "Ksh 493" while the cell containing Q3 price as Product_Q3 which was "Ksh 1669.50".
Next was to classify the current prices as either "Low", "High" or "Medium". All the prices below the Price_Q1 value were classified as "Low" while those prices between Price_Q1 and Price_Q3 value as "Medium" while the prices above the Price_Q3 value as "High". This was a better approach of classification other than choosing random arbitrary values.&lt;/li&gt;
&lt;li&gt;I used the formula below to perform the task:
&lt;code&gt;=IF([@[Current Price]]="","Missing",IF([@[Current Price]]&amp;lt;=Price_Q1,"Low Price",IF([@[Current Price]]&amp;lt;=Price_Q3,"Medium Price","High Price")))&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The results are shown below:
&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%2Faaausvzhm3wvah7johgb.png" alt=" " width="346" height="142"&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Engagement and Performance Flags
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;That section defined a set of yes/no labels known as "flags" that got attached to each product in the dataset based on its discount level, customer rating, and review volume relative to the overall product catalog. Rather than relying on subjective judgment, each flag was defined using percentile-based thresholds calculated directly from the dataset's distribution.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The base metrics used were:&lt;br&gt;
|Field Name|Formula|Value|Meaning&lt;br&gt;
|---|---|---|---|&lt;br&gt;
|&lt;code&gt;Engagement_Q3&lt;/code&gt;|=QUARTILE.INC(tb1Products[Review],3)|14|Products with 14 or more reviews are considered to have strong customer engagement/High reviews|&lt;br&gt;
|&lt;code&gt;Engagement_Q1&lt;/code&gt;|=QUARTILE.INC(tb1Products[Review],1)|5|Products with 5 or less reviews are considered to have low reviews|&lt;br&gt;
|&lt;code&gt;Discount_Q3&lt;/code&gt;|=QUARTILE.INC(tb1Products[Discount],3)|49%|Products discounted at 49% or more are considered  to have high discount|&lt;br&gt;
|&lt;code&gt;Rating_Q1&lt;/code&gt;|=QUARTILE.INC(tb1Products[Rating],1)|3|Products rated 3 or below are considered to have low rating|&lt;br&gt;
|&lt;code&gt;Rating_Q3&lt;/code&gt;|=QUARTILE.INC(tb1Products[Rating],3)|4.6|Products rated 4.6 and above are considered to have high rating|&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgqnkwvum0etx1m1zukje.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%2Fgqnkwvum0etx1m1zukje.png" alt=" " width="800" height="266"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I also created flags for 4 different categories as shown:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr0iux1kpfpq2hncpzft6.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%2Fr0iux1kpfpq2hncpzft6.png" alt=" " width="799" height="218"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Data Analysis
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;At this stage, it was time to begin analyzing the data in order to use this later in answering the key questions and derive meaningful insights.&lt;/li&gt;
&lt;li&gt;I calculated the KPI's(Key Performance Indicator) needed using various formulas and the findings were displayed in the &lt;code&gt;Analysis&lt;/code&gt; worksheet. as shown below.
&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%2F6yux0rs2htzbltkggn3y.png" alt=" " width="800" height="252"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Relationship Analysis
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;I copied the &lt;code&gt;tb1Products&lt;/code&gt; data into a new worksheet named &lt;code&gt;Helper_Data&lt;/code&gt; and filtered it to retain only rows with complete data across all four fields: Current Price, Discount, Rating, and Review. Using this cleaned dataset, I created three scatter charts: Discount vs Reviews, Rating vs Reviews, and Current Price vs Rating. Each with a linear trendline displaying the equation and R-squared value(R^2). The resulting charts are presented in the &lt;code&gt;Analysis&lt;/code&gt; worksheet&lt;/li&gt;
&lt;li&gt;Afterwards I calculated the Pearson correlations(r), the R-squared value(R^2) shown on your trendline is simply the Pearson correlation coefficient(r) squared i.e R^2=r^2 and the results achieved are shown below.
&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%2Fuikfoetw29wtx5vt0alx.png" alt=" " width="800" height="182"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Products Rating
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;I then created tables to rank the products according to different categories required for the analysis, I used a &lt;code&gt;PivotTable&lt;/code&gt; placing the "Product" name on the &lt;code&gt;Rows&lt;/code&gt; field and "relevant measure" on the &lt;code&gt;Value&lt;/code&gt; field, Sorted from Largest to Smallest and applied the Value Filter. I was required to make ranked tables for the following categories and the results posted in the &lt;code&gt;Analysis&lt;/code&gt; sheet. From the ranked tables, the business question to be answered were:

&lt;ul&gt;
&lt;li&gt;Which products have review counts above the engagement threshold? The engagement threshold was identified as 14 using the third quartile hence only 16 products were above this.&lt;/li&gt;
&lt;li&gt;Which products combine weak engagement with high discount? There were 7 products in this category. This means that even though these products have very high discounts the reviews are not many showing negative correlation between the two.&lt;/li&gt;
&lt;li&gt;Which products have high engagement but fall in the Average rating category? There were 6 products for this meaning they have  a lot of customer attention though the ratings sit in the "average" band rather than being top performers as expected.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  PivotTables and Pivot-Charts
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;After I ensured that everything was okay on the dataset, it was time to create several pivot tables and pivot charts that were required for analysis to compare different product measures. They are displayed in the &lt;code&gt;Pivot_Tables&lt;/code&gt; worksheet.&lt;/li&gt;
&lt;li&gt;Next I Inserted &lt;code&gt;Slicers&lt;/code&gt; for &lt;code&gt;Rating Category&lt;/code&gt;, &lt;code&gt;Discount Category&lt;/code&gt; and &lt;code&gt;Price Category&lt;/code&gt;. I then &lt;code&gt;Reported Connection&lt;/code&gt; for the slicers this is a very important step because it enables the user to filter all charts simultaneously when interacting with the dashboard.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Final Dashboard
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Now came the fun part creating an interactive Excel dashboard where all the KPI's, relevant charts, slicers, key insights and recommendations would be displayed. The dashboard should be limited to information that is essential to client and to the insights the analyst intends to convey.&lt;/li&gt;
&lt;li&gt;Orange was selected as the dashboard's primary color to reflect the established brand identity of Jumia, the client for this project.
&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%2Fd1arm4yor93nzpwl1216.png" alt=" " width="800" height="409"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key Findings
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Higher Discounts do not necessarily attribute to high customer engagement of products. Therefore, sellers should not rely solely on offering high discounts on products with the expectation of getting more reviews resulting from more sales.&lt;/li&gt;
&lt;li&gt;The total number of Reviews a product has does not attribute to it's Rating. From the dataset it was clear that popular products are not always the best rated and high sales volume does not mean high satisfaction &lt;/li&gt;
&lt;li&gt;Products with higher prices tend to have slightly higher ratings than the rest implying that price may signal quality, or high end buyers may simply be easily satisfied by their purchases.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Recommendations for Jumia Sellers
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Investigate the quality on highly discounted, low rated items. This includes reviewing the products for any defects, checking listings accuracy and and identifying possible delivery challenges before offering deeper discounts.&lt;/li&gt;
&lt;li&gt;Run controlled tests across different discount levels to see which level actually drives better customer engagement, instead of assuming bigger discounts always results to more sales.&lt;/li&gt;
&lt;li&gt;Improve the titles, photos, descriptions, and specifications of products with high engagement but average ratings, since these products already reach a large audience volume.&lt;/li&gt;
&lt;li&gt;Encourage customers to submit ratings and reviews after purchase to improve the quality and completeness of future analysis. &lt;/li&gt;
&lt;li&gt; Promote products with both strong ratings and strong engagement as trusted picks because they have demonstrated customer interest and satisfaction.&lt;/li&gt;
&lt;li&gt;Collect sales, revenue, returns, delivery, and customer complaint data in future analysis to create a more complete view of product performance.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Limitations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Small sample sizes where some groups had few data points making averages less reliable.&lt;/li&gt;
&lt;li&gt;Missing data point since for the Reviews and Rating, half of the cells were blank resulting to inefficient data for analysis.&lt;/li&gt;
&lt;li&gt;Due to the absence of sales or revenue figures, review counts stood in as an engagement measure though not confirming the actual sales.&lt;/li&gt;
&lt;li&gt;Correlation does not establish causation. The relationships identified in this project describe patterns rather than proving cause and effect.&lt;/li&gt;
&lt;li&gt;The dataset does not include important business variables such as units sold, revenue, profit margin, returns, delivery time, or customer complaints.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key Lessons
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Set thresholds before analyzing by defining "high," "low," and "average" upfront which keeps the analysis objective.&lt;/li&gt;
&lt;li&gt;Treat reviews, ratings, discounts, and prices as separate measures because they represent different aspects of performance.&lt;/li&gt;
&lt;li&gt;Use Power Query for repeatable data-cleaning steps.&lt;/li&gt;
&lt;li&gt;Brand alignment builds trust hence using Jumia's orange made the report feel client specific and not generic.&lt;/li&gt;
&lt;li&gt;Keep  the dashboard focused on the information required for decision making.&lt;/li&gt;
&lt;li&gt;These insights are a starting point, not a final verdict. As more data becomes available, revisiting this analysis will sharpen the recommendations and surface new patterns worth acting on.&lt;/li&gt;
&lt;li&gt;The complete project can be accessed on GitHub using the repository link below:
&lt;a href="https://github.com/Tracy-Kihara/Jumia-Product-Dashboard" rel="noopener noreferrer"&gt;https://github.com/Tracy-Kihara/Jumia-Product-Dashboard&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>data</category>
      <category>analytics</category>
    </item>
    <item>
      <title>Getting Started with Excel for Data Analytics: From Basics to Data Cleaning</title>
      <dc:creator>Tracy K</dc:creator>
      <pubDate>Sun, 30 Aug 2026 20:42:32 +0000</pubDate>
      <link>https://dev.to/tracy_k/getting-started-with-excel-for-data-analytics-from-basics-to-data-cleaning-2bdb</link>
      <guid>https://dev.to/tracy_k/getting-started-with-excel-for-data-analytics-from-basics-to-data-cleaning-2bdb</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Microsoft Excel is a spreadsheet program developed by Microsoft used to collect, organize, analyze and visualize data. It organizes data into rows and columns, allowing for complex computations and visual representations.&lt;/li&gt;
&lt;li&gt;It is a powerful and versatile tool for data analysis, while effective data cleaning ensures accuracy providing a strong foundation for meaningful insights and informed decision-making.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Excel Interface
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;An excel file is known as a workbook.&lt;/li&gt;
&lt;li&gt;A workbook is made up of worksheets that can be renamed as desired for easier identification.&lt;/li&gt;
&lt;li&gt;An excel worksheet is made up of rows and columns. The rows are horizontal lines of cells numbered 1,2,3... while the columns are vertical lines of cells labeled A,B,C...&lt;/li&gt;
&lt;li&gt;A cell is an intersection of a row and a column where you enter data such as A1&lt;/li&gt;
&lt;li&gt;A ribbon is the toolbar across the top that contains all commands organized into tabs that is: Home, Insert, Draw, Formulas, Page Layout and Data.&lt;/li&gt;
&lt;li&gt;Once you open an excel workbook containing data, it is advisable to open a new worksheet and copy paste the existing data which you will use in data cleaning so that you do not alter the original data.&lt;/li&gt;
&lt;li&gt;Below is an example of an excel workbook:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwh9k2xh88bk1fyqly1jm.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%2Fwh9k2xh88bk1fyqly1jm.png" alt=" " width="800" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Types
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Data types are the different forms of data that can be entered in an excel sheet. They comprise of:

&lt;ul&gt;
&lt;li&gt;Text -words e.g Nairobi&lt;/li&gt;
&lt;li&gt;Numbers - used for counting and computations e.g 17, 40, 56 &lt;/li&gt;
&lt;li&gt;Date - e.g 20/08/2004&lt;/li&gt;
&lt;li&gt;Currency - money amounts e.g $500&lt;/li&gt;
&lt;li&gt;Formula - a command that performs calculations e.g =A1+B1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Data Formatting
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It changes how cell values appear without modifying the underlying raw data, it makes data look more clear and well organized. &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Basic Types of Formatting
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Font- it changes the color, type and size of a text.&lt;/li&gt;
&lt;li&gt;Bold(B)/Italics(I)/Underline(U)- changes the style of a text. Example John➡️&lt;strong&gt;John&lt;/strong&gt;, John➡️&lt;em&gt;John&lt;/em&gt; and John➡️&lt;u&gt;John&lt;/u&gt;.&lt;/li&gt;
&lt;li&gt;Borders- adds lines on a cell.&lt;/li&gt;
&lt;li&gt;Horizontal Alignment- positions data to the left, center or right&lt;/li&gt;
&lt;li&gt;Vertical Alignment- positions data to the top, middle or bottom&lt;/li&gt;
&lt;li&gt;Wrap text- makes long text to appear on multiple lines in the same cell&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Number Formatting
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;It controls how numbers look in a cell depending on the format applied. 
-Go to the Home tab, in the Number group, choose a format from the drop-down list. Examples:

&lt;ul&gt;
&lt;li&gt;Number- 1234.567➡️1,234.56&lt;/li&gt;
&lt;li&gt;Currency- 1234.57➡️$1,234.56, Ksh1,234.56&lt;/li&gt;
&lt;li&gt;Percentage- 0.25➡️25%&lt;/li&gt;
&lt;li&gt;Fraction- 0.25➡️1/4&lt;/li&gt;
&lt;li&gt;Date- 2021-12-01&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fei8etxstnz81hdh81oa4.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%2Fei8etxstnz81hdh81oa4.png" alt=" " width="613" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Cleaning Using Text Functions
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It refers to removing incorrect, unwanted, or messy data so that it is accurate and easy to use by use of various text functions&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Upper()- converts text to upper case
&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%2Fhfo1oub67vgulcax9o8f.png" alt=" " width="199" height="96"&gt;
&lt;/li&gt;
&lt;li&gt;Lower()- converts text to lower case
&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%2Fns3oovfhotkjw3qnl6v4.png" alt=" " width="205" height="103"&gt;
&lt;/li&gt;
&lt;li&gt;Proper()- capitalizes first letter of each
word
&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%2Fnpsiodpwhqjrugaqytjy.png" alt=" " width="201" height="103"&gt;
&lt;/li&gt;
&lt;li&gt;Left()- extracts leftmost letters in a word
&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%2Fp57c0qsw7ulewbp978nl.png" alt=" " width="208" height="106"&gt;
&lt;/li&gt;
&lt;li&gt;Right()- extracts rightmost letters in a word
&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%2Fzuguer70pmkv81yrwcl4.png" alt=" " width="208" height="103"&gt;
&lt;/li&gt;
&lt;li&gt;Trim()- removes extra spaces in a word
&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%2Fm95n293lforva3vcptfj.png" alt=" " width="226" height="100"&gt;
&lt;/li&gt;
&lt;li&gt;Len()- shows the number of letters in a text
&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%2F1zl8ljmvs9je63fbo9cf.png" alt=" " width="151" height="94"&gt;
&lt;/li&gt;
&lt;li&gt;Mid()- displays the characters from the middle in a word
&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%2F8kimlf536euioyygs4fm.png" alt=" " width="192" height="97"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Case Example
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Below is an excel worksheet containing data that needs to be cleaned:
&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%2F2gp7itkp0pz3jio750t3.png" alt=" " width="800" height="228"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Cleaning the Patient ID column
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Some data consists of numbers while others consist of numbers and texts. The proper data type should be text since patient ID is an identifier and although it is made up of values, there is no computation that can be done.&lt;/li&gt;
&lt;li&gt;Select the column, press &lt;code&gt;ctrl+h&lt;/code&gt; for the find and replace tool, replace "PM-" with " ". This will omit the unwanted text as shown.
&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%2Fkn1li60ip1sjon3roi6v.png" alt=" " width="577" height="303"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Cleaning the first and last name column
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Use the Proper() function discussed earlier to ensure that text in the first and last name column are written in proper case.
&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%2Foiuj36utoqnyeqk5zzkn.png" alt=" " width="322" height="300"&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%2Fn3yts5v0xs3u2cu8fwgk.png" alt=" " width="334" height="294"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Cleaning the gender column
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;The gender column consists of texts that have been misspelled, the goal is to ensure that all the cells are either "Male" or "Female".&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;ctrl+h&lt;/code&gt; to find all misspelled texts and replace them.
&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%2Fyj7rd4jdn6ylpx4mkfon.png" alt=" " width="340" height="214"&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%2Fgfgnqrv48q8x4z7gohhn.png" alt=" " width="346" height="117"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Cleaning the bill amount column
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;The column consists of values in both text and number data types as well as values in different currencies.&lt;/li&gt;
&lt;li&gt;The words formatted on the left have text data type while those formatted on the right have number data type.&lt;/li&gt;
&lt;li&gt;First delete letters appearing before the numbers then use the currency format and select "Ksh" to ensure the currency is in Kenyan Shilling.
&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%2Fa7d5fscs6g1ya0jl059n.png" alt=" " width="204" height="294"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Creating an email column
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Assuming you want to add a new column containing the patients email addresses, you can use Concat() function to join the first and last names, then, use lower() and concat() functions together to create an email address as shown below:
&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%2Fisxpt1262s56se3ziqam.png" alt=" " width="634" height="370"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Sorting and Filtering
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Sorting arranges data in a specific order. This include: 

&lt;ul&gt;
&lt;li&gt;Text Sorting (A to Z or Z to A)&lt;/li&gt;
&lt;li&gt;Number Sorting (Smallest to Largest or vice versa)&lt;/li&gt;
&lt;li&gt;Date Sorting (Oldest to Newest or vice versa)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Filtering shows only the records that meet specific conditions while the other records are temporarily hidden. Common types of filter are:

&lt;ul&gt;
&lt;li&gt;Text Filter(Contains, Does Not Contain, Begins With)&lt;/li&gt;
&lt;li&gt;Number Filter(Greater Than, Less Than, Between)&lt;/li&gt;
&lt;li&gt;Date Filter(Before, After, This Month, Last Year)&lt;/li&gt;
&lt;li&gt;Color Filter(Filters by cell or font color)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Functions in Excel
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;An excel function is a preset formula that performs specific calculations.&lt;/li&gt;
&lt;li&gt;Sum()- adds numeric values in a range.&lt;/li&gt;
&lt;li&gt;Average()- calculates the mean of values.&lt;/li&gt;
&lt;li&gt;Max()- finds largest value.&lt;/li&gt;
&lt;li&gt;Min()- finds lowest value.&lt;/li&gt;
&lt;li&gt;Count()- counts how many numbers are in a range of selected cells&lt;/li&gt;
&lt;li&gt;CountA()- counts the number of cells that are not empty both numbers and texts.&lt;/li&gt;
&lt;li&gt;If()- checks whether a condition is true or false and returns a specified result.&lt;/li&gt;
&lt;li&gt;CountIf()- counts the number of cells that meet a specific condition.&lt;/li&gt;
&lt;li&gt;SumIf()- adds values that meet a specific condition.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;This article provides an introduction to the basics of excel, but there is so much more this powerful tool can do. Mastering excel is a continuous journey that requires practice, consistency, and a willingness to learn. Start your journey with excel today to turn data into insights, and insights into impact.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>beginners</category>
      <category>data</category>
    </item>
    <item>
      <title>Git Workflow</title>
      <dc:creator>Tracy K</dc:creator>
      <pubDate>Sun, 23 Aug 2026 07:30:21 +0000</pubDate>
      <link>https://dev.to/tracy_k/git-workflow-543p</link>
      <guid>https://dev.to/tracy_k/git-workflow-543p</guid>
      <description>&lt;h2&gt;
  
  
  File Creation and Working directory
&lt;/h2&gt;

&lt;p&gt;*From your local device, locate and open git to access git bash&lt;br&gt;
*From the git bash command execution area, enter the command cd to take you to the home path.&lt;br&gt;
*Then enter command &lt;code&gt;cd Desktop&lt;/code&gt; to navigate to the desktop folder.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Use the commands below to create a new folder *&lt;/em&gt;&lt;br&gt;
*&lt;code&gt;mkdir my-first-project&lt;/code&gt;. This opens a new folder. There are two options in naming:&lt;br&gt;
       *use hyphens to separate the name not spaces&lt;br&gt;
       *write the folder name under quotation marks e.g 'my first           project'. This prevents generation of three individual folders instead of one. &lt;/p&gt;

&lt;p&gt;*&lt;code&gt;cd my-first-project&lt;/code&gt;. It takes you inside your created folder hence, this will be your working directory.&lt;br&gt;
*&lt;code&gt;touch filename.extension&lt;/code&gt;. This creates a new file that is specific to the type of extension you want. For example, data.xlsx for excel, script.py for python and notes.txt for text file.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One file creation, you data edit and add content in your respective created file above.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  GitHub repository creation
&lt;/h2&gt;

&lt;p&gt;*Open your browser and log into github.&lt;br&gt;
*From the home page, on the top right locate (+) icon and select new repository to create a new repository.&lt;br&gt;
*Give your repo an appropriate name, add a description which should be clear and precise but not mandatory. &lt;br&gt;
*You can make the repo either public or private depending on your preference. Public repo is visible to everyone while private repo is only visible in your account.&lt;/p&gt;

&lt;h2&gt;
  
  
  Staging and commit
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;To stage your files, use commands below&lt;/strong&gt;&lt;br&gt;
*from the working directory in git, use the following commands:&lt;br&gt;
*&lt;code&gt;git init&lt;/code&gt; to initialize your git&lt;br&gt;
*&lt;code&gt;git add .&lt;/code&gt; to move your files e.g script.py from working directory to the staging area. The staging area is where your files stay before they get committed.&lt;br&gt;
*&lt;code&gt;git commit -m 'initial commit'&lt;/code&gt; to move your files from the staging area to the local repository. Local repository is a hidden repo that is managed by git.&lt;/p&gt;

&lt;p&gt;*Go back to github , locate your created repo, open the repo and find the green button written 'code', click on the drop down symbol and copy the link that is under https.&lt;/p&gt;

&lt;p&gt;*&lt;code&gt;git remote add origin github_https_link'&lt;/code&gt;. This connects a remote repository hosted on GitHub to your local Git repository on your PC.&lt;br&gt;
*&lt;code&gt;git push origin main&lt;/code&gt; to push your files from your local computer to your github repository&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
    </item>
  </channel>
</rss>
