<?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: Wendy Adika</title>
    <description>The latest articles on DEV Community by Wendy Adika (@wendy_adika_e0949a228a269).</description>
    <link>https://dev.to/wendy_adika_e0949a228a269</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%2F4070908%2Fc2db8dd2-baee-420e-abbb-57fdba86e17b.jpg</url>
      <title>DEV Community: Wendy Adika</title>
      <link>https://dev.to/wendy_adika_e0949a228a269</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/wendy_adika_e0949a228a269"/>
    <language>en</language>
    <item>
      <title>Data Modelling, Relationships &amp; Joins in Power Bi</title>
      <dc:creator>Wendy Adika</dc:creator>
      <pubDate>Sun, 13 Sep 2026 11:29:39 +0000</pubDate>
      <link>https://dev.to/wendy_adika_e0949a228a269/data-modelling-relationships-joins-in-power-bi-2bfk</link>
      <guid>https://dev.to/wendy_adika_e0949a228a269/data-modelling-relationships-joins-in-power-bi-2bfk</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Microsoft Power BI&lt;/strong&gt; is a business intelligence platform used to find insights within an organization's data. It can help connect disparate data sets, transform and clean the data into a data model and create charts or graphs to provide visuals of the data. All of this can be shared with other Power BI users within the organization.&lt;br&gt;
Every Power BI report is only as good as the data model sitting underneath it. Visuals, DAX measures, and refresh performance all trace back to a handful of structural decisions made early on: how tables are shaped, how they relate to one another, and how data is combined before it ever reaches the report canvas. This article works through those decisions using a running sales scenario as a consistent example throughout, before closing with a recommended model design and the reasoning behind it.&lt;/p&gt;

&lt;h2&gt;
  
  
  i). Data Modelling
&lt;/h2&gt;

&lt;p&gt;A data model, at its core, comes down to how tables relate to one another. Each table is responsible for one piece of the data. An example is sales transactions or product details and clear connections that tie those tables together.&lt;/p&gt;

&lt;p&gt;Data Modeling in Power BI is the process of organizing multiple tables and defining relationships between them so that Power BI can efficiently analyze and visualize business data. The main data modelling approaches are flat table, star schema and snowflake schema.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Importance of a well designed data model.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Reporting&lt;/em&gt;: It will organize data into familiar business terms using dimensional structures (like fact and dimension tables) rather than rigid source-system formats. It will prevents conflicting metrics across departments by establishing standardized definitions and relationships.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Dax Calculations&lt;/em&gt;: It eliminates the need for complex, nested filter manipulation (FILTER, EARLIER) by letting relationships handle context automatically.It also prevents common errors like double-counting or incorrect cross-filtering between unrelated tables.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Performance&lt;/em&gt;: It reduces memory consumption and file size by removing unnecessary columns and optimizing data types wich equals to faster load time and efficient storage.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Scalability&lt;/em&gt;: It handles expanding data volumes and historical additions without degrading query response times and makes adding new data sources straightforward because you already have a clear conceptual framework for where new information fits.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Maintainability&lt;/em&gt;: It allows you to modify or expand reporting requirements locally without breaking existing visuals or downstream dashboards.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1. Flat Table
&lt;/h3&gt;

&lt;p&gt;A flat table stores most or all reporting information in one wide table. For example, a retail dataset could contain OrderID, OrderDate, CustomerID, CustomerName, ProductID, ProductName, Category, Store, Quantity, UnitPrice, Discount, and SalesAmount in every transaction row.&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%2F3k6ietd8xcw1pqodhwpq.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%2F3k6ietd8xcw1pqodhwpq.png" alt="flat table model" width="800" height="214"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Advantages&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Simple to understand: There is nothing to join or relate since everything is visible in one place.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fast to build for a one-off, small analysis with no ongoing maintenance need.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Straightforward for basic visuals.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Disadvantages&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Heavy data redundancy&lt;/em&gt;: The same customer or product attributes repeat on every transaction row, inflating file size and memory usage.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Update anomalies&lt;/em&gt;: if a customer's city changes, every historical row for that customer must be updated, or the data becomes inconsistent.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;DAX becomes harder at scale&lt;/em&gt;: Measures that should be simple aggregations end up needing extra logic to avoid double-counting repeated attribute values.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When it is apprpriate&lt;/strong&gt;:&lt;br&gt;
In Power BI, a flat table can work well for a small dataset because there are fewer relationships and less modelling effort. However, as data grows, repeated customer, product, or location attributes increase redundancy and can make maintenance harder. A flat table also does not naturally express the business separation between facts and dimensions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performance and complexity implications&lt;/strong&gt;:&lt;br&gt;
Model complexity is low (one table, no relationships), but runtime performance is often poor at scale: wide flat tables compress less efficiently, and repeated text values consume far more memory than the same values stored once in a dimension table and referenced by a numeric key.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Star Schema
&lt;/h3&gt;

&lt;p&gt;A star schema organizes data around a central fact table, connected directly to a set of surrounding dimension tables: one join per dimension, no intermediate tables. Viewed in Power BI's Model View, the fact table sits in the middle with relationship lines radiating outward to each dimension, resembling a star.&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%2F0ihk53wx7jj4ox0zmakm.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%2F0ihk53wx7jj4ox0zmakm.png" alt="Star Schema" width="800" height="715"&gt;&lt;/a&gt;&lt;br&gt;
The fact table (FactSales) holds transactional measures and foreign keys. Each dimension table (DimCustomer, DimProduct, DimDate, DimStore) is fully denormalized on its own. For example, DimCustomer holds every customer attribute in one table, with no further breakout into separate store or date tables.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Advantages&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Simple, predictable relationship paths&lt;/em&gt;: Every dimension is exactly one join away from the fact table, which keeps DAX filter logic intuitive.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Strong VertiPaq compression&lt;/em&gt;: Narrow, single-purpose dimension columns with repeated values compress extremely well.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Fast query performance&lt;/em&gt;: Fewer joins mean fewer hops for Power BI to resolve when a report applies a filter.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Easy for report authors to navigate&lt;/em&gt;: Dimension fields are grouped logically and predictably in the field list.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Disadvantages&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Some redundancy remains inside each denormalized dimension table (e.g., a city name repeated for every customer in that city), though far less than a flat table.&lt;/li&gt;
&lt;li&gt;Less “textbook normalized” than a snowflake schema, which can matter in strict data-warehousing contexts outside of BI reporting.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When it is appropriate&lt;/strong&gt;:&lt;br&gt;
The star schema is the recommended default for the overwhelming majority of Power BI reporting models such as sales analysis, financial reporting, operational dashboards because it balances simplicity, performance, and maintainability better than either alternative.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performance and complexity implications&lt;/strong&gt;:&lt;br&gt;
Star schemas are what Power BI's VertiPaq engine and DAX language are optimized for. Model complexity stays low even as more dimensions are added, and performance scales well because each additional dimension is still just one join away from the fact table.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Snowflake Schema
&lt;/h3&gt;

&lt;p&gt;A snowflake schema takes a star schema's dimension tables and normalizes them further, splitting each into smaller, related sub-dimension tables. Instead of DimCustomer holding city and country directly, those attributes move into separate DimCity and DimCountry tables, connected in a chain back to DimCustomer.&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%2Fjhbab2lswjri5dr8vej4.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%2Fjhbab2lswjri5dr8vej4.png" alt="snowflake schema" width="800" height="669"&gt;&lt;/a&gt;&lt;br&gt;
The fact table still sits at the centre, but some dimensions now require two or more joins to reach. For example, filtering FactSales by Country means passing through DimCustomer &amp;gt; DimCity &amp;gt; DimCountry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Advantages&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Eliminates redundancy within dimensions: A country name is stored once in DimCountry rather than repeated across every customer row.&lt;/li&gt;
&lt;li&gt;Can reduce dimension table size when a dimension has genuinely hierarchical, highly repetitive attributes shared by many members.&lt;/li&gt;
&lt;li&gt;Familiar to teams coming from traditional, fully normalized relational data-warehouse design.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Disadvantages&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More relationships to maintain and reason about, increasing model complexity.&lt;/li&gt;
&lt;li&gt;Multi-hop filter paths can slow query performance, since Power BI must traverse several relationships to filter the fact table from an outer sub-dimension.&lt;/li&gt;
&lt;li&gt;Harder for report authors to navigate because related fields are spread across more tables in the field list.&lt;/li&gt;
&lt;li&gt;Diminishing returns in Power BI specifically: VertiPaq's columnar compression already minimizes much of the storage benefit that snowflaking is meant to achieve in traditional row-based databases.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When it is appropriate&lt;/strong&gt;:&lt;br&gt;
Snowflaking is worth considering when a dimension is very large and its sub-attributes are reused identically across many other dimensions (a shared DimGeography used by both DimCustomer and DimStore, for instance), or when a data source is already normalized upstream, and further denormalizing it into a full star schema is not practical.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performance and complexity implications&lt;/strong&gt;:&lt;br&gt;
Snowflake schemas generally increase model complexity and can reduce performance relative to a star schema, because Power BI must resolve longer filter-propagation chains. The storage savings that justify snowflaking in traditional relational databases are largely already achieved by VertiPaq's compression, which weakens the case for snowflaking in most Power BI models.&lt;/p&gt;

