<?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: Expert Writer</title>
    <description>The latest articles on DEV Community by Expert Writer (@expertwriter).</description>
    <link>https://dev.to/expertwriter</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%2F4088714%2Fd85dedea-64fb-4738-b297-5b8643a4b504.jpg</url>
      <title>DEV Community: Expert Writer</title>
      <link>https://dev.to/expertwriter</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/expertwriter"/>
    <language>en</language>
    <item>
      <title>JCars Logistics Power BI Business Intelligence Assessment</title>
      <dc:creator>Expert Writer</dc:creator>
      <pubDate>Wed, 30 Sep 2026 13:26:24 +0000</pubDate>
      <link>https://dev.to/expertwriter/jcars-logistics-power-bi-business-intelligence-assessment-83k</link>
      <guid>https://dev.to/expertwriter/jcars-logistics-power-bi-business-intelligence-assessment-83k</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;A vehicle sales report can look convincing and still mislead. A revenue total is only useful when its currency is clear, the underlying price fields agree, returns are handled consistently, and the report grain is understood. For JCars Logistics, those questions matter because a single flat file brings together vehicle sales, customers, branches, representatives, payments, delivery activity, costs, and customer feedback.&lt;br&gt;
The goal of this article is to explain the analytical decisions behind that structure, on how to think about data quality, how to model the subject, how to define reusable calculations, and how to make findings responsibly. The dataset is small enough to inspect row by row, but its mixed formats and conflicting values make it a useful example of why preparation and validation are part of analysis, not housekeeping.&lt;br&gt;
This project turns that operational dataset into a Power BI analysis intended to help management explore sales, profitability, operational performance, and areas needing investigation. The supplied report contains dedicated pages for calculations, the model, branches, sales representatives, payments, customers, and revenue. Its measure set includes total transactions, sales revenue, cost, gross profit, gross profit margin, revenue per car, units sold, discounted units, logistics cost ratio, logistics cost per car, and orders requiring investigation.&lt;/p&gt;

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

&lt;p&gt;I was working with a deliberately dirty flat file of 276 vehicle sales records from a Kenyan importer, JCars Logistics, and asked to turn it into a Power BI solution that helps management make decisions. This article walks through how I did it: understanding the grain, auditing data quality, cleaning with Power Query, modelling, writing DAX, building the report, and pulling out insights.&lt;/p&gt;

&lt;p&gt;The most important thing I learned is that the headline numbers lied. As recorded, the business shows a 20.8% gross margin. Once I stopped trusting two suspicious transactions, the margin fell to 8.0%. I also found bugs in my own model while reconciling my numbers, and I document them here because they are the most useful part of the analysis.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Business Problem
&lt;/h3&gt;

&lt;p&gt;JCars Logistics imports, sells, and delivers vehicles across Kenya. Management needs to understand not only how much business was recorded, but also where value is generated and what operational conditions may be associated with it. Questions include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How many transactions and vehicles are represented, and what revenue and gross profit do they produce?&lt;/li&gt;
&lt;li&gt;Which makes, models, branches, regions, and sales representatives contribute to performance?&lt;/li&gt;
&lt;li&gt;How do payment method and payment status relate to recorded sales?&lt;/li&gt;
&lt;li&gt;What does delivery status indicate about fulfilment, and where do logistics costs deserve attention?&lt;/li&gt;
&lt;li&gt;How do customer type, returns, and customer ratings add context to the sales picture?&lt;/li&gt;
&lt;li&gt;Which unusual records should be checked before a manager acts on a result?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Understanding the Dataset
&lt;/h3&gt;

&lt;p&gt;The data set had &lt;code&gt;276 rows&lt;/code&gt; and &lt;code&gt;32 columns&lt;/code&gt; in a single flat CSV.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Grain&lt;/strong&gt;: One row is one sales order line, meaning one customer buying a specific vehicle (make, model, year, colour, transmission, fuel) in some quantity, at one branch, handled by one sales rep, with its own payment, delivery and rating information.&lt;/p&gt;

&lt;p&gt;Column groups:&lt;/p&gt;

&lt;p&gt;Group   Columns&lt;br&gt;
&lt;strong&gt;Transaction&lt;/strong&gt; &lt;code&gt;Order ID, Order Date, Delivery Date&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Customer&lt;/strong&gt;    &lt;code&gt;Customer Name, Customer Type, Customer Age&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Geography&lt;/strong&gt;   &lt;code&gt;Region, County, City, Branch&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;People / channel&lt;/strong&gt;    &lt;code&gt;Sales Rep, Lead Source&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Vehicle&lt;/strong&gt; &lt;code&gt;Car Make, Car Model, Vehicle Type, Vehicle Year, Fuel Type, Transmission, Color&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Measures&lt;/strong&gt;    &lt;code&gt;Units Sold, Unit Selling Price, Unit Cost, Discount, Delivery Fee, Logistics Cost, Revenue Recorded&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Status&lt;/strong&gt;  &lt;code&gt;Payment Method, Payment Status, Delivery Status, Returned&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Experience&lt;/strong&gt;  &lt;code&gt;Customer Rating, Review Count&lt;/code&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%2Fgqe8mpvr54kvjcp6ey8v.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%2Fgqe8mpvr54kvjcp6ey8v.png" alt=" " width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Data Quality Assessment
&lt;/h3&gt;

&lt;p&gt;In the first few rows alone, dates use multiple representations, a delivery date appears as an Excel serial number; amounts include currency symbols, text suffixes, and plain numbers; categories vary in casing; and vehicle and employee names have spelling variants. The file also contains missing values in key fields, including Order ID, dates, customer details, unit cost, units sold, discount, logistics cost, customer rating, and return status.&lt;br&gt;
These are the challenges that I faced while was working on the data:&lt;br&gt;
&lt;strong&gt;Missing transaction identifiers.&lt;/strong&gt; Missing or repeated Order IDs weaken distinct-order counts and make reconciliation difficult. Preserve the record for analysis where possible, but do not silently treat it as a confidently identified order.&lt;br&gt;
&lt;strong&gt;Mixed date formats.&lt;/strong&gt; Text dates in different patterns and spreadsheet serial values can parse differently depending on locale. Convert using explicit rules, then compare order and delivery chronology and flag unresolved values.&lt;br&gt;
&lt;strong&gt;Inconsistent monetary formats.&lt;/strong&gt; Values such as &lt;code&gt;KSh 8,136,000&lt;/code&gt;, &lt;code&gt;KES 56,000&lt;/code&gt;, plain numbers, and abbreviated text such as &lt;code&gt;9.14M&lt;/code&gt; required parsing into numeric amounts and currency codes before calculations.&lt;br&gt;
&lt;strong&gt;Currency ambiguity.&lt;/strong&gt; Kenya Shillings are the required reporting currency. I treated the values without any currency as KES.&lt;br&gt;
&lt;strong&gt;Conflicting revenue fields.&lt;/strong&gt; Unit selling price, units sold, discount, and Revenue Recorded permit an independent revenue check. &lt;br&gt;
&lt;strong&gt;Negative or implausible monetary values.&lt;/strong&gt; A negative recorded revenue may represent a return, a correction, or a mistake. &lt;br&gt;
&lt;strong&gt;Category spelling and casing.&lt;/strong&gt; Examples in the source include &lt;code&gt;Toyta&lt;/code&gt; versus &lt;code&gt;Toyota&lt;/code&gt;, &lt;code&gt;petrol&lt;/code&gt; versus &lt;code&gt;Petrol&lt;/code&gt;, and multiple spellings/casings for branches and locations.&lt;br&gt;
&lt;strong&gt;Nonstandard categorical values.&lt;/strong&gt; Payment statuses include variants such as &lt;code&gt;Paid&lt;/code&gt; and &lt;code&gt;complete&lt;/code&gt;; delivery statuses include &lt;code&gt;AT YARD&lt;/code&gt;, &lt;code&gt;held&lt;/code&gt;, and &lt;code&gt;Delayed&lt;/code&gt;.&lt;br&gt;
&lt;strong&gt;Inconsistent numeric types.&lt;/strong&gt; Unit costs, prices, discounts, and ratings appear as text in some rows. Parse percentages and numeric amounts separately, and capture parse failures instead of converting them to zero.&lt;br&gt;
&lt;strong&gt;Missing unit cost and units sold.&lt;/strong&gt; These fields underpin gross profit and unit metrics. A missing cost should not silently become zero, because that would overstate profit; a missing quantity should not be assumed to equal one without a documented rule.&lt;br&gt;
&lt;strong&gt;Unverified duplicate orders.&lt;/strong&gt; Exact duplicate rows and repeated identifiers can inflate revenue and volume. I investigated using transaction keys and row attributes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Business Definitoions Calculations
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Total Sales Revenue&lt;/strong&gt; = &lt;code&gt;SUMX('Jcars_Fact Table', 'Jcars_Fact Table'[Units Sold] * 'Jcars_Fact Table'[Unit Selling Price] * (1-COALESCE('Jcars_Fact Table'[Discount], 0)) + SUM('Jcars_Fact Table'[Delivery Fee]))&lt;/code&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%2Fkwrvcyaapfluimubm1l2.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%2Fkwrvcyaapfluimubm1l2.png" alt=" " width="799" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Total Cost&lt;/strong&gt; = &lt;code&gt;SUMX('Jcars_Fact Table', 'Jcars_Fact Table'[Units Sold]* 'Jcars_Fact Table'[Unit Cost])&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Total Logistics&lt;/strong&gt; = &lt;code&gt;SUM('Jcars_Fact Table'[Logistics Cost])&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Total Transactions&lt;/strong&gt; = &lt;code&gt;DISTINCTCOUNT('Jcars_Fact Table'[Order ID])&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Total Units Sold&lt;/strong&gt; = &lt;code&gt;SUM('Jcars_Fact Table'[Units Sold])&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rated Transactions&lt;/strong&gt; = &lt;br&gt;
&lt;code&gt;CALCULATE(&lt;br&gt;
    DISTINCTCOUNT('Jcars_Fact Table'[Order ID]),&lt;br&gt;
    NOT ISBLANK('Jcars_Fact Table'[Customer Rating]))&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Discounted Revenue&lt;/strong&gt; = &lt;code&gt;CALCULATE([Total Sales Revenue], 'Jcars_Fact Table'[Discount]&amp;gt;0)&lt;/code&gt;&lt;/p&gt;

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

