<?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: Makori Nyachaki</title>
    <description>The latest articles on DEV Community by Makori Nyachaki (@makorinyachaki).</description>
    <link>https://dev.to/makorinyachaki</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%2F930536%2F9502c910-1809-4df6-9150-73fd2ff4250c.jpg</url>
      <title>DEV Community: Makori Nyachaki</title>
      <link>https://dev.to/makorinyachaki</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/makorinyachaki"/>
    <language>en</language>
    <item>
      <title>Navigating the KES 1.85B Revenue Reality: An Enterprise Power BI Solution for JCars Logistics</title>
      <dc:creator>Makori Nyachaki</dc:creator>
      <pubDate>Wed, 07 Oct 2026 02:59:12 +0000</pubDate>
      <link>https://dev.to/makorinyachaki/navigating-the-kes-185b-revenue-reality-an-enterprise-power-bi-solution-for-jcars-logistics-3m7n</link>
      <guid>https://dev.to/makorinyachaki/navigating-the-kes-185b-revenue-reality-an-enterprise-power-bi-solution-for-jcars-logistics-3m7n</guid>
      <description>&lt;h2&gt;
  
  
  How Data Auditing and Custom DAX Uncovered a 70.46% vs 10.64% Regional Margin Gap and a 68-Day Fulfillment Delinquency.
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Executive Summary and Business Context
&lt;/h2&gt;

&lt;p&gt;J-Cars Logistics is a major automotive logistics and dealership enterprise in Kenya, specializing in importing, marketing, and delivering imported and local vehicles to corporate, commercial, and individual clients across 7 geographic regions (Central, Coast, Eastern, Nairobi, Nyanza, Rift Valley, and Western). The business operates through 8 main branches located in Thika, Kakamega, Nakuru, Nairobi, Kisumu, Mombasa, Eldoret, and Athi River, supported by a network covering 11 cities and 8 counties.&lt;/p&gt;

&lt;p&gt;The raw, unclean flat table provides was transformed into an enterprise grade Power BI decision support solution by the team. The dataset contained multiple anomalies, multicurrency transactions, unstandardized text, attributes, and invalid dates undermining management's ability to evaluate true operational profitability and logistical performance.&lt;/p&gt;

&lt;p&gt;The article presents, complete architectural journey: from data auditing and Power Query ETL transformations, to modelling, advanced DAX logic development, Dashboard design, and strategic recommendations founded in verified data performance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Performance Summary
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Performance Value&lt;/th&gt;
&lt;th&gt;Strategic Context &amp;amp; Impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Gross &amp;amp; Net Revenue&lt;/td&gt;
&lt;td&gt;Ksh. 1.85Bn Gross/1.77Bn Net&lt;/td&gt;
&lt;td&gt;Reflects Ksh. 15.07M in refunds and regional revenue adjustments.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Net Profit &amp;amp; Margin&lt;/td&gt;
&lt;td&gt;KSh. 447.52M(25.34% Margin)&lt;/td&gt;
&lt;td&gt;Strong top-line margin, heavily weighed by premium vehicle sales.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sales Volume &amp;amp; Orders&lt;/td&gt;
&lt;td&gt;408 units Sold across 245 Orders&lt;/td&gt;
&lt;td&gt;Average of 1.67 Vehicles per order; high commercial fleet bundling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Logistic and Delivery Costs&lt;/td&gt;
&lt;td&gt;KSh. 24.72M Logistics/ KSh. 23.04M Delivery Fees&lt;/td&gt;
&lt;td&gt;Net Logistics deficit of KSh. 1.68M where logistics expenses exceed customer fees.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Order to Delivery&lt;/td&gt;
&lt;td&gt;23 days OTD average/ 26 Days Transit&lt;/td&gt;
&lt;td&gt;Severe transit friction in digital channels i.e. WhatsApp average is 68 days&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Dataset Grain and Quality Audit
&lt;/h2&gt;

&lt;p&gt;Before modelling, a thorough audit was executed defining the grain and underlying anomalies. The &lt;code&gt;dataset grain&lt;/code&gt; was established as one row per sales transaction item, representing a sales order line item containing all details pertaining the transaction; order details, branch details, customer details, sale rep details, payment details, delivery details, rating, and reviews attributes.&lt;/p&gt;

&lt;p&gt;The following were critical data quality issues uncovered that posed a challenge to the management in reporting accurately if unattended.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;Multicurrency Inconsistencies:&lt;/em&gt; Monetary fields(Unit Selling Price, Unit Cost, Logistic Cost, Delivery Fees) contained mixed currencies. The currencies were KES for Kenya, USD and $ for US dollar, EUR for the Euro, and ZA/ZAR/R for the South African Rand. Solved the issue by standardizing all non Kenyan Currency using the documented CBK average for the exchange rates in the year 2026, by creating an exchange rate table with the currency symbol and rate columns and splitting the fields using the digit and non digit values to obtain amount value and currency symbol. Those without currency symbol were assumed as KES. Also, formatting of some unit values were indicated i.e. as 1.4M implying they were in millions, we used a helper column to get a multiplier i.e. for any Value ending in &lt;code&gt;M&lt;/code&gt; the Multiplier would be &lt;code&gt;1000000&lt;/code&gt;, &lt;code&gt;K&lt;/code&gt; = &lt;code&gt;1000&lt;/code&gt;, else &lt;code&gt;1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Negative and Zero Selling Prices, Unit Cost, Logistic Cost Delivery Fees, and Revenue Recorded:&lt;/em&gt; Test entries or erroneous records showing Zero/negative selling prices were flagged and excluded from core revenue measures. The following steps were followed for each:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Unit Selling Price&lt;/em&gt;&lt;br&gt;
A negative Unit Selling Price usually means on of the following:&lt;br&gt;
a. A Customer Return/Refund&lt;br&gt;
b. A promotional credit.&lt;br&gt;
c. a data corruption error&lt;/p&gt;

&lt;p&gt;We were not provided with sufficient information to rule in favor of promotional credit. However, we had to determine for true refunds and find corrupted data. Before that we need to know and understand how to handle the errors.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Selling Price&lt;/th&gt;
&lt;th&gt;Quantity&lt;/th&gt;
&lt;th&gt;Total Revenue&lt;/th&gt;
&lt;th&gt;Meaning and Context&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;-ve&lt;/td&gt;
&lt;td&gt;+2&lt;/td&gt;
&lt;td&gt;-Ve&lt;/td&gt;
&lt;td&gt;
&lt;em&gt;System Refund:&lt;/em&gt; The system logs returns by making Unit Price negative instead of quantity.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-ve&lt;/td&gt;
&lt;td&gt;-2&lt;/td&gt;
&lt;td&gt;+ve&lt;/td&gt;
&lt;td&gt;
&lt;em&gt;Accounting Bug:&lt;/em&gt; Double negative error. A return is logged with both negative price and quantity resulting in a false positive revenue.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-ve&lt;/td&gt;
&lt;td&gt;+ve&lt;/td&gt;
&lt;td&gt;-ve&lt;/td&gt;
&lt;td&gt;
&lt;em&gt;Line-Item Credit:&lt;/em&gt; A gift card, trade-in, or price adjustment rebate was applied.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Decisions&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;Legitimate Returns:&lt;/em&gt; Keep the rows and fix the Math. Total revenue will be correct, but your Unit Cost metrics will be skewed. To fix make the Selling price positive and shift the negative sign to the quantity column.
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight datastudio"&gt;&lt;code&gt;&lt;span class="n"&gt;if&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Unit&lt;/span&gt; &lt;span class="n"&gt;Selling&lt;/span&gt; &lt;span class="n"&gt;Price&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="nf"&gt;then&lt;/span&gt; &lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;Unit&lt;/span&gt; &lt;span class="n"&gt;Sold&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Unit&lt;/span&gt; &lt;span class="n"&gt;Sold&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;// Create a corrected Unit Selling Price column by converting it to an absolute value&lt;/span&gt;

&lt;span class="n"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Abs&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;Unit&lt;/span&gt; &lt;span class="n"&gt;Selling&lt;/span&gt; &lt;span class="n"&gt;Price&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;em&gt;Remember to account for this while performing aggregations.&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;If both the Unit Selling Price and Units Sold are null, remove the records&lt;/li&gt;
&lt;li&gt;Removed rows: Both Units sold and Unit Selling price is null where only 1 row was affected&lt;/li&gt;
&lt;li&gt;Null Selling Price(1 row)&lt;/li&gt;
&lt;li&gt;Errors (9 rows affected)&lt;/li&gt;
&lt;li&gt;Units Sold is null (6 rows)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A total of 17 rows were removed.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Logistic Costs&lt;/em&gt;&lt;br&gt;
Zero Logistics Cost in a data source, it usually implies one of two scenarios: a &lt;em&gt;Free Shipping Promotion offered to the customer&lt;/em&gt;, or a &lt;em&gt;System Drop-ship/Pick-up&lt;/em&gt; where no internal shipping occurred.&lt;br&gt;
To handle the issues, we kept the following in mind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Legitimate Reversals: kept them negative if it was a product return. This offset total expenses and allows us to calculate true net logistics spend.&lt;/li&gt;
&lt;li&gt;Outflow Typos(Convert to positive): If a row was negative and it was a standard forward shipment but logged as negative it was considered a formatting error, thus converted to it is absolute value.
-In the case of pure corruption: Converted to &lt;code&gt;null&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Unit Cost&lt;/em&gt;&lt;br&gt;
Required a distinct approach to handle simply because they can stem from completely different issues:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;Negative:&lt;/em&gt; Are almost always data corruption or a system error since a product can not cost less than nothing to produce.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Zero Cost:&lt;/em&gt; Also most always legitimate such as giveaways, samples, bundle items, or inventory adjustments. However, if a standard item has 0 cost, it will artificially inflate profit margins.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To handle the errors, for negative Unit Cost we converted them too &lt;code&gt;null&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Delivery Fee&lt;/em&gt;&lt;br&gt;
For all negative delivery fees we removed them from the data. A total of 7 rows were affected.&lt;/p&gt;

&lt;p&gt;After making all these changes, we removed all extra dirty columns to clean our data.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Recorded Revenue&lt;/em&gt;&lt;br&gt;
From our findings, &lt;code&gt;Recorded Revenue&lt;/code&gt; was a calculated field. After cleaning all our monetary values we calculated recorded revenue, handling it using the following DAX function in the Power BI editor and having it in a new column:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight q"&gt;&lt;code&gt;&lt;span class="n"&gt;Revenue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Recorded&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FactOrders&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Unit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Selling&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Price&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;KES&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;FactOrders&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Units&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Sold&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;FactOrders&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Discount&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FactOrders&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Delivery&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Fees&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;KES&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;Date Format Mismatches:&lt;/em&gt; Mixed date strings (DD/MM/YYYY vs MM/DD/YYYY). Parsed explicitly in Power Query using Locale setting (English - Kenya). Other errors were replaced with &lt;code&gt;null&lt;/code&gt; after setting the correct type for both the &lt;code&gt;Order Date&lt;/code&gt; and &lt;code&gt;Delivery Date&lt;/code&gt;. The following custom M code handled the date issue i.e. for the &lt;code&gt;Order Date&lt;/code&gt; by creating a new column. Follow the comments in the code for the steps:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight q"&gt;&lt;code&gt;&lt;span class="cm"&gt;// 1. Clean the text, but keep slashes/hyphens for now&lt;/span&gt;

&lt;span class="n"&gt;rawTxt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Text.Clean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Text.Trim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Text.From&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;])))&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;

&lt;span class="cm"&gt;// 2. Try standard parsing first (handles Excel serial numbers and system-matching dates)&lt;/span&gt;

&lt;span class="n"&gt;parseStandard&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Date.From&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Number.FromText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rawTxt&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;otherwise&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Date.FromText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rawTxt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;otherwise&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;

&lt;span class="cm"&gt;// 3. If standard parsing fails, strip out hyphens, slashes, and dots to inspect the raw digits&lt;/span&gt;

&lt;span class="n"&gt;cleanDigits&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Text.Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rawTxt&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="s"&gt;"9"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Text.Length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleanDigits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;

&lt;span class="cm"&gt;// 4. Conditional logic to extract components from the raw digits&lt;/span&gt;

&lt;span class="n"&gt;parseCustom&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;parseStandard&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;then&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;parseStandard&lt;/span&gt;
&lt;span class="n"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Text.StartsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleanDigits&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"20"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;
&lt;span class="n"&gt;Text.StartsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleanDigits&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"19"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;then&lt;/span&gt;

&lt;span class="cm"&gt;// Handles YYYYMMDD (Assumes Year first)&lt;/span&gt;

&lt;span class="n"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Int16.From&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Text.Start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleanDigits&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;Int16.From&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Text.Middle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleanDigits&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;Int16.From&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Text.End&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleanDigits&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;

&lt;span class="cm"&gt;// Alternate backup: If Month &amp;gt; 12, handles YYYYDDMM&lt;/span&gt;

&lt;span class="n"&gt;otherwise&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Int16.From&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Text.Start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleanDigits&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="kd"&gt;4)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Int16.From&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Text.End&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleanDigits&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;Int16.From&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Text.Middle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleanDigits&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;

&lt;span class="n"&gt;otherwise&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;null&lt;/span&gt;
&lt;span class="n"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;then&lt;/span&gt;

&lt;span class="cm"&gt;// Handles MMDDYYYY (Assumes Year is at the end)&lt;/span&gt;

&lt;span class="n"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Int16.From&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Text.End&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleanDigits&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;Int16.From&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Text.Start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleanDigits&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;Int16.From&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Text.Middle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleanDigits&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;

&lt;span class="cm"&gt;// Alternate backup: If Month &amp;gt; 12, handles DDMMYYYY&lt;/span&gt;

&lt;span class="n"&gt;otherwise&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Int16.From&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Text.End&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleanDigits&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="kd"&gt;4)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Int16.From&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Text.Middle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleanDigits&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;Int16.From&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Text.Start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleanDigits&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="n"&gt;otherwise&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;null&lt;/span&gt;
&lt;span class="n"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;null&lt;/span&gt;
&lt;span class="ow"&gt;in&lt;/span&gt;
&lt;span class="n"&gt;parseCustom&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;Missing Transmission, Color, Returned, Customer Name, and Vehicle Year, Region, Customer Type, Sales Rep, Lead Source, Car Make, Transmission, Vehicle Type, Fuel Type, Color, Payment Method, Delivery Status, Payment Status, City, Branch, County, and City Naming Variations:&lt;/em&gt; Null values in Transmission, Color, Returned and Customer Name columns were Categorized as Not Provided and Unknown respectively to prevent aggregation loss. For the Vehicle year it was set to text type and the missing values categorized as &lt;code&gt;null&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Branches&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Some  branches had name variations i.e. one branch would be referred to different names but practically it was one branch. The variations were rectified and one branch would be referred to only one standard name. Example: &lt;em&gt;Eld, Eldoret, Eldoret Branch&lt;/em&gt; were referring to the &lt;code&gt;Eldoret&lt;/code&gt; branch. We replaced these values with &lt;code&gt;Eldoret&lt;/code&gt;. Similarly, we did this for the other branches. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;County&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;One county would also be referred to more than one name with spelling variation i.e. &lt;em&gt;Kambu and Kiambu County&lt;/em&gt; were referring to the county government of Kiambu. We Replaced values with only &lt;code&gt;Kiambu&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Color&lt;/em&gt;&lt;br&gt;
After doing replacement, we used mode to determine between &lt;code&gt;Grey&lt;/code&gt; and &lt;code&gt;Green&lt;/code&gt; which one we were to use as a replacement value for &lt;code&gt;Gre&lt;/code&gt;. We used &lt;code&gt;Grey&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This was also done to other fields that had similar issues replacing them with more relevant values for that particular columns. This was essential not to affect aggregations and other actions performed.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;Mixed and Incorrectly Formatted &lt;code&gt;Order ID&lt;/code&gt;:&lt;/em&gt; The &lt;code&gt;Order ID&lt;/code&gt; was incorrectly formatted as a text field where non digits and digit values were combined for some IDs while some had either the digit part or the non digit part only and some blank. After observations, the field had a sequential digit part starting at &lt;code&gt;1000&lt;/code&gt;. To solve this, we decided to use only the digit part to fill down the &lt;code&gt;Order ID&lt;/code&gt; column by creating a new &lt;code&gt;Custom Index Column&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Steps&lt;/em&gt;&lt;br&gt;
In Power Query&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On the Ribbon click on &lt;code&gt;Add Columns&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;From the General group, click on the drop down arrow &lt;code&gt;Index Column&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Choose &lt;code&gt;Custom&lt;/code&gt; instead of From 0 or From 1&lt;/li&gt;
&lt;li&gt;On the Dialog box specify &lt;code&gt;Starting Index&lt;/code&gt; = 1000, and the &lt;code&gt;Increment&lt;/code&gt; = 1 and click &lt;code&gt;OK&lt;/code&gt;. Our IDs will begin at index 1000 and be incremented by 1. Getting the index range of 1000 - 1275 for our &lt;code&gt;Order ID&lt;/code&gt; column.&lt;/li&gt;
&lt;li&gt;Remove the old formatted &lt;code&gt;Order ID&lt;/code&gt;, rename the new &lt;code&gt;Index Column&lt;/code&gt; to &lt;code&gt;Order ID&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;Delivery Status Discrepancies:&lt;/em&gt; 
Orders marked 'Delivered' or 'Yard' but showing empty delivery fees the delivery fee was set to 0.&lt;/li&gt;
&lt;li&gt;If the &lt;code&gt;Delivery Fee = null&lt;/code&gt; and &lt;code&gt;Delivery Fee &amp;lt; 0&lt;/code&gt; and the &lt;code&gt;Delivery Status = "Cancelled"&lt;/code&gt; and &lt;code&gt;Delivery Status = "Held"&lt;/code&gt; then &lt;code&gt;Delivery Fee = null&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If &lt;code&gt;Delivery Fee = null&lt;/code&gt; and &lt;code&gt;Delivery Status = "Yard"&lt;/code&gt; then &lt;code&gt;Delivery Fee = 0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Else &lt;code&gt;Delivery Fees&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We removed all errors and nulls in the &lt;code&gt;Delivery Fees&lt;/code&gt; column affecting a total of 9 rows.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;Incorrect type for Discount, Rating, Reviews Count, and Age:&lt;/em&gt; Before converting to the correct type, we had to Trim and Clean the fields to get rid of leading and trailing whitespaces and extra spaces. Then for:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Discount&lt;/em&gt;&lt;br&gt;
To handle the field was very critical. First, we hard to &lt;em&gt;Standardize the Text to Numbers&lt;/em&gt; by creating a custom column, that detects if a value ends with a "%" sign, strips it, divides it by 100, and otherwise parses the value as a decimal.&lt;br&gt;
Use the following procedure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open Power Query Editor (click &lt;code&gt;Transform Data&lt;/code&gt; in Power BI).&lt;/li&gt;
&lt;li&gt;Go to the &lt;code&gt;Add Column&lt;/code&gt; tab and click &lt;code&gt;Custom Column&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Name your column (e.g., Cleaned Discount) and use the following &lt;em&gt;M formula&lt;/em&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight q"&gt;&lt;code&gt;&lt;span class="n"&gt;let&lt;/span&gt;
&lt;span class="cm"&gt;// Remove any accidental leading/trailing spaces(Trim)&lt;/span&gt;