&lt;h3&gt;
  
  
  Schema comparison Table
&lt;/h3&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%2Fkgure3ywzj1rg1z9pngk.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%2Fkgure3ywzj1rg1z9pngk.png" alt="Schema Comparison Table" width="688" height="326"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ii). Fact Table and Dimension Table
&lt;/h2&gt;

&lt;p&gt;Star and snowflake schemas both depend on a clear division of labour between two table types: fact tables, which record business events, and dimension tables, which describe the entities involved in those events.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fact Tables
&lt;/h3&gt;

&lt;p&gt;A fact table stores measurable, numeric business events including the things a business wants to sum, average, or count. Typical fact tables include FactSales, FactOrders, and FactTransactions. Each row in a fact table generally represents one occurrence of the tracked event (one sale line, one order line, one transaction) and contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Foreign keys pointing to related dimension tables (CustomerKey, ProductKey, DateKey, LocationKey).&lt;/li&gt;
&lt;li&gt;Measures which are numeric values meant to be aggregated, such as SalesAmount, Quantity, or Discount.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A crucial concept for any fact table is its grain. Grain is the level of detail a single row represents. A fact table with a grain of “one row per order line” is very different from one with a grain of “one row per order,” even if both are called FactSales; the grain determines what can and cannot be calculated correctly from the table. Grain should be decided deliberately and kept consistent. Mixing grains within a single fact table (some rows per line item, others pre-aggregated per order) is a common source of double-counting errors in DAX measures.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dimensions table
&lt;/h3&gt;

&lt;p&gt;Dimension tables contain descriptive attributes used to group, filter, and explain facts. Common dimensions include DimCustomer, DimProduct, DimDate, and DimLocation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Measures vs. Descriptive Attributes&lt;/strong&gt;&lt;br&gt;
The distinction between a measure and a descriptive attribute is really a distinction between what belongs in a fact table and what belongs in a dimension table. SalesAmount is a measure: it is meaningful to sum it across thousands of rows. ProductCategory is a descriptive attribute: summing it makes no sense, but grouping and filtering by it does. Keeping measures and descriptive attributes in separate tables is what makes a star schema efficient. Power BI can compress and filter a column of repeated category labels very differently from a column of continuously varying sale amounts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Worked Example: FactSales at the Centre of a Star Schema&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Consider a retail business tracking online sales. A single central fact table, FactSales, records one row per sale line: a SalesID, the numeric SalesAmount and Quantity, and foreign keys to four dimensions. Each dimension supplies the descriptive context needed to make that fact meaningful in a report:&lt;/p&gt;

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

&lt;p&gt;With this structure, a report can answer “total SalesAmount by Region and Quarter” by summing FactSales while grouping by attributes pulled from DimLocation and DimDate without a single duplicated customer or product name anywhere in the fact table itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  iii). Relationships in PowerBI
&lt;/h2&gt;

&lt;p&gt;A relationship in the Power BI data model is a defined link between two tables, based on a shared column, that tells Power BI how to combine data from both tables when a report requests it. Relationships are what make a star or snowflake schema function as a single connected model rather than a collection of unrelated tables. Without them, filtering DimProduct to a single category would have no effect on FactSales at all.&lt;br&gt;
The diagram below shows the different types of relationships.&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%2F2yrifldndqrtufpkmyrk.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%2F2yrifldndqrtufpkmyrk.png" alt="Relationships types in powerbi" width="799" height="228"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;This is the standard, most common relationship in a star schema: one row in a dimension table (the “1” side) can relate to many rows in a fact table (the “*” side). Example: one product in DimProduct appears on many rows in FactSales. Use this whenever a dimension's key is unique and a related table repeats that key for multiple events. It should not be used when the “one” side is not actually unique. If DimProduct itself contains duplicate ProductKey values, Power BI will raise an ambiguity error or produce a many-to-many relationship.&lt;/p&gt;

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

&lt;p&gt;Each row in one table relates to exactly one row in the other, with unique keys on both sides, for example, DimEmployee and a supplementary DimEmployeeDetail table both keyed by the same unique EmployeeID. This is uncommon in typical star schemas and is generally used only when splitting one logical entity across two physical tables (for security reasons, or because the data arrives from two separate systems).&lt;/p&gt;

&lt;h3&gt;
  
  
  Many-to-Many (&lt;em&gt;:&lt;/em&gt;)
&lt;/h3&gt;

&lt;p&gt;Both sides of the relationship can contain repeated key values. For example, FactSales and a DimPromotion table where a single sale can qualify for multiple promotions, and a single promotion can apply to multiple sales. Many-to-many relationships should be used carefully and sparingly. They can produce ambiguous or unexpectedly inflated aggregation results, and are usually better resolved with an intermediate bridge table that turns the problem back into two clean one-to-many relationships.&lt;/p&gt;

&lt;h3&gt;
  
  
  Primary Keys, Foreign Keys, and Uniqueness
&lt;/h3&gt;

&lt;p&gt;Every relationship in Power BI depends on two roles being clearly assigned:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Primary key&lt;/strong&gt;: A column in a dimension table containing unique values, with no duplicates, that identifies each row (CustomerID in DimCustomer).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Foreign key&lt;/strong&gt;: A column in another table (typically a fact table) that stores those same key values, but is expected to repeat many times, once for every event associated with that dimension member (CustomerID repeated across every row in FactSales for that customer).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is precisely why CustomerID contains unique values in DimCustomer but appears many times as a foreign key in FactSales: DimCustomer holds one row per customer, while FactSales holds one row per sale, and any customer can have many sales.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cardinality, Referential Integrity and Active/Inactive Relationships
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Cardinality&lt;/strong&gt; describes the matching pattern between tables: 1:&lt;em&gt;, 1:1, or *:&lt;/em&gt;. &lt;strong&gt;Referential integrity&lt;/strong&gt; means every foreign key value in the fact table has a matching primary key value in the related dimension table: no “orphan” sales pointing to a CustomerID that does not exist in DimCustomer. Power BI handles violations by grouping unmatched rows under a blank member rather than failing outright, but persistent referential-integrity gaps usually indicate an upstream data-quality problem worth fixing at the source.&lt;br&gt;
A single pair of tables can have more than one plausible relationship eg FactSales might have both an OrderDate and a ShipDate, each of which could relate to DimDate. Power BI allows only one active relationship between two tables at a time (the one used automatically by visuals); any additional relationship must be marked inactive and invoked explicitly in DAX using the USERELATIONSHIP function when a calculation specifically needs the alternate date.&lt;/p&gt;

&lt;h2&gt;
  
  
  iv). Filter Direction
&lt;/h2&gt;

&lt;p&gt;Filter direction determines which way a selection made on one table propagates to affect another, related table. This is set per relationship and is one of the most consequential yet most commonly misunderstood settings in a Power BI model.&lt;br&gt;
The diagram below shows the two filtering directions:&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%2Fpztk1pmfrv9d9khiw6di.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%2Fpztk1pmfrv9d9khiw6di.png" alt="filter directions" width="799" height="278"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Single-Direction Filtering
&lt;/h3&gt;