&lt;p&gt;The flat table repeats every descriptive attribute on every row, mixes measures with attributes, and cannot support reliable time intelligence. A star schema gives one narrow fact table and small, clean dimensions, so filters flow predictably.&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%2Fwj9an64vyk1r6jfbwz5i.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%2Fwj9an64vyk1r6jfbwz5i.png" alt=" " width="800" height="596"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I modelled my data into the following dimension tables:&lt;br&gt;
&lt;code&gt;Dim_Customer&lt;/code&gt;    One customer profile&lt;br&gt;
&lt;code&gt;Dim_Location&lt;/code&gt;    One branch (region, county, city, branch)&lt;br&gt;
&lt;code&gt;Dim_SalesRep&lt;/code&gt;    One salesrep&lt;br&gt;
&lt;code&gt;Dim_Payment&lt;/code&gt;     One method and status combination&lt;br&gt;
&lt;code&gt;Dim_Vehicle&lt;/code&gt;     One make, model, type, year, fuel, transmission, colour combination&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Fact_Table&lt;/code&gt;holds the surrogate key, the dimension keys, the measures (units, KES price, KES cost, discount, KES delivery fee, KES logistics cost), delivery status, returned flag, rating, review count, order and delivery dates, and the data quality flag. It is deliberately free of descriptive text.&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%2Fp18rgfmmsmn4yd3uwo3d.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%2Fp18rgfmmsmn4yd3uwo3d.png" alt=" " width="799" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Analysis and Answers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Which parts of the business have high logistics costs relative to value?&lt;/strong&gt; Overall logistics is 1.6% of revenue. The pressure lies in cheaper vehicles and specific places:&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%2Fgsiyybrplrxoiao1rzl5.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%2Fgsiyybrplrxoiao1rzl5.png" alt=" " width="799" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Models with at least 8 orders: Corolla 4.5% of revenue (KES 83,600 per car), Demio 4.5%, Fielder 3.5%, Fit 3.0%, Outlander 3.0%, Canter 2.8%.&lt;br&gt;
Vehicle types: hatchbacks and wagons 3.1%, crossovers 2.7%. Per car, trucks (KES 81,600), wagons (KES 73,600) and pickups (KES 70,400) cost the most to move.&lt;br&gt;
Locations per car: Nairobi HQ KES 78,300, Mombasa KES 74,900, Athi River KES 72,300, against Nakuru KES 46,900 and Rift Valley KES 51,800.&lt;br&gt;
36 individual orders spend more than 5% of their value on logistics. They are 4.6% of revenue but 21% of logistics cost. The worst are single low-value cars such as a Fit (14.6%), a Demio (12.3%) and an Axela (12.0%).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which customer types contribute most?&lt;/strong&gt;&lt;br&gt;
Dealers are the most valuable segment: largest, second-best margin, cheapest to serve. NGOs generate the most orders (58) but earn the lowest margin. Individuals cost the most to deliver per car&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%2Fx2x6zsqik95h1trsz1g3.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%2Fx2x6zsqik95h1trsz1g3.png" alt=" " width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;What is the relationship between discounts and performance?&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
The correlation between discount and margin is &lt;code&gt;-0.85.&lt;/code&gt;&lt;br&gt;
Discounts show almost no link to volume (-0.11 with cars per order, -0.12 with revenue).&lt;br&gt;
Since the average price-to-cost ratio is 1.20, the break-even discount is about 16%. 21 orders sell below cost, together losing KES 8.9M, and all carry a discount of at least 5% (average 21%).&lt;br&gt;
Orders discounted more than 10% are 23% of all orders and KES 297M of revenue, but earn only KES 2.0M of profit: a margin of 0.7%, against 14.0% for the rest.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which orders or customers should management investigate?&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;(blank ID)&lt;/code&gt;   Harrier Thika   (10.7M) Delivery cancelled but partly paid, marked returned, 68-day gap, 15% discount&lt;br&gt;
&lt;code&gt;LCL1095&lt;/code&gt;  Impreza Nairobi HQ  (1.6M)  Partly paid, delivery cancelled, marked returned, 15% discount&lt;br&gt;
&lt;code&gt;LCL1195&lt;/code&gt;  CX-5    Kakamega    (24.8M) 20% discount sold below cost, partly paid, delivery cancelled&lt;br&gt;
&lt;code&gt;LCL1201&lt;/code&gt;  Land Cruiser    Thika   (12.9M) Paid, but delivery cancelled, date missing&lt;br&gt;
&lt;code&gt;LCL1137&lt;/code&gt;  Hilux   Nakuru  (2.5M)  50% discount, returned&lt;br&gt;
&lt;code&gt;LCL1028&lt;/code&gt;  Impreza Kisumu  (1.0M)  50% discount, returned&lt;/p&gt;

&lt;h2&gt;
  
  
  Findings and recommendations: what the data can support
&lt;/h2&gt;

&lt;p&gt;The report design makes it possible to investigate where performance varies, but a defensible published article should only state results after checking the current model output under the intended filters. The files inspected for this write-up establish the source structure, report pages, measure names, and visible data-quality risks. They do not establish a validated headline revenue, profit, top branch, best-selling make, or delivery rate. Those figures should be read from the refreshed Power BI model after currency and revenue reconciliation, not inferred from a few sample records.&lt;br&gt;
That distinction is important. A high-revenue branch may also have higher costs or a larger transaction base, a high logistics-cost ratio may be driven by vehicle mix or geography, and a low rating may have very few reviews. The report should show denominators and context, and the article should state when a pattern is descriptive rather than causal.&lt;/p&gt;

&lt;p&gt;Based on the issues surfaced, management and the analyst should prioritize these evidence-led next steps:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reconcile recorded revenue before using it for targets or incentives.&lt;/strong&gt; Compare recorded revenue with quantity, unit selling price, discount, delivery fees, and returns. Investigate material mismatches and keep an exception list until the accounting rule is confirmed.&lt;br&gt;
&lt;strong&gt;Treat delivery and logistics differences as investigation signals.&lt;/strong&gt; Compare logistics cost per unit and delivery status by branch, region, and vehicle type. Review the contributing orders before changing routes, delivery commitments, or branch processes.&lt;br&gt;
&lt;strong&gt;Improve transaction capture for decision-critical fields.&lt;/strong&gt; Require valid order IDs, dates, quantities, currency, unit cost, and return/payment statuses at entry. These fields directly affect transaction counts, margins, time analysis, and exception monitoring.&lt;br&gt;
&lt;strong&gt;Interpret customer ratings with sample size.&lt;/strong&gt; Compare ratings alongside review counts and customer/vehicle context before proposing service interventions.&lt;br&gt;
&lt;strong&gt;Keep an auditable exception workflow.&lt;/strong&gt; Surface missing costs, negative revenue, unresolved currencies, date conflicts, and unusual amounts in a dedicated investigation view, then record their resolution rather than silently dropping them.&lt;/p&gt;