&lt;span class="n"&gt;CleanDisc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Text.Trim&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;Discount&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;

&lt;span class="cm"&gt;// Check if the value ends with a percentage sign&lt;/span&gt;

&lt;span class="n"&gt;IsPercent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Text.EndsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CleanDisc&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"%"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;

&lt;span class="cm"&gt;// Extract the numeric part of the text&lt;/span&gt;

&lt;span class="n"&gt;RawValue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;IsPercent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;then&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Text.Start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CleanText&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Text.Length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CleanDisc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="n"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CleanText&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;

&lt;span class="cm"&gt;// Convert text to a number (using Invariant Culture to handle&lt;/span&gt;
&lt;span class="n"&gt;dot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;decimals&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;safely&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;NumberValue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Number.FromText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RawValue&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Culture.Current&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="ow"&gt;in&lt;/span&gt;

&lt;span class="cm"&gt;// If it was a percentage text (like "10"), divide by 100 to  get 0.10. Otherwise, keep the decimal.&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;IsPercent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;then&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;NumberValue&lt;/span&gt;&lt;span class="c1"&gt; / 100 else NumberValue&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Click &lt;em&gt;OK&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Change the data type of this new column to &lt;code&gt;Percentage&lt;/code&gt; or &lt;code&gt;Decimal Number&lt;/code&gt; by clicking the icon next to the column header&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Secondly, to handle outliers that is any discount value greater than 100% or greater than 1 is replaced by &lt;code&gt;null&lt;/code&gt; in order not to skew the analysis and profit margins. A discount greater than 100% generally means the transaction is invalid.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you want to keep the rows but change anything over 100% down to 100%, go to Add Column &amp;gt; Custom Column and use:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;if [Cleaned Discount] &amp;gt; 1 then 1 else [Cleaned Discount]&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For discounts less 0, they set to 0&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;if [Cleaned Discount] &amp;lt; 0 the 0 else [Cleaned Discount]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Finally, we cleaned our data by removing the old Discount field from the data to remain with our cleaned discount field and renamed it to Discount.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Age&lt;/em&gt;&lt;br&gt;
The age field was also incorrectly formatted with mixed types. So;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Changed the data type to a &lt;code&gt;Whole Number&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Replaced &lt;code&gt;Error&lt;/code&gt; with &lt;code&gt;null&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Replaced &lt;code&gt;null&lt;/code&gt; values with the average age &lt;code&gt;45&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Also, replaced age below 18 years with 18. Since in Kenya the minimum age for one to obtain official identification is 18 years, enabling one to make independent decisions and purchases that requires official identification i.e. Tax certificate.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Review Count&lt;/em&gt;&lt;br&gt;
For the Review Count column:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We Trimmed and Cleaned the text.&lt;/li&gt;
&lt;li&gt;Replaced &lt;code&gt;ten&lt;/code&gt; with &lt;code&gt;10&lt;/code&gt;, &lt;em&gt;N/A and -&lt;/em&gt; with blanks.&lt;/li&gt;
&lt;li&gt;Change type to a &lt;em&gt;Whole Number&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;We converted the negative numbers to absolute values&lt;/li&gt;
&lt;li&gt;Select the &lt;code&gt;Review Count&lt;/code&gt; column&lt;/li&gt;
&lt;li&gt;On the Ribbon &amp;gt; Transform Tab (Number Group)&lt;/li&gt;
&lt;li&gt;Click on the &lt;code&gt;Scientific&lt;/code&gt; the from the options choose &lt;code&gt;Absolute Value&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Assumption:&lt;/em&gt; &lt;em&gt;All negative reviews were not counted to be negative counts.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Customer Rating&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Text Trimmed/Cleaned&lt;/li&gt;
&lt;li&gt;Replaced Values &lt;em&gt;out of 5&lt;/em&gt; with blanks, &lt;em&gt;Excellent&lt;/em&gt; with 5, &lt;em&gt;N/A&lt;/em&gt; or &lt;em&gt;-&lt;/em&gt; with blank, &lt;em&gt;4.7/5&lt;/em&gt; with an average of 4.9.&lt;/li&gt;
&lt;li&gt;Changed type to &lt;code&gt;Decimal Number&lt;/code&gt; with 1 decimal place and converted negative values to their absolute equivalent.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;After successful data cleaning, we modelled our data into dimensional and fact tables. We modelled our data into a star schema with seven Dimensional tables and 1 fact table. Modelling reduces redundance and optimizes DAX engine evaluation. &lt;/p&gt;

&lt;p&gt;The following tables were created, merged and relationships established:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Table Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Primary/Foreign Key&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DimCustomers&lt;/td&gt;
&lt;td&gt;Dimensional&lt;/td&gt;
&lt;td&gt;Customer ID&lt;/td&gt;
&lt;td&gt;Holds customer details: &lt;code&gt;Customer Name&lt;/code&gt;, &lt;code&gt;Customer Type&lt;/code&gt;, and &lt;code&gt;Age&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DimRegions&lt;/td&gt;
&lt;td&gt;Dimensional&lt;/td&gt;
&lt;td&gt;Region ID&lt;/td&gt;
&lt;td&gt;Holds the region details: &lt;code&gt;Region ID&lt;/code&gt; and &lt;code&gt;Region&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DimBranches&lt;/td&gt;
&lt;td&gt;Dimensional&lt;/td&gt;
&lt;td&gt;Branch ID&lt;/td&gt;
&lt;td&gt;Branch Details: &lt;code&gt;Branch ID&lt;/code&gt; and &lt;code&gt;Branch&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DimSalesRep&lt;/td&gt;
&lt;td&gt;Dimensional&lt;/td&gt;
&lt;td&gt;Sales Rep ID&lt;/td&gt;
&lt;td&gt;Sales Rep Details: &lt;code&gt;Name&lt;/code&gt; and &lt;code&gt;ID&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DimCities&lt;/td&gt;
&lt;td&gt;Dimensional&lt;/td&gt;
&lt;td&gt;City ID&lt;/td&gt;
&lt;td&gt;City Details: &lt;code&gt;City&lt;/code&gt; and &lt;code&gt;City ID&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DimCounties&lt;/td&gt;
&lt;td&gt;Dimensional&lt;/td&gt;
&lt;td&gt;County ID&lt;/td&gt;
&lt;td&gt;County Details: &lt;code&gt;County ID&lt;/code&gt; and &lt;code&gt;County&lt;/code&gt; name.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DimDateTable&lt;/td&gt;
&lt;td&gt;Dimensional&lt;/td&gt;
&lt;td&gt;Date&lt;/td&gt;
&lt;td&gt;Calendar Date Table: &lt;code&gt;Date&lt;/code&gt;, &lt;code&gt;Year&lt;/code&gt;, &lt;code&gt;Month Number&lt;/code&gt;, &lt;code&gt;Month Name&lt;/code&gt;, &lt;code&gt;Quarter&lt;/code&gt;, &lt;code&gt;Year-Month&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FactOrders&lt;/td&gt;
&lt;td&gt;Fact&lt;/td&gt;
&lt;td&gt;Order ID, Customer ID, Sales Rep ID, Branch ID, Region ID, City ID, County ID&lt;/td&gt;
&lt;td&gt;Holds the transaction details: Unit Selling Price, Unit Cost, Logistic Cost, Delivery Fees, Units Sold, Discount, Customer Rating, Reviews Count, Car Make, Car Model, Vehicle Type, Year, Color, Lead Source, Delivery Status, Payment Method, Payment Status, Fuel Type, Transmission, Returned, and Recorded Revenue.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;After creating the tables in our models we established the following relationships as shown on the diagram 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%2Funua6a5t0utdnabjw03y.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%2Funua6a5t0utdnabjw03y.png" alt="Relationships" width="799" height="488"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; All relationships enforce &lt;code&gt;1-to-Many (1:*)&lt;/code&gt; cardinality with a single direction filtering (Dimension to Fact), eliminating circular dependencies and ambiguity.&lt;/p&gt;

&lt;h2&gt;
  
  
  DAX Calculations and Reusable Business Logic
&lt;/h2&gt;

&lt;p&gt;To enforce consistent business rules across all visual elements, DAX measures were constructed. Core DAX formulas used include:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Gross Revenue(Create a new custom column)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;Gross Revenue = FactOrders[Units Sold] * FactOrders[Unit Selling Price(KES)]&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Recorded Revenue(Create a new custom column)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;Revenue Recorded = (FactOrders[Unit Selling Price(KES)]*FactOrders[Units Sold]*(1-FactOrders[Discount])) + FactOrders[Delivery Fees(KES)]&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Discount Amount(Create a new custom column)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;Discount Amount = (FactOrders[Unit Selling Price(KES)]/(1 - FactOrders[Discount])) - FactOrders[Unit Selling Price(KES)]&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Net Profit Margin(New custom column)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;Net Profit Margin = FactOrders[Revenue Recorded] - ((FactOrders[Units Sold]*FactOrders[Unit Cost(KES)])+FactOrders[Logistic Cost(KES)]+FactOrders[Delivery Fees(KES)])&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Volume Quarter 1 2025&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;VolumeQtr125 = CALCULATE(SUM(FactOrders[Units Sold]), AND(QUARTER(FactOrders[Order Date]) = 1, YEAR(FactOrders[Order Date]) = 2025), NOT(ISBLANK(FactOrders[Order Date])))&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Percentage Volume Quarter 1(Compare between Q1 2025 and Q1 2026 Performance. Create a new measure)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;VolumePercentageQ1 = (([VolumeQtr126]-[VolumeQtr125])/[VolumeQtr125])&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Total Revenue Recorded&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;TotalRevenueRecorded = SUM(FactOrders[Revenue Recorded])&lt;/code&gt;&lt;/p&gt;

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