&lt;p&gt;In single-direction filtering, a selection on the “1” side of a relationship (a dimension table) filters the “*” side (the fact table), but not the reverse. For example, selecting “Electronics” in DimProduct filters FactSales down to electronics sales but a selection made directly on FactSales does not filter DimProduct back. This is the default behaviour for one-to-many relationships in Power BI, and it correctly matches how most star schema reporting is meant to work: dimensions drive filters on facts, not the other way around.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bidirectional Filtering
&lt;/h3&gt;

&lt;p&gt;Bidirectional (both-direction) filtering allows the filter to propagate both ways: a selection on DimProduct still filters FactSales, but a selection or calculation touching FactSales can now also filter back onto DimProduct. This is occasionally necessary, for example, to make a slicer built from a fact table correctly limit an unrelated dimension in a many-to-many scenario but it should be applied carefully and only when needed.&lt;/p&gt;

&lt;p&gt;The main risks of overusing bidirectional filtering are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ambiguous filter paths: When multiple bidirectional relationships create more than one possible route between two tables, Power BI may be unable to resolve which path should apply, or may apply one path unexpectedly.&lt;/li&gt;
&lt;li&gt;Unnecessary model complexity: Bidirectional relationships are harder to reason about and debug, since the effect of a single filter can now ripple through the model in ways that are not immediately obvious from looking at a single relationship line.&lt;/li&gt;
&lt;li&gt;Performance cost: Resolving filters in both directions requires more computation than a single, predictable direction.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The general guidance is to leave relationships single-directional by default and enable bidirectional filtering only on a specific relationship, for a specific, well-understood reason but never as a default troubleshooting step when a filter “isn't working.”&lt;/p&gt;

&lt;h2&gt;
  
  
  v) Joins in Power Query
&lt;/h2&gt;

&lt;p&gt;A join (called a Merge Query in Power Query) combines rows from two tables based on matching values in one or more key columns. It is a similar in concept to a SQL join, but performed during data loading and transformation, before the data ever reaches the Power BI data model. Power Query's Merge Queries dialog supports six join kinds, illustrated below using a Customers table and an Orders table.&lt;br&gt;
See figure below.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Left Outer Join
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Definition&lt;/strong&gt;: keeps every row from the left table (Customers) and attaches matching columns from the right table (Orders) where a match exists; unmatched left rows are kept with nulls in the right-hand columns.&lt;br&gt;
&lt;strong&gt;Retained&lt;/strong&gt;: all left rows, plus matched right rows.&lt;br&gt;
&lt;strong&gt;Example&lt;/strong&gt;: Customers = {Amina, John, Wanjiru}; Orders = {Amina–Order1, John–Order2}. A left outer join on Customer returns Amina with Order1, John with Order2, and Wanjiru with a null order. Wanjiru is not dropped even though she has no order.&lt;/p&gt;

&lt;h3&gt;
  
  
  Right Outer Join
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Definition&lt;/strong&gt;: the mirror image of a left outer join. It keeps every row from the right table (Orders) and attaches matching columns from the left table (Customers) where a match exists.&lt;br&gt;
&lt;strong&gt;Retained&lt;/strong&gt;: all right rows, plus matched left rows.&lt;br&gt;
&lt;strong&gt;Example&lt;/strong&gt;: using the same tables, if Orders additionally contains an order with no matching customer record (a deleted or missing customer), a right outer join still returns that order, with null customer details attached.&lt;/p&gt;

&lt;h3&gt;
  
  
  Full Outer Join
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Definition&lt;/strong&gt;: keeps every row from both tables, matching where possible and filling with nulls on whichever side has no match.&lt;br&gt;
&lt;strong&gt;Retained&lt;/strong&gt;: all rows from both Customers and Orders.&lt;br&gt;
&lt;strong&gt;Example&lt;/strong&gt;: the result includes Amina and John with their orders, Wanjiru with a null order, and any order with no matching customer, with null customer details or nothing from either table is dropped.&lt;/p&gt;

&lt;h3&gt;
  
  
  Inner Join
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Definition&lt;/strong&gt;: keeps only rows where a match exists in both tables.&lt;br&gt;
&lt;strong&gt;Retained&lt;/strong&gt;: only matched rows, which is the intersection.&lt;br&gt;
&lt;strong&gt;Example&lt;/strong&gt;: only Amina and John appear in the result, since only they have matching orders; Wanjiru (no order) and any unmatched order are excluded entirely.&lt;/p&gt;

&lt;h3&gt;
  
  
  Left Anti Join
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Definition&lt;/strong&gt;: keeps only rows from the left table (Customers) that have no match in the right table (Orders); no columns from the right table are attached, since by definition there is nothing to attach.&lt;br&gt;
&lt;strong&gt;Retained&lt;/strong&gt;: unmatched left rows only.&lt;br&gt;
&lt;strong&gt;Example&lt;/strong&gt;: the result is just Wanjiru and is useful for a “customers who have never placed an order” report.&lt;/p&gt;

&lt;h3&gt;
  
  
  Right Anti Join
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Definition&lt;/strong&gt;: the mirror image of a left anti join. It keeps only rows from the right table (Orders) that have no match in the left table (Customers).&lt;br&gt;
&lt;strong&gt;Retained&lt;/strong&gt;: unmatched right rows only.&lt;br&gt;
&lt;strong&gt;Example&lt;/strong&gt;: the result is only the order with no matching customer record. It is useful for finding orphaned transactions that point to a missing or deleted customer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Join summary table&lt;/em&gt;&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%2Fwn7gx8cl43qmasxnao1i.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%2Fwn7gx8cl43qmasxnao1i.png" alt="Join summary table" width="619" height="191"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  vi). Power Query Join vs Power BI Relationships.
&lt;/h2&gt;

&lt;p&gt;Merging tables in Power Query and creating a relationship in the Power BI data model can look superficially similar because both connect two tables on a matching key but they operate at different stages of the workflow and have very different consequences for the resulting 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%2F4ml5ju69znkno3rg38lh.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%2F4ml5ju69znkno3rg38lh.png" alt="Power Query Join vs Power BI Relationships" width="619" height="224"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A merge is the right choice when data genuinely needs to be flattened once upstream for example, resolving a lookup value from a small reference table into a single column before the query is loaded, where creating a full dimension table would be overkill. A relationship is the right choice for connecting a fact table to its dimensions, because it preserves each table's independent structure, avoids duplicating dimension attributes across every fact row, and lets Power BI's filter-propagation engine do the work of applying filters across tables at query time rather than at load time.&lt;br&gt;
Excessive merging pulls a model back toward the flat-table pattern discussed in Section 1: descriptive attributes get copied into transactional rows, redundancy increases, and the model loses the clean separation between facts and dimensions that makes a star schema efficient. Keeping fact and dimension tables separate, connected by relationships rather than merged into one wide table is preferable in a BI model because it keeps redundancy low, keeps each table's grain clean and unambiguous, and lets a single dimension table (like DimDate) be reused across multiple fact tables without being duplicated into each one.&lt;/p&gt;

&lt;h2&gt;
  
  
  vii). Recommended Power BI Model
&lt;/h2&gt;

&lt;p&gt;For a typical business intelligence project like sales, operations, or financial reporting against a fact table connected to a handful of descriptive dimensions(a star schema), connected with single-direction, one-to-many relationships, is the recommended default design.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why a star schema over a flat table&lt;/strong&gt;&lt;br&gt;
A flat table may look simpler at first glance, but it fails on almost every criterion that matters as a report grows: redundancy inflates file size, compression suffers, and DAX measures that look simple can silently double-count values once a single wide table mixes transactional and descriptive data. A star schema solves all three problems by separating facts from dimensions from the outset.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why a star schema over a snowflake schema&lt;/strong&gt;&lt;br&gt;
A snowflake schema's main benefit is reduced redundancy within dimensions. It is only marginally useful in Power BI, because VertiPaq's columnar compression already stores repeated values efficiently. What a snowflake schema does add is more relationships and longer filter-propagation paths, which increase model complexity and can slow down report performance without a corresponding benefit. Snowflaking is only worth the added complexity when a dimension is genuinely very large and its sub-attributes are shared identically across multiple other dimensions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Relationships and filter direction&lt;/strong&gt;&lt;br&gt;
Within the recommended star schema, relationships should be one-to-many between each dimension and the fact table, with the dimension on the “1” side. Filter direction should default to single-direction (dimension &amp;gt; fact), which matches how star schema reporting is meant to work and avoids the ambiguous filter paths that bidirectional relationships can introduce. Bidirectional filtering should be reserved for specific, well justified cases such as a genuine many-to-many scenario resolved through a bridge table rather than applied broadly&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%2Fm7zreme7tc1qvld0skzr.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%2Fm7zreme7tc1qvld0skzr.png" alt="Summary of recommendations" width="618" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;In short, build fact and dimension tables separately, connect them with one-to-many relationships kept single-directional by default, use Power Query merges sparingly and only for genuine upstream flattening needs, and reach for a snowflake schema only when a specific, large, shared dimension clearly justifies the added complexity. This combination gives the best balance of performance, simplicity, and long-term maintainability for the great majority of Power BI reporting projects.&lt;/p&gt;