&lt;p&gt;These are recommendations for analysis and control improvements, not causal conclusions about why a particular branch or employee performs as it does.&lt;/p&gt;

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

&lt;p&gt;The most valuable step in this project was to distrust the first number. The same 276 rows told three different profit stories depending on two decisions, whether foreign currencies were converted, and whether two impossible prices were believed. Only after resolving both, I could answer the real business questions, discounting drives profit, half of revenue is unpaid, and fulfilment problems sit at Nairobi HQ and Kisumu.&lt;/p&gt;

&lt;h2&gt;
  
  
  GitHub Link
&lt;/h2&gt;

&lt;p&gt;[(&lt;a href="https://github.com/Expertwriter006/From-Raw-Data-to-Business-Decisions-A-Complete-Power-BI-Solution-for-JCars-Logistics)" rel="noopener noreferrer"&gt;https://github.com/Expertwriter006/From-Raw-Data-to-Business-Decisions-A-Complete-Power-BI-Solution-for-JCars-Logistics)&lt;/a&gt;]&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>data</category>
      <category>database</category>
    </item>
    <item>
      <title>Data Modelling, Relationships and Joints in Power BI</title>
      <dc:creator>Expert Writer</dc:creator>
      <pubDate>Thu, 24 Sep 2026 21:07:08 +0000</pubDate>
      <link>https://dev.to/expertwriter/data-modelling-relationships-and-joints-in-power-bi-7f5</link>
      <guid>https://dev.to/expertwriter/data-modelling-relationships-and-joints-in-power-bi-7f5</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;A Power BI report is only as reliable as the model beneath it. Data modelling is the process of organising tables, keys, relationships, and calculations so that business questions can be answered accurately and efficiently. A good model reduces ambiguity, makes DAX easier to write, improves query performance, and gives report users predictable filtering behaviour.&lt;br&gt;
The attached Kenya Crops Data PBIX provides a useful starting point for this discussion. Its report definition shows a single table named &lt;code&gt;Kenya_Crops_Dataset 5&lt;/code&gt;, with fields including &lt;code&gt;County&lt;/code&gt;, &lt;code&gt;Yield (Kg)&lt;/code&gt;, &lt;code&gt;Revenue (KES)&lt;/code&gt; and &lt;code&gt;Profit (KES)&lt;/code&gt;, plus measures named &lt;code&gt;Total Revenue&lt;/code&gt; and &lt;code&gt;Total Profits&lt;/code&gt;. In modelling terms, this is essentially a flat-table design: it can produce useful visuals quickly, but it also provides an excellent example of why a growing analytical solution may eventually benefit from separating facts and dimensions.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Data Modelling in Power BI
&lt;/h2&gt;

&lt;p&gt;Data modelling is the process of deciding how the tables loaded into Power BI relate to one another, which tables exist, what each one contains, which columns act as keys, and how relationships connect them so that a filter selected in one visual correctly reaches every other value it should affect. It happens after data is loaded and cleaned in Power Query, and before any report visuals or DAX measures are built. It is the structural layer that everything else sits on.&lt;br&gt;
A properly designed model supports reporting, analytics, DAX, performance, scalability and maintainability because each table has a clear purpose and each relationship reflects a real business rule.&lt;/p&gt;

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

&lt;p&gt;A flat table stores every attribute and every measurable fact in one wide table, with one row per transaction or observation. The Kenya Crops Data model is an example of this approach: County, Yield, Revenue and Profit-related fields are available in the same dataset used by the report.&lt;/p&gt;

&lt;h4&gt;
  
  
  Advantages
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Simple to build and understand since there are no relationships to configure, so no risk of an incorrect join.&lt;/li&gt;
&lt;li&gt;Fast for very small datasets or fast analysis&lt;/li&gt;
&lt;li&gt;Every value is visible in one place, which is convenient for data exploration just as in excel.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Disadvantages
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Repeated descriptive values increase redundancy&lt;/li&gt;
&lt;li&gt;Changes to descriptive attributes become harder to manage&lt;/li&gt;
&lt;li&gt;A single wide table can make the semantic model less reusable&lt;/li&gt;
&lt;li&gt;No natural place for hierarchy or for attributes that don't change per transaction, such as a farmer's registration details&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  When it is appropriate
&lt;/h4&gt;

&lt;p&gt;Flat tables are appropriate for small, static datasets, quick prototypes, or reports with a short shelf life where the overhead of proper modelling isn't needed. It becomes a liability once the dataset grows, needs multiple related fact sources.&lt;/p&gt;

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

&lt;p&gt;A star schema places one central fact table,  holding the measurable, numeric events (yield, revenue, profit), surrounded by multiple dimension tables, each holding descriptive attributes for one subject area (county, crop, date, farmer). Every dimension connects directly to the fact table, and the dimensions do not connect to each other. Viewed in Power BI's Model view, the fact table sits in the middle with 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%2Fyfv9uaeez3qhbo1u94ay.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%2Fyfv9uaeez3qhbo1u94ay.png" alt="Star_schema" width="800" height="519"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The star schema is the default preferred approach for the overwhelming majority of Power BI reporting and analytics solutions, from small departmental dashboards to enterprise semantic models because it balances simplicity, performance, and maintainability better than either alternative.&lt;br&gt;
It provides a simple filter path, clear table responsibilities, efficient columnar storage and straightforward DAX. Its main disadvantage is that it requires more modelling work than a flat table and may require surrogate keys or dimension-management processes.&lt;/p&gt;

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

&lt;p&gt;A snowflake schema normalises one or more dimensions into additional related tables. For example, Product could connect to Category, while Location could be separated into County, Region and Country tables.&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%2Favvk1nt5rbmbqscmfifa.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%2Favvk1nt5rbmbqscmfifa.png" alt=" " width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Snowflaking is useful where dimensions are genuinely shared, large, hierarchical or governed centrally, but unnecessary normalisation is usually best avoided.&lt;/p&gt;

&lt;h4&gt;
  
  
  Advantages
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Removes duplicate attribute values&lt;/li&gt;
&lt;li&gt;Can better reflect a genuine multi-level business hierarchy as separate, independently maintainable tables.&lt;/li&gt;
&lt;li&gt;Slightly smaller storage footprint for very large, highly repetitive dimension attributes&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Disadvantages
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;More tables to manage, name, and document &lt;/li&gt;
&lt;li&gt;Extra hops mean filters must pass through an additional relationship to reach the fact table, which can slow queries and complicate DAX&lt;/li&gt;
&lt;li&gt;The storage savings are usually negligible in Power BI&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Fact Tables and Dimensional Tables
&lt;/h2&gt;

&lt;p&gt;The star and snowflake schemas both rest on a single distinction, separating what happened (facts) from who, what, when, and where it happened to (dimensions).&lt;/p&gt;

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

&lt;p&gt;A fact table stores the measurable, numeric business events such as sum, average, or count. &lt;br&gt;
Fact tables are typically long with many rows and narrow, having few columns that are mostly foreign keys plus numeric measures.&lt;br&gt;
The &lt;strong&gt;grain of a fact table is the precise definition of what a single row represents&lt;/strong&gt;, the level of detail at which facts are recorded. For FactCropProduction, the grain might be "one row per farmer, per crop, per season, per county." Getting the grain right is one of the most important modelling decisions.&lt;br&gt;
Every measure and every dimension key in the fact table must be true at that declared grain.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dimension Tables
&lt;/h3&gt;

&lt;p&gt;A dimension table stores descriptive, mostly textual attributes that give context to the facts, the who, what, when, and where. Dimension tables are typically short (relatively few distinct rows) and wide (many descriptive columns), and they change far less often than fact rows accumulate.&lt;/p&gt;

&lt;h3&gt;
  
  
  Worked Example: A Star Schema for Crop Production
&lt;/h3&gt;

&lt;p&gt;Bringing this together, a central FactCropProduction table connects to four dimensions, each answering a different question about the same production event:&lt;br&gt;
&lt;code&gt;DimDate&lt;/code&gt;answers "&lt;strong&gt;when?&lt;/strong&gt;" — supporting month, season and year-over-year analysis.&lt;br&gt;
&lt;code&gt;DimCounty&lt;/code&gt; answers "&lt;strong&gt;where?&lt;/strong&gt;" — supporting county- and region-level comparison.&lt;br&gt;
&lt;code&gt;DimCrop&lt;/code&gt; answers "&lt;strong&gt;what?&lt;/strong&gt;" — supporting crop and crop-category breakdowns.&lt;br&gt;
&lt;code&gt;DimFarmer&lt;/code&gt; answers "&lt;strong&gt;who?&lt;/strong&gt;" — supporting analysis by farm size or individual farmer.&lt;/p&gt;

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

&lt;p&gt;A relationship is a logical link between two tables, defined by matching a column in one table to a column in another. It does not copy or merge any data, it simply tells Power BI's engine how two tables are connected through columns, so that a filter applied to one table can propagate to the other. Relationships are what make it possible to split data across multiple tables.&lt;/p&gt;

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

&lt;p&gt;This is usually the standard dimensional relationship, where one row in DimProduct can correspond to many rows in FactSales. ProductID is unique on the dimension side but may repeat on the fact side. This should normally be the default pattern for Power BI models.&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, and vice versa, both key columns contain entirely unique values.&lt;/p&gt;

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

&lt;p&gt;Both sides of the relationship can contain repeated (non-unique) values, where many rows in Table A can match many rows in Table B.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keys, Uniqueness, Cardinality and Referential Integrity
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Primary key&lt;/strong&gt;: This the column (or columns) in a dimension table that uniquely identifies each row&lt;br&gt;
&lt;strong&gt;Foreign key&lt;/strong&gt;: The corresponding column in the fact table that references a dimension's primary key&lt;br&gt;
&lt;strong&gt;Cardinality&lt;/strong&gt;: The mathematical nature of the relationship (1:1, 1:&lt;em&gt;, *:1, or *:&lt;/em&gt;), which Power BI detects automatically when a relationship is created but which should always be reviewed and confirmed by the modeller&lt;br&gt;
&lt;strong&gt;Referential integrity&lt;/strong&gt;: the assurance that every foreign key value in the fact table actually has a matching primary key value in the dimension &lt;br&gt;
&lt;strong&gt;Active and inactive relationships&lt;/strong&gt;: Power BI allows only one active relationship between two given tables at a time&lt;/p&gt;

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

&lt;p&gt;Once a relationship exists, Power BI needs to know which direction a filter is allowed to travel across it. This is the relationship's cross-filter direction, and it determines how selecting a value in one visual affects the values shown in another.&lt;/p&gt;

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

&lt;p&gt;In a single-direction relationship, filters flow only from the "one" side to the "many" side, from a dimension into the fact table. This is the default and recommended setting for the great majority of relationships in a star schema.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bidirectional (Both) Filtering
&lt;/h3&gt;

&lt;p&gt;A bidirectional relationship allows filters to flow both ways, a selection in the fact table can also filter the connected dimension table, and vice versa.&lt;/p&gt;

&lt;h4&gt;
  
  
  Why Bidirectional Filtering Needs Care
&lt;/h4&gt;

&lt;p&gt;Bidirectional filtering is powerful but risky, and should be switched on deliberately, not by default:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ambiguous filter paths&lt;/strong&gt;: if multiple bidirectional relationships create more than one route by which a filter could reach a table, Power BI may refuse to create the relationship, or worse, resolve the ambiguity in a way the model author didn't intend.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unnecessary model complexity&lt;/strong&gt;: every bidirectional relationship is another path a report author (or a future you) has to mentally trace when a number looks wrong.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance cost&lt;/strong&gt;: bidirectional relationships require the engine to evaluate filters in both directions, which is more expensive than a single-direction filter, especially on large fact tables.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Circular relationships&lt;/strong&gt;: combining bidirectional filtering with certain model shapes e.g., a many-to-many bridge plus a bidirectional dimension can create circular filter logic that Power BI will block outright&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;A join in Power Query is performed through Merge Queries. Unlike a model relationship, a merge combines columns from one query with matching rows from another query during data preparation. The result becomes part of the query output loaded into the model.&lt;/p&gt;

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

&lt;p&gt;Keeps every row from the left (first) table, and adds matching columns from the right table where a match exists.&lt;br&gt;
This is the default and most commonly used join in Power Query since it is appropriate whenever you want to enrich a complete list. &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%2Fwc2io7encwck2257jbnm.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%2Fwc2io7encwck2257jbnm.png" alt="Left_outer_join" width="800" height="658"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;This join keeps every row from the right table, adding matching columns from the left table where available, and nulls where not.&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%2Fgv6lupiad4p74mirjoa1.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%2Fgv6lupiad4p74mirjoa1.png" alt="Right_outer_join" width="800" height="654"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Keeps every row from both tables, matching where possible and filling with nulls on whichever side has no match.&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%2Fc6zhbc5cjpi8jxwq12lm.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%2Fc6zhbc5cjpi8jxwq12lm.png" alt="Full_outer_join" width="800" height="663"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Keeps only rows where a match exists in both tables, and anything unmatched on either side is dropped entirely.&lt;br&gt;
Inner joins are appropriate when incomplete or unmatched data is not useful for the analysis.&lt;/p&gt;

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

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

&lt;p&gt;Keeps only rows from the left table that have no match in the right table, and the matching rows are excluded&lt;/p&gt;

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

&lt;p&gt;The mirror of a left anti join, keeping only rows from the right table that have no match in the left table.&lt;/p&gt;

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

&lt;p&gt;Merging in Power Query and relating tables in the data model look similar since both connect two tables on a common key, but they operate at different stages of the Power BI workflow and have very different effects on the model.&lt;br&gt;
A Power Query merge happens during data transformation before the final model is used for reporting by physically adding columns/rows to the query result.&lt;br&gt;
A Power BI relationship is a semantic connection between already separate model tables, it does not copy the columns of one table into another.&lt;/p&gt;

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

&lt;p&gt;For a typical business intelligence project, I would recommend a star schema rather than a flat table or a heavily snowflaked model. The key reason is balance, as it provides enough separation to reduce redundancy and support scalability without introducing the relationship complexity of excessive normalisation.&lt;br&gt;
A star schema normally gives better report readability, simpler DAX, predictable filter propagation and a strong foundation for adding new facts and dimensions. Power BI's columnar storage engine also benefits from well-structured tables with appropriate data types and low cardinality dimension attributes. The model remains easier to test because each relationship has a clear business meaning.&lt;br&gt;
My default relationship design would be one-to-many from dimensions to facts, active relationships for the main analytical path, and single-direction filtering. Bidirectional relationships would be introduced only when there is a demonstrated business requirement and the resulting filter paths are unambiguous.&lt;br&gt;
The final objective is not simply to minimise the number of tables. It is to create a model in which each table has one clear responsibility, each relationship represents a valid business rule, and users can build reports without needing to understand the physical complexity of the source system.&lt;/p&gt;

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

&lt;p&gt;Data modelling decisions in Power BI are rarely about right or wrong in the abstract, they are about matching the shape of the model to the shape of the analysis it needs to support. A flat table is honest and simple but scales poorly. A star schema strikes the best balance for almost every practical reporting scenario, a snowflake schema earns its extra complexity only in specific, large-scale situations. Relationships, cardinality, filter direction, and Power Query joins are the mechanics that make any of these structures actually work, understanding when to use a one-to-many (1:*) relationship versus a merge, or when to allow bidirectional filtering versus keeping it single-direction, is what turns a technically correct model into a genuinely usable one. Relationships connect semantic tables without physically merging them, while Power Query joins reshape data before it reaches the model. Understanding this distinction allows a data scientist to build solutions that are accurate, performant, scalable and maintainable.&lt;/p&gt;

</description>
      <category>datascience</category>
      <category>database</category>
      <category>data</category>
    </item>
    <item>
      <title>Building an Interactive Excel Dashboard for E-commerce Product Analysis: A Case Study of Jumia Products</title>
      <dc:creator>Expert Writer</dc:creator>
      <pubDate>Tue, 08 Sep 2026 15:04:20 +0000</pubDate>
      <link>https://dev.to/expertwriter/building-an-interactive-excel-dashboard-for-e-commerce-product-analysis-a-case-study-of-jumia-o8</link>
      <guid>https://dev.to/expertwriter/building-an-interactive-excel-dashboard-for-e-commerce-product-analysis-a-case-study-of-jumia-o8</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Data analytics play a vital role in decision-making processes for e-commerce. Online market platforms generate massive amounts of data and information about products, their prices, discounts, customer reviews, offers available and, ratings. When properly analysed, this information can be of great use to the sellers, and institutions in understanding customer behaviour, identify products that are performing highly, improve pricing strategies, and come up with better promotional decisions.&lt;br&gt;
In this particular project, I will focus on the analysis of Jumia product dataset using &lt;strong&gt;Microsoft Excel&lt;/strong&gt;, which is an important tool that can be used for data analysis, to get some essential indications. The major objective of the analysis is to transform raw data into cleaned, structured, analysed, and interactive dashboard that provides meaningful business insights. &lt;/p&gt;

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

&lt;p&gt;The primary objective of this project was to create an interactive Excel dashboard for analysing the performance of products listed on Jumia.&lt;br&gt;
The final dashboard provides an overview of product performance using key performance indicators (KPIs), charts, product rankings, and category breakdowns.&lt;br&gt;
The dashboard is intended to help Jumia sellers and decision-makers understand how pricing, discounts, ratings and customer engagement interact.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Dataset
&lt;/h2&gt;

&lt;p&gt;The dataset contains information and data about Jumia products.&lt;br&gt;
The original dataset was made of &lt;strong&gt;115 product records&lt;/strong&gt; and &lt;strong&gt;6 main columns&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Product       :          Name of the product&lt;/li&gt;
&lt;li&gt;Current Price :          Current selling price (In Ksh)&lt;/li&gt;
&lt;li&gt;Old Price     :          Original price before discount&lt;/li&gt;
&lt;li&gt;Discount      :          Percentage discount offered&lt;/li&gt;
&lt;li&gt;Review        :          Number of customer reviews&lt;/li&gt;
&lt;li&gt;Rating        :          Average customer rating out of 5&lt;/li&gt;
&lt;/ol&gt;

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

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

&lt;p&gt;The original dataset had several quality issues that I had to address before analysis such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Duplicate records.&lt;/li&gt;
&lt;li&gt;Prices were stored as text containing the &lt;code&gt;KSh&lt;/code&gt; currency symbol&lt;/li&gt;
&lt;li&gt;Ratings were stored in text such as &lt;code&gt;4.5 out of 5&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Review values appeared as negative numbers.&lt;/li&gt;
&lt;li&gt;Missing values in the Review and Rating fields&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Action Taken
&lt;/h3&gt;

&lt;p&gt;I started by checking for &lt;strong&gt;duplicates&lt;/strong&gt; in the Original dataset and deleted them.&lt;br&gt;
I did this by selecting the whole data set, and under the &lt;strong&gt;Data&lt;/strong&gt; tab in Excel, I clicked on &lt;strong&gt;Remove Duplicates&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%2F3mgl4y4jvkunesbnuql5.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%2F3mgl4y4jvkunesbnuql5.png" alt="Remove duplicates" width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This step reduced the number of products to &lt;strong&gt;111&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Secondly, I changed the values in Original Price field,which were in &lt;code&gt;Text&lt;/code&gt; form, into &lt;code&gt;Numbers.&lt;/code&gt;&lt;br&gt;
Similarly, the rating field contained values such as &lt;code&gt;4.5 out of 5&lt;/code&gt; which is in Text format, and need to be in Numerical values&lt;/p&gt;

&lt;h4&gt;
  
  
  Checking for Missing Values
&lt;/h4&gt;

&lt;p&gt;Missing values can interfere with calculations and visualizations. The original dataset had missing values in the &lt;strong&gt;Review&lt;/strong&gt; and &lt;strong&gt;Rating&lt;/strong&gt; Columns.&lt;/p&gt;

&lt;h4&gt;
  
  
  Cleaning the Review Column
&lt;/h4&gt;

&lt;p&gt;The Review column had its values written as negative such as &lt;code&gt;-2, -4, -14, -7.&lt;/code&gt;&lt;br&gt;
Logically, the number of customer reviews cannot be negative. I treated the negative signs as erroneous and removed the negatives.  &lt;/p&gt;

&lt;h4&gt;
  
  
  Creating the Discount Amount Column
&lt;/h4&gt;

&lt;p&gt;One of the calculated fields required by the project was the absolute discount amount.&lt;br&gt;
The formula is:&lt;br&gt;
&lt;code&gt;=Old Price - Current Price&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Creating the Rating Category
&lt;/h4&gt;

&lt;p&gt;I created the Rating Category to group the products according to their customer ratings as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Poor: Rating below 3&lt;/li&gt;
&lt;li&gt;Average: Rating between 3 and 4&lt;/li&gt;
&lt;li&gt;Excellent: Rating above 4.5
The Excel formula is:
&lt;code&gt;=IF(F2&amp;lt;3,"Poor",IF(F2&amp;lt;=4.4,"Average","Excellent"))&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Creating the Discount Category
&lt;/h4&gt;

&lt;p&gt;I created the discount category in three groups:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Low Discount: Below 20%&lt;/li&gt;
&lt;li&gt;Medium Discount: 20%–40%&lt;/li&gt;
&lt;li&gt;High Discount: Above 40%
The Excel formula is:
&lt;code&gt;=IF(D2&amp;lt;20%,"Low Discount",IF(D2&amp;lt;=40%,"Medium Discount","High Discount"))&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Descriptive Statistics
&lt;/h3&gt;

&lt;p&gt;After the data cleaning and transformation, I calculated the descriptive statistics as follows, with the excel functions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Total Products (&lt;code&gt;=COUNTA(A2:A113)&lt;/code&gt;):&lt;strong&gt;111&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Avg Current Price (&lt;code&gt;=AVERAGE(B2:B113)&lt;/code&gt;): &lt;strong&gt;1181.37&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Avg Old Price(&lt;code&gt;=AVERAGE(C2:C113)&lt;/code&gt;):&lt;strong&gt;1803.10&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Avg Discount(&lt;code&gt;=AVERAGE(D2:D113)&lt;/code&gt;): &lt;strong&gt;37%&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Avg Rating (&lt;code&gt;=AVERAGE(F2:F113)&lt;/code&gt;): &lt;strong&gt;3.88&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Total Reviews(&lt;code&gt;=SUM(E2:E113)&lt;/code&gt;): &lt;strong&gt;721&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

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

&lt;p&gt;I investigated three major relationships:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Discount and reviews&lt;/li&gt;
&lt;li&gt;Rating and reviews&lt;/li&gt;
&lt;li&gt;Price and rating&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  1. Discount Vs Customer Reviews
&lt;/h3&gt;

&lt;p&gt;The first relationship examined was whether products with higher discounts receive more customer reviews.&lt;br&gt;
The correlation between discount percentage and number of reviews, of the final 111 products was &lt;strong&gt;-0.139.&lt;/strong&gt;&lt;br&gt;
This indicates a very &lt;strong&gt;weak negative relationship&lt;/strong&gt; in the dataset.&lt;br&gt;
The results, therefore, suggests that &lt;strong&gt;higher discounts&lt;/strong&gt; are &lt;strong&gt;not associated&lt;/strong&gt; with substantially &lt;strong&gt;higher customer engagement&lt;/strong&gt; in this dataset.&lt;br&gt;
Consequently, it is important, for the sellers not to assume that increasing the discount will automatically generate more customer reviews.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rating Vs Customer Reviews
&lt;/h3&gt;

&lt;p&gt;The correlation for this relationship was &lt;strong&gt;0.066.&lt;/strong&gt;&lt;br&gt;
This indicates a &lt;strong&gt;weak positive relationship&lt;/strong&gt;.&lt;br&gt;
Therfore, highly rated products do not necessarily receive significantly more reviews.&lt;br&gt;
It is, therefore, important to note that &lt;strong&gt;Customer satisfaction and customer engagement are different dimensions of product performance.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Price Vs Rating
&lt;/h3&gt;

&lt;p&gt;The correlation between price and rating is &lt;strong&gt;0.104.&lt;/strong&gt;&lt;br&gt;
This represents a very &lt;strong&gt;weak positive relationship.&lt;/strong&gt;&lt;br&gt;
Therefore, more expensive products are not necessarily rated substantially higher than cheaper products.&lt;br&gt;
The result suggests that price alone does not appear to determine customer satisfaction in this dataset.&lt;/p&gt;

&lt;h2&gt;
  
  
  Identifying Top 10 Products by Customer Reviews
&lt;/h2&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%2Fc82xmnpybo8rlm7sp2gg.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%2Fc82xmnpybo8rlm7sp2gg.PNG" alt="Top products by customer reviews" width="568" height="245"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The strongest observation is the first product, &lt;strong&gt;120W Cordless Vacuum Cleaner.&lt;/strong&gt; It has the highest number of reviews but only a &lt;strong&gt;2.8/5 rating&lt;/strong&gt;.&lt;br&gt;
This translates into high customer engagement but low customer satisfaction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Identifying Top 10 Products by Rating
&lt;/h2&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%2F8erp6bdj48nlzhz30pyi.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%2F8erp6bdj48nlzhz30pyi.PNG" alt="Top products by rating" width="591" height="250"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The products showed to genarally have relatively small review counts.&lt;br&gt;
This is why a high rating should not automatically be interpreted as strong market demand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Identifying Top 10 Products by Discount
&lt;/h2&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%2Fldxphsuq9749hh3az7t7.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%2Fldxphsuq9749hh3az7t7.PNG" alt="Top products by discount" width="552" height="251"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;One of the most useful analyses was to identify products that combine:&lt;br&gt;
&lt;strong&gt;High discount + Low rating&lt;/strong&gt;&lt;br&gt;
These products are a bit troublesome since they may be heavily promoted but still receive poor customer feedback.&lt;br&gt;
One clear example is the &lt;strong&gt;5-PCS Stainless Steel Cooking Pot Set&lt;/strong&gt; with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Discount: 55%&lt;/li&gt;
&lt;li&gt;Rating: 2.1/5&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reviews: 13&lt;br&gt;
This data suggests that the problem is not in the price. Reducing the price further, may increase sales temporarily, but may not solve the root cause of underlying customer dissatisfaction.&lt;br&gt;
Potential causes may include:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Product quality&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Product description&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Product expectations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Packaging&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Delivery experience&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Product durability&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Creating KPI cards for the Dashboard
&lt;/h2&gt;

&lt;p&gt;The Key Performance Indicators for my dashboard included:&lt;/p&gt;

&lt;p&gt;`- TOTAL PRODUCTS &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AVERAGE PRICE &lt;/li&gt;
&lt;li&gt;AVERAGE DISCOUNT &lt;/li&gt;
&lt;li&gt;AVERAGE RATING &lt;/li&gt;
&lt;li&gt;TOTAL REVIEWS`&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Dashboard Layout
&lt;/h2&gt;

&lt;p&gt;I organised the dashboard into several sections, keeping the most important information visible, while also providing detailed physical views.&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%2Fzeyjoludsdq8fl1642f6.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%2Fzeyjoludsdq8fl1642f6.PNG" alt="Dashboard" width="800" height="528"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Pivot Tables
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Rating Category
&lt;/h3&gt;

&lt;p&gt;This pivot table was to provide a breakdown of products into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Poor&lt;/li&gt;
&lt;li&gt;Average&lt;/li&gt;
&lt;li&gt;Excellent&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%2Fq0b0ebyjlkw59q2x9w59.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%2Fq0b0ebyjlkw59q2x9w59.PNG" alt="Rating category" width="800" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Discount Category
&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%2Fkv3sfbgi62md6j2tsmol.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%2Fkv3sfbgi62md6j2tsmol.PNG" alt="Discount Category" width="800" height="628"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Business Findings
&lt;/h2&gt;

&lt;p&gt;The analysis produced several important findings as follows:&lt;/p&gt;

&lt;h3&gt;
  
  
  1.High Discounts Do Not Guarantee High Engagement
&lt;/h3&gt;

&lt;p&gt;The correlation between discount percentage and reviews was approximately &lt;strong&gt;-0.139&lt;/strong&gt;, indicating a weak negative relationship.&lt;br&gt;
Therefore, increasing discounts does not automatically result in more customer reviews.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.High Ratings Do Not Guarantee High Demand
&lt;/h3&gt;

&lt;p&gt;The relationship between ratings and review gave a correlation of &lt;strong&gt;0.066,&lt;/strong&gt; indicating almost no linear relationship. Some highly rated products have very few reviews.&lt;br&gt;
Sellers should, therefore, consider both Rating and Rating Volume to evaluate performance.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.Price Does Not Strongly Determine Rating
&lt;/h3&gt;

&lt;p&gt;The correlation between price and rating of &lt;strong&gt;0.104&lt;/strong&gt; indicates a very weak positive relationship.&lt;br&gt;
Therefore, premium pricing does not automatically result in higher customer ratings.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.Some Products Have Strong Engagement but Poor Satisfaction
&lt;/h3&gt;

&lt;p&gt;A clear example in this category is the 120W Cordless Vacuum Cleaner. with &lt;br&gt;
&lt;code&gt;29 Reviews&lt;br&gt;
2.8 Rating&lt;/code&gt;&lt;br&gt;
This product attracts considerable customer engagement but has poor satisfaction. It needs to be analysed what could be the cause for this trend.&lt;/p&gt;

&lt;h3&gt;
  
  
  Some Products Are Heavily Discounted Despite Poor Ratings
&lt;/h3&gt;

&lt;p&gt;A good example in this category is the 5-PCS Stainless Steel Cooking Pot Set that has:&lt;br&gt;
&lt;code&gt;55% Discount, 2.1 Rating, 13 Reviews&lt;/code&gt;&lt;br&gt;
This indicates that high discounting does not necessarily solve customer satisfaction problems.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  1. Avoid excessive reliance on discounts
&lt;/h3&gt;

&lt;p&gt;The sellers should not assume that increasing discounts will automatically increase customer engagement.&lt;br&gt;
Promotional startegies should involve improvements of product quality and better customer experienvces&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Investigate products with high reviews, and low ratings
&lt;/h3&gt;

&lt;p&gt;Products with large numbers of reviews but low ratings should receive urgent attention. A clear example is the 120W Cordless Vacuum Cleaner&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Analyse customer feedback
&lt;/h3&gt;

&lt;p&gt;The sellers should examine the content of negative reviews to identify recurring problems that may include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quality&lt;/li&gt;
&lt;li&gt;Durability&lt;/li&gt;
&lt;li&gt;Size&lt;/li&gt;
&lt;li&gt;Functionality&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Use ratings and the number of reviews together
&lt;/h3&gt;

&lt;p&gt;A 5.0 rating based on one review should not be treated in the same way as a 4.7 rating based on dozens of reviews.&lt;br&gt;
A better performance framework should consider:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Customer Rating + Review Volume + Discount + Price&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Reconsider high discounts on poorly rated products
&lt;/h3&gt;

&lt;p&gt;When a product has high discount and poor rating, the selllers need to examine the underlying problem before enhancing the discount.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Missing data in ratings and review counts of some products&lt;/li&gt;
&lt;li&gt;The database does not contain a dedicated product-category field. Adding categories would make it possible to compare performance across product groups&lt;/li&gt;
&lt;li&gt;The sales data contains reviews but does not have actual sales quantities&lt;/li&gt;
&lt;li&gt;The revenue and profit-margin data are not available&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;This project demonstrated how Microsoft Excel can be used to transform raw e-commerce data into a practical business intelligence dashboard.&lt;br&gt;
The final cleaned dataset contains 111 products after removing three duplicate records and the problematic sofa-cover record.&lt;br&gt;
The analysis demonstrates the importance of cleaning and validating data before creating a dashboard.&lt;br&gt;
The final findings show that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Higher discounts do not necessarily generate higher customer engagement.&lt;/li&gt;
&lt;li&gt;Highly rated products do not necessarily have more reviews.&lt;/li&gt;
&lt;li&gt;Expensive products are not necessarily rated higher.&lt;/li&gt;
&lt;li&gt;Some products have high customer engagement but poor ratings.&lt;/li&gt;
&lt;li&gt;Some products have substantial discounts but poor customer satisfaction.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The most important lesson from this project is that &lt;strong&gt;a dashboard is only as reliable as the data behind it&lt;/strong&gt;. Careful data cleaning, appropriate Excel formulas, meaningful visualizations and thoughtful interpretation are all necessary to turn raw e-commerce data into actionable business intelligence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Github Link
&lt;/h2&gt;

&lt;p&gt;Below is the link for Github Repository.&lt;br&gt;
&lt;a href="https://github.com/Expertwriter006/Jumia-Product-Performance-Dashboard" rel="noopener noreferrer"&gt;https://github.com/Expertwriter006/Jumia-Product-Performance-Dashboard&lt;/a&gt;&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>data</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Getting Started with Excel for Data Analytics: From Basics to Data Cleaning</title>
      <dc:creator>Expert Writer</dc:creator>
      <pubDate>Tue, 01 Sep 2026 07:45:13 +0000</pubDate>
      <link>https://dev.to/expertwriter/getting-started-with-excel-for-data-analytics-from-basics-to-data-cleaning-3818</link>
      <guid>https://dev.to/expertwriter/getting-started-with-excel-for-data-analytics-from-basics-to-data-cleaning-3818</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Microsoft Excel remains one of the most widely used tools for data analytics, not because it is the most powerful platform available, but because it combines accessibility with genuine analytical depth. It has data entry, data inspection, cleaning, calculation, filtering, visualisation, and reporting in one familiar environment. Through the Excel, we always get to have our first real encounter with dataset for analysis. This is exactly where my Week 1 learning began: understanding the building blocks of a spreadsheet, then immediately putting those building blocks to work on a dataset that badly needed attention.&lt;/p&gt;

&lt;p&gt;This article explains my practical exercise, where I used the &lt;strong&gt;HR_Dataset_Dirty.xlsx dataset&lt;/strong&gt;. The dataset contains &lt;strong&gt;876 employee records and 21 variables&lt;/strong&gt;, including Employee ID, department, salary, hire date, age, gender, performance score, employment status, bonus, education level, work experience, office location, project count, remote-work status, training hours and manager feedback score. The purpose of the exercise was not simply to calculate statistics, but to demonstrate an important principle of data analytics that &lt;strong&gt;reliable analysis begins with reliable data.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Understanding the Excel Environment
&lt;/h2&gt;

&lt;p&gt;Before touching the dataset, it is worth revisiting the fundamental concepts that make everything else in Excel possible. These are not advanced features, they are the vocabulary of the spreadsheet, and every cleaning technique used later in this article is really just a combination of these basics.&lt;/p&gt;

&lt;h3&gt;
  
  
  Workbooks, Worksheets, and Cells
&lt;/h3&gt;

&lt;p&gt;An Excel workbook is a file that can contain multiple worksheets (tabs), each organised as a grid of rows and columns. Columns are normally used for variables or fields, while rows represent individual observations. In the HR dataset, for example, Department is a variable and each row represents an employee record. The intersection of a row and a column is a cell, identified by a unique address such as A1 or D9. Every worksheet in the workbook built for this project - from the raw data to the final cleaned table, is simply a grid of cells connected to one another through references and formulas.&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%2F6yymc6lsdphjdqxgsl30.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%2F6yymc6lsdphjdqxgsl30.PNG" alt=" " width="800" height="425"&gt;&lt;/a&gt;&lt;br&gt;
The image above illustrates a worksheet, it having both &lt;strong&gt;Original Dirty Hr Dataset&lt;/strong&gt;, and &lt;strong&gt;Cleaned Dataset.&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%2Frxc9llq3utkkxqdtkt8d.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%2Frxc9llq3utkkxqdtkt8d.PNG" alt=" " width="800" height="240"&gt;&lt;/a&gt;&lt;br&gt;
The above image demonstrates an &lt;strong&gt;Active Cell,&lt;/strong&gt; bordered in green colour, and positioned in D5, with D being the column, and 5 being the row. The active cell therefore, is at the intersection of D column, and row 5.&lt;/p&gt;

&lt;h3&gt;
  
  
  Formulas and Functions
&lt;/h3&gt;

&lt;p&gt;A formula is any expression that begins with an equals sign and calculates a result, a function is a predefined formula such as TRIM, PROPER, or IF. In this, I learnt text functions (TRIM, PROPER, SUBSTITUTE, UPPER), logical functions (IF), and counting functions (COUNTIF, COUNTBLANK). As shown throughout this article, these five or six functions are, in practice, almost the entire toolkit needed to take a messy dataset and make it ready for analysis.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Inspecting the HR Dataset
&lt;/h2&gt;

&lt;p&gt;The first step in a data-cleaning workflow is data profiling. I checked the number of rows and columns, missing values, duplicate records, data types and inconsistent categories.&lt;/p&gt;

&lt;p&gt;The original HR dataset contained &lt;strong&gt;876 rows and 21 columns&lt;/strong&gt;. It also contained &lt;strong&gt;277 blank cells&lt;/strong&gt; and &lt;strong&gt;seven exact duplicate rows&lt;/strong&gt;. More importantly, several fields contained inconsistent representations of the same concept.&lt;br&gt;
For example, the &lt;strong&gt;Department&lt;/strong&gt; field contained values such as &lt;code&gt;HR&lt;/code&gt;, &lt;code&gt;H.R&lt;/code&gt;, &lt;code&gt;Hr&lt;/code&gt;, &lt;code&gt;Human Resource&lt;/code&gt;, &lt;code&gt;Human Resources&lt;/code&gt;, &lt;code&gt;Humman Res.&lt;/code&gt; and &lt;code&gt;Humna Resources&lt;/code&gt;. These values may refer to the same department, but Excel would treat them as different categories when counting. See in the picture 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%2Fvqi3jhs34qv4jagdwelm.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%2Fvqi3jhs34qv4jagdwelm.PNG" alt=" " width="748" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Similar problems occurred in other fields. &lt;strong&gt;Gender&lt;/strong&gt; included &lt;code&gt;Male&lt;/code&gt;, &lt;code&gt;MALE&lt;/code&gt;, &lt;code&gt;male&lt;/code&gt;, &lt;code&gt;M&lt;/code&gt;, &lt;code&gt;Female&lt;/code&gt;, &lt;code&gt;female&lt;/code&gt;, &lt;code&gt;F&lt;/code&gt; and &lt;code&gt;Femle&lt;/code&gt;. &lt;strong&gt;Employee Type&lt;/strong&gt; included &lt;code&gt;Permanent&lt;/code&gt;, &lt;code&gt;Perm&lt;/code&gt;, &lt;code&gt;permanent&lt;/code&gt;, &lt;code&gt;Contract&lt;/code&gt;, &lt;code&gt;Contrct&lt;/code&gt; and &lt;code&gt;contractor&lt;/code&gt;. &lt;strong&gt;Office Location&lt;/strong&gt; contained variations such as &lt;code&gt;London&lt;/code&gt; and &lt;code&gt;Londn&lt;/code&gt;, &lt;code&gt;Nairobi&lt;/code&gt; and &lt;code&gt;Nairob&lt;/code&gt;, and &lt;code&gt;Tokyo&lt;/code&gt; and &lt;code&gt;Tokio&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The dataset also contained invalid or suspicious numeric values. Examples included a performance score of &lt;strong&gt;11&lt;/strong&gt; even though the intended scale is &lt;strong&gt;1–10&lt;/strong&gt;, an age recorded as &lt;code&gt;thirty&lt;/code&gt;, and a project count recorded as &lt;code&gt;ten&lt;/code&gt;. There were also values such as &lt;code&gt;-1&lt;/code&gt; in work experience and &lt;code&gt;1900&lt;/code&gt; or &lt;code&gt;2030&lt;/code&gt; in Last Promotion Year that require validation rather than blind acceptance.&lt;/p&gt;

&lt;p&gt;Additionally, it had:&lt;br&gt;
Inconsistent Employee IDs - some stored as plain numbers &lt;code&gt;(10764)&lt;/code&gt;, others prefixed with text &lt;code&gt;(EMP-10540)&lt;/code&gt;, and several IDs duplicated across two different employees.&lt;br&gt;
Invalid or inconsistent dates - hire dates such as &lt;code&gt;"2019-02-30"&lt;/code&gt; (30 February does not exist), &lt;code&gt;"2020/13/05"&lt;/code&gt; (month 13 does not exist), &lt;code&gt;"31/04/2021"&lt;/code&gt; (April has 30 days), and plain text such as &lt;code&gt;"not available"&lt;/code&gt;.&lt;br&gt;
Missing values - blank first names, blank office locations, and blank salaries scattered throughout the sheet.&lt;/p&gt;

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

&lt;p&gt;Rather than cleaning the data by hand, I built the entire workflow using formulas, so that every 'cleaned' value is calculated automatically and stays connected to its raw source. If the raw data changes, the cleaned output updates with it - this is the real advantage of doing data cleaning in Excel using formulas rather than typing corrections over the original values.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Standardising Text - Names, Departments, Locations, and Status
&lt;/h3&gt;

&lt;p&gt;The first pass targets text inconsistency. Full names are rebuilt from First Name and Last Name using TRIM (to remove stray spaces), SUBSTITUTE (to collapse accidental double spaces), and PROPER (to apply consistent capitalisation). Where either name was blank, an IF/OR check flags the record as "MISSING - REVIEW" instead of silently producing an incomplete name.&lt;br&gt;
The result was a worksheet where every text field - name, department, office location, and employment status - now uses one consistent spelling throughout, which is essential before any analysis of the data started.&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%2Fkb8426v14hk64rh69a4c.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%2Fkb8426v14hk64rh69a4c.PNG" alt="Standardised Texts" width="800" height="322"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Detecting Duplicate and Missing Records
&lt;/h3&gt;

&lt;p&gt;With text standardised, my next step was finding rows that should not exist (duplicates) and rows that are missing critical information. I first stripped &lt;strong&gt;Employee ID&lt;/strong&gt; of its "&lt;code&gt;EMP-&lt;/code&gt;" prefix and converted to a genuine number with SUBSTITUTE and VALUE, so that "&lt;code&gt;EMP-10540&lt;/code&gt;" and "&lt;code&gt;10540&lt;/code&gt;" are recognised as the same identifier.  Then I used COUNTIF against that cleaned ID column to flag any employee ID that occurs more than once, and COUNTBLANK to check each entire row for missing fields.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Correcting Numeric Fields - Salary, Age, and Work Experience
&lt;/h3&gt;

&lt;p&gt;Several numeric columns were stored as text, which silently breaks any SUM, AVERAGE, and other calculations on them. Salary values such as "&lt;code&gt;$65109&lt;/code&gt;" were converted to true numbers, and the currency used as &lt;strong&gt;KES&lt;/strong&gt;(Kenyan Shillings).&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Validating and Standardising Hire Dates
&lt;/h3&gt;

&lt;p&gt;Dates were the least consistent field in the dataset, mixing genuine date values with plain text ("not available"), and several strings that look like dates but describe days that do not exist on any calendar. &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%2Fw7jec9krodybsjrgnplx.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%2Fw7jec9krodybsjrgnplx.PNG" alt="Corrected Hire Dates" width="136" height="209"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Consolidating into an Analysis-Ready Table
&lt;/h3&gt;

&lt;p&gt;The final worksheet pulls the cleaned output of every previous step into a single, consolidated table, with one row per employee, with standardised names, departments, locations, employment status, salary, age, work experience, and hire date. A final Record Status column combines every flag raised earlier (duplicate ID, incomplete record, invalid date, or missing name/salary/age) into one clear verdict: "Ready for analysis". I added an AutoFilter so that a colleague could instantly isolate the records that still need attention before running any further analysis.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Validating the Cleaned Dataset
&lt;/h3&gt;

&lt;p&gt;After cleaning, I performed another inspection rather than assuming the data was correct.&lt;br&gt;
The cleaned working dataset contained 869 rows after removal of the seven exact duplicate rows. Standardised categories were used for fields such as Department, Gender, Education Level, Employee Type, Office Location and Remote Work Status.&lt;br&gt;
Numeric fields were converted to usable numeric values where possible, and invalid values were flagged or converted to blanks when they fell outside defined logical ranges.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 7: Basic Excel Analytics After Cleaning
&lt;/h3&gt;

&lt;p&gt;Once the data was clean enough to analyse, I used Excel formulas to provide immediate descriptive statistics.&lt;br&gt;
For example, I used &lt;code&gt;AVERAGE&lt;/code&gt; to calculate &lt;code&gt;mean&lt;/code&gt; salary, age or performance score. &lt;code&gt;COUNTIF&lt;/code&gt; to count employees belonging to a particular department, and &lt;code&gt;SUMIF&lt;/code&gt; to total salaries or bonuses for a selected category.&lt;br&gt;
Using the cleaned working data, the average salary was approximately &lt;strong&gt;$74,114.16&lt;/strong&gt;, the average age was approximately &lt;strong&gt;41.98 years&lt;/strong&gt;, and the average performance score was approximately &lt;strong&gt;4.98&lt;/strong&gt;.&lt;br&gt;
There were &lt;strong&gt;155 Finance employees&lt;/strong&gt; and 263 employees classified as Fully Remote in the cleaned working dataset.&lt;/p&gt;

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

&lt;p&gt;Excel is a powerful tool, and the skills provide the foundation for the wider data-analytics workflow. Understanding workbooks, worksheets, cells, ranges, formulas, data types, tables, sorting and filtering may appear basic, but these skills directly support professional data preparation and analysis.&lt;br&gt;
The HR dataset demonstrates that real-world data is rarely perfectly structured. The original file contained 876 records, 21 variables, 277 missing cells, seven exact duplicate rows, inconsistent categorical labels, mixed data types, invalid dates and suspicious numeric values.&lt;br&gt;
Through inspection, standardisation, type conversion, validation and duplicate handling, the working dataset was reduced to 869 records and made substantially more analysis-ready.&lt;br&gt;
The most important lesson is that data cleaning is not merely about making a spreadsheet look neat. It is about making the meaning of the data consistent, transparent, and defensible.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>career</category>
      <category>excel</category>
      <category>datascience</category>
    </item>
    <item>
      <title>Understanding Git Workflow from Working Directory, Staging, Commit, and Push.</title>
      <dc:creator>Expert Writer</dc:creator>
      <pubDate>Sun, 23 Aug 2026 20:34:12 +0000</pubDate>
      <link>https://dev.to/expertwriter/understanding-git-workflow-from-working-directory-staging-commit-and-push-4kdi</link>
      <guid>https://dev.to/expertwriter/understanding-git-workflow-from-working-directory-staging-commit-and-push-4kdi</guid>
      <description>&lt;h2&gt;
  
  
  Git
&lt;/h2&gt;

&lt;p&gt;Git is used to track changes in files and allow for managing ythe developmnet of projects, especially those that entail data. I used git to enable me record the different versions of my data from the original raw data, compare changes, without interfering with the initial data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Git Workflow
&lt;/h2&gt;

&lt;p&gt;Git has a series of commands that are important for committing changes and tracking the data. The commands are described as a &lt;strong&gt;Git Workflow&lt;/strong&gt; as it involves checking the status of the current project, making changes to the projects by adding files, and committing the changes. The Git Workflow is quite vital as it allows for a systematic and organised way of managing changes, keeping a record of every progress, and making it easier to identify the areas that changes were made.&lt;/p&gt;

&lt;p&gt;My project was Kenya Health Records Analysis and it contained and excel data, thus was in this structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`Kenya Health Records Analysis/ 
- Kenya Health Records Analysis.xlsx 
- README.md`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Checking the Project Directory
&lt;/h4&gt;

&lt;p&gt;I used &lt;code&gt;cd "Kenya Health Records Analysis"&lt;/code&gt; to access the project directory then ran the command &lt;code&gt;ls -la&lt;/code&gt; to list the contents that were in the directory&lt;/p&gt;

&lt;h4&gt;
  
  
  Checking README File
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;cat README.md&lt;/code&gt;&lt;br&gt;
This displayed the contents of the file such as the Title, tools used, and the challenges faced.&lt;/p&gt;
&lt;h4&gt;
  
  
  Initialize Git
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;git init&lt;/code&gt;&lt;br&gt;
I ran this command to instruct Git that I needed the project to become a git repository.&lt;br&gt;
To confirm whether it was successful, I ran the command &lt;code&gt;ls -la&lt;/code&gt;and &lt;code&gt;git status&lt;/code&gt;&lt;/p&gt;
&lt;h5&gt;
  
  
  Changing a file
&lt;/h5&gt;

&lt;p&gt;I was able to edit and modify my project in this stage by opening the &lt;code&gt;README.md&lt;/code&gt; file and adding more information in the &lt;strong&gt;Challenges Faced&lt;/strong&gt; section.&lt;br&gt;
I then ran &lt;code&gt;git status&lt;/code&gt; but got this error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;`Changes not staged for commit: 
      modified: README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I noted that changing a file does not directly create a commit. I therefore, ran &lt;code&gt;git add README.md&lt;/code&gt; which communicates to git to adjust the changes.&lt;/p&gt;

&lt;h4&gt;
  
  
  Commit
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;git commit -m&lt;/code&gt;&lt;br&gt;
This was for creating a checkpoint in the project analysis by recording the changes I have done in the project. It also allowed for me to continue working without having to push the changes in Github immediately.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git commit -m "Kenya Health Records Analysis"&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Checking Commit History
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;git log --oneline&lt;/code&gt;&lt;br&gt;
This command allowed me to inspect every of my commit history&lt;/p&gt;

&lt;p&gt;This is followed by &lt;code&gt;git status&lt;/code&gt; to understand the current state of the project&lt;/p&gt;

&lt;h4&gt;
  
  
  Push
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;git push&lt;/code&gt;&lt;br&gt;
After making the challenges locally, I ran &lt;code&gt;git push origin main&lt;/code&gt; to send them to the remote repository.&lt;/p&gt;

&lt;h3&gt;
  
  
  Functions of Git
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Track changes&lt;/li&gt;
&lt;li&gt;Create commits&lt;/li&gt;
&lt;li&gt;Mmaintain project history&lt;/li&gt;
&lt;li&gt;Manage different versions of my project locally&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;During this project, I learnt that Git workflow is a sequence and not just a list of random commands. It starts from inspecting the project files with &lt;code&gt;ls -la&lt;/code&gt; and then reading the documentation through running &lt;code&gt;cat README.md.&lt;/code&gt; I can then run &lt;code&gt;git status&lt;/code&gt; to understand the latest status of the repository. After this, I commit using &lt;code&gt;git commit -m&lt;/code&gt;, and can review the history using &lt;code&gt;git log --oneline.&lt;/code&gt;To finally share the local commits I made, I ran the command &lt;code&gt;git push origin main.&lt;/code&gt;&lt;br&gt;
Understanding this workflow gave me essential foundation for working with data analytics project as the one in &lt;strong&gt;Kenya Health Records Analysis&lt;/strong&gt; in terms of documenting my work, and building a portfolio as a Data Scientist.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>git</category>
      <category>softwaredevelopment</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