&lt;p&gt;After cleaning and the required aggregations, we designed the following executive dashboard to help the executive understand, draw insights for informed decision making.&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%2Fabrv6sbenwnco2nsdimz.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%2Fabrv6sbenwnco2nsdimz.png" alt="Dashboard" width="799" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Business Questions and Findings
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Question 1: What is the overall general business performance and comparisons?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The business had:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Total Recorded Revenue:&lt;/em&gt;  A revenue of &lt;em&gt;1.77Bn&lt;/em&gt; was recorded with 2025 recording &lt;em&gt;KSh. 1.12Bn(63.36%)8 and 2026 recording *0.KSh. 53Bn(30.63%)&lt;/em&gt; of the total revenue recorded. Only 6.11% equating to &lt;em&gt;KSh. 0.1Bn&lt;/em&gt; of the total revenue was not classified to either of the years. Thika branch recorded the most recorded revenue of KSh. 385.02 million compared to the Athi River branch which recorded the lowest revenue of KSh. 158.42 million. By region the Central region had the highest revenue accounting for KSh. 385.02 million compared to the Eastern Region with a revenue of KSh. 158.42 million.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Profit and Profit Margin:&lt;/em&gt; A net profit of &lt;em&gt;KSh. 447.52Mn&lt;/em&gt; was recorded. Nairobi branch recorded 151.37Mn compared to Eldoret branch with a 21.34Mn profit. Grace Njeri earned KSh. 141.26M while Kevin Mwangi earned KSh. 8.59M in profits.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Order to Delivery Days(OTD):&lt;/em&gt; An overall average of &lt;em&gt;23&lt;/em&gt; days were required for an order to be delivered. However, Nairobi region had the highest OTD of 40 days while Central had 17 days. By channel, Facebook had the highest OTD, 32 days and Instagram had 16 days. &lt;/li&gt;
&lt;li&gt;Cancellation Rate:* An average cancellation rate of &lt;em&gt;7.35%&lt;/em&gt; was observed. Nairobi branch had an historical cancellation of 15% the highest while Mombasa had 2.78%. By channel, Tenders had the highest cancellation rate of 18.75% while Instagram had 2.94%.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Transit Days:&lt;/em&gt; An average of 26 days compared to 23 days of OTD.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Orders:&lt;/em&gt; A total of  245 orders were made, 408 units were sold. Referrals had the highest number of units sold, 61 compared to WhatsApp. Toyota pushed 116 units about 25% of the total units sold while BMW sold 11 unit which is about 2.7%. &lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Discount and Discount Margins:&lt;/em&gt; Toyota contributed to the highest discount amount of 34.46M while Isuzu contributed to the lowest discount amount of 1.73M.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Customers:&lt;/em&gt; A total of 245 customers who made a total of 245 orders purchasing 408 units across a period of about 2 years.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Question 2: What is the relationship between Discount Amounts and Profit Margin across branches?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Analysis revealed that high discounting does not correlate with higher net profit. Thika issued Ksh. 14.76M in discounts while maintaining a 35.91% margin due to premium vehicle mix. In contrast, Nakuru issued Ksh. 15.49M in discounts but achieved only a 12.42% margin, demonstrating margin erosion from excessive price concessions on low-margin inventory.&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%2Fvf8gtlbrhf1tv316pv7v.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%2Fvf8gtlbrhf1tv316pv7v.png" alt="Discount Amounts and Profit Margins" width="373" height="271"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Question 3: Which sales channels exhibit severe delivery latencies and high logistics cost ratios?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;WhatsApp leads generate high unit volume (35 units) but suffer from an extreme Average Order-to-Delivery latency of 68 days—more than double the company average of 26 days. Tenders also exhibit a high cancellation rate (18.75%) and long transit times (42 days).&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%2Fpnnrc0qq5h9ps0nj8fkq.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%2Fpnnrc0qq5h9ps0nj8fkq.png" alt="Latencies" width="421" height="261"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Question 4: How does vehicle performance vary when evaluated by Profit Margin Tier vs. Volume Share?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Volkswagen models represent only 4.17% of total units sold (17 units) but generate an extraordinary 77.19% profit margin (Ksh 126.50M net profit). Conversely, Toyota accounts for 28.43% of total volume (116 units) with a solid 29.21% margin (Ksh 201.98M net profit). Nissan and Mitsubishi represent 'fleet volume' categories with profit margins below 10%.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Question 5: Is customer rating correlated with sales representative revenue productivity?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Interestingly, top revenue producer Faith Achieng (Ksh 347.30M revenue) holds a moderate customer rating of 3.37, while Peter Kiptoo holds the lowest rating (2.98) alongside low profitability (Ksh 15.49M). High-performing rep Grace Njeri maintains both strong revenue (Ksh 295.00M) and solid margins (Ksh 141.26M profit).&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%2Fgkr4ssjm89u26je8t69m.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%2Fgkr4ssjm89u26je8t69m.png" alt="Faith Achieng" width="640" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Question 6: What is the impact of payment methods on transaction cancellation and cash flow stability?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Mpesa is the dominant payment channel by volume (101 units, 24.75%) and value (Ksh 513.17M, 29.06%). Asset Financing accounts for 66 units (Ksh 219.51M) but exhibits higher processing delays, impacting delivery completion rates.&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%2F2s5q0mixov9xp9c6rumd.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%2F2s5q0mixov9xp9c6rumd.png" alt="Units Sold by Payment Method" width="800" height="503"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;Insight 1: Premium Trim Pricing Power Drive Executive Margin Growth&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Volkswagen (77.19% margin, Ksh 126.50M profit) and Toyota (29.21% margin, Ksh 201.98M profit) generate the vast majority of company net profit. High-end SUV trims (Prado, Harrier, CX-5, C200, E250) exhibit strong pricing power, whereas hatchback/sedan volume models (Fit, Demio, Axio) operate on slim margins below 10%.&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%2Fqmknc1fa2di1h1ay2en4.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%2Fqmknc1fa2di1h1ay2en4.png" alt="Volkswagen Contribution" width="646" height="454"&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%2Fwlq5uv4cuni617kjyk6y.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%2Fwlq5uv4cuni617kjyk6y.png" alt="Volkswagen Graph" width="800" height="293"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Insight 2: Severe Regional Profit Disparity Between Nairobi and Rural Branches&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Nairobi branch achieves an unparalleled 70.46% profit margin (Ksh. 151.37M profit on Ksh. 214.84M revenue), driven by luxury sales with low delivery overhead. Conversely, Kisumu branch yields a modest 10.64% profit margin (Ksh. 21.34M profit) burdened by Ksh. 11.94M in customer refunds and Ksh. 9.00M in discounts.&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%2Fewunjudnwksuoep2z93t.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%2Fewunjudnwksuoep2z93t.png" alt="Profit by Region" width="397" height="294"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Insight 3: High Digital Lead Volume Belied by Severe Logistics Friction&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Website (Ksh. 316.25M revenue) and Walk-Ins (Ksh. 300.99M revenue) represent the primary profit drivers. However, social media and messaging channels—specifically WhatsApp—suffer from acute supply chain friction, recording a 68-day average OTD time that severely harms customer satisfaction.&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%2Fk2b70lwkccy146kvae2l.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%2Fk2b70lwkccy146kvae2l.png" alt="Logistic Cost by Channel" width="418" height="241"&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%2Fryibvkjizp3fc8z0kzks.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%2Fryibvkjizp3fc8z0kzks.png" alt="Revenue Recorded by Channel" width="313" height="202"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Insight 4: Tender Sales Suffer from Abnormally High Cancellation Rates&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Tender sales channel records an alarming 18.75% cancellation rate—more than 2.5 times the company baseline of 7.35%. This stems from protracted procurement timelines (42 days transit) and strict contract specs that fail post-award inspection.&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%2Faghyean7nozptm1m48ku.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%2Faghyean7nozptm1m48ku.png" alt="High Cancellation Rate for Tenders" width="627" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Insight 5: Concentration of Sales Rep Profitability Creates Key-Person Risk&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Two sales representatives—Faith Achieng (Ksh. 131.61M profit) and Grace Njeri (Ksh. 141.26M profit)—generate Ksh. 272.87M, or 60.98% of total company net profit. The remaining 8 sales reps combined generate less than 40% of net profits.&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%2F8f8sk33ubgf2a42lr33c.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%2F8f8sk33ubgf2a42lr33c.png" alt="Profits by Sales Rep" width="415" height="283"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;Realign Vehicle Inventory Procurement Toward High-Margin Trims&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shift procurement capital away from low-margin fleet models (Nissan, Mitsubishi) toward high-margin Crossover/SUV models (Volkswagen Tiguan/Golf, Toyota Prado/Harrier, Mercedes C200/E250).&lt;/li&gt;
&lt;li&gt;Expanding high-margin trim volume by 15% will increase total company net profit by an estimated Ksh. 65M annually without increasing overall unit storage overhead.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Overhaul WhatsApp Order Fulfillment &amp;amp; Digital Logistics Workflows&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Establish dedicated digital logistics fulfillment protocols for social and messaging leads (WhatsApp/Instagram) to compress OTD latency from 68 days down to the company benchmark of 28 days.&lt;/li&gt;
&lt;li&gt;Eliminating fulfillment bottlenecks will reduce customer cancellations, decrease refund liabilities (currently Ksh. 15.07M), and elevate average customer rating scores above 4.0.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Enforce Discount Guardrails &amp;amp; Restructure Branch Pricing Governance&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Institute a strict discount approval matrix limiting branch managers to a maximum 5% discount on vehicles yielding margins under 15%. Require executive approval for discounts exceeding Ksh 500,000.&lt;/li&gt;
&lt;li&gt;Curbing unwarranted discounting in Nakuru, Kisumu, and Eldoret will recover an estimated Ksh. 18M to Ksh. 25M in annual profit leakage.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To view and see the project visit my GitHub Page at &lt;a href="https://github.com/MakoriNyachaki/jcars-logistics-executive-bi-solution" rel="noopener noreferrer"&gt;Jcars Logistics Executive BI Solution&lt;/a&gt;&lt;/p&gt;

</description>
      <category>datascience</category>
      <category>powerplatform</category>
      <category>analytics</category>
      <category>github</category>
    </item>
    <item>
      <title># Power BI Data Modelling: A Great Path to Great Analysis</title>
      <dc:creator>Makori Nyachaki</dc:creator>
      <pubDate>Wed, 16 Sep 2026 19:05:44 +0000</pubDate>
      <link>https://dev.to/makorinyachaki/-power-bi-data-modelling-a-great-path-to-great-analysis-3e4n</link>
      <guid>https://dev.to/makorinyachaki/-power-bi-data-modelling-a-great-path-to-great-analysis-3e4n</guid>
      <description>&lt;h1&gt;
  
  
  Data Modeling in Power BI
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;At a time when data is rapidly generated by different activities ranging from experiments to business, more often do we get data in different formats and structures. The data may or may not be related depending on the source. Related data in different formats and structure need to be re-organized to establish existing relationships for accurate analysis and reporting. To establish data model relationships and properties we need advanced tools that can connect to these sources. Then load the different datasets from source, and perform modelling to connect the links.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Data Modeling&lt;/em&gt; therefore, becomes very important. &lt;em&gt;Data Modeling is the process of defining the data structure, properties, and relationships within a &lt;em&gt;Data Model&lt;/em&gt;.&lt;/em&gt; Through organizing tables and columns, defining relationships between tables in the model, setting cardinality and cross-filter direction we achieve the best model which supports accurate calculations and reporting.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A Data Model&lt;/em&gt; is the logical representation of how data is structured and related within the data model.&lt;/p&gt;

&lt;p&gt;Before modeling ensure that your data is clean and up to date, ready for modeling.&lt;/p&gt;

&lt;h4&gt;
  
  
  Why Data Modeling
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Improved Performance and Scalability&lt;/em&gt; - join optimization, filters, and aggregations lead to a good model that is efficient and reliable. However, poorly designed models with complex relationships and redundant records cause delays, making queries slow.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Accuracy and Consistency&lt;/em&gt; - Guarantees the accuracy and consistency of the data used, making it reliable in reporting and drawing precise  insights and improved decision making.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Supports Data Exploration&lt;/em&gt; - Users can use hierarchies and drill-down paths to support efficient data exploration.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Ease of Maintenance&lt;/em&gt; - Any changes in one model or report are reflected everywhere in real time enabling reusability and scalability, reducing the effort required to maintain reports and models as the business grows.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Components of Power BI Data Model
&lt;/h2&gt;

&lt;p&gt;a. &lt;em&gt;Tables and Sources&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Tables&lt;/em&gt; are the raw building blocks of data models. They contain fields and records of particular data from different sources.&lt;br&gt;
&lt;em&gt;Sources,&lt;/em&gt; where we get our data from can vary depending on the context. We can get our data from SQL Database servers, Excel files, Data warehouse, SharePoint, and Power BI Dataflows.&lt;/p&gt;
&lt;h4&gt;
  
  
  Designing Source Tables
&lt;/h4&gt;

&lt;p&gt;i. &lt;em&gt;Fact Tables&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Fact tables contain quantitative data, numerical data that can be aggregated and analyzed. Examples the &lt;em&gt;Sales, Orders, or Invoices.&lt;/em&gt; This information is about specific events, business transaction, or measurements at the core of the data model.&lt;/p&gt;

&lt;p&gt;Fact tables keeps one record for each transaction or event, includes only keys and metrics, and they avoid storing descriptive attributes.&lt;/p&gt;

&lt;p&gt;Fact tables contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Foreign Key(FK)&lt;/em&gt; - a link to the Dimension table i.e. DateKey, ProductKey, e.t.c.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Measures(Numeric values)&lt;/em&gt; - Quantitative data you can aggregate. i.e. Quantity, UnitPrice, TotalAmount etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Degenerate dimensions&lt;/em&gt; - Descriptive data that does not warrant its dimension table. i.e. OrderNumber, InvoiceNumber.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ii. &lt;em&gt;Dimension Tables&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Dimension tables provide context or additional details to the data in &lt;em&gt;Fact Tables&lt;/em&gt;. They contains fewer rows while fact tables can contain a large number of rows and they are on growing.&lt;/p&gt;

&lt;p&gt;Relationship are used to establish links and connections between the fact and dimension tables in Power BI.&lt;/p&gt;

&lt;p&gt;Dimension table contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Primary Key(PK)&lt;/em&gt; - Unique identifier e.g.  &lt;code&gt;ProductID&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Descriptive attributes&lt;/em&gt; - Text, categories, hierarchies e.g. &lt;code&gt;ProductName&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Hierarchy Columns&lt;/em&gt; - Columns that form drill-down paths e.g. Country -&amp;gt; City -&amp;gt; Town.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Natural key&lt;/em&gt; - original identifier from the source system e.g. &lt;code&gt;ProductCode&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;iii. &lt;em&gt;Reference and Lookup Tables&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;They are small but critical tables in supporting the integrity and interpretation of data. They support additional mappings  or categorizations. Example: DiscountTypes or StatusCodes.&lt;/p&gt;
&lt;h4&gt;
  
  
  Loading Data
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Open Power BI&lt;/li&gt;
&lt;li&gt;On the Ribbon &lt;code&gt;Home&lt;/code&gt; tab, Click on &lt;code&gt;Get Data&lt;/code&gt; from the &lt;em&gt;Data&lt;/em&gt; group option.&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%2F66k0diijxhlyhy3u575k.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%2F66k0diijxhlyhy3u575k.png" alt="Get Data Icon" width="73" height="121"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;From the drop down list, choose the source of your data. i.e. &lt;code&gt;Text/CSV&lt;/code&gt; if your data is text or comma separated file.&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%2Fry5forag9mczmuo6vp2y.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%2Fry5forag9mczmuo6vp2y.png" alt="Data Source" width="673" height="865"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Choose the path to your file i.e. &lt;code&gt;C:/Users/User/Downloads/file.csv&lt;/code&gt; and click on &lt;code&gt;Open&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Click on &lt;code&gt;Connect&lt;/code&gt; on the Power Query editor window.&lt;/li&gt;
&lt;li&gt;Your data is extracted to Power Query for cleaning. Click on &lt;code&gt;Transform - Data&lt;/code&gt; to clean explore and clean it on the Power Query editor.&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%2Fx3w74nr7tpccnzje1ctg.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%2Fx3w74nr7tpccnzje1ctg.png" alt="Query Editor Window" width="800" height="605"&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%2Fy687xi1m2rznqt31flmv.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%2Fy687xi1m2rznqt31flmv.png" alt="Cleaning Window" width="799" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Finally, on the Power Query Editor Window Ribbon, Click on &lt;code&gt;Close &amp;amp; Apply&lt;/code&gt; from the &lt;code&gt;Home&lt;/code&gt; tab.&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%2Fi0u30cj2gbc7eqfj68qw.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%2Fi0u30cj2gbc7eqfj68qw.png" alt="Close and Apply Button" width="456" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Changes are loaded and applied to Power BI. We will load all our &lt;a href="https://mavenanalytics.io/data-playground/toy-store-e-commerce-database" rel="noopener noreferrer"&gt;Toy Store E-Commerce Database&lt;/a&gt; data set for modeling using the procedure above. The data is already clean, we are going to use it for demonstrating relationships in data modeling.&lt;/p&gt;

&lt;p&gt;b. &lt;em&gt;Relationships&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Relationships are an important aspect of data modeling in Power BI. Relationships are for establishing connections and links between tables of a data model. They allow related tables to communicate with each other. They are the link between &lt;em&gt;Fact Tables&lt;/em&gt; and &lt;em&gt;Dimension Tables&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Relationships determine how data in the model is filtered, aggregated, combined, and visualized. They're critical to the accuracy and performance of queries in Power BI.&lt;/p&gt;
&lt;h5&gt;
  
  
  Cardinality
&lt;/h5&gt;

&lt;p&gt;Cardinality type defines each relationship in a model. &lt;em&gt;Cardinality&lt;/em&gt; refers to the number of unique values in one table related to the number of unique values in another.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Types of Cardinality in Relationships&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;One-to-One(1:1)&lt;/em&gt; - Every single record in one table is related to another single record in another table. Commonly used when splitting a large table for performance and security reasons.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;One-to-Many(1:N)&lt;/em&gt; - Refers to when a single record in one table is related to many records in another table(s). Very common type of relationship in Power BI models. The &lt;em&gt;Fact&lt;/em&gt; table is on the &lt;em&gt;Many&lt;/em&gt; side while the &lt;em&gt;Dimension&lt;/em&gt; table is on the &lt;em&gt;One&lt;/em&gt; side when linking &lt;em&gt;Fact&lt;/em&gt; tables and &lt;em&gt;Dimension&lt;/em&gt; tables.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Many-to-Many(N:N)&lt;/em&gt; - Refers to when many records in the first table are related to many other records in the second table.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;
  
  
  Cross Filter Directions
&lt;/h5&gt;

&lt;p&gt;Used to determine the direction which filters propagate.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Single&lt;/em&gt; - When applied, only one of the tables in the relationship can filter data across the other table. Filtering data on the other table does not affect the data shown on the first table.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Bi-Directional&lt;/em&gt; - When applied, data can be filtered on either direction between the tables. Filtering data in one table affects data shown on the other table and vice versa. It is less often used and can impact performance negatively and create ambiguous filters.&lt;/p&gt;

&lt;p&gt;Cross-filter options are largely dependent on the cardinality type.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Cardinality&lt;/th&gt;
&lt;th&gt;Cross-Filter Options&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1:1&lt;/td&gt;
&lt;td&gt;Bi-Directional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1:*&lt;/td&gt;
&lt;td&gt;Single or Bi-Directional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;:&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Single or Bi-Directional&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Table 1: A table showing cardinality and their cross-filter options.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Creating a Relationship
&lt;/h3&gt;

&lt;p&gt;To create relationships, first you need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Identify the matching columns(keys).&lt;/li&gt;
&lt;li&gt;Choose the right cardinality.&lt;/li&gt;
&lt;li&gt;Decide on the Filter direction.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  The Model View Interface
&lt;/h4&gt;

&lt;p&gt;To manage relationships in Power BI Desktop:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click the Model icon in the left sidebar (the icon with three connected boxes)&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%2Fr0q1w3uckdy3ugx9xjjy.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%2Fr0q1w3uckdy3ugx9xjjy.png" alt="Model" width="40" height="58"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You'll see all your tables displayed as boxes with their columns listed&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%2F640t85qbncfoxysszrlj.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%2F640t85qbncfoxysszrlj.png" alt="Tables in the Model" width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Lines between tables represent relationships&lt;/li&gt;
&lt;li&gt;The line style indicates cardinality: 1 on one end and * on the many end&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;
  
  
  Auto-Detect Relationships
&lt;/h4&gt;

&lt;p&gt;When you load tables, Power BI automatically recognizes columns with same data type and name and creates relationships. However, you shoul always create relationships manually or review those created automatically. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Just like in our case, Power BI automatically creates relationships between tables in our model. We will review them.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;When auto-detect works well:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Column names match exactly (e.g., ProductID in both tables)&lt;/li&gt;
&lt;li&gt;Data types are compatible&lt;/li&gt;
&lt;li&gt;Values actually correspond between the tables&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Creating Relationships Manually
&lt;/h4&gt;