</description>
      <category>datascience</category>
      <category>tutorial</category>
      <category>beginners</category>
      <category>basic</category>
    </item>
    <item>
      <title>Building a Product Analytics Dashboard from E-Commerce Data: A Jumia Case Study</title>
      <dc:creator>Wendy Adika</dc:creator>
      <pubDate>Sun, 06 Sep 2026 15:48:44 +0000</pubDate>
      <link>https://dev.to/wendy_adika_e0949a228a269/building-a-product-analytics-dashboard-from-e-commerce-data-a-jumia-case-study-2988</link>
      <guid>https://dev.to/wendy_adika_e0949a228a269/building-a-product-analytics-dashboard-from-e-commerce-data-a-jumia-case-study-2988</guid>
      <description>&lt;h2&gt;
  
  
  1. Introduction
&lt;/h2&gt;

&lt;p&gt;E-commerce sites collect huge amounts of listing data, but it's rarely ready to analyze right out of the box. Prices show up as messy text instead of numbers, review counts sometimes don't make logical sense, and ratings are missing more often than you'd expect. This article walks through the full process of turning raw Jumia product listings into a working, interactive Excel dashboard including the data problems I ran into, how I cleaned them, the formulas used to build new analytical fields, and what the data ultimately showed. The goal isn't just to show the final result, but to explain why each decision was made, so the same approach can be reused on similar marketplace data.&lt;/p&gt;

&lt;p&gt;The main question behind this project was easy to ask but harder to answer well: does discounting actually help sellers on Jumia, and if so, how? More specifically: do bigger discounts lead to more customer engagement (reviews), or better perceived quality (ratings)? To answer that, the analysis moved through four stages: getting the raw data in, cleaning and validating it, engineering useful features, and building a dashboard that non-technical people could actually use.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Dataset
&lt;/h2&gt;

&lt;p&gt;The raw dataset consists of 115 rows and six columns as per the Raw_Data   worksheet in the Jumia_product_dashboard.xlsl file. Below are screenshots of the Raw_Data worksheet and field descriptions.&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%2F5zvs3l2e6dli62ksjotb.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%2F5zvs3l2e6dli62ksjotb.png" alt="Raw data screenshot" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;This dataset is just a single snapshot in time;it doesn't include sales numbers, how old each listing is, or who the seller is. That limits what we can actually claim. The analysis can show that things are related, not that one causes the other. &lt;/p&gt;

&lt;h2&gt;
  
  
  3. Data Quality Assessment
&lt;/h2&gt;

&lt;p&gt;Before any transformation, the raw data was profiled systematically. This produced a data quality audit with the following findings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;345 price cells were text, not numbers&lt;/strong&gt;. Prices had things like currency symbols, commas, or extra spaces so Excel couldn't do math on them until we cleaned them up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;58 blank cells in both Review and Ratings&lt;/strong&gt;. These weren't zero they just meant no review or rating existed yet. If they were treated as zero, it would have made every average look much worse than it really was.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;57 review counts were negative&lt;/strong&gt;. A review count can't be negative in real life, so this was likely an error from scraping or exporting the data.&lt;/li&gt;
&lt;li&gt;*&lt;em&gt;57 discount values didn't make sense *&lt;/em&gt;. Discounts should always be between 0% and 100%, so these were probably also export errors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3 rows were exact duplicates&lt;/strong&gt;. If left in, they would have been counted twice in every total and average.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2 prices were written as a range&lt;/strong&gt; (like "100–200") instead of one number, which formulas can't use directly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Column headers weren't consistent with spelling mistakes&lt;/strong&gt;. This seems minor, but it causes real problems once formulas depend on typing the header name exactly right.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Data Cleaning
&lt;/h2&gt;

&lt;p&gt;Before cleaning, I copied the data from Raw_Data sheet to Cleaned_Data sheet and converted the data range to an Excel Table with Ctrl+T and gave it the name &lt;strong&gt;&lt;em&gt;tblProducts.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Removed the 3 duplicate rows.&lt;/strong&gt; They added no new information and would have thrown off every total. 112 Products remained.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Renamed the column headers.&lt;/strong&gt; so they were consistent. This also made them safe to use as table references (like &lt;code&gt;tblproducts[Current Price]&lt;/code&gt;) instead of plain cell ranges.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Formatted prices column&lt;/strong&gt;.Removed KSh, commas, and extra spaces, then convert to a number using this formula. &lt;code&gt;=VALUE(SUBSTITUTE(SUBSTITUTE(B2,"KSh",""),",",""))&lt;/code&gt;
Format cleaned values as KSh #,##0.00&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Turned the price ranges into a midpoint number.&lt;/strong&gt; This keeps the row usable without guessing at an exact figure. I used the average function to do this.
&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%2Fobnhghm2xuuo3fkug8kp.png" alt="Midpoint calculation" width="673" height="72"&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Changed disount column data type&lt;/strong&gt;. Remove %, convert to a number, divide by 100 if necessary, and format as Percentage using the formula below.
&lt;code&gt;=VALUE(SUBSTITUTE(D2,"%",""))/100&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Converted negative review counts to whole numbers.&lt;/strong&gt; Since a negative review count isn't real, it was treated as an error and corrected it rather than deleting the row using the formula below.
&lt;code&gt;=IF(E2="","",ABS(VALUE(E2)))&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Formatted Ratings column&lt;/strong&gt;. Removed  out of 5, converted to a decimal, and leave genuinely missing ratings blank using this formula.
&lt;code&gt;=IF(F2="","",VALUE(SUBSTITUTE(F2," out of 5","")))&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kept missing Review and Ratings cells as "Missing," not zero.&lt;/strong&gt; This was the most important cleaning decision in the whole project.&lt;/li&gt;
&lt;li&gt;Added checks for Price, Ratings and discounts column using the formulas shown.&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%2Fv01esmmt3r5lnnv0dqd2.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%2Fv01esmmt3r5lnnv0dqd2.png" alt="Price check" width="548" height="55"&gt;&lt;/a&gt;&lt;/p&gt;

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

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

&lt;h2&gt;
  
  
  5. Excel formulas and enrichment fields.
&lt;/h2&gt;

&lt;p&gt;Once the numbers were clean, new columns were added to turn raw numbers into useful, easy to read categories.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Discount Amount:&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;=[@[Old Price]]-[@[Current Price]]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rating Category&lt;/strong&gt; (fixed thresholds, since a star rating means the same thing everywhere):&lt;br&gt;
&lt;code&gt;=IF([@Ratings]="","Missing",IF([@Ratings]&amp;lt;3,"Poor",IF([@Ratings]&amp;lt;=4.5,"Average","Excellent")))&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Discount Category&lt;/strong&gt; Chosen to match how discount tiers are usually talked about in retail.&lt;br&gt;
&lt;code&gt;=IF([@Discount]="","Missing",IF([@Discount]&amp;lt;20%,"Low Discount",IF([@Discount]&amp;lt;=40%,"Medium Discount","High Discount")))&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Price Category&lt;/strong&gt; used the dataset's own quartiles that were calculated in the analysis sheet instead of fixed numbers, since "expensive" or "cheap" depends on what's actually in this dataset:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Price_Q1 = QUARTILE.INC(tblproducts[Current Price], 1)
Price_Q3 = QUARTILE.INC(tblproducts[Current Price], 3)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&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;/p&gt;

&lt;p&gt;&lt;strong&gt;Customer Engagement&lt;/strong&gt; used the same quartile approach, splitting products into Low, Steady, and Strong engagement.&lt;br&gt;
&lt;code&gt;=IF([@Review]="","Missing",IF([@Review]&amp;lt;=Review_Q1,"Low Engagement",IF([@Review]&amp;lt;=Review_Q3,"Steady Engagement","Strong Engagement")))&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Review Category&lt;/strong&gt; &lt;br&gt;
&lt;code&gt;=IF([@Review]="","Missing",IF([@Review]&amp;lt;=Review_Q1,"Low Reviews",IF([@Review]&amp;lt;=Review_Q3,"Steady Reviews","Many Reviews")))&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Finally, three simple &lt;strong&gt;QC check columns&lt;/strong&gt; were added so problems would show up immediately if new data was ever added. &lt;em&gt;&lt;strong&gt;Price, Ratings and Disounts.&lt;/strong&gt;&lt;/em&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  6. PivotTable and analysis workflow;
&lt;/h2&gt;

&lt;p&gt;After cleaning, 112 products remained. Summary numbers were calculated directly from the cleaned table.&lt;br&gt;
These were the formulas used:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Total products   =ROWS(tblProducts[Product])&lt;br&gt;
Average current price   =AVERAGE(tblProducts[Current Price])&lt;br&gt;
Average old price   =AVERAGE(tblProducts[Old Price])&lt;br&gt;
Average discount    =AVERAGE(tblProducts[Discount])&lt;br&gt;
Average rating  =AVERAGE(tblProducts[Rating])&lt;br&gt;
Total reviews   =SUM(tblProducts[Review])&lt;br&gt;
Most expensive price    =MAX(tblProducts[Current Price])&lt;br&gt;
Least expensive price   =MIN(tblProducts[Current Price])&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Below is a screenshot of the summary.&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%2Fqhmu4d8bt8c14b37zex9.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%2Fqhmu4d8bt8c14b37zex9.png" alt="Data Summary" width="239" height="203"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Xlookup function was used to find the excat most and least expensive product.&lt;br&gt;
&lt;code&gt;=XLOOKUP(MAX(tblproducts[Current Price]),tblproducts[Current Price],tblproducts[Product])&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Correlation was also tested between the following fields using this formulas:&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Discount (x) versus review *&lt;/em&gt;(y); -0.136822724&lt;br&gt;
As disount goes up the number of reviews tend to slightly go down but because the value is very close to zero the linear relationship is non-existent. That's worth pausing on, because it goes against the common assumption that bigger discounts automatically mean more customer engagement.&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%2F4emvpwpazrlulktqubck.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%2F4emvpwpazrlulktqubck.png" alt="Discount vs Reviews" width="442" height="72"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ratings (x) versus review (y)&lt;/strong&gt;; 0.057209035&lt;br&gt;
As the product rating increases, the number of reviews tends to increase very slightly.Because the strength of this relationship is so close to zero there is no meaningful linear relationship between the two variables, hence a product's rating does not predict how many reviews it will receive and vice versa.&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%2F1mw6crwb2ub3ofi01jhc.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%2F1mw6crwb2ub3ofi01jhc.png" alt="Ratings vs Review" width="360" height="46"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Current price (x) versus rating (y)&lt;/strong&gt;; 0.110090213&lt;br&gt;
As the current price of a product increases, its rating tends to increase slightly.The relationship is highly minimal. Because the value is so close to zero, price explains only a tiny fraction of the variation in product ratings. You cannot reliably use a product's price to predict its consumer satisfaction 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%2F5w5oe71he8he2vwg4i5p.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%2F5w5oe71he8he2vwg4i5p.png" alt="Current Price vs Ratings" width="395" height="40"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;There are also three line charts for each correlation analysis.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;From there, PivotTables were built on top of the cleaned data. PivotTables act as a middle layer. They make the charts faster to load and let the slicers filter several charts at once without slowing the whole workbook down. &lt;br&gt;
The following are the tables created:&lt;br&gt;
&lt;em&gt;&lt;strong&gt;top 5 and bottom 5 products by rating;&lt;br&gt;
top 10 products by discount;&lt;br&gt;
top 10 products by reviews;&lt;br&gt;
top 10 products by rating;&lt;br&gt;
products with high discounts but low ratings;&lt;br&gt;
products with high discounts but low engagement; and&lt;br&gt;
products with many reviews but average ratings&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Dashboard Design and Slicer Connections
&lt;/h2&gt;

&lt;p&gt;The dashboard was built so a non-technical person like a category manager could explore the data without ever touching a formula.&lt;/p&gt;

&lt;p&gt;Below are screenshots of the Dashboard.&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%2F8dnor7xmib5g3afjjjto.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%2F8dnor7xmib5g3afjjjto.png" alt="Dahboard 1" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

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

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

&lt;ul&gt;
&lt;li&gt;The top part of the dashboard is the dashboard title: &lt;strong&gt;Product Performance and Pricing&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The furthest left side of the board are the &lt;strong&gt;slicers&lt;/strong&gt;; &lt;em&gt;Price category, Rating Category and Discount Category&lt;/em&gt;.  All are connected to every PivotTable behind the charts, so clicking one option filters all the visuals on the sheet at once. Connecting both slicers to all five PivotTables (instead of just one chart each) is what makes the dashboard feel interactive rather than static: a single click updates the whole picture at once. You do this by right clicking on each slicer then reporting connections and choose all tables.&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%2Fdfo1p4cgex881ke4vye1.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%2Fdfo1p4cgex881ke4vye1.png" alt="Report Connections" width="394" height="585"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Eight charts&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Top 10 products by ratings&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Top 10 products by review&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Top 10 products by Discounts&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discount vs Reviews&lt;/strong&gt;: does a bigger discount mean more reviews?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rating vs Review&lt;/strong&gt;: how does review count change across different rating scores?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Price vs Ratings&lt;/strong&gt;: do more expensive products get rated higher?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rating Mix&lt;/strong&gt;: what share of products fall into each rating category, including "Missing"?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discount Mix&lt;/strong&gt;: how many products sit in each discount tier?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Insights&lt;/strong&gt;&lt;br&gt;
The insight text box contains findings and recommendations.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Key Findings
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Bigger discounts bring more reviews, but not better ratings.&lt;/strong&gt; High and Medium Discount products get far more total reviews than Low Discount ones, but the correlation check shows this isn't a strong, reliable pattern at the individual product level.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Most products sit in the High Discount group&lt;/strong&gt; (about 63 products, versus 24 in Low Discount)The catalog leans heavily toward deep discounting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Higher priced products get slightly better ratings&lt;/strong&gt; (about 4.1 vs. 3.75 for the cheapest tier), a small but consistent gap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A clear "Missing" ratings group exists&lt;/strong&gt;, separate from "Poor": these are simply unrated products, not confirmed bad ones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discount size barely predicts review count&lt;/strong&gt; (correlation ≈ −0.14) something else is driving engagement more than the discount itself.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  9. Business Recommendations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Test smaller discounts on Low Discount products to see if reviews still grow without hurting ratings.&lt;/li&gt;
&lt;li&gt;Check a sample of High Discount listings to see if they're real deals or just aging stock being cleared out.&lt;/li&gt;
&lt;li&gt;Improve photos and descriptions on Low Price listings, where ratings tend to be a bit lower.&lt;/li&gt;
&lt;li&gt;Focus review-request campaigns on "Missing" rated products before worrying about the smaller "Poor" group.&lt;/li&gt;
&lt;li&gt;Don't rely on discount depth alone to grow reviews because the data shows it's a weak lever on its own.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  10. Limitations and Lessons Learned
&lt;/h2&gt;

&lt;p&gt;This dataset has no sales numbers, no listing age, and no seller identity hence "more reviews" can't be read as "more sales," and older listings can't be told apart from genuinely more popular ones. With only 112 cleaned rows, smaller groups (like Low Discount, at about 24 products) carry more uncertainty than larger ones. And because this is a single snapshot, none of these patterns should be treated as fixed facts but starting points for real tests, like controlled discount experiments, not final answers.&lt;/p&gt;