&lt;p&gt;Using the Managing Relationship Dialog&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On the &lt;code&gt;Home&lt;/code&gt; tab  → &lt;code&gt;Manage Relationships&lt;/code&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%2Fe9k3v6p49atl22gcbccr.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%2Fe9k3v6p49atl22gcbccr.png" alt="Manage Relationships" width="130" height="139"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click &lt;code&gt;New&lt;/code&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%2F67azwf4uj1ui9uvrskat.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%2F67azwf4uj1ui9uvrskat.png" alt="New Relationship" width="232" height="81"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select the first table and column, &lt;code&gt;From Table&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Select the second table and column, &lt;code&gt;To Table&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Configure cardinality and cross-filter direction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="/images/specifytables.png" class="article-body-image-wrapper"&gt;&lt;img src="/images/specifytables.png" alt="Configure Relationship Tables"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click &lt;code&gt;Save&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;
  
  
  Step by Step for Creating Relationships for our Toy Store E-Commerce Database
&lt;/h5&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Load all tables:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt;```
    products
    orders
    order_items
    order_item_refunds
    website_sessions
    website_pageviews
```
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br&gt;
`&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open Model view and delete any autodetected relationship.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;To delete a relationship:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In Model view, right-click on the line joining the &lt;code&gt;products&lt;/code&gt; and &lt;code&gt;order_items&lt;/code&gt; tables&lt;/li&gt;
&lt;li&gt;From the options displayed, Click on &lt;code&gt;Delete&lt;/code&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%2Fdtf2aw65nkd1g6yijp1f.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%2Fdtf2aw65nkd1g6yijp1f.png" alt="Delete Relationship" width="499" height="189"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Save your work&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Create the following relationships:&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;From Fact Table&lt;/th&gt;
&lt;th&gt;To Dimension Table&lt;/th&gt;
&lt;th&gt;Cardinality&lt;/th&gt;
&lt;th&gt;Cross-Filter&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;products[product_id]&lt;/td&gt;
&lt;td&gt;order_items[product_id]&lt;/td&gt;
&lt;td&gt;One-to-Many&lt;/td&gt;
&lt;td&gt;Single&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;orders[order_id]&lt;/td&gt;
&lt;td&gt;order_items[order_id]&lt;/td&gt;
&lt;td&gt;One-to-Many&lt;/td&gt;
&lt;td&gt;Single&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;orders[order_id]&lt;/td&gt;
&lt;td&gt;order_item_refunds[order_id]&lt;/td&gt;
&lt;td&gt;One-to-Many&lt;/td&gt;
&lt;td&gt;Single&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;website_sessions[website_session_id]&lt;/td&gt;
&lt;td&gt;orders[website_session_id]&lt;/td&gt;
&lt;td&gt;One-to-One&lt;/td&gt;
&lt;td&gt;Bi-Direction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;website_sessions[website_session_id]&lt;/td&gt;
&lt;td&gt;website_pageviews[website_session_id]&lt;/td&gt;
&lt;td&gt;One-to-Many&lt;/td&gt;
&lt;td&gt;Single&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;order_items[order_item_id]&lt;/td&gt;
&lt;td&gt;order_item_refunds[order_item_id]&lt;/td&gt;
&lt;td&gt;One-to-one&lt;/td&gt;
&lt;td&gt;Bi-Direction&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Table 2: Table showing relationships to be created.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Creating a relationship between the &lt;code&gt;products&lt;/code&gt; and &lt;code&gt;order_items&lt;/code&gt; tables&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On the &lt;code&gt;Home&lt;/code&gt; tab  → &lt;code&gt;Manage Relationships&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;code&gt;New&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Select the &lt;code&gt;products&lt;/code&gt; table and specify the column &lt;code&gt;product_id&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Select the &lt;code&gt;order_items&lt;/code&gt; table and specify the column &lt;code&gt;product_id&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Set cardinality to &lt;code&gt;One-to-Many&lt;/code&gt; and the cross-filter as &lt;code&gt;Single&lt;/code&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%2Fzxkil7bt8jnreqnl6se0.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%2Fzxkil7bt8jnreqnl6se0.png" alt="Specify Table Configurations" width="800" height="746"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click &lt;code&gt;Save&lt;/code&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%2F4p8p8td07yn5z155cz8x.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%2F4p8p8td07yn5z155cz8x.png" alt="Established Relationship" width="534" height="285"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Complete creating all the other relationships following the procedure. You will get something similar to:&lt;/em&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%2Fnajbu37h8so9je7em9e2.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%2Fnajbu37h8so9je7em9e2.png" alt="All Relationships" width="799" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Verify by checking that filters from any dimension table correctly filter the fact table.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;Data modeling is very crucial to building powerful reports and visualizations. It is key to great analysis because it establishes relationships, links, and connections existing in a data model making it wholesome and complete. Further, it improves query performance increasing efficiency and reliability of queries. Correct data modeling can lead to accurate reporting and result reliability, thus informed decision making. To view the complete model and data for your practice on GitHub visit &lt;a href="https://github.com/MakoriNyachaki/Toy-Store-E-Commerce" rel="noopener noreferrer"&gt;Toy Store E-Commerce&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>powerfuldevs</category>
      <category>datascience</category>
      <category>dataengineering</category>
      <category>database</category>
    </item>
    <item>
      <title>Building a Jumia Product Performance Dashboard in Excel.</title>
      <dc:creator>Makori Nyachaki</dc:creator>
      <pubDate>Sat, 05 Sep 2026 12:31:13 +0000</pubDate>
      <link>https://dev.to/makorinyachaki/building-a-jumia-product-performance-dashboard-in-excel-3l6l</link>
      <guid>https://dev.to/makorinyachaki/building-a-jumia-product-performance-dashboard-in-excel-3l6l</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Building a professional dashboard is rarely a simple task; it requires careful planning and a series of strategic decisions. A clean, well-structured build ensures that complex business contexts are easy to understand, providing stakeholders with an immediate overview of the problem at hand, key findings, and actionable solutions. Clarity is the hallmark of an effective dashboard.&lt;/p&gt;

&lt;p&gt;In this post, we will analyze Jumia's product performance to translate raw data into meaningful insights that drive business growth and improve service delivery. By examining customer engagement, pricing models, and promotional effectiveness, we can better understand the specific factors influencing product success.&lt;/p&gt;

&lt;h2&gt;
  
  
  Business Questions
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Are larger discounts correlated with a higher volume of reviews?&lt;/li&gt;
&lt;li&gt;Do highly-rated products naturally attract stronger customer engagement?&lt;/li&gt;
&lt;li&gt;What is the relationship between product pricing and customer ratings?&lt;/li&gt;
&lt;li&gt;Which products represent the top performers based on ratings and review volume?&lt;/li&gt;
&lt;li&gt;Which products require a pivot in their current pricing or marketing strategy?&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Data Methodology
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Data Quality Audit
&lt;/h2&gt;

&lt;p&gt;After receiving the dataset, find any errors that may exist within the dataset. We checked whether the dataset had headers, checked for formatting, duplicates, missing values, data types, and any inconsistencies. We used filters and conditional formatting to find out where these errors were. This was very helpful in identifying the errors during the data cleaning process.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; Copy your dataset and retain the original. Work on the copied dataset.&lt;/p&gt;

&lt;p&gt;We found the following errors and inconsistencies in the dataset:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mispelt headings &lt;em&gt;Ratingd&lt;/em&gt; instead of &lt;em&gt;Rating&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Mismatching Header cases &lt;em&gt;old prices&lt;/em&gt; and &lt;em&gt;Current prices&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Trailing white spaces and extra spaces in column 1&lt;/li&gt;
&lt;li&gt;Duplicates: we found 3  duplicates with an exact match in all fields.&lt;/li&gt;
&lt;li&gt;Negative review values in the reviews column&lt;/li&gt;
&lt;li&gt;One price range in both the &lt;em&gt;Current Price&lt;/em&gt; and &lt;em&gt;Old Prices&lt;/em&gt; columns instead of a price value.&lt;/li&gt;
&lt;li&gt;Improper data types in the &lt;em&gt;Rating&lt;/em&gt; and &lt;em&gt;Prices&lt;/em&gt; columns.&lt;/li&gt;
&lt;li&gt;Missing values in the &lt;code&gt;Rating&lt;/code&gt; and &lt;code&gt;Review&lt;/code&gt; columns.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, after copying our dataset into the new sheet to retain the original dataset, create a data table. Select all the data, go to &lt;em&gt;Insert &amp;gt; Table&lt;/em&gt; from the &lt;em&gt;Tables group section.&lt;/em&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%2Ff7jtk944o8quyxu28ll4.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%2Ff7jtk944o8quyxu28ll4.png" alt="An image of Raw Data" width="800" height="388"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Fig 1: An image of Raw Data&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Data Cleaning
&lt;/h2&gt;

&lt;p&gt;Now that we have understood the structure and where the underlying issues are in our data, it is time to get rid of the messy details from our dataset in readiness for analysis.&lt;/p&gt;

&lt;p&gt;The following are the steps and decisions that we made through the cleaning process.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;For the headings, we had to change to correct spellings for &lt;em&gt;Rating&lt;/em&gt; from &lt;em&gt;Ratingd&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For the price columns, we had to convert headers using the &lt;code&gt;PROPER()&lt;/code&gt; function to convert them to proper case. That is, the first letter of each word is capitalized.&lt;br&gt;
&lt;code&gt;&lt;br&gt;
=PROPER(B1)&lt;br&gt;
=PROPER(C1)&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
&lt;em&gt;B1&lt;/em&gt; and &lt;em&gt;C1&lt;/em&gt;: is the address to the &lt;em&gt;Current Price&lt;/em&gt; and &lt;em&gt;Old Price&lt;/em&gt; headers in the sheet. The function returns the new text formatted to proper case. &lt;br&gt;
Then we used copy and paste special(Paste as Values), where we copied and pasted the new text to the header, replacing the old one.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Removed all trailing whitespace and extra spaces using the &lt;code&gt;TRIM()&lt;/code&gt; function. &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Steps&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Insert a new column to the right of the &lt;em&gt;Product&lt;/em&gt; column&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In Cell B2, type the function below:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;=TRIM(A2)&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Press &lt;em&gt;Enter&lt;/em&gt; to return the new text value&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The column is auto-filled.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;_Copy and Paste Special _&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select all the values in the B column, i.e., from B2:B116&lt;/li&gt;
&lt;li&gt;Copy the values using the Shortcut &lt;code&gt;CTRL + C&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Then, select cell A2, and right- click on it&lt;/li&gt;
&lt;li&gt;Then from the dialog box choose, &lt;em&gt;Paste as Values&lt;/em&gt; instead of &lt;em&gt;Paste&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use the &lt;code&gt;CLEAN()&lt;/code&gt; function to also remove non-printable characters from the &lt;em&gt;Product&lt;/em&gt; column.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Steps&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clear the column we used for trimming&lt;/li&gt;
&lt;li&gt;In &lt;em&gt;B2&lt;/em&gt; enter the following function
&lt;code&gt;=CLEAN(A2)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Copy the values in &lt;em&gt;B2:B116&lt;/em&gt;, paste special in in cell A2.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Duplicates&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Three duplicates were found; they were an exact match in every field. Remove them to avoid redundancy and incorrect results of analysis due to redundancy.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Steps&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select all the data&lt;/li&gt;
&lt;li&gt;On Data Tab click on &lt;em&gt;Remove Duplicates&lt;/em&gt; in the &lt;em&gt;Data Tools&lt;/em&gt; group section&lt;/li&gt;
&lt;li&gt;Select all the fields, and then click &lt;em&gt;OK&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A confirmation pop-up message will show you the number of duplicates removed.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Negative Reviews&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For the negative values in the &lt;em&gt;Reviews&lt;/em&gt; column, convert them to absolute values using the &lt;code&gt;ABS()&lt;/code&gt; function.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Steps&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Insert a new column to the right of the &lt;em&gt;review&lt;/em&gt; column&lt;/li&gt;
&lt;li&gt;On the new column, F, enter the following function in cell &lt;em&gt;F2&lt;/em&gt;:
&lt;code&gt;=ABS(E2)&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E2 is the address of the first review negative value&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Press Enter&lt;/li&gt;
&lt;li&gt;Copy and Paste Special the values to replace those in the &lt;em&gt;review&lt;/em&gt; column.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Price Ranges&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Used the midpoint of the price range to get the value for the particular products. We found the midpoint using the formula:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`Price = (Lower Range Limit + Upper Range Limit) / 2`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Data Types&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Current Price and Old Price Columns&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Used Find and Replace to replace &lt;em&gt;KSh&lt;/em&gt; with Blanks&lt;/li&gt;
&lt;li&gt;Converted the remaining values to &lt;em&gt;Number&lt;/em&gt; type, then to &lt;em&gt;Currency&lt;/em&gt; type to 2 decimal places with the symbol &lt;em&gt;KSh&lt;/em&gt;, and used the &lt;em&gt;,&lt;/em&gt; 1000 separator &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Rating&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Converted Rating to &lt;em&gt;Number&lt;/em&gt; type, formatted to one decimal place.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Review&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Converted &lt;em&gt;Review&lt;/em&gt; column to &lt;em&gt;Number&lt;/em&gt; type, a whole number.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Steps to Change to Number Type&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select the Column with the data&lt;/li&gt;
&lt;li&gt;Go to the Home tab; in the Number group section, from the drop-down, select &lt;em&gt;More Number formats&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;On the left side of the pop-up window, select &lt;em&gt;Number&lt;/em&gt; or &lt;em&gt;Currency&lt;/em&gt; and specify the other options.&lt;/li&gt;
&lt;li&gt;Then click &lt;em&gt;OK&lt;/em&gt; to apply the changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Missing Values&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For missing values and blanks, never assume anything. Leave them blank as they are. Note that a &lt;em&gt;Blank&lt;/em&gt; does not mean zero.&lt;/p&gt;

&lt;p&gt;Exclude blanks from metrics that require the missing field.&lt;/p&gt;

&lt;p&gt;Add a data status field (for example, &lt;em&gt;Complete&lt;/em&gt;, &lt;em&gt;Missing Rating&lt;/em&gt;) if it can help users understand better.&lt;/p&gt;
&lt;h2&gt;
  
  
  Enriching Fields and Excel Formulas
&lt;/h2&gt;

&lt;p&gt;We added the following columns to our cleaned data.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;1. Discount Amount&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Use the following formula to get the values for the column:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;=@[Old Price]-@[Current Price]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Optionally, compare the advertised discount with the calculated discount:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;=IFERROR(([@[Old Price]]-[@[Current Price]])/[@[Old Price]],"")&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Flag any difference instead of overwriting the advertised value.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;2. Rating Category&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Rating values are classified as follows:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Poor&lt;/em&gt; &amp;lt; 3&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Average&lt;/em&gt; Between 3 and 4&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Excellent&lt;/em&gt; &amp;gt; 4.5&lt;/p&gt;

&lt;p&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;4.1-4.5 are not classified; if the original boundaries must be followed literally, label 4.1-4.5 as &lt;code&gt;Unclassified&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;3. Discount Category&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Classify your &lt;em&gt;Discount&lt;/em&gt; into the following categories:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Low Discount&lt;/em&gt; &amp;lt; 20%&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Medium Discount&lt;/em&gt; 20%-40%&lt;/p&gt;

&lt;p&gt;&lt;em&gt;High Discount&lt;/em&gt; &amp;gt; 40%&lt;/p&gt;

&lt;p&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;em&gt;4. Price Category&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;On the &lt;code&gt;Analysis&lt;/code&gt; worksheet, define thresholds rather than arbitrary values. A preferred approach uses the first and third quartiles&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;br&gt;
    =QUARTILE.INC(tblProducts[Current Price],1)&lt;br&gt;
    =QUARTILE.INC(tblProducts[Current Price],3)&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Name those sales as &lt;code&gt;Price_Q1&lt;/code&gt; and &lt;code&gt;Price_Q3,&lt;/code&gt; respectively.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the following classifications&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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;ul&gt;
&lt;li&gt;Remember to record the final KSH thresholds in the &lt;code&gt;Data Dictionary&lt;/code&gt; for ease of interpretation by other users.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;5. Engagement and Performance Flag&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;For strong 'Customer Engagement,'  define a measurable rule such as review count at or above the 75th Percentile. You may also create flags for:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;high discount and low rating;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;high discount and low engagement;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;many reviews and average rating; and&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;strong engagement and excellent rating&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;State the exact thresholds.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; Do not select the products subjectively.&lt;/p&gt;
&lt;h2&gt;
  
  
  Pivot Tables and Analysis
&lt;/h2&gt;

&lt;p&gt;Calculate:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Example Excel formula&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Total products&lt;/td&gt;
&lt;td&gt;&lt;code&gt;=ROWS(tblProducts[Product])&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Average current price&lt;/td&gt;
&lt;td&gt;&lt;code&gt;=AVERAGE(tblProducts[Current Price])&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Average old price&lt;/td&gt;
&lt;td&gt;&lt;code&gt;=AVERAGE(tblProducts[Old Price])&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Average discount&lt;/td&gt;
&lt;td&gt;&lt;code&gt;=AVERAGE(tblProducts[Discount])&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Average rating&lt;/td&gt;
&lt;td&gt;&lt;code&gt;=AVERAGE(tblProducts[Rating])&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total reviews&lt;/td&gt;
&lt;td&gt;&lt;code&gt;=SUM(tblProducts[Review])&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Most expensive price&lt;/td&gt;
&lt;td&gt;&lt;code&gt;=MAX(tblProducts[Current Price])&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Least expensive price&lt;/td&gt;
&lt;td&gt;&lt;code&gt;=MIN(tblProducts[Current Price])&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Then find and return the product names with the least and most expensive prices:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=XLOOKUP(MAX(tblProducts[Current Price]),tblProducts[Current Price],tblProducts[Product])
=XLOOKUP(MIN(tblProducts[Current Price]),tblProducts[Current Price],tblProducts[Product])
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Report all ties using &lt;code&gt;FILTER,&lt;/code&gt;, not only the first match.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scatter Plots
&lt;/h3&gt;

&lt;p&gt;To establish relationships between variables, create scatter plots, using one product per point:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Discount (x) versus reviews (y);&lt;/li&gt;
&lt;li&gt;Rating (x) versus reviews (y); and&lt;/li&gt;
&lt;li&gt;Current price (x) versus rating (y).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Add a linear trendline, display the equation and R-squared value, and calculate the Pearson Correlation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=CORREL(tblProducts[Discount],tblProducts[Review])
=CORREL(tblProducts[Rating],tblProducts[Review])
=CORREL(tblProducts[Current Price],tblProducts[Rating])
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;A PivotTable or Filter helper range containing only complete pairs may be required because blanks can cause errors in some versions of Excel.&lt;/li&gt;
&lt;li&gt;Interpret direction carefully.&lt;/li&gt;
&lt;li&gt;Note that correlation does not establish causation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ranked Tables
&lt;/h3&gt;

&lt;p&gt;Create ranked tables for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;top 5 and bottom 5 products by rating;&lt;/li&gt;
&lt;li&gt;top 10 products by discount;&lt;/li&gt;
&lt;li&gt;top 10 products by reviews;&lt;/li&gt;
&lt;li&gt;top 10 products by rating;&lt;/li&gt;
&lt;li&gt;products with high discounts but low ratings;&lt;/li&gt;
&lt;li&gt;products with high discounts but low engagement; and&lt;/li&gt;
&lt;li&gt;products with many reviews but average ratings.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use a PivotTable(&lt;em&gt;Rows:&lt;/em&gt; Product; &lt;em&gt;Values:&lt;/em&gt; relevant measure; sort in ascending/descending order, and apply &lt;em&gt;Value Filters &amp;gt; Top 10&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Use review count as a tiebreaker for rating ranks and rating as a tiebreaker for review ranks. Exclude ratings from rating lists and show how you handle ties.&lt;/p&gt;

&lt;h3&gt;
  
  
  Seller Performance Questions
&lt;/h3&gt;

&lt;p&gt;Translate ranked tables into evidence-based answers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Strong Demand&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Which products have review counts above the engagement threshold?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pricing/Marketing Attention&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Which products combine weak engagement or weak ratings with high price/high discount?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Many Reviews and Average Experience&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Which products have high engagement but fall in the Average rating category?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Promotion Inefficiency&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Which high-discount products remain below the engagement threshold?&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%2Fq5l7eqwvk5ccube575zm.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%2Fq5l7eqwvk5ccube575zm.png" alt="Cleaned Data" width="800" height="403"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Fig 2: Cleaned Data&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Pivot Tables
&lt;/h3&gt;

&lt;p&gt;These are the suggested PivotTables:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;PivotTable&lt;/th&gt;
&lt;th&gt;Rows&lt;/th&gt;
&lt;th&gt;Values&lt;/th&gt;
&lt;th&gt;Recommended visual&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Rating mix&lt;/td&gt;
&lt;td&gt;Rating Category&lt;/td&gt;
&lt;td&gt;Count of Product&lt;/td&gt;
&lt;td&gt;Doughnut or column chart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Discount mix&lt;/td&gt;
&lt;td&gt;Discount Category&lt;/td&gt;
&lt;td&gt;Count of Product&lt;/td&gt;
&lt;td&gt;Column chart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Price vs rating&lt;/td&gt;
&lt;td&gt;Price Category&lt;/td&gt;
&lt;td&gt;Average of Rating&lt;/td&gt;
&lt;td&gt;Column chart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Engagement by discount&lt;/td&gt;
&lt;td&gt;Discount Category&lt;/td&gt;
&lt;td&gt;Average/Sum of Review&lt;/td&gt;
&lt;td&gt;Column chart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Top products by rating&lt;/td&gt;
&lt;td&gt;Product&lt;/td&gt;
&lt;td&gt;Average of Rating&lt;/td&gt;
&lt;td&gt;Horizontal bar chart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Top products by reviews&lt;/td&gt;
&lt;td&gt;Product&lt;/td&gt;
&lt;td&gt;Sum of Review&lt;/td&gt;
&lt;td&gt;Horizontal bar chart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Top products by discount&lt;/td&gt;
&lt;td&gt;Product&lt;/td&gt;
&lt;td&gt;Average of Discount&lt;/td&gt;
&lt;td&gt;Horizontal bar chart&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;And use &lt;em&gt;Insert &amp;gt; Slicer&lt;/em&gt; for &lt;code&gt;Rating Category&lt;/code&gt;, &lt;code&gt;Discount Category&lt;/code&gt;, and &lt;code&gt;Price Category&lt;/code&gt;. Connect each slicer to every compatible PivotTable using &lt;em&gt;Report Connections&lt;/em&gt; (or &lt;em&gt;Pivot Table Connections&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Remember to test each slicer independently.&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%2F303e2r9e0ltnzyoq9ytb.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%2F303e2r9e0ltnzyoq9ytb.png" alt="Pivot Tables and Pivot Charts" width="800" height="354"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Fig 3: Pivot Tables and Pivot Charts&lt;/em&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Here is the structure of the Jumia Product Performance dashboard:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+------------------------------------------------------------------+
| Title, refresh date, and slicers                                 |
+------------------------------------------------------------------+
| Total Products | Avg Price | Avg Discount | Avg Rating | Reviews |
+------------------------------------------------------------------+
| Top 10 by Rating | Top 10 by Reviews | Top 10 by Discount        |
+------------------------------------------------------------------+
| Discount vs Reviews | Rating vs Reviews | Price vs Rating         |
+------------------------------------------------------------------+
| Rating Mix | Discount Mix | Key Insights / Recommendations       |
+------------------------------------------------------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Dashboard Standards&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Ensure a clean and tidy dashboard is created. Use consistent color, formatting, font, and relevant symbols for the different columns. &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%2Fu13be8zodgaclcq5cibg.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%2Fu13be8zodgaclcq5cibg.png" alt="Image showing Jumia Product Performance Dashboardn" width="800" height="401"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Fig 4: Image showing Jumia Product Performance Dashboard&lt;/em&gt; &lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;High discounts do not mean a high number of reviews or better engagement. From the analysis, there is no relationship at all between discount and reviews. The correlation coefficient between discount and reviews is &lt;em&gt;-0.14&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;There is a weak relationship that establishes no pattern between rating and reviews. This indicates that more reviews do not translate to higher ratings in the data; hence, no causation. The correlation coefficient stands at 0.06.&lt;/li&gt;
&lt;li&gt;The analysis establishes a weak positive correlation between prices and ratings of 0.11. Prices are not influenced by the rating of the product.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Investigate quality issues on highly discounted products but have low ratings.&lt;/li&gt;
&lt;li&gt;Find out why highly rated products have higher prices than the average and lower-rated products. Does this influence come from sales made? &lt;/li&gt;
&lt;li&gt;Combine promotions of products with high ratings and higher prices to increase engagement and check if they can translate to sales.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Limitations and Lessons
&lt;/h2&gt;

&lt;p&gt;We've learnt valuable lessons throughout the project. We were able to use and apply functions, build PivotTables and Pivot Charts, build a clean and interactive dashboard, access price, discount, rating, and engagement relationships, clean data for real data analysis, and communicate findings, limitations, and business recommendations. This will go along way in helping sellers to make informed business decisions for their businesses.&lt;/p&gt;

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

&lt;p&gt;None of the performance metrics- discount, rating, and reviews translate to better engagement. They do not influence either metric or engagement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links to GitHub
&lt;/h2&gt;

&lt;p&gt;To review and see the completed project, visit &lt;a href="https://github.com/MakoriNyachaki/jumia-product-performance-dashboard" rel="noopener noreferrer"&gt;Jumia Product Performance Dashboard&lt;/a&gt; on GitHub.&lt;/p&gt;

</description>
      <category>data</category>
      <category>datascience</category>
      <category>msexcel</category>
      <category>github</category>
    </item>
    <item>
      <title>Getting Started with Excel for Data Analytics: From Basics to Data Cleaning</title>
      <dc:creator>Makori Nyachaki</dc:creator>
      <pubDate>Sat, 29 Aug 2026 22:12:42 +0000</pubDate>
      <link>https://dev.to/makorinyachaki/getting-started-with-excel-for-data-analytics-from-basics-to-data-cleaning-g44</link>
      <guid>https://dev.to/makorinyachaki/getting-started-with-excel-for-data-analytics-from-basics-to-data-cleaning-g44</guid>
      <description>&lt;h1&gt;
  
  
  Getting Started with Excel for Data Analytics: From Basics to Data Cleaning.
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Excel
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Excel is one of the most foundational tools critical to Data Analysts. It is useful for preparing data for analysis. Excel can be used from the point of data collection to creating dashboards. It is the foundational tool used by most Data Analysts in cleaning, reformatting, and structuring the dataset ready for analysis. Excel provides unique technical tools that support collecting, cleaning, analyzing, visualizing, and reporting. Removing duplicates, filtering and sorting, validating data, aggregating, and performing some statistical operations are some of the major tools that Microsoft Excel supports and are useful during data analytics.&lt;/p&gt;

&lt;p&gt;Excel provides a ton of benefits to many organizations and businesses. It can serve as a database for storing and retrieving business data, i.e., sales data; it can serve as an electronic ledger, a data analytics tool, and many more functions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding Excel
&lt;/h2&gt;

&lt;p&gt;Before diving into data analytics using Excel, we first need to understand Excel and all its functional components that are core to data analysis. This will give us an overview of the Excel interface and basic functions for the different components.&lt;/p&gt;

&lt;h4&gt;
  
  
  Interface
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Ribbon - Contains all the command tabs you will work with. The tabs are: File, Home, Insert, Draw, Page Layout, Formulas, Data, Review, View, Help, and many others. These tabs have more groups from which we can access and apply different commands to our dataset.&lt;/li&gt;
&lt;li&gt;Toolbar - At the top right corner of the workbook. Used to hold and display the most common commands we use in Excel, like "Save", "Undo", "Redo", or/and any other command you may wish to add to the toolbar.&lt;/li&gt;
&lt;li&gt;Scroll Bar(Horizontal and Vertical) - Scrollbars at the end of the worksheet. The vertical scrollbar is used to scroll through your worksheet up and down, and vice versa. The horizontal one helps you scroll through his/her worksheet from left to right and back.&lt;/li&gt;
&lt;li&gt;Worksheet - Where you work from. It contains cells where you do your data entry.&lt;/li&gt;
&lt;li&gt;Columns - Named alphabetically and move vertically in the worksheet.&lt;/li&gt;
&lt;li&gt;Rows - Named numerically and moves across/horizontals in the worksheet&lt;/li&gt;
&lt;li&gt;Cell - An intersection between a row and a column. Where we enter our data.&lt;/li&gt;
&lt;li&gt;Formula Bar - Where you enter and edit your formulas in Excel.&lt;/li&gt;
&lt;li&gt;Name Bar/ Address Bar - Displays the address of the active cell.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Workbook&lt;/em&gt; - One or more worksheets existing in the same Excel file.&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%2Fr3a9iorgk46yes3vwvl9.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%2Fr3a9iorgk46yes3vwvl9.png" alt=" " width="799" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  Home Tab
&lt;/h5&gt;

&lt;p&gt;Most of our formatting commands will be done from this tab. It is divided into around 8 groups: &lt;br&gt;
    - &lt;em&gt;Clipboard:&lt;/em&gt; From here you can access the &lt;em&gt;Copy&lt;/em&gt;, &lt;em&gt;Cut&lt;/em&gt;, &lt;em&gt;Paste&lt;/em&gt;, and &lt;em&gt;Format Painter&lt;/em&gt; commands.&lt;br&gt;
    - &lt;em&gt;Font:&lt;/em&gt; From here you can access text formatting commands. They include: Bolding, changing font face, font size, borders, highlighting, font color, italicizing, underlining, and many more commands.&lt;br&gt;
    - &lt;em&gt;Alignment:&lt;/em&gt; You can access text alignment(Vertical and horizontal) commands, orientation, and indentation commands.&lt;br&gt;
    - &lt;em&gt;Number:&lt;/em&gt; Where you can access different data type formatting features. i.e., date, currency, number, and many more.&lt;br&gt;
    - &lt;em&gt;Styles:&lt;/em&gt; Conditional Formatting, Formatting as Table, and applying different cell styles.&lt;br&gt;
    - &lt;em&gt;Cells:&lt;/em&gt; You can insert, delete, and format cells from this group.&lt;br&gt;
    - &lt;em&gt;Editing:&lt;/em&gt; AutoSum, find and replace, filter, and sort command options are accessible from this group.&lt;br&gt;
    - &lt;em&gt;Add-ins:&lt;/em&gt; Where you can access your Excel add-ins.&lt;/p&gt;

&lt;h5&gt;
  
  
  Insert Tab
&lt;/h5&gt;

&lt;p&gt;A very important tab too. We can access the following groups essential for data analytics:&lt;br&gt;
    - &lt;em&gt;Tables:&lt;/em&gt; We can work with Pivot Tables from this group&lt;br&gt;
    - &lt;em&gt;Charts:&lt;/em&gt; We can create and insert charts from this group during our visualization and reporting.&lt;br&gt;
    - &lt;em&gt;Sparklines:&lt;/em&gt; Insert sparklines for monitoring trends in our analytics.&lt;br&gt;
    - &lt;em&gt;Filter:&lt;/em&gt; You can insert slicers and timelines, which are used for filtering our data and output in the dashboard mostly.&lt;/p&gt;

&lt;h5&gt;
  
  
  Formulas Tab
&lt;/h5&gt;

&lt;p&gt;This tab is very essential and critical to data aggregation and statistical manipulation. The tab contains formulas and functions that are used to carry out mathematical and statistical manipulation on all numeric and textual data. It contains the following sections:&lt;br&gt;
    - &lt;em&gt;Function Library:&lt;/em&gt; Contains Financial, Logical, Text, Date &amp;amp; Time, Lookup &amp;amp; Reference, Math &amp;amp; Trigonometric, and many more functions used while working with our dataset.&lt;br&gt;
    - &lt;em&gt;Formula auditing:&lt;/em&gt; Contains tools that are used to understand the logic and structure of complex formulas(Dependents and Precedents). &lt;/p&gt;

&lt;h5&gt;
  
  
  Data
&lt;/h5&gt;

&lt;p&gt;It contains the following groups, which serve an important role in preparing our data for analysis:&lt;br&gt;
    - &lt;em&gt;Get &amp;amp; Transform:&lt;/em&gt; Used to import data from different sources, i.e., web and CSV files. Also, it is useful in doing transformation of datasets into Excel-compatible datasets.&lt;br&gt;
    - &lt;em&gt;Sort and Filter:&lt;/em&gt; Used for sorting and filtering our dataset. This is important when you want to understand your data ranges or find anomalies that exist in your dataset for correction and further investigation.&lt;br&gt;
    - &lt;em&gt;Data Tools:&lt;/em&gt; From here, we can get data validation commands, remove duplicates, convert text into columns, and many other commands that help maintain data consistency, reliability, and integrity during collection and analysis.&lt;br&gt;
    - &lt;em&gt;Forecast:&lt;/em&gt; Used to do what-if analysis and forecast what will happen in the future to help with reporting and in making informed decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Analysis
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Data analysis is the process of investigating a dataset to uncover patterns, trends, and insights for informed decision-making and to drive growth and success in business and organizations. Through data analytics, businesses and organizations can solve problems, improve operations, and optimize stakeholder decisions. Therefore, data analysis involves transforming raw opinions or data into meaningful facts or information.&lt;/p&gt;

&lt;p&gt;Data analysis is crucial across fields like marketing, sales, health, finance, sports, and retail industries. It helps industry owners to be decisive and informed for a better future that fosters growth.&lt;/p&gt;

&lt;h3&gt;
  
  
  Types of Data Analytics
&lt;/h3&gt;

&lt;p&gt;These are the types of data analytics. They all serve to achieve a common goal.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Descriptive - Used to answer the question: what happened? It investigates and summarizes historical uncover trends and patterns. Involves data aggregation and visualization.&lt;/li&gt;
&lt;li&gt;Prescriptive - Used to answer the question: what is likely to happen next? It uses models to foretell what the future looks like based on past events. Involves machine learning and linear regression.&lt;/li&gt;
&lt;li&gt;Prescriptive Analytics - Answers the question: What should we do? It recommends actions by combining data analysis with optimization techniques. Involves algorithm optimization.&lt;/li&gt;
&lt;li&gt;Diagnostic - Answers the question: Why did it happen? Uses statistical methods to identify the cause. Involves correlation analysis and hypothesis testing.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Steps in Data Analysis
&lt;/h2&gt;

&lt;p&gt;There are several steps involved in data analysis. The sequential steps are important if you want to begin collecting data by yourself.&lt;/p&gt;

&lt;p&gt;We will use a publicly available dataset to illustrate the steps involved in data preparation before the actual analysis. Some of the steps may require actual data collection; hence, our dataset will not be used in those steps but rather in the preceding steps.&lt;/p&gt;

&lt;p&gt;We are going to use the &lt;a href="https://www.kaggle.com/datasets/ahmedmohamed2003/cafe-sales-dirty-data-for-cleaning-training" rel="noopener noreferrer"&gt;Cafe Sales - Dirty Data for Cleaning&lt;/a&gt; Training Dataset, available for download from Kaggle.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; Before you start the process, ensure that you keep a copy of your data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Data Preparation
&lt;/h3&gt;

&lt;p&gt;This is the process of collecting, cleaning, transforming, and analyzing the collected data. It readies &lt;/p&gt;

&lt;p&gt;Data preparation ensures its accuracy, reliability, consistency, and regulatory compliance. These increase the level of trust and collaboration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Data Collection
&lt;/h3&gt;

&lt;p&gt;Data collection involves gathering raw opinions and facts right from the source.&lt;/p&gt;

&lt;p&gt;There are various methods involved in data collection, which include but are not limited to: Conducting interviews, surveys, API integrations, IoT devices, web scraping, observation, or getting it from third-party sources.&lt;/p&gt;

&lt;p&gt;The data is then loaded into tools like spreadsheets for further activities like cleaning and analysis.&lt;/p&gt;

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

&lt;p&gt;Before the cleaning process, data is assessed to determine whether it meets the data standards that can help us avoid costly mistakes such as misleading results and flawed decisions.&lt;/p&gt;

&lt;p&gt;Ensuring data is accurate, timely, complete, consistent, relevant, and of integrity is the key objective in this step.&lt;/p&gt;

&lt;h3&gt;
  
  
  Data Cleaning
&lt;/h3&gt;

&lt;p&gt;Data cleaning ensures that datasets are complete, accurate, and consistent before analysis. This is achieved by getting rid of errors, fixing broken data, and addressing all issues that the dataset might have.&lt;/p&gt;

&lt;p&gt;Data cleaning helps us to handle missing values, duplicates, outliers, inconsistent formatting, and irrelevant data.&lt;/p&gt;

&lt;p&gt;From this point forward, we will be using our dataset to demonstrate how we can handle these issues we have listed. We are cleaning our data using &lt;em&gt;Microsoft Excel.&lt;/em&gt; Open your CSV dataset using Excel.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Open the Dataset&lt;/em&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Navigate to the project folder `excel-data-cleaning/`
- Then go to the data folder `data/`
- Double-click on the file `dirty_cafe_sale.csv`; it will open in Excel.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Saving a copy of your dataset in Excel format&lt;/em&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- In  excel on the Ribbon click on the *File* Tab, then go *Save AS*
- Choose your save location. In our case, it is in the project root folder, then in the `dashboard/` subfolder.
- Give it the name, in our case *cleaned_cafe_sales.xlxs*
- Click on *Save*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Now you have made a copy of your dataset, which is a working file. So inspect your file carefully to determine the missing details and existing mistakes that are visible.&lt;/p&gt;

&lt;p&gt;You can also bold your column titles, convert the dataset into tables, and apply other basic formatting, like changing the font if the current font is not readable.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;To Bold Titles&lt;/em&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Select the first row containing titles.
- Click on the *Home* Tab
- Navigate to the *Font* group section. 
- Click on the *Bold* icon(*B*)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fk0e4adhz9nrpyxp7tt2a.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%2Fk0e4adhz9nrpyxp7tt2a.png" alt=" " width="799" height="253"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Alternatively, you can use the shortcut &lt;em&gt;Ctrl + B&lt;/em&gt; to bold your selected titles.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Converting the Dataset into a Table&lt;/em&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Select all your data.
- Click on the *Insert* tab
- In the _Tables_ group section, click on the Table icon.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F74ycbthnvy1w58wyuwst.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%2F74ycbthnvy1w58wyuwst.png" alt=" " width="800" height="242"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Alternatively, you can use the &lt;em&gt;Ctrl + T&lt;/em&gt; Keyboard shortcut after selecting your data. This helps us to easily filter and organize our data.&lt;/p&gt;

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

&lt;p&gt;You can filter and sort your dataset to check for blanks and missing information.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*Filter*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Applying a filter to your data allows you to select a specific type of data you want to view in a given column. In our case, we want to view &lt;em&gt;Blanks&lt;/em&gt; in the &lt;em&gt;Item&lt;/em&gt; column.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Select the data
- Click on the *Home* tab
- On the _Editing_ group section click on *Sort &amp;amp; Filter*
- From the drop-down, click on *Filter*
- A filter icon is displayed on the title column.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F6zkcjktgdi6xdus9x26a.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%2F6zkcjktgdi6xdus9x26a.png" alt=" " width="36" height="37"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Click on the Filter icon on the title of any column. In the drop-down list of commands, in the Fields section, uncheck _Select All_, scroll through the field list and select *Blanks*, and click *OK* to see only blank fields.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F1ypu0uio0g09dcs5drau.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%2F1ypu0uio0g09dcs5drau.png" alt=" " width="800" height="547"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To clear filters, click on the filter icon on the respective column, then click on &lt;em&gt;Clear Filter from Item&lt;/em&gt;. &lt;/li&gt;
&lt;li&gt;You can also sort the field using the steps. However, you can click on &lt;em&gt;Sort A to Z&lt;/em&gt; - Ascending or &lt;em&gt;Sort Z to A&lt;/em&gt; - Descending order.&lt;/li&gt;
&lt;li&gt;You can also filter or sort custom, i.e., &lt;em&gt;Filter by color&lt;/em&gt; or &lt;em&gt;Sort by color&lt;/em&gt;, in case you have already applied conditional formatting.&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%2Fvqkidagiytk7696h1c8m.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%2Fvqkidagiytk7696h1c8m.png" alt=" " width="394" height="706"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since our column has blanks, we need to count the blanks to know how many there are using the Excel function:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;=COUNTBLANK(B2:B10001)&lt;/code&gt;: there are 333 blank cells, which translates to around 3.33%. This will help us to understand the amount of data that we need to clean and how it will affect analysis or the level of bias. Below 5%, we will clean our data by replacing blanks with Unknown. We will do cleaning later.&lt;/p&gt;

&lt;h5&gt;
  
  
  Conditional Formatting
&lt;/h5&gt;

&lt;p&gt;Conditional formatting highlights duplicate values, helping in spotting patterns or identifying anomalies.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Applying Conditional Formatting&lt;/em&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Select the columns or range to inspect; in our case, the  _Quantity_ Column.
- Navigate to the *Home* tab.
- On the *Styles* group, Click on _Conditional Formatting_
- Choose a criteria to conditionally format your column i.e. _Highlight Cells_, then Go to _Duplicate Values_, choose a color scheme and Click *OK*.
- All duplicate values in the column will be highlighted.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fcj3sj7rej88yn7rzxi5n.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%2Fcj3sj7rej88yn7rzxi5n.png" alt=" " width="598" height="616"&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%2Fnh6sbt1m5q6nf9d96iyk.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%2Fnh6sbt1m5q6nf9d96iyk.png" alt=" " width="800" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These are some of the basic tools in Excel we'll use while dealing with missing data, detecting outliers, duplicate detection, identifying inconsistent formats, irrelevant data, and detecting erroneous entries.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*1. Removing Duplicates*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Removing duplicates helps analysts to avoid redundancy, which can distort analysis, inflate counts, and skew findings that can lead to wrong and misguided business decisions.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Select all data
- Click on the *Data* tab
- In the *Data Tools* section, click on the Remove Duplicates icon
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fjq82eg9sbr717ehjs9bj.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%2Fjq82eg9sbr717ehjs9bj.png" alt=" " width="800" height="135"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- the fields from which you want to get rid of duplicates. In our case, we want to remove all matching records, so we'll select all fields.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fwmym95372qpbk9t44rw3.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%2Fwmym95372qpbk9t44rw3.png" alt=" " width="517" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Click *OK*. All duplicates will be removed, with a pop-up dialog window indicating the total number of duplicates removed.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fblcgwwn6et7drbd0gyho.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%2Fblcgwwn6et7drbd0gyho.png" alt=" " width="282" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In our case, there were no duplicate records; thus, the message was "No duplicate values found."&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*Handling Missing Values*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Missing values can result from human error, system limitations, incomplete forms, or data integration issues. All these can lead to inaccurate analyses, biased models, and misleading conclusions due to the variation resulting from missing data.&lt;/p&gt;

&lt;p&gt;Excel provides multiple imputation techniques we can use to handle missing data. These techniques include, but are not limited to, replacing missing values with the mean, median, or mode. This depends on the type of data you are dealing with. For example, a data analyst replaces the product rating with an overall average of the product rating across all blanks in the product rating column to ensure consistent review data.&lt;/p&gt;

&lt;p&gt;We can use the following techniques in Excel to handle missing data:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;1. Filtering and Sorting to Find Blanks&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You first have to find where missing values are.&lt;/p&gt;

&lt;p&gt;Apply filters as discussed above on the item column to find blanks. Replace all blanks with the text value.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;em&gt;Steps&lt;/em&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Click on the filter icon on the *Item*column.
- Uncheck all Fields, then select only the *Blanks* field and click *OK*
- On the first cell of the *Item* column, type the text _Unknown_ and copy it down through the blank cells.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;em&gt;To Copy the Text&lt;/em&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Select the cell where you typed the replacement text("Unknown")
- Drag your pointer to the bottom right of the selected cell; your pointer turns into a dark cross at the tip of the bottom right corner.
- Click and drag the cross down the empty cells to copy the text into the blank cells
- Click and save your work once all blank cells are filled, and clear the filters.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Alternatively, you can use &lt;em&gt;Find and Replace.&lt;/em&gt; To use Find and Replace:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Undo the changes you have made and clear all filters first.
- Select the Item column
- Navigate to *Home* tab, on the *Editing* group click on _Find &amp;amp; Select_ 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Ffk5xwb2fmxukxtgu80ma.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%2Ffk5xwb2fmxukxtgu80ma.png" alt=" " width="75" height="117"&gt;&lt;/a&gt;&lt;br&gt;
    - From the dropdown options, click on &lt;em&gt;Replace&lt;/em&gt;&lt;br&gt;
    - In the Dialog box, leave the &lt;em&gt;Find what:&lt;/em&gt; text box, leave it blank. We are finding blanks&lt;br&gt;
    - On the &lt;em&gt;Replace with&lt;/em&gt; textbox enter "Unknown" text, and click &lt;em&gt;Replace All&lt;/em&gt; to make the changes.&lt;/p&gt;

&lt;p&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%2Fhtiuojjwbt6mi92zc7jm.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%2Fhtiuojjwbt6mi92zc7jm.png" alt=" " width="733" height="301"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- A message box will be displayed showing how many blanks the changes were made to.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F4ksw75f59k2zfchje72k.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%2F4ksw75f59k2zfchje72k.png" alt=" " width="360" height="177"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also, you can use the &lt;code&gt;IF()&lt;/code&gt; function to find and replace missing values in a column. The syntax is &lt;code&gt;=IF(B2="", "Unknown", B2)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Explanation&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;B2="": Cell referencing the value contained in it; also the condition to check if B2 is blank.&lt;/li&gt;
&lt;li&gt;Unknown: Value returned if B2="" is TRUE, that is, it is blank.&lt;/li&gt;
&lt;li&gt;B2: If B2="" is FALSE, it retains the value or text held in B2.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To achieve this, you need to create a blank column to the right of the item column, then enter the function in cell &lt;code&gt;C2&lt;/code&gt;, copy and drag down the formula, then copy the values held in cell C2:C10001, then paste special (As values only) the values into cell B2. All the other text values will be replaced.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*Text Cleaning and Standardization*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Inconsistencies such as trailing whitespaces, unprintable characters, and mixed text cases are common in text-based data. However, Excel offers functions that we can use to correct these errors and mishaps.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What is an Excel Function?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A function in Excel is an inbuilt formula used to perform mathematical, logical, statistical, or financial operations in Excel. A function must begin with an equal sign.&lt;/p&gt;

&lt;p&gt;In cleaning text data, we use functions such as:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;a. TRIM()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Used to remove extra spaces that were typed into cells and fields.&lt;/p&gt;

&lt;p&gt;In our dataset, we can apply the function to Item to remove any trailing or extra spaces. &lt;/p&gt;

&lt;p&gt;We need a new column to do this, then later copy and paste special the values of the new column.&lt;/p&gt;

&lt;p&gt;In Cell C2 of the new column, type the formula on it and press Enter, then copy it down the column to get the rest of the values.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;=TRIM(B2)&lt;/code&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;b. CLEAN()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Used to remove any unprintable characters. Also requires a new column and later copying the values into the original column.&lt;/p&gt;

&lt;p&gt;We are going to work on the &lt;em&gt;Item&lt;/em&gt; column, then copy the values to the original column.&lt;/p&gt;

&lt;p&gt;In cell C2 enter &lt;code&gt;=CLEAN(B2)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Copy the formula down to auto-fill values.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;c. LEFT(), RIGHT(), and MID()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;LEFT() is used to extract the specified number of characters from a text value starting from the left. I.e. Extracting the first three characters of the &lt;em&gt;Transaction ID&lt;/em&gt; we use &lt;code&gt;=LEFT(A2, 3)&lt;/code&gt; and we get "TXN"&lt;/li&gt;
&lt;li&gt;RIGHT() extracts the specified number of characters starting from the right. I.e., extracting the last three characters of the transaction ID in cell A2: &lt;code&gt;=RIGHT(A2, 3)&lt;/code&gt; we get "124"&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MID() is used to extract a specified number of characters starting from a specified position. I.e. extacting the 4 characters of the &lt;em&gt;Transaction ID&lt;/em&gt; starting position 2. &lt;code&gt;=MID(A2,2,4)&lt;/code&gt; we get "N_99"&lt;/p&gt;

&lt;p&gt;d. UPPER(), PROPER(), and LOWER()&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;UPPER() - Converts a text string into all uppercase.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;PROPER() - Converts a text string into proper case; that is, it capitalizes the first letter of each word. We will convert our &lt;em&gt;Item&lt;/em&gt; column to proper case for consistency.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;LOWER() - Converts a text string into all lowercase.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To convert our Item column into proper case, we need another column, then copy the values back to the original column.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Use this function in cell C2 `=PROPER(B2)`
- Copy it down through the column for all values.
- All the Item values have been converted into proper case.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Standardizing Dates&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Dates may be formatted as:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- MM/DD/YYYY
- DD/MM/YYYY
- YYYY-MM-DD
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;And sometimes they may be misinterpreted depending on the local regional settings. &lt;/p&gt;

&lt;p&gt;To format a date, you may use the Excel built-in date feature by following the steps below:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Select the date column
- Go to *Home* tab, on the _Number_ group, from the drop down list choose _More numbers Formats_.
- From the dialog window, choose _Dates_ from the right section, then specify the date format you prefer and click *OK* to apply the changes.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;We'll format the &lt;em&gt;Transaction Date&lt;/em&gt; and change the column to Date format for consistency.&lt;/p&gt;

&lt;p&gt;Alternatively, you can use the &lt;code&gt;TEXT()&lt;/code&gt; function to format dates. The syntax is, e.g., &lt;code&gt;=TEXT(H2, "MM/DD/YYYY),&lt;/code&gt; where H2 is a field containing a date.&lt;/p&gt;

&lt;p&gt;Other date functions can help us work best with dates. I.e. NOW(), TODAY(), DATEDIF(), YEAR(),MONTH(), WEEK(), DAY()... You can research them.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;e. CONCAT()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Used for joining two or more texts. For example: Joining the first and last name to make one name.&lt;/p&gt;

&lt;p&gt;i.e. &lt;code&gt;=CONCAT(A1," ", B1)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This is important for preparing data for standardized formatting, reporting, or creating lookups across datasets.&lt;/p&gt;

&lt;p&gt;There are many more functions that can be used to handle text data.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*Handling Outliers*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Outliers are errors resulting from values that are much higher or lower than the expected range. For example: finding a person with an age of 223 in the age field. &lt;/p&gt;

&lt;p&gt;The errors may result from human error, measurement inconsistencies, or valid but extreme occurrences.&lt;/p&gt;

&lt;p&gt;We can use &lt;em&gt;Filter &amp;amp; Sort&lt;/em&gt; to work around these inconsistencies. We can also use basic statistics to determine these errors.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Basic statistics: Mean, Standard Deviation, Median, and Mode&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Mean and Standard deviation are data-driven methods to define what is considered a normal dataset.&lt;/p&gt;

&lt;p&gt;AVERAGE() function is used to calculate the mean. i.e., calculating the average &lt;em&gt;Quantity&lt;/em&gt; in our data.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;=AVERAGE(C2:C10001)&lt;/code&gt; We get &lt;em&gt;3&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;STDEV() is used to find the standard deviation of a sample. i.e the standard deviation of our &lt;em&gt;Quantity&lt;/em&gt; column:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;=STDEV(C2:C10001)&lt;/code&gt; we get 1.4&lt;/p&gt;

&lt;p&gt;Values more than 2 or 3 standard deviations from the mean may be considered outliers.&lt;/p&gt;

&lt;p&gt;MODE() and MEDIAN() functions are used to find the value with the highest frequency and the middle number, respectively.&lt;/p&gt;

&lt;p&gt;For missing values, depending on the type of data you are working on. The mean, mode, or median can be used to fill in the missing values, considering that the data distribution is normal.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*Data Validation and Restriction*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Data validation ensures that data entered into a worksheet conforms to specific rules or formats, minimizing the risk of errors or inconsistencies. It is important before data collection is carried out. However, you can validate your data if already been collected to avoid future data entry errors.&lt;/p&gt;

&lt;p&gt;For example: We are going to validate our &lt;em&gt;Location&lt;/em&gt; field to only allow "In Store", "Take Away", or "Unknown".&lt;/p&gt;

&lt;p&gt;To access data validation:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Select the _Location_ column in our dataset.
- Click on the *Data* tab from our Ribbon
- Click on the validation icon.     
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fo6ocsdt7d9s9bpwwz8xf.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%2Fo6ocsdt7d9s9bpwwz8xf.png" alt=" " width="66" height="40"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- From the dialog box, choose List as the validation criteria
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F4blg6o72rsnms4vvlv4a.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%2F4blg6o72rsnms4vvlv4a.png" alt=" " width="649" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Enter the list of items, separated by commas, OR refer to a list range.
- Here is how it looks on the worksheet.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fts10adkgx7k2le8g4ozk.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%2Fts10adkgx7k2le8g4ozk.png" alt=" " width="225" height="159"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Error Alerts and Input Message&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;These are useful guides during data entry.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Input Message:&lt;/em&gt; A brief output that appears when the user selects the validated cell, offering guidance on the expected input.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Error Alert:&lt;/em&gt; A message that appears if the user tries to enter invalid data. &lt;em&gt;Stop:&lt;/em&gt; blocks entry, &lt;em&gt;Warning:&lt;/em&gt; Allows the entry but prompts the user, and &lt;em&gt;Information:&lt;/em&gt; gives the user feedback without blocking.&lt;/p&gt;

&lt;p&gt;These messages, if well designed they reduce confusion and improve the quality of the data.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*Pivot Tables*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Pivot tables are tools in Excel that we can use to summarize our data. They are important tools used during visualization to create charts.&lt;/p&gt;

&lt;p&gt;To create a pivot table in Excel:&lt;/p&gt;

&lt;p&gt;Select the data&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click on *Insert_ tab, and from &lt;em&gt;Tables&lt;/em&gt; group click o &lt;em&gt;Pivot Table&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;From the dialog box, choose where to enter your pivot table; choose a new sheet&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%2Fs5it9nxwp6l17n7y4pme.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%2Fs5it9nxwp6l17n7y4pme.png" alt=" " width="800" height="728"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click OK&lt;/li&gt;
&lt;li&gt;Select the fields you want to summarize using your Pivot Table.&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%2F0zzcq14fnxqfxg1ok1m8.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%2F0zzcq14fnxqfxg1ok1m8.png" alt=" " width="798" height="706"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary of the Complete Data Cleaning Process
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Selected all my data and converted it into a table. I used the shortcut &lt;em&gt;Ctrl + T&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Added &lt;em&gt;BOLD&lt;/em&gt; to my column titles and increased their font size to 14.&lt;/li&gt;
&lt;li&gt;Used filters and sort to inspect my data. Accessed the dataset to find missing values, outliers, or any inconsistencies within the data.&lt;/li&gt;
&lt;li&gt;Found blanks, columns with &lt;em&gt;ERROR&lt;/em&gt;, and &lt;em&gt;UNKNOWN&lt;/em&gt; as their input. I used Find and Replace to fill the blanks with &lt;em&gt;Unknown&lt;/em&gt;, and also replaced &lt;em&gt;ERROR&lt;/em&gt; and &lt;em&gt;UNKNOWN&lt;/em&gt; with &lt;em&gt;Unknown&lt;/em&gt; for consistency. &lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Quantity&lt;/em&gt; Column: Used Find and Replace to replace the text strings &lt;em&gt;ERROR&lt;/em&gt; and &lt;em&gt;UNKNOWN&lt;/em&gt; with blanks. Secondly, I set the data type for the column to &lt;em&gt;Number&lt;/em&gt; type, a whole number without a fraction part.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Price Per Unit&lt;/em&gt; Column:  Used Find and Replace to replace the text strings &lt;em&gt;ERROR&lt;/em&gt; and &lt;em&gt;UNKNOWN&lt;/em&gt; with blanks. Converted the column to the &lt;em&gt;Currency&lt;/em&gt; type with the United States Dollar sign as the currency prefix, formatted to 2 decimal places. From observation through sorting and filtering, using the item and its respective price per unit, all items add up to the same price for the individual item. I had to manually fill in the blanks for individual items with the correct price.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Total Spent&lt;/em&gt; Column: Used Find and Replace to replace the text strings &lt;em&gt;ERROR&lt;/em&gt; and &lt;em&gt;UNKNOWN&lt;/em&gt; with blanks. Converted the column to the &lt;em&gt;Currency&lt;/em&gt; type with the United States Dollar sign as the currency prefix, formatted to 2 decimal places. From the observation through sorting and filtering, total spent was the product of &lt;em&gt;Quantity&lt;/em&gt; and &lt;em&gt;Price Per Unit&lt;/em&gt;. So, I had to recalculate the total spent on each transaction using the PRODUCT() function in a new column, then used copy and paste special to paste the new values into the &lt;em&gt;Total Spent&lt;/em&gt; column.&lt;/li&gt;
&lt;li&gt;Recalculated the Quantity since some values were blank, yet they had the &lt;em&gt;Price Per Unit&lt;/em&gt; and &lt;em&gt;Total Spent&lt;/em&gt; filled. To get the &lt;em&gt;Quantity&lt;/em&gt; used the formula &lt;code&gt;=[@Total Spent]/[@Price Per Unit]&lt;/code&gt;. Then used Paste Special.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Payment Method&lt;/em&gt; Column: Used Find and Replace to replace the text strings &lt;em&gt;ERROR&lt;/em&gt; and &lt;em&gt;UNKNOWN&lt;/em&gt; with &lt;em&gt;Unknown&lt;/em&gt;. Validated the field as a list field with the following options: "Cash", "Credit Card", "Digital Wallet", and "Unknown".&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Location&lt;/em&gt; Column: Found blanks, columns with &lt;em&gt;ERROR&lt;/em&gt;, and &lt;em&gt;UNKNOWN&lt;/em&gt; as their input. Used Find and Replace to fill the blanks with &lt;em&gt;Unknown&lt;/em&gt;, and also replaced &lt;em&gt;ERROR&lt;/em&gt; and &lt;em&gt;UNKNOWN&lt;/em&gt; with &lt;em&gt;Unknown&lt;/em&gt; for consistency. Validated the field as a list type with only three fields: "In-Store", "Take Away", and "Unknown"&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Transaction Date&lt;/em&gt; Column: Found blanks, columns with &lt;em&gt;ERROR&lt;/em&gt;, and &lt;em&gt;UNKNOWN&lt;/em&gt; as their input replaced &lt;em&gt;ERROR&lt;/em&gt; and &lt;em&gt;UNKNOWN&lt;/em&gt; with &lt;em&gt;Blanks&lt;/em&gt; for consistency. The blanks were untouched. Then converted the field to a date type with the format "DD/MM/YYYY".&lt;/li&gt;
&lt;li&gt;Inserted a pivot table summarizing the quantity of each item. &lt;/li&gt;
&lt;li&gt;Found the average quantity, price per unit, and total spent.&lt;/li&gt;
&lt;li&gt;Found the maximum and minimum price per unit.&lt;/li&gt;
&lt;li&gt;Found the Total sales using the SUM() function. i.e. =SUM(E:E)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are the operations performed on the dataset.&lt;/p&gt;

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

&lt;p&gt;We have learnt great and unique technical skills in data analysis. We have found how important data analysis is and the best way to carry it out. If standardized, results will be meaningful in helping stakeholders make informed decisions that drive growth. Data cleaning is the most time consuming in the whole process, but if done right, it will serve a great deal.&lt;/p&gt;

</description>
      <category>datascience</category>
      <category>database</category>
      <category>beginners</category>
      <category>excel</category>
    </item>
    <item>
      <title>My First Project: From a Local Folder to GitHub Using Git and SSH</title>
      <dc:creator>Makori Nyachaki</dc:creator>
      <pubDate>Sun, 23 Aug 2026 05:34:57 +0000</pubDate>
      <link>https://dev.to/makorinyachaki/my-first-project-from-a-local-folder-to-github-using-git-and-ssh-9eb</link>
      <guid>https://dev.to/makorinyachaki/my-first-project-from-a-local-folder-to-github-using-git-and-ssh-9eb</guid>
      <description>&lt;h1&gt;
  
  
  My First Project: From a Local Folder to Git hub Using Git and SSH
&lt;/h1&gt;

&lt;h2&gt;
  
  
  GIT
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;Git is an open source version control system used to manage projects. It is fast and efficient to manage projects using git. You can easily track the project version, history, modifications, and many more project activities. It allows for ease of collaboration while working on projects as teams.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installing Git
&lt;/h3&gt;

&lt;p&gt;Download and install git from &lt;a href="https://git-scm.com/install/windows" rel="noopener noreferrer"&gt;Git&lt;/a&gt;. Ensure you download for your respective operating system.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configuring Git
&lt;/h3&gt;

&lt;p&gt;Before using Git effectively, you have to configure your identity by setting up your &lt;em&gt;username&lt;/em&gt; and &lt;em&gt;email&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;This allows to easily track any changes to your project and the associate, that is; who made the changes?&lt;/p&gt;

&lt;p&gt;To set up your identity, follow the following steps, using Git Bash a git terminal:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Steps&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;To set your username&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git config --global user.name "YOUR NAME"&lt;/code&gt;&lt;/p&gt;
&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%2Fm2klshvu1cg81rnk5b9h.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%2Fm2klshvu1cg81rnk5b9h.png" alt=" " width="490" height="33"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In place of &lt;em&gt;YOUR NAME&lt;/em&gt; type in your correct user name that will be associated with your github account activity.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;To set your email&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git config --global user.email "youemail@example.com"&lt;/code&gt;&lt;/p&gt;
&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%2Fsgftb5445ya6u0h7se9d.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%2Fsgftb5445ya6u0h7se9d.png" alt=" " width="532" height="37"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; It is recommended to use your correct email that is associated with your GitHub account.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Rename you GitHub branch to &lt;em&gt;main&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git config --global init.Branch main&lt;/code&gt;&lt;/p&gt;
&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%2Fq4b2fl8gsgnl5wp1ua9m.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%2Fq4b2fl8gsgnl5wp1ua9m.png" alt=" " width="486" height="31"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;After setting up your identity you can verify your configurations to confirm your identity for each field set.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To check your:&lt;/p&gt;

&lt;p&gt;User name&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`git config --global user.name`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Email&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`git config --global user.email`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Branch&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git config --global init.Branch`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;OR&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can use the following command to check all you account details instead:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`git config --global --lists`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F1cgsansyzn2xjgc4yqqa.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%2F1cgsansyzn2xjgc4yqqa.png" alt=" " width="648" height="196"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  SSH
&lt;/h2&gt;