&lt;p&gt;The biggest lesson from this project wasn't about charts or formatting. It was the decision to keep missing ratings labeled as "Missing" instead of quietly treating them as zero or dropping them. That one choice is what let the dashboard tell the difference between a product nobody has rated yet and one people genuinely dislike, a distinction that changes what a seller should actually do next.&lt;/p&gt;

&lt;h2&gt;
  
  
  10.Links
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/wendyadika/Jumia-Dashboard.git" rel="noopener noreferrer"&gt;Github Repo&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/wendyadika/Jumia-Dashboard/tree/c512fd491f32bd9f6a0f156e206ef6209335b47c/Dashboard" rel="noopener noreferrer"&gt;Dashboard file&lt;/a&gt;&lt;/p&gt;

</description>
      <category>datascience</category>
      <category>beginners</category>
      <category>database</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Getting Started with Excel for Data Analytics: From Basics to Data Cleaning.</title>
      <dc:creator>Wendy Adika</dc:creator>
      <pubDate>Thu, 27 Aug 2026 18:14:07 +0000</pubDate>
      <link>https://dev.to/wendy_adika_e0949a228a269/getting-started-with-excel-for-data-analytics-from-basics-to-data-cleaning-2mlo</link>
      <guid>https://dev.to/wendy_adika_e0949a228a269/getting-started-with-excel-for-data-analytics-from-basics-to-data-cleaning-2mlo</guid>
      <description>&lt;h2&gt;
  
  
  What is Excel?
&lt;/h2&gt;

&lt;p&gt;Excel is a spreadsheet program that enables users to capture, organize, calculate and visualize data. Excel is part of Microsoft office and is available for Windows and Mac. Operating systems that can't access excel like Linux will first require installation of a virtual Machine(A software based computer inside another physical computer) through a cloud-service provider like Microsoft Azure, Google Cloud Platform(GCP) or Amazon Web Services(AWS).&lt;/p&gt;

&lt;h2&gt;
  
  
  How Organizations Use Excel.
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Collection and storage of data.&lt;/li&gt;
&lt;li&gt;Data cleaning.&lt;/li&gt;
&lt;li&gt;Data analysis and visualization.&lt;/li&gt;
&lt;li&gt;Performance reporting.&lt;/li&gt;
&lt;li&gt;Accounting.&lt;/li&gt;
&lt;li&gt;Administrative and project management.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Excel User Interface and Components.
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Interface.
&lt;/h3&gt;

&lt;p&gt;When you open excel on your laptop, this is what you essentially see:&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%2Fd2ji9ozpxgszglt4bvke.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%2Fd2ji9ozpxgszglt4bvke.png" alt="Excel Interface" width="800" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Components of Excel.
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ribbon&lt;/strong&gt;: A row of tabs that helps you locate and navigate commands. The tabs include Home, Insert, Page Layout, Formulas, Data, Review, View and Help.&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%2Fkt917a120fwfsosf16r1.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%2Fkt917a120fwfsosf16r1.png" alt="Ribbon" width="799" height="106"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Quick Access Toolbar&lt;/strong&gt;: Contains icons for save, undo and redo. Marked blue in the image below is the quick access toolbar.&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%2Fmb7jbwl0woxm0c28bfd5.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%2Fmb7jbwl0woxm0c28bfd5.png" alt="Quick access toolbar" width="800" height="81"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Formula bar&lt;/strong&gt;: Where contents of a selected cell are displayed. The formul bar is circled red in the image 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%2Fqdymb7b7f4yt4l1optll.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%2Fqdymb7b7f4yt4l1optll.png" alt="Formula Bar" width="798" height="136"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Worksheet&lt;/strong&gt;: A set of rows and columns.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Column&lt;/strong&gt;: A vertical line of cells labelled in Alphabetical Order(&lt;em&gt;Column A, Column B,C...&lt;/em&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Row&lt;/strong&gt;: Horizontal line of cells labelled in numerical order( &lt;em&gt;Row 1, Row 2,3...&lt;/em&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cell&lt;/strong&gt;: Intersection of a row and column where raw data is captured. It is labelled as column_row(A1, B12)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Worksheet tabs&lt;/strong&gt;: Tabs at the bottom (&lt;em&gt;Original, Cleaned, Sheet2&lt;/em&gt;) that switch between spreadsheets within a workbook
&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%2Fs5tq9w9w2hm4i8owax74.png" alt="worksheet" width="800" height="425"&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Workbook&lt;/strong&gt;- A collection of multiple spreadsheets/worksheets that create an excel file.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Status bar&lt;/strong&gt;: Displays workbook status and quick calculation information. Refer on what it looks like using the image 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%2Fkfpsri28rdhc4hqi1e7h.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%2Fkfpsri28rdhc4hqi1e7h.png" alt="status bar" width="800" height="80"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Data Entry and Editing.
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Entering data:
&lt;/h3&gt;

&lt;p&gt;To enter data into a cell, click on any cell then add values. Columns store fields and rows store records. Click enter to move to the next row or the arrow keys to move to whichever cell you want.&lt;br&gt;
See example 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%2F1g7jxjf2t3ywafxdl5uw.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%2F1g7jxjf2t3ywafxdl5uw.png" alt="data structure in excel" width="800" height="181"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Data Types:
&lt;/h3&gt;

&lt;p&gt;Some commonly used data types that can be found on the home tab  under number group include:&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%2Fqg0f8alhh6i3bj4d177o.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%2Fqg0f8alhh6i3bj4d177o.png" alt="data types" width="800" height="343"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;General: No specific format&lt;/li&gt;
&lt;li&gt;Text: Words(Gloria)&lt;/li&gt;
&lt;li&gt;Number:2&lt;/li&gt;
&lt;li&gt;Dates: 02/12/2026&lt;/li&gt;
&lt;li&gt;Currency: $280&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Data types are also accessible when you select a cell/cells then right click and choose format cells on the dropdown list that appears.&lt;/p&gt;

&lt;h3&gt;
  
  
  Data formatting in excel:
&lt;/h3&gt;

&lt;p&gt;All data formatting commands are found in the home tab. &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%2F5jcbnmcq87smta3zw84g.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%2F5jcbnmcq87smta3zw84g.png" alt="formatting commands in home tab" width="799" height="81"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;To Format text: Click on home tab then under font group select whatever format you desire. Some format options include Bold(&lt;strong&gt;B&lt;/strong&gt;), Italics(&lt;strong&gt;I&lt;/strong&gt;), Underline(&lt;strong&gt;U&lt;/strong&gt;). You can also change Font type, Font color and Font size.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To Align cells&amp;gt; Check alignment group.Some alignment options include aligning to either the right, left, center top or bottom, merging cells(combining cells) and wrappint text(moving words to a new line when they reach a margin instead of overflowing. &lt;br&gt;
Normally, when the data type is text, the cell contents are aligned to the left. Numerical data is usually aligned to the right.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To Format numbers: Check the Number group which contains actions like number types and choose your data type from the dropdown list.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Borders and fill colors: Select your cell range then go to font group and click on the diagram that looks like a window pane. See borders in the image below marked in blue.&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%2Fbtkdo22gkvdyfwqvuu6t.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%2Fbtkdo22gkvdyfwqvuu6t.png" alt="borders" width="470" height="146"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Saving a Workbook:
&lt;/h3&gt;

&lt;p&gt;Different ways to save your workbook:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click on file then click on save as. Select the directory/folder you want it save in.(eg.Desktop) then write your file name. Make sure the file type is excel workbook/ &lt;strong&gt;&lt;em&gt;.xlsx&lt;/em&gt;&lt;/strong&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%2Fbct0hfdaddyzllzucczp.png" alt="file type" width="679" height="246"&gt;
&lt;/li&gt;
&lt;li&gt;You can also click on the save icon at the quicktool bar at the top left part of the screen. 
&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%2F5u0fkc2d7t2f9s09t7ux.png" alt="Save icon" width="448" height="183"&gt;
&lt;/li&gt;
&lt;li&gt;To save time, use the save shortcut by clicking &lt;strong&gt;&lt;em&gt;ctrl and S&lt;/em&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Data Sorting and Filtering.
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Sorting:
&lt;/h3&gt;