&lt;p&gt;SSH key is a secure credential used to authentication to accessing network resources confidentially without need of a password. The ssh-key contains two keys. A &lt;em&gt;&lt;strong&gt;Public&lt;/strong&gt;&lt;/em&gt; and &lt;em&gt;&lt;strong&gt;Private&lt;/strong&gt;&lt;/em&gt; key. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Public key&lt;/strong&gt; is used publicly, that is it is shared between peers. Used to identify you remote resources.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Private key&lt;/strong&gt; it is a pair key that is kept as a secret for identifying your local machine.&lt;/p&gt;

&lt;h3&gt;
  
  
  Generating an SSH Key
&lt;/h3&gt;

&lt;p&gt;Using Git Bash&lt;/p&gt;

&lt;p&gt;Before generating a new SSH Key, it is recommended to check and confirm if you have an existing key which you can use.&lt;/p&gt;

&lt;p&gt;To check if you have an existing key use the following command:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`ls -al ~/.ssh`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The command will list all existing ssh keys. Here sample output:&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%2Ffp2p0ax8ew91mgfn9w4s.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%2Ffp2p0ax8ew91mgfn9w4s.png" alt=" " width="798" height="166"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If there is no existing key, you can generate a new key that you will use to link your computer with your github account.&lt;/p&gt;

&lt;p&gt;To generate a new ssh key, follow the following steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Genereate a new ssh-key&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ssh-keygen -t ed25529 -C "youremail@example.com"&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The email should be the one associated with with your github account.&lt;/p&gt;

&lt;p&gt;Follow the prompt by adding the name of your key, and also you can add the passphrase which is optional.&lt;/p&gt;

&lt;p&gt;The passhrase should be memorable, you will need to use it each time you want to access you github account.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add your key to the SSH-Agent.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Open your Powershell Terminal and follow the steps below:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Run the following command to start your SSH Agent

    `Get-Service -Name ssh-agent | Set-Service StartupType Manual`

- Add your key to the  path using the  command

    `ssh-add &amp;lt;PATH/TO/YOUR/PRIVATE_KEY&amp;gt;`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;After the command, you should specifify the path to your private key and add it to your host machine's ssh-agent. i.e. &lt;code&gt;ssh-add "C:/Users/&amp;lt;YOUR_USER_NAME/.ssh/&amp;lt;YOUR_PRIVATE_KEY&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If you don't know your computer's user name, you can use the &lt;code&gt;whoami&lt;/code&gt; command to see your username.&lt;/p&gt;

&lt;p&gt;Your &lt;em&gt;PRIVATE_KEY_NAME&lt;/em&gt; is the name that you gave to your key.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Once you're done, close your Powershell terminal and return to Git Bash.