&lt;p&gt;Sorting means arranging data in a specific order. You can sort &lt;strong&gt;&lt;em&gt;text&lt;/em&gt;&lt;/strong&gt; in alphabetical order(&lt;strong&gt;A-Z&lt;/strong&gt;) or (&lt;strong&gt;Z-A&lt;/strong&gt;), &lt;strong&gt;&lt;em&gt;numerical values&lt;/em&gt;&lt;/strong&gt; from &lt;strong&gt;largest to smallest&lt;/strong&gt; and &lt;strong&gt;vice versa&lt;/strong&gt; and &lt;strong&gt;&lt;em&gt;date&lt;/em&gt;&lt;/strong&gt; from &lt;strong&gt;oldest to newest&lt;/strong&gt; and &lt;strong&gt;vice versa&lt;/strong&gt;.&lt;br&gt;
Sorting helps to make data easier to read, search and manage.&lt;br&gt;
To sort:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select column or range of cells you want to sort.&lt;/li&gt;
&lt;li&gt;Go to home tab then sort and filter under the editing group.&lt;/li&gt;
&lt;li&gt;Choose what type of sorting you desire. You can also custom sort. Then click ok to run that command.
&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%2Fwb9xnx6wbn6ewc7xckvw.png" alt="sort" width="799" height="81"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Filtering:
&lt;/h3&gt;

&lt;p&gt;Filtering hides cells that don't meet a certain criteria. It only displays the cells that do. The filer button is at the same place where the sort is. Check the sorting diagram above. &lt;br&gt;
To filter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click anywhere on your data set.&lt;/li&gt;
&lt;li&gt;Click on sort&amp;amp;filter on the hometab in the editing group, then click filter.&lt;/li&gt;
&lt;li&gt;A dropdown arrow will appear on the column you want the filter.&lt;/li&gt;
&lt;li&gt;Click on the arrow and choose your filter option. Click ok.
&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%2Fxo2bijfe71uimzzd2rju.png" alt="Filtering" width="557" height="683"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are three types of filter options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Text Filter: Contains, Begins With, Ends With.....&lt;/li&gt;
&lt;li&gt;Number Filter: Greater Than, Less Than......&lt;/li&gt;
&lt;li&gt;Date Filter: Before, After, Between.....&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Data Validation:
&lt;/h3&gt;

&lt;p&gt;Data validation restricts the type of data that can be keyed into a cell in a particular field/column.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select range of cells you want to validate.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go to data tab then click on data validation&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%2F9oiwzywu9dh5gbbv39q4.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%2F9oiwzywu9dh5gbbv39q4.png" alt="Data validation" width="800" height="167"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the dialog box, select the criteria you want to use.&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%2F0ysy7v1w3v5ga1x1jc4m.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%2F0ysy7v1w3v5ga1x1jc4m.png" alt="data validation dialog box" width="527" height="577"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An example is when you want your column to only accept K, L and M, you can click on list then add the 3 values. No other value that is not the three will be accepted in that particular column. See demonstration below. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz6qj2i4n514b7ml7gvv0.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%2Fz6qj2i4n514b7ml7gvv0.png" alt=" " width="800" height="315"&gt;&lt;/a&gt;&lt;br&gt;
 Any attempt to key in any value that is not in the criteria will bring an error message as shown in the illustration above.&lt;/p&gt;

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

&lt;p&gt;Data cleaning is the process of finding and fixing errors, missing values and removing duplicates  in a dataset to make it more accurate and ready for analysis.&lt;/p&gt;

&lt;p&gt;Before cleaning your data, you can perform this actions to make navigation easier:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Autofit: 
When values in cells are cut off showing ###errors, you can first select all data on your workspace using the short cut &lt;em&gt;C*&lt;em&gt;TRL+A&lt;/em&gt;*&lt;/em&gt; then autofit by clicking on the home tab, then on the cells group click format, then click autofit width length 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%2Fod0ozlzr5ii12ccaytpo.png" alt="Autofit" width="800" height="390"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;2.Freezing Panes:&lt;br&gt;
Freezing panes helps to lock specific rows or columns so that they remain visible as you scroll. This makes it easier to work on the data especially when dealing with a large data set.&lt;br&gt;
Click on the view tab the freeze panes the choose what you intend to freeze, then click ok.&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%2Fgtgnundz9r903bzf5dro.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%2Fgtgnundz9r903bzf5dro.png" alt="Freezing panes" width="799" height="221"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;To remove duplicates,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select your complete dataset by clicking the &lt;strong&gt;&lt;em&gt;ctrl+A&lt;/em&gt;&lt;/strong&gt; shortcut.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go to the Data tab and select remove duplicates. See illustration 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%2F2pi0i2bnhugczje69fpf.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%2F2pi0i2bnhugczje69fpf.png" alt="Removing duplicates" width="800" height="151"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the dialog box, check the columns to consider. Often it is wiser to check all. Then click ok.&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%2F43cspt9umr6shjkwtocx.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%2F43cspt9umr6shjkwtocx.png" alt="Remove duplicates dialog box" width="674" height="554"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Number formatting changes how numerical values appear on a spreadsheet without changing the actual data stored in the cell.&lt;/li&gt;
&lt;li&gt;To format number, &lt;/li&gt;
&lt;li&gt;You can select cells then right click to return a dropdown box with a format cells option.
&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%2Flog1pdp0nrskydxeqq1p.png" alt=" " width="800" height="565"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Select cells then under the home tab go to number group and click on number format bar. These data types are used to show prices(currency), percentages(percentages/%)and dates.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;Conditional Formatting is used to highlight cells that follow a rule that you have set, making it easier to search for a particular value and also spot trends.&lt;br&gt;
To conditional format:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select cells.&lt;/li&gt;
&lt;li&gt;Go to home bar, under styles group click on conditional formatting.&lt;/li&gt;
&lt;li&gt;Choose the rule you wish to apply. Click ok
&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%2Flnimsw0mx7kzcy3tbvo4.png" alt="Conditional formatting rules" width="696" height="494"&gt;
&lt;/li&gt;
&lt;li&gt;Enter the value you want to highlight then click ok.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Text Functions
&lt;/h3&gt;