- Type the following command

    `git config --global core.sshCommand "C:/Windows/System32/OpenSSH/ssh.exe`

- Then Clip and copy your key using the following commands:

    `clip &amp;lt; ~/.ssh/&amp;lt;PUBLIC_KEY.pub&amp;gt;`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;i.e &lt;code&gt;clip &amp;lt; /.ssh/my_key.pub&lt;/code&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    `cat ~/.ssh/&amp;lt;PUBLIC_KEY.pub&amp;gt;`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;i.e. 'cat ~/.ssh/my_key.pub` to view your public ssh key&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- After displaying your key, select and copy the key to add to your GitHub account.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  Adding Your Key to GitHub
&lt;/h3&gt;

&lt;p&gt;To connect your computer and git-hub is necessary to facilitate access to your remote resources from your local computer.&lt;/p&gt;

&lt;p&gt;You need to add your SSH Keys to GitHub to facilitate the connection. To achieve this, follow the steps:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you have an existing GitHub account:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;a. Login to your account using your email/username and password.&lt;/p&gt;

&lt;p&gt;b. From the profile section, go to &lt;em&gt;Settings&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;c. Scroll to &lt;em&gt;SSH and GPG Key&lt;/em&gt;. Navigate and click on &lt;em&gt;New SSH Key&lt;/em&gt; on the SSH Key Section to your right.&lt;/p&gt;

&lt;p&gt;e. Add the &lt;em&gt;Title/Name&lt;/em&gt; of the key i.e. &lt;em&gt;Ubuntu Laptop&lt;/em&gt;, the key will be used for &lt;em&gt;Authentication&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;f. Paste your key to the available textbox.&lt;/p&gt;

&lt;p&gt;g. Finally, click on &lt;em&gt;Add Key&lt;/em&gt; to save your key. You'll be prompted to re-enter your git-hub account password (login password), to confirm your authenticity before saving.&lt;/p&gt;

&lt;p&gt;Now you are ready to go. Before you start, it is good you test your connection to check if it was successful.&lt;/p&gt;

&lt;p&gt;Run Powershell as an Administrator and use the following command to test connection:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`ssh -T git@github.com`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;If the connection is successful, your username will be displayed along with a success message.&lt;/p&gt;

&lt;p&gt;If successful, you are good to go and work on your project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Working With Folders
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;To keep you project structural and more organized; you've to keep its files and scripts in folders.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This will make it easier to navigate and access the project. Follow the steps below to work with folders in Windows.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In Git Bash Terminal(Opened normally)&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;To navigate and change location use the following command&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`cd &amp;lt;path_location&amp;gt;`
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To select the current location&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    `cd .`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;To get to the previous location one step back use&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    `cd ..`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Getting back to the root directory use&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    `cd ~`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;You can also move to a specific folder by specifying the path to that folder&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    `cd &amp;lt;path/to/folder&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;example: &lt;code&gt;cd "C:/Users/Admin/Desktop/My-Project"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;My-Project/&lt;/em&gt; is a folder located in Desktop, which is for the user with the username &lt;em&gt;Admin&lt;/em&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;To create a directory or folder use&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`mkdir &amp;lt;directory_name&amp;gt;`
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;i.e. Create a directory named &lt;em&gt;My-First-Project&lt;/em&gt; in Desktop &lt;code&gt;mkdir My-First-Project&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Navigate to your created folder. Assuming you are on Desktop, use the following command:&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`cd My-First-Project/`
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So your bash terminal path will look like &lt;code&gt;~/Desktop/My-First-Project&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;To list and view items use the following command&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`ls`
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It will list all files and folders excluding the hidden files and folders. As shown 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%2Fv8l5ka6phzhoqyibjcse.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%2Fv8l5ka6phzhoqyibjcse.png" alt=" " width="800" height="125"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To list and view all files and folders including the hidden ones you add &lt;em&gt;-a&lt;/em&gt; attribute to the &lt;code&gt;ls&lt;/code&gt; command as below&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    `ls -a`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F2wt7jom89ta8ny7tosie.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%2F2wt7jom89ta8ny7tosie.png" alt=" " width="800" height="128"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To list files and display their attributes we add the &lt;em&gt;-l&lt;/em&gt; attribute to the &lt;code&gt;ls&lt;/code&gt; command.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    `ls -l`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fdmop7m63pzur63y7o0ic.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%2Fdmop7m63pzur63y7o0ic.png" alt=" " width="798" height="210"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; You can combine the attributes to list all files and their attributes i.e. as &lt;code&gt;ls -al&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;You can delete an empty folder using &lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`rm -r &amp;lt;folder_name&amp;gt;`
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To delete a folder together with its contents we use the &lt;code&gt;rm -r &amp;lt;non-empty_folder_name&amp;gt;&lt;/code&gt; command.&lt;/p&gt;

&lt;p&gt;Example: Create a folder in you my project folder using the &lt;code&gt;mkdir&lt;/code&gt; command, inspect the folder created and its contents, then delete the folder using the rm command:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Steps&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Create scripts: &lt;code&gt;mkdir scripts&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Navigate to scripts and back to your project folder: &lt;code&gt;cd scripts/&lt;/code&gt; and &lt;code&gt;cd ..&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Inspect scripts: &lt;code&gt;ls scripts/&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Delete scripts: &lt;code&gt;rm -r scripts/&lt;/code&gt;&lt;/p&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%2F4q6swbhytblh9sv2f3ao.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%2F4q6swbhytblh9sv2f3ao.png" alt=" " width="799" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; &lt;code&gt;rm&lt;/code&gt; without any attribute will no delete a directory/folder even if empty, the attribute &lt;em&gt;-r&lt;/em&gt; tells the command &lt;code&gt;rm&lt;/code&gt; that what you're deleting is a directory.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You can copy and paste contents between different folders.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To copy contents moves a duplicate of the files to another location leaving the original intact.&lt;/p&gt;

&lt;p&gt;While using the &lt;code&gt;cp&lt;/code&gt; command you have to specify the file/contents path and the destination address. Example:&lt;/p&gt;

&lt;p&gt;To copy some file named hello.txt to the scripts folder; you need to recreate the folder and create the file in the root directory then copy it to scripts folder in your projects folder&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Steps&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;In your project folder create scripts &lt;code&gt;mkdir scripts&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Navigate to your project root folder and create the file &lt;em&gt;hello.txt&lt;/em&gt; &lt;code&gt;touch hello.txt&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Copy the file to scripts &lt;code&gt;cp hello.txt ~/scripts&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Inspect both locations to see that the file exists in both location. &lt;code&gt;ls&lt;/code&gt; and &lt;code&gt;ls scripts&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; You can specify the file path in the cp command if the file is in a different location and the destination path address &lt;/p&gt;

&lt;p&gt;i.e. &lt;code&gt;cp &amp;lt;~/path/to/file_to_be_copied.txt&amp;gt; &amp;lt;~/path/to_destination/&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You can move a file or any content completely from the source to an new destination using the &lt;code&gt;mv&lt;/code&gt; command.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example: Move &lt;em&gt;hello.txt&lt;/em&gt; file from the project's folder to a new folder named &lt;em&gt;docs&lt;/em&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`mv hello.txt docs/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; You can also specify the file path in case the files and destination address are in different locations i.e. &lt;code&gt;mv &amp;lt;~/path/from_source/hello.txt&amp;gt; &amp;lt;~/path/to_destination_folder/&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Working With Files
&lt;/h2&gt;

&lt;p&gt;While working in your project you will need to create different files for your project.&lt;/p&gt;

&lt;p&gt;The different files will be saved in different directories depending on their type and use. &lt;/p&gt;

&lt;p&gt;The organization will help us to achieve a proper project structure, easier to navigate and access our project files.&lt;/p&gt;

&lt;p&gt;We will create our files using Git Bash terminal.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To create a file we'll use the &lt;code&gt;touch&lt;/code&gt; command. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Create a file named &lt;em&gt;hello-world.txt&lt;/em&gt; in your project root directory.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    `touch hello-world.txt`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Use the &lt;code&gt;ls&lt;/code&gt; command to confirm your file has been created.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;To view the contents of the file we use the &lt;code&gt;cat&lt;/code&gt; command, since our file is empty it will display 'nothing'.&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`cat hello-world.txt`
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To add contents to our file we use the &lt;code&gt;echo&lt;/code&gt; command.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Add the following text to the file &lt;em&gt;hello-world.txt&lt;/em&gt;; "Hello, World"&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    `echo "Hello, World!" &amp;gt; hello-world.txt`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Ffccmiel0gdoohobtiwby.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%2Ffccmiel0gdoohobtiwby.png" alt=" " width="483" height="27"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We use the &lt;em&gt;&amp;gt;&lt;/em&gt; to redirect the output to our file. &lt;em&gt;&amp;gt;&lt;/em&gt; Rewrites any content in the file. &lt;/p&gt;

&lt;p&gt;If you want to add more content to the file use &lt;em&gt;&amp;gt;&amp;gt;&lt;/em&gt;, more text will be added to our file. &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%2Fwdfqh2byidzkfb9f0zkl.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%2Fwdfqh2byidzkfb9f0zkl.png" alt=" " width="675" height="43"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Example; add the following text to our file "I am happy to learn SSH and Git".&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    `echo "I am happy to learn Git and SSH" &amp;gt;&amp;gt; hello-world.txt`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cat hello-world.txt&lt;/code&gt; to view the contents of the file.&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%2Fej57klmspja8riwtn850.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%2Fej57klmspja8riwtn850.png" alt=" " width="439" height="82"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;* Editing you file using nano *&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Nano is an inbuilt text editor in Git Bash.&lt;/p&gt;

&lt;p&gt;It helps us to navigate through our files; scripts, text file, .... once we make mistakes.&lt;/p&gt;

&lt;p&gt;To open our script or text file we use the &lt;code&gt;nano&lt;/code&gt; command in git bash then specify the file we want to open, for example open &lt;em&gt;hello-world.txt&lt;/em&gt; using nano:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    `nano hello-world.txt'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F57izzxrx1dx3aw0z2zhj.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%2F57izzxrx1dx3aw0z2zhj.png" alt=" " width="693" height="265"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are many more commands for nano that will help you edit your text file. For example the most common commands are:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Ctr + O - To save your file

2. Ctrl + X - To exit your nano text editor

3. Ctrl + K - To Cut text in the editor

4. Ctrl + U - To Paste your text

5. Ctrl + G - To find help for you nano editor.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;There are many more commands of help that you can use to edit you files in nano editor.&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%2Fqlt2qdhhgchhi27je0fg.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%2Fqlt2qdhhgchhi27je0fg.png" alt=" " width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Your First Project
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Initialize your first project with git
&lt;/h3&gt;

&lt;p&gt;Before running the command, check to confirm that you are in your project folder using the &lt;code&gt;pwd&lt;/code&gt; command. &lt;/p&gt;

&lt;p&gt;The &lt;code&gt;pwd&lt;/code&gt; command means &lt;em&gt;print working directory&lt;/em&gt;  it shows your current location with regard to the root directory.&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%2Fpcuz99l2l79zybxvl6oh.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%2Fpcuz99l2l79zybxvl6oh.png" alt=" " width="595" height="57"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If in your project directory, the path will end with the name of the project folder. I.e. &lt;em&gt;My-First-Project&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Use the &lt;code&gt;git init&lt;/code&gt; command.&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%2F247lvpe6jyclmjvnr0mf.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%2F247lvpe6jyclmjvnr0mf.png" alt=" " width="800" height="44"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The command is used to initialize our project directory as a git repository.&lt;/p&gt;

&lt;h3&gt;
  
  
  Git repository structure.
&lt;/h3&gt;

&lt;p&gt;After running the above command, you may notice notification  of git initializing an empty git repo...&lt;/p&gt;

&lt;p&gt;If you list to view the structure using the &lt;code&gt;ls&lt;/code&gt; command you may notice a &lt;em&gt;.git/&lt;/em&gt; folder.&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%2Fbbr03ybcaz3k1k981pqf.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%2Fbbr03ybcaz3k1k981pqf.png" alt=" " width="604" height="70"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The folder contains Git's internal repository information, which git uses to manage activities such as: push, commits, pull, Branches, project history, repository configurations,....&lt;/p&gt;

&lt;h3&gt;
  
  
  Checking the project status
&lt;/h3&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    `git status`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Used to show what's happening with your project currently. &lt;/p&gt;

&lt;p&gt;It can show things such as untracked files, staged files to be committed yet, if the working tree is clean meaning everything has been committed.&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%2Fxfxrbvxtrpkzz7s5lbjp.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%2Fxfxrbvxtrpkzz7s5lbjp.png" alt=" " width="799" height="220"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The above show that there is nothing that has been staged for commit, there are three untracked files in the initialized repository.&lt;/p&gt;

&lt;h3&gt;
  
  
  Staging your project files
&lt;/h3&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    `git add .`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fh4kecaxriw57axl4zqj5.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%2Fh4kecaxriw57axl4zqj5.png" alt=" " width="800" height="48"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It adds your project files to git for tracking.&lt;/p&gt;

&lt;p&gt;Checking on the status of the staged file, you should get such an output with &lt;code&gt;git status&lt;/code&gt; command&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%2Fyyw2v2g37wg58rxm0x4o.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%2Fyyw2v2g37wg58rxm0x4o.png" alt=" " width="800" height="613"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It prepares all you changes for the next commit.&lt;/p&gt;

&lt;p&gt;You can stage a single file by specifying the file/folder you want to stage i.e. &lt;code&gt;git add &amp;lt;file_name.txt&amp;gt;&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%2Fy46q03xne97cxa93a32i.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%2Fy46q03xne97cxa93a32i.png" alt=" " width="800" height="34"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You should see almost a similar output when using &lt;code&gt;git status&lt;/code&gt; command after staging a single file&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%2F8wp949u9pgcm45u3qef8.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%2F8wp949u9pgcm45u3qef8.png" alt=" " width="759" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using the &lt;em&gt;.&lt;/em&gt; means you stage everything in your project folder.&lt;/p&gt;

&lt;h3&gt;
  
  
  Commiting you staged files
&lt;/h3&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    `git commit -m "&amp;lt;commit message&amp;gt;"`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Creates a saved checkpoint.&lt;/p&gt;

&lt;p&gt;The message should be precise and clear, related to the activity carried out. i.e. "My First Project Using Git Commit"&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%2F2rm4jyeyxa0vbztp66x9.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%2F2rm4jyeyxa0vbztp66x9.png" alt=" " width="800" height="582"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It does not upload anything to git-hub yet.&lt;/p&gt;

&lt;h3&gt;
  
  
  Uploading to git-hub
&lt;/h3&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    `git push -u origin &amp;lt;branch_name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fdk7kjy553cgykupctzn6.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%2Fdk7kjy553cgykupctzn6.png" alt=" " width="513" height="76"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sends all the committed changes to GitHub. However, in our case we get the above error because we have not linked our local project repo to a git-hub remote repository.&lt;/p&gt;

&lt;p&gt;We will be linking our repositories in the next section.&lt;/p&gt;

&lt;p&gt;After running this command, you can easily check on the changes whether they reflect on GitHub via your browser.&lt;/p&gt;

&lt;p&gt;However, for us we are yet to see these changes. This may not work since we are yet to create a remote repository which we will then connect to our local project in our laptop.&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating a remote repository
&lt;/h3&gt;

&lt;p&gt;To create a remote repository, follow the following steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Login to your git-hub account&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In your account click on "Create New Repository"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enter the name of your Repository as "My-First-Project"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Do not create a README, uncheck the checkbox&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide a brief descriptions for your project. The description is: "My First Project: From a Local Folder to Git hub Using Git and SSH"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Then click on Create Repository&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A new empty repository is created with the name "My-First-Project"&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Navigate to your repository&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on the &lt;em&gt;code&lt;/em&gt; section, then click on &lt;em&gt;ssh&lt;/em&gt; tab and copy the &lt;em&gt;ssh code&lt;/em&gt;&lt;/p&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%2Fvxiq5azw5r8w30i4d1m5.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%2Fvxiq5azw5r8w30i4d1m5.png" alt=" " width="800" height="524"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We'll use the ssh code to connect our remote and local repositories before pushing our project.&lt;/p&gt;

&lt;h3&gt;
  
  
  Connecting our local and remote repositories
&lt;/h3&gt;

&lt;p&gt;Navigate to your git initialized  project folder&lt;/p&gt;

&lt;p&gt;Type in the following command and thereafter paste the ssh code for your remote repository and hit enter.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    `git remote add origin &amp;lt;your_remote_ssh_code&amp;gt;`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;i.e. &lt;code&gt;git remote add origin git@github.com:MakoriNyachaki/My-First-Github-Project.git&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%2Fsy23kp10jw9rabxkx8ys.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%2Fsy23kp10jw9rabxkx8ys.png" alt=" " width="800" height="77"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Rename your branch
&lt;/h3&gt;

&lt;p&gt;If your remote repository's branch is not &lt;em&gt;main&lt;/em&gt; rename it to &lt;em&gt;main&lt;/em&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    `git branch -m main`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F7y5wp945ky3xes3mmybe.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%2F7y5wp945ky3xes3mmybe.png" alt=" " width="799" height="49"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Check the remote
&lt;/h3&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    `git remote -v`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fqx90sivwfrdpo5706rk9.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%2Fqx90sivwfrdpo5706rk9.png" alt=" " width="800" height="77"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Push your project to git-hub
&lt;/h3&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    `git push -u origin &amp;lt;branch_name&amp;gt;`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;i.e. &lt;code&gt;git push -u origin main&lt;/code&gt; this works to upload our committed changes to our git-hub repository.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;An introductory article for learning GIT and SSH. It is thrilling practical exercise for generating ssh keys, working with folders and files, connecting local project folders with remote repositories, and working with git. The introductory article requires one to do further research on so many commands that are available for the different tools we have used here in order to be an expert. Let's learn forward.&lt;/p&gt;

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