&lt;p&gt;Text functions can be used to clean data by addressing issues such as extra spaces, inconsistent text formats, unwanted symbols, or multiple text strings combined in a single cell.&lt;br&gt;
Below are the different text functions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;UPPER&lt;/strong&gt;-Changes all text in selected cell to upper case- Example: If cell k5 contents is "&lt;strong&gt;&lt;em&gt;Grace&lt;/em&gt;&lt;/strong&gt;", when you use the upper function &lt;em&gt;&lt;strong&gt;=UPPER(K5)&lt;/strong&gt;&lt;/em&gt; and run it &lt;strong&gt;&lt;em&gt;GRACE&lt;/em&gt;&lt;/strong&gt; will be displayed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LOWER&lt;/strong&gt;-Changes all text in selected cell to lower case- Example: If cell k5 contents is "&lt;strong&gt;&lt;em&gt;Grace&lt;/em&gt;&lt;/strong&gt;", when you use the lower function &lt;em&gt;&lt;strong&gt;=LOWER(K5)&lt;/strong&gt;&lt;/em&gt; and run it &lt;strong&gt;&lt;em&gt;grace&lt;/em&gt;&lt;/strong&gt; will be displayed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PROPER&lt;/strong&gt;-Capitalizes the first letter of each word in a cell.If cell k5 contents is "&lt;strong&gt;&lt;em&gt;grace kamau&lt;/em&gt;&lt;/strong&gt;" when you use the proper function &lt;em&gt;&lt;strong&gt;=PROPER(K5)&lt;/strong&gt;&lt;/em&gt; then "&lt;em&gt;&lt;strong&gt;Grcae Kamau&lt;/strong&gt;&lt;/em&gt;" will be displayed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TRIM&lt;/strong&gt;-Removes extra spaces within text. If you &lt;strong&gt;&lt;em&gt;=TRIM( " Grace Kamau "&lt;/em&gt;&lt;/strong&gt; then &lt;strong&gt;&lt;em&gt;"Grace Kamau"&lt;/em&gt;&lt;/strong&gt; will be displayed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LEFT&lt;/strong&gt;-Extracts leftmost characters. If you =LEFT("Grace,2) then "Gr" will be displayed. Similar to the &lt;strong&gt;RIGHT&lt;/strong&gt; function where if you &lt;strong&gt;&lt;em&gt;=RIGHT("Grace",2)&lt;/em&gt;&lt;/strong&gt; it will display &lt;em&gt;&lt;strong&gt;"ce"&lt;/strong&gt;&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MID&lt;/strong&gt;-Extracts characters from the middle. if you &lt;em&gt;&lt;strong&gt;=MID("Grace", 1)&lt;/strong&gt;&lt;/em&gt; then &lt;strong&gt;&lt;em&gt;"a"&lt;/em&gt;&lt;/strong&gt; is displayed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LEN&lt;/strong&gt;-Calculates length of text. If you &lt;em&gt;&lt;strong&gt;=LEN("Grace")&lt;/strong&gt;&lt;/em&gt; then &lt;strong&gt;"5"&lt;/strong&gt; is displayed. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FIND&lt;/strong&gt;-Finds position of a substring. If you &lt;strong&gt;&lt;em&gt;=FIND("a","Grace")&lt;/em&gt;&lt;/strong&gt; the &lt;strong&gt;&lt;em&gt;"3"&lt;/em&gt;&lt;/strong&gt; is displayed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CONCAT&lt;/strong&gt;-Combine two texts from different cells into one. If Grace(k5) and  Kamau(L5) are in different cells you can &lt;strong&gt;&lt;em&gt;=CONCAT(K2," ",L2)&lt;/em&gt;&lt;/strong&gt; then &lt;strong&gt;&lt;em&gt;"Grace Kamau"&lt;/em&gt;&lt;/strong&gt; will be displayed. the &lt;em&gt;" "&lt;/em&gt; on the function is for when you want a single space between the two texts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SUBSTITUTE&lt;/strong&gt;-Replaces a text within a string. If you &lt;strong&gt;&lt;em&gt;=SUBSTITUTE("Grace kamau","  kamau"," Mutua")&lt;/em&gt;&lt;/strong&gt; it will display &lt;strong&gt;&lt;em&gt;"Grace Mutua"&lt;/em&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Other functions include&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aggregate functions: &lt;em&gt;SUM, PRODUCT, POWER, MODE, MEDIAN, MAX, MIN, SQRT&lt;/em&gt;
etc.
Statistical functions: &lt;em&gt;COUNT, COUNTA, COUNTBLANK&lt;/em&gt; etc.
Conditional: &lt;em&gt;COUNTIF,SUMIF&lt;/em&gt;....etc.
Date and Time: &lt;em&gt;TODAY,NOW,DAY,MONTH,YEAR,DATEDIF,NETWORKDAYS&lt;/em&gt; etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Formulas.
&lt;/h3&gt;

&lt;p&gt;A formula is an expression in a cell that performs calculations. It must always start with the = sign.&lt;br&gt;
It can include&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cell references(M20)&lt;/li&gt;
&lt;li&gt;Operators(*,+)&lt;/li&gt;
&lt;li&gt;Numbers(45)&lt;/li&gt;
&lt;li&gt;Functions(SUM)
An example: &lt;em&gt;=78+22&lt;/em&gt; which will return &lt;em&gt;100&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;This article has explained the basics of Mircosoft excel including components and the different ways to you can use it to clean data(Sorting and filtering, Data validation, removing duplicates, number formatting). Moreover, you can practice on ai generated unclean date and explore other articles to deepen your skills.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>analytics</category>
      <category>datascience</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>My First GitHub Project: From a Local Folder to GitHub Using Git and SSH</title>
      <dc:creator>Wendy Adika</dc:creator>
      <pubDate>Thu, 20 Aug 2026 12:20:47 +0000</pubDate>
      <link>https://dev.to/wendy_adika_e0949a228a269/my-first-github-project-from-a-local-folder-to-github-using-git-and-ssh-3bbg</link>
      <guid>https://dev.to/wendy_adika_e0949a228a269/my-first-github-project-from-a-local-folder-to-github-using-git-and-ssh-3bbg</guid>
      <description>&lt;p&gt;This tutorial guides on how to push your local projects to Github using Git and SSH.&lt;/p&gt;

&lt;p&gt;The prerequisite steps are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Installed and configured Git using your user name and email.&lt;/li&gt;
&lt;li&gt;Set up your Github account.&lt;/li&gt;
&lt;li&gt;Generated and added your public ssh key to your Github.&lt;/li&gt;
&lt;li&gt;Tested your ssh connected and make sure it is successful.&lt;/li&gt;
&lt;li&gt;Created a local project with Readme file, data ,scripts and notebooks where applicable.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: Project Initialization With Git
&lt;/h2&gt;

&lt;p&gt;Open gitbash terminal. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Before initialization, ensure your location(which is at the end of the path) is the project folder you intend to push.&lt;br&gt;
Run: &lt;br&gt;
&lt;code&gt;pwd&lt;/code&gt; which stands for print working directory. Working directory is the folder you are currently in.&lt;br&gt;
You can move to intended directory using the &lt;code&gt;cd&lt;/code&gt; command.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To initialize the folder as a Git repo(repository) run:&lt;br&gt;
&lt;code&gt;git init&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This will appear:&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%2F6rbk293lkokn3w42lgwo.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%2F6rbk293lkokn3w42lgwo.png" alt="git innit command" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Also check for git's hidden files by running: &lt;code&gt;ls -la&lt;/code&gt;
You should see &lt;strong&gt;&lt;em&gt;.git&lt;/em&gt;&lt;/strong&gt; among files. &lt;strong&gt;&lt;em&gt;.git&lt;/em&gt;&lt;/strong&gt; folder acts as the git memory.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 2: Check Status
&lt;/h2&gt;

&lt;p&gt;To check the current status of your working directory and staging area run: &lt;br&gt;
&lt;code&gt;git status&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%2Fffxqkuzrd2gf3rp2gjpl.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%2Fffxqkuzrd2gf3rp2gjpl.png" alt="git status command" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Because it is a new project, the files are untracked.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Add
&lt;/h2&gt;

&lt;p&gt;To prepare our project files for the next commit you run:&lt;br&gt;
&lt;code&gt;git add .&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Commit
&lt;/h2&gt;

&lt;p&gt;To save any changes to your project files run: &lt;br&gt;
&lt;code&gt;git commit -m "----"&lt;/code&gt;&lt;br&gt;
Inside the quotes, write a message that explains what was saved.&lt;br&gt;
See example:&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%2Fy6vik4nhc95row8bsh2k.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%2Fy6vik4nhc95row8bsh2k.png" alt="git commit command" width="629" height="63"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Always ensure that the branch is main.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Pushing to Github
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Create a New Github Repo
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Sign in to your github account.&lt;/li&gt;
&lt;li&gt;Create a new repo- should be empty.&lt;/li&gt;
&lt;li&gt;Fill in new repo form then click on create(Repo name, description and choosing either public or private, the rest you can skip).&lt;/li&gt;
&lt;li&gt;Click on ssh then copy ssh address. &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Go Back To Gitbash
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Ensure location is still project folder.&lt;/li&gt;
&lt;li&gt;To link your local git repository to  your github repository run:
&lt;code&gt;git remote add origin **the_copied_ssh_address**&lt;/code&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%2Fp63zode8kxczcnglqobp.png" alt="git remote add origin command" width="" height=""&gt;
&lt;/li&gt;
&lt;li&gt;To confirm that Git can send and receive information from the correct github repo run:
&lt;code&gt;git remote -v&lt;/code&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%2Fwnc5svx68kd5qk8nh8xb.png" alt="git remote -v command" width="565" height="61"&gt;
.&lt;/li&gt;
&lt;li&gt;To push your project run:
&lt;code&gt;git push -u origin main&lt;/code&gt;
This means that git has sent any commited changes to your github repository.&lt;/li&gt;
&lt;li&gt;Confirm your project has been pushed to github by refreshing the page.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>git</category>
      <category>githubactions</category>
      <category>ssh</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
