<?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: David Samuel</title>
    <description>The latest articles on DEV Community by David Samuel (@iblack).</description>
    <link>https://dev.to/iblack</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%2F4077400%2F2992602d-feb6-4619-8c7b-0f6721ef223e.JPG</url>
      <title>DEV Community: David Samuel</title>
      <link>https://dev.to/iblack</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/iblack"/>
    <language>en</language>
    <item>
      <title>Power BI Project: A Case Study of JCars Logistics</title>
      <dc:creator>David Samuel</dc:creator>
      <pubDate>Tue, 29 Sep 2026 18:26:58 +0000</pubDate>
      <link>https://dev.to/iblack/power-bi-project-a-case-study-of-jcars-logistics-phh</link>
      <guid>https://dev.to/iblack/power-bi-project-a-case-study-of-jcars-logistics-phh</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;JCars Logistics is a car sales business. The business serves a diverse range of clients including, individuals, corporates, and even the government. Jcars has 8 branches stocking different car makes. The business has 10 sales representatives tasked with driving sales across the 8 branches while leveraging different lead sources such as social media. For this analysis, the goal was to create diverse KPIs and helping the business gain a deeper understanding of how the business is performing. The analysis was a gradual process that yielded meaningful insights for the business. &lt;/p&gt;

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

&lt;p&gt;The availed raw facts table was quite messy. The table contained erroneous data types, a mix of currencies, mixed date formats, and a mix of upper- and lower-case characters. Such mix-ups necessitated cleaning and preparation prior to performing subsequent analysis. &lt;/p&gt;

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

&lt;p&gt;The first step of cleaning and preparing the data entailed loading it to Power BI and creating column headers. &lt;/p&gt;

&lt;h2&gt;
  
  
  Cleaning Text Columns
&lt;/h2&gt;

&lt;p&gt;J Cars facts table had the following text columns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Order ID&lt;/li&gt;
&lt;li&gt;Customer Name&lt;/li&gt;
&lt;li&gt;Customer Type&lt;/li&gt;
&lt;li&gt;Region&lt;/li&gt;
&lt;li&gt;County &lt;/li&gt;
&lt;li&gt;City&lt;/li&gt;
&lt;li&gt;Branch&lt;/li&gt;
&lt;li&gt;Sales Rep&lt;/li&gt;
&lt;li&gt;Lead Source&lt;/li&gt;
&lt;li&gt;Car Make&lt;/li&gt;
&lt;li&gt;Car Model&lt;/li&gt;
&lt;li&gt;Vehicle Type&lt;/li&gt;
&lt;li&gt;Vehicle Year&lt;/li&gt;
&lt;li&gt;Fuel Type&lt;/li&gt;
&lt;li&gt;Transmission&lt;/li&gt;
&lt;li&gt;Colour&lt;/li&gt;
&lt;li&gt;Payment Method&lt;/li&gt;
&lt;li&gt;Payment Status&lt;/li&gt;
&lt;li&gt;Delivery Status&lt;/li&gt;
&lt;li&gt;Returned&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%2Fz1tmjvl3livhogph9fla.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%2Fz1tmjvl3livhogph9fla.png" alt="Examples of Text Columns" width="505" height="789"&gt;&lt;/a&gt;&lt;br&gt;
All these text columns shared similar problems such as a mix of characters, missing values, misspellings and word shortforms as well as presence of hyphens, “N/A” and “missing” in cells that ought to have been left blank. Cleaning was done for each column individually and entailed:&lt;br&gt;
&lt;em&gt;Trimming&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%2Ft297900uj219gj0xc8i7.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%2Ft297900uj219gj0xc8i7.png" alt="Trimming Text" width="339" height="200"&gt;&lt;/a&gt;&lt;br&gt;
Most of the text had leading, trailing, and excessive internal spaces. This was corrected by highlighting a column, right-clicking on it and then selecting “trim” from the “transform” button.&lt;br&gt;&lt;br&gt;
&lt;em&gt;Transforming Text to Proper Case&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%2Fmbfpsgar514pzz3pshzz.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%2Fmbfpsgar514pzz3pshzz.png" alt="Capitalizing Words" width="341" height="233"&gt;&lt;/a&gt;&lt;br&gt;
Capitalizing each word was crucial in eliminating a mix of upper- and lower-case characters. It was especially instrumental in writing people’s and places’ names in columns such as “Sales Rep”, “Customer Name”, “County” and “City” correctly. &lt;br&gt;
&lt;em&gt;Replacing Values&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%2Fypuxn9nbpo8r1tbrouny.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%2Fypuxn9nbpo8r1tbrouny.png" alt="Replacing Values" width="338" height="159"&gt;&lt;/a&gt;&lt;br&gt;
Replacing values was crucial in correcting misspelt words and getting rid of unnecessary texts or punctuation marks. For instance, the approach was used in correcting misspelling in the name “Kev1N”, and replacing texts such as “missing” with blanks or “Unknown”. &lt;/p&gt;
&lt;h2&gt;
  
  
  Cleaning Date Columns
&lt;/h2&gt;

&lt;p&gt;JCars facts table had the following date columns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Order Date&lt;/li&gt;
&lt;li&gt;Delivery Date&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%2F4r4y2hb6cyh5bowd3aug.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%2F4r4y2hb6cyh5bowd3aug.png" alt="Date Columns" width="508" height="313"&gt;&lt;/a&gt;&lt;br&gt;
The date columns were a mix of different date formats including, Excel date serials, MM/DD/YYYY DD/MM/YYYY and YYYY-MM-DD. For some, the month name was also included instead of the month number. With the dates appearing like that, it would be impossible to perform analysis involving dates, such as trends and changes over time. As such, it was important to alter the dates to a common date format. &lt;br&gt;
The first step involved converting the Excel date serials to MM/DD/YYYY format. Here, I created a custom column named “Custom Order Date” using the formula below:&lt;br&gt;
&lt;code&gt;Custom Order Date&lt;br&gt;
 = if Text.Length ([Order Date]) = 5&lt;br&gt;
then Date.From(Number.FromText([Order Date]))&lt;br&gt;
else [Order Date] &lt;br&gt;
&lt;/code&gt;&lt;br&gt;
The formula extracted the 5-digit Excel date serials stored as text and converted them to nullable dates whilst retaining everything else as it was in the original date column.&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%2Firmikt4cwyi2t1a49kem.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%2Firmikt4cwyi2t1a49kem.png" alt="Excel Serials to Dates" width="255" height="784"&gt;&lt;/a&gt;&lt;br&gt;
From here, I converted the rest of the dates to the DD/MM/YYYY format using locale. The output was as 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%2Fbtrv3y57b1327wfpxn3a.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%2Fbtrv3y57b1327wfpxn3a.png" alt="Fixing Dates Using Locale" width="245" height="659"&gt;&lt;/a&gt;&lt;br&gt;
The errors represented invalid dates such as 2026-13-04. Since we do not have a 13th month, Power BI detects such as errors. &lt;br&gt;
I then replaced the errors with nulls 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%2F2cjdk3sgf6m8jf6nne6t.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%2F2cjdk3sgf6m8jf6nne6t.png" alt="Replacing Errors" width="347" height="209"&gt;&lt;/a&gt;&lt;br&gt;
The final output was 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%2F01tukwia460udbuvzf63.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%2F01tukwia460udbuvzf63.png" alt="Cleaned Order Date" width="250" height="666"&gt;&lt;/a&gt;&lt;br&gt;
The same approach was applied on the delivery date column. In the end, the new order date and delivery date columns looked like this:&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%2Fkqbig40q6vkfa4la7oyz.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%2Fkqbig40q6vkfa4la7oyz.png" alt="Cleaned Dates" width="519" height="828"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Cleaning Numeric Columns
&lt;/h2&gt;

&lt;p&gt;JCars facts table had the following numeric columns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Customer Age&lt;/li&gt;
&lt;li&gt;Units Sold&lt;/li&gt;
&lt;li&gt;Discount %&lt;/li&gt;
&lt;li&gt;Customer Rating&lt;/li&gt;
&lt;li&gt;Review Count&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%2Flwl2opao5n456klf4utb.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%2Flwl2opao5n456klf4utb.png" alt="Examples of Numeric Columns" width="513" height="794"&gt;&lt;/a&gt;&lt;br&gt;
Cleaning the numeric columns entailed removing unnecessary text such as “out of 5” in the “Customer Rating” column, replacing words with their numeric equivalents (for example replacing “ten” with 10), replacing texts such as “unknown” with blank, and selecting the data type as decimal number. As such, replacing values was one of the most repeated steps in cleaning numeric columns. &lt;br&gt;
However, cleaning the discount column required a different approach. The column contained glaring issues that needed fixing prior to rendering it useful for analysis.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvs1bi5afut5b3ccakrjq.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%2Fvs1bi5afut5b3ccakrjq.png" alt="Uncleaned Discount Column" width="259" height="798"&gt;&lt;/a&gt;&lt;br&gt;
Unnecessary texts and punctuations such as hyphens, “NULL”, and “disc” were expunged by replacing them with blanks. However, “No discount” was replaced with a zero. Erroneous entries such as percentages greater than 100% and whole numbers equal or greater than 1 were replaced with nulls because it is not practically possible to offer 100% or greater discount on a car. Next, I got rid of the % sign. After getting rid of the unnecessary texts and erroneous discount percentages, the discount column only contained numerals ranging from zero to figures below 100. The figures needed further cleaning. Any figure greater than 1 had to be converted to a decimal. This effectively changed figures that were initially recorded as 3%, for instance, to 0.03 whilst retaining those that were originally recorded as decimals. For this step, I created a custom column using M language as shown below:&lt;br&gt;
&lt;code&gt;Custom Discount % &lt;br&gt;
 = if [Discount] &amp;gt;= 1 then [Discount]/100&lt;br&gt;
else [Discount]&lt;br&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%2Fglsgwxmqdrgr9y4bmc6q.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%2Fglsgwxmqdrgr9y4bmc6q.png" alt="Custom Discount %" width="800" height="395"&gt;&lt;/a&gt;&lt;br&gt;
The formula converted all numerical figures to decimals. Blank cells returned errors. As the final step, I replaced the errors with null. The final output was 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%2F0tjtmb339qojy7zqvnp2.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%2F0tjtmb339qojy7zqvnp2.png" alt="Discount %" width="175" height="758"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Cleaning Currency Columns
&lt;/h2&gt;

&lt;p&gt;JCars facts table had the following currency columns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unit Selling Price&lt;/li&gt;
&lt;li&gt;Unit Cost&lt;/li&gt;
&lt;li&gt;Delivery Fee&lt;/li&gt;
&lt;li&gt;Logistics Cost&lt;/li&gt;
&lt;li&gt;Revenue Recorded&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%2Fkv1wb4qmnjjd83qq1s2x.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%2Fkv1wb4qmnjjd83qq1s2x.png" alt="Raw Currency Columns" width="509" height="783"&gt;&lt;/a&gt;&lt;br&gt;
Currency columns contained a host of erroneous entries. Therefore, cleaning of the columns was done systematically. First, entries such as “#VALUE!”, “ERROR”, “KES”, “KSh”, hyphens, “missing”, “TBD”, and “not available” were replaced with blanks. Next, I replaced the abbreviations “EUR” and “USD” with euro and dollar signs, respectively. I also assumed that figures with a prefix “?” were meant to be represented in the dollar denomination. As such, I replaced every “?” prefix with a dollar sign. The next step involved multiplying figures recorded in millions (for example 1.9M) with 1000000 for uniformity with other currency values represented in Kenya shillings. Additionally, I had to convert figures in euros, US dollars, and the South African rand by multiplying the relevant figures with 148, 130, and 8, where the figures 148, 130, and 8 represent the exchange rates. To do this, I used the formula below:&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;Custom&lt;/span&gt;&lt;span class="w"&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;Cost&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;Text.Contains&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;Cost&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="s"&gt;"$"&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="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;Text.Remove&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;Cost&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="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"$"&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="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;130&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;Text.Contains&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;Cost&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="s"&gt;"ZAR"&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="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;Text.Remove&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;Cost&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="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"ZAR"&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="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="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;Text.Contains&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;Cost&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="s"&gt;"€"&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="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;Text.Remove&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;Cost&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="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"€"&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="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;148&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;Text.Contains&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;Cost&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="s"&gt;"M"&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="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;Text.Remove&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;Cost&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="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"€"&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="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;1000000&lt;/span&gt;

&lt;span class="n"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &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;Cost&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&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%2Fc0v4z4ny0tk5yhg8nezh.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%2Fc0v4z4ny0tk5yhg8nezh.png" alt="Formula" width="800" height="420"&gt;&lt;/a&gt;&lt;br&gt;
Next, any errors were replaced with nulls. The approach was repeated for all currency columns and the end result was:&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%2Fdlcidz75ogpf53bwzc5x.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%2Fdlcidz75ogpf53bwzc5x.png" alt="Cleaned Currency Columns" width="669" height="775"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Creation of Dimension Tables
&lt;/h2&gt;

&lt;p&gt;After cleaning the raw JCars flat table, I created 4 dimensional tables for orders, branches, customers, and sales rep. &lt;br&gt;
&lt;em&gt;Creating Orders Dimension Table&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Created a duplicate of the JCars flat table and named it “dim_orders”.&lt;/li&gt;
&lt;li&gt;Selected “Order ID”, “Order Date”, and “Delivery Date” columns.&lt;/li&gt;
&lt;li&gt;Removed other columns. &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%2F5dgotcgorn5y0z8pdl20.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%2F5dgotcgorn5y0z8pdl20.png" alt="dim_orders" width="691" height="795"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Creating Branches Dimension Table&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Created a duplicate of the JCars flat table and named it “dim_branches”.&lt;/li&gt;
&lt;li&gt;Selected “Branch” column.&lt;/li&gt;
&lt;li&gt;Removed other columns.&lt;/li&gt;
&lt;li&gt;Removed duplicates and was left with 8 rows.&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%2Fq27zs6778rx4c6bxj4ri.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%2Fq27zs6778rx4c6bxj4ri.png" alt="Duplicates Removal" width="261" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Added a custom index column with the starting index being 100 and an increment of 1 and renamed it to “Branch ID”. &lt;/li&gt;
&lt;li&gt;Reordered the columns as shown below:&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%2F7hixsmtk7k1j4lnt6uy7.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%2F7hixsmtk7k1j4lnt6uy7.png" alt="dim_branches" width="297" height="305"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Creating Sales Rep Dimension Table&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Created a duplicate of the J Cars flat table and named it “dim_sales_rep”.&lt;/li&gt;
&lt;li&gt;Selected “Sales Rep” column.&lt;/li&gt;
&lt;li&gt;Removed other columns.&lt;/li&gt;
&lt;li&gt;Removed duplicates and was left with 10 rows.&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%2F0qi6j0e50fjkgdcb6768.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%2F0qi6j0e50fjkgdcb6768.png" alt="Duplicates Removal" width="264" height="470"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Added an index column with the starting from 1 and renamed it to “Sales Rep ID. &lt;/li&gt;
&lt;li&gt;Reordered the columns as below:&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%2Fxg2lbw2nqcpckf4mlbsu.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%2Fxg2lbw2nqcpckf4mlbsu.png" alt="dim_sales_rep" width="322" height="378"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Creating Customers Dimension Table&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Created a duplicate of the J Cars flat table and named it “dim_customers”.&lt;/li&gt;
&lt;li&gt;Selected “Customer Name”, “Customer Type”, “Customer Age”, “Region”, “County”, and “City” columns.&lt;/li&gt;
&lt;li&gt;Removed other columns.&lt;/li&gt;
&lt;li&gt;Removed duplicates and was left with 276 rows. No row was deleted because no entry was an exact duplicate of any other based on similarities on all 6 columns.&lt;/li&gt;
&lt;li&gt;Added an index column starting from 1 and renamed it to “Customer ID”.&lt;/li&gt;
&lt;li&gt;Reordered the columns as below:&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%2F7w5onev3008hxtkigx9s.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%2F7w5onev3008hxtkigx9s.png" alt="dim_customers" width="800" height="457"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Creating the Final Facts Table&lt;/em&gt;&lt;br&gt;
Creating the final facts table named “facts_jcars” entailed:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Inserting “Customer ID”, “Branch ID”, and “Sales Rep ID” columns in the facts table.&lt;/li&gt;
&lt;li&gt;Removing columns in the facts table that were also present in individual dimension tables&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Inserting the ID columns was a step-wise procedure involving merging queries whereby the facts table was selected as the left table and appropriate dimension tables selected as the right tables. The tables were then joined using the left outer join and selecting matching columns. Finally, the joint table was expanded by keeping only the columns needed. In the end, the following facts table was arrived at:&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%2Fzgopu3u2o0lxfx1b33f8.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%2Fzgopu3u2o0lxfx1b33f8.png" alt="jcars_facts" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;I created a star schema whereby the facts table (“facts_jcars”) was surrounded by the four dimension tables (“dim_customers”, “dim_orders”, “dim_branches”, “dim_sales_rep” 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%2Fvvooey48wbjjl7m9es7v.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%2Fvvooey48wbjjl7m9es7v.png" alt="Data Model" width="800" height="446"&gt;&lt;/a&gt;&lt;br&gt;
Creating the relationships was crucial for allowing the separate tables to function together as a single unified field. Additionally, the relationships would allow accurate filtering and correct aggregation. &lt;/p&gt;

&lt;h2&gt;
  
  
  Creation of DAX
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Calculated Column&lt;/em&gt;&lt;br&gt;
&lt;code&gt;Discounted Selling Price = facts_jcars[Unit Selling Price] * (1- facts_jcars[Discount as %])&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Calculated Measures
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Payment Cancellations = CALCULATE(COUNTROWS(facts_jcars), facts_jcars[Payment Status] = "Cancelled")&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Total Returned = CALCULATE(COUNTROWS(facts_jcars), facts_jcars[Returned] = "Yes")&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Total Cars Sold = (SUM(facts_jcars[Units Sold]) - [Total Returned])&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Total Cost = SUMX(facts_jcars, facts_jcars[Unit Cost] + facts_jcars[Delivery Fee KSh] + facts_jcars[Logistics Cost KSh])&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Total Delivery Fees = SUM(facts_jcars[Delivery Fee KSh])&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Total Logistics Cost = SUM(facts_jcars[Logistics Cost KSh])&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Total Profit = SUMX(facts_jcars, facts_jcars[Revenue Recorded KSh] - facts_jcars[Unit Cost] - facts_jcars[Delivery Fee KSh] - facts_jcars[Logistics Cost KSh])&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Total Revenue = SUM(facts_jcars[Revenue Recorded KSh])&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Total Unit Cost = SUM(facts_jcars[Unit Cost])&lt;/code&gt;&lt;/p&gt;

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

&lt;p&gt;The analysis bit entailed creation of visual that answered different business questions and provided meaningful insights. Here I created a map visual to show revenue generation per county, a line graph to show monthly total revenue and profit, a bar chart to show revenue generated by each sales representative, a donut chart to compare revue generated by manual cars against that generated by automatic ones, a line and column chart to show how revenue and profit varied by car type, and a bar chart to show how different car makes were rated by customers.   &lt;/p&gt;

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

&lt;p&gt;The dashboard comprised KPIs, slicers, and visuals showing how the business was performing.&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%2F71zllcwvgt6gkfl4597r.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%2F71zllcwvgt6gkfl4597r.png" alt="Dashboard" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Insights
&lt;/h2&gt;

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

&lt;ul&gt;
&lt;li&gt;Kakamega is the leading region in terms of revenue.&lt;/li&gt;
&lt;li&gt;Toyota generates highest revenue.&lt;/li&gt;
&lt;li&gt;Automatic cars generate higher returns compared to manual ones.&lt;/li&gt;
&lt;li&gt;Profit and revenue were at the highest in April.&lt;/li&gt;
&lt;li&gt;Dealers and the government are among the most important customers in terms of revenue.&lt;/li&gt;
&lt;li&gt;Honda is among the most returned car type and has a low average rating too.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Top 3 sales representatives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Faith Achieng&lt;/li&gt;
&lt;li&gt;Mary Wanjiku &lt;/li&gt;
&lt;li&gt;Brian Otieno&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Investigate why sales rep Daniel Kimani ranks among bottom 3 in terms of revenue generation but highest in terms of payment cancellations. Could he need further training or replacement?&lt;/li&gt;
&lt;li&gt;Investigate why Honda has high return rate, low average rating, and is among low revenue generators. Could it be an issue of car quality?&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>powerbi</category>
      <category>analysis</category>
      <category>dashboard</category>
    </item>
    <item>
      <title>Building an Interactive Excel Dashboard for E-commerce Product Analysis: A Case Study of Jumia Products.</title>
      <dc:creator>David Samuel</dc:creator>
      <pubDate>Tue, 29 Sep 2026 12:14:25 +0000</pubDate>
      <link>https://dev.to/iblack/building-an-interactive-excel-dashboard-for-e-commerce-product-analysis-a-case-study-of-jumia-cad</link>
      <guid>https://dev.to/iblack/building-an-interactive-excel-dashboard-for-e-commerce-product-analysis-a-case-study-of-jumia-cad</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Data analysis is crucial for informed decision-making in the e-commerce sector. Jumia is one of the leading e-commerce platforms in Africa. The multi-national corporation operates an online marketplace that links sellers with buyers. Jumia features an enormous range of items with diverse prices and discounts. Usually, customers browse Jumia’s website and make online purchases by adding items of choice to a virtual card and then making payments through a safe digital checkout. Additionally, the website allows buyers to give quantitative scores (ratings) and qualitative feedback (reviews) about products purchased. In this project, the goal was to use Microsoft Excel to analyze a dataset comprising items listed on Jumia with the aim of understanding how pricing, discounts, and customer engagement affect product performance. Ultimately, insights from the analysis would help answer critical business questions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Are higher discounts leading to higher customer engagement?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Do highly rated products have higher or lower prices?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Which products are performing best based on reviews and ratings?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Which products may need improved pricing strategies?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;What recommendations would you give to Jumia sellers?&lt;br&gt;
The entire process was step-wise and involved data cleaning and preparation, data enrichment, analysis, and presentation. &lt;/p&gt;
&lt;h2&gt;
  
  
  Data Cleaning
&lt;/h2&gt;

&lt;p&gt;The original Jumia dataset contained a host of errors, including duplicates, unnecessary characters, and erroneous data types. As such it was important to first clean the data before proceeding to the analysis stage. &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%2F7w06asnw3a253u75om02.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%2F7w06asnw3a253u75om02.png" alt="Raw Data" width="744" height="448"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Removal of Duplicates&lt;/em&gt;&lt;br&gt;
Removal of duplicates entails deletion of entries that are an exact match in all columns of the table. To do so, I highlighted the entire table, navigated to the data section of the ribbon and then selected “Remove duplicates”. A total of 3 duplicate values was deleted leaving behind 112 unique values. &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%2F28vpf2exuxav797c4sx6.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%2F28vpf2exuxav797c4sx6.png" alt="Duplicates Removal" width="627" height="336"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Removal of Unnecessary Characters&lt;/em&gt;&lt;br&gt;
A quick glance at the data showed that it contained unnecessary characters such as the letter “d” in rating, which was misspelt as “Ratingd”, the (-) sign in the review column, “out of 5” in the rating column, and “KSh” prefix in the current price and old price columns. To begin with, I corrected the misspelt column D header by simply deleting the extra “d”. Next, I replaced the “out of 5” phrase with blank using the Find and Replace function.&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%2Flavhdinw87dxe5uhl2lm.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%2Flavhdinw87dxe5uhl2lm.png" alt="Find and Replace" width="739" height="333"&gt;&lt;/a&gt;&lt;br&gt;
In total, 57 replacements were made.&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%2Fpwf2mvqx7kvbaehxmuns.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%2Fpwf2mvqx7kvbaehxmuns.png" alt="Replacement of Values" width="725" height="336"&gt;&lt;/a&gt;&lt;br&gt;
The same approach was used to clean the old price and current price columns whereby “KSh” prefixes were replaced with blanks. &lt;br&gt;
The next phase of data cleaning entailed selecting the correct data types for various columns. Notably, all column data types were set to “General”. To rectify this error, I highlighted individual columns and set the values to the right data types. For the rating column, I set the data type to “number” and selected “One Decimal Place” for uniformity of figures. I also set the review column to “number” with zero decimal places. Because the discount was a percentage figure, I set the data type for that column to “Percentage” with zero decimal places. As for the current price and old price columns, I set the data type to currency and selected “Zero Decimal Places”.  While cleaning the price columns, I also noticed the prices of one item in row 40 was set as a range instead of a single figure. To correct this error, I calculated the average for the range provided in the ‘old price’ column and set it as the ‘old price’. I also calculated the average for the range provided in the ‘new price’ column and set it as the ‘new price’. I also noticed that several rows in the rating and review columns were left blank. Because replacing the blanks with median or average figures would lead to inaccurate computation of average product rating and total reviews, I opted to leave the blanks unfilled.   &lt;/p&gt;
&lt;h2&gt;
  
  
  Data Enrichment
&lt;/h2&gt;

&lt;p&gt;To improve my analysis, it was crucial to create additional columns using formulas listed below:&lt;br&gt;
&lt;em&gt;Discount Amount Column&lt;/em&gt;&lt;br&gt;
&lt;code&gt;Discount Amount = Old Price – Current Price&lt;/code&gt;&lt;br&gt;
&lt;em&gt;Discount Category Column&lt;/em&gt;&lt;br&gt;
&lt;code&gt;Discount Category = IF(E2&amp;lt;20%,"Low Discount",IF(E2&amp;lt;=40%,"Medium Discount","High Discount"))&lt;/code&gt;&lt;br&gt;
&lt;em&gt;Rating Category Column&lt;/em&gt;&lt;br&gt;
&lt;code&gt;Rating Category =  IF(ISBLANK(I38),"Not Provided",IF(I2&amp;lt;3,"Poor",IF(I2&amp;lt;=4.5,"Average","Excellent")))&lt;/code&gt;&lt;br&gt;
&lt;em&gt;Price Category Column&lt;/em&gt;&lt;br&gt;
Prior to inserting the ‘Price Category’ column I computed the first quartile as 493 and third quartile as 1670. I then used these values as my conditions for the IF function below:&lt;br&gt;
&lt;code&gt;Price Category = IF(B2&amp;lt;=493,"Low Price",IF(B2&amp;lt;=1670,"Medium Price","High Price"))&lt;/code&gt;&lt;br&gt;
The results of data cleaning, enrichment, and preparation was the data 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%2F3e310p59eqe395d9p1md.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%2F3e310p59eqe395d9p1md.png" alt="Clean Data" width="800" height="256"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Data Analysis
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Descriptive Analysis&lt;/em&gt;&lt;br&gt;
This stage of data analysis entailed calculating averages, sums, maximum, and minimum values. Here, I used pivot tables. Creating the pivot tables was done by clicking any cell&amp;gt;&amp;gt;insert&amp;gt;&amp;gt;pivot tables&amp;gt;&amp;gt;New page. The pivot tables helped me perform analysis and obtain the results below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Average current price of products = KSh. 1186
Average old price of products = Ksh. 1811
Average discount percentage = 37%
Average product rating = 3.9
Total number of products = 112
Total number of reviews = 723
Most Expensive Product = 32PCS Portable Cordless Drill Set with Cyclic Battery Drive -26 Variable Speed costing KSh. 3750
Least Expensive Product = 3PCS Single Head Knitting Crochet Sweater Needle Set costing KSh. 38
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Trend Analysis&lt;/em&gt;&lt;br&gt;
I used scatter plots to find relationships between different variables and answer the questions below: &lt;br&gt;
&lt;em&gt;Does a higher discount percentage result in more customer reviews?&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%2Fz0a4qpnll6c0hgqt6zku.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%2Fz0a4qpnll6c0hgqt6zku.png" alt="Relationship between Discount and Reviews" width="580" height="503"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Do highly rated products receive more customer reviews?&lt;/em&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%2Fahaaha85sgwg03kwn7ns.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%2Fahaaha85sgwg03kwn7ns.png" alt="Relationship between Reviews and Ratings" width="602" height="642"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Are expensive products rated higher than cheaper products?&lt;/em&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%2Fdtjq6abioo539pm53lus.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%2Fdtjq6abioo539pm53lus.png" alt="Relationship between Price and Ratings" width="661" height="514"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Product Performance Analysis&lt;/em&gt;&lt;br&gt;
To perform product performance analysis, I used pivot tables with filters. The tables helped me determine:&lt;br&gt;
&lt;em&gt;Top 5 products with the highest ratings&lt;/em&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%2F2vf81zd1587325isfx4b.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%2F2vf81zd1587325isfx4b.png" alt="Top 5 Products by Rating" width="799" height="230"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Top 5 products with the lowest ratings&lt;/em&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%2Fawayph2asjf1pkjdvr7y.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%2Fawayph2asjf1pkjdvr7y.png" alt="Top 5 products with the lowest ratings" width="799" height="204"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Top 10 products with the highest discounts&lt;/em&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%2F6lqz5h0pda0n4qhmsgso.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%2F6lqz5h0pda0n4qhmsgso.png" alt="Top 10 products with the highest discounts" width="799" height="216"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Top 10 products with the highest number of reviews.&lt;/em&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%2F3rpx3q073uhrjlh6ikgh.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%2F3rpx3q073uhrjlh6ikgh.png" alt="Top 10 products by reviews" width="799" height="216"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Top 10 products with the highest number of reviews.&lt;/em&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%2Fqr3u035nxrvn0dnur0nu.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%2Fqr3u035nxrvn0dnur0nu.png" alt="Top 10 products by reviews" width="800" height="207"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Top 10 highest-rated products.&lt;/em&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%2Fzii66lr4cfnpofgbv31n.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%2Fzii66lr4cfnpofgbv31n.png" alt="Top 10 highest-rated products" width="800" height="214"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Products with high discounts but low ratings.&lt;/em&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%2F2qe1nzhk9qqaev5tyr53.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%2F2qe1nzhk9qqaev5tyr53.png" alt="Products with high discounts but low ratings" width="800" height="334"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Products with strong customer engagement.&lt;/em&gt;&lt;br&gt;
To determine products with strong customer engagement, I used both reviews and ratings.&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%2Fi6gl5oodeq0sd1kuaq8k.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%2Fi6gl5oodeq0sd1kuaq8k.png" alt="Products with strong customer engagement" width="800" height="220"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Seller Performance Analysis&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Products that appear to have strong customer demand&lt;/em&gt;&lt;br&gt;
Products with high rating and a high number of reviews qualify to be classed as having strong customer demand. The products include: &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffw5y6wx6xeuw9dtrao86.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%2Ffw5y6wx6xeuw9dtrao86.png" alt="Products with high customer demand" width="800" height="220"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Products that may require better pricing or marketing strategies&lt;/em&gt;&lt;br&gt;
Products with high discount and high rating could be underpriced. The products include:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F47h9w0d98jls03jsxvu1.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%2F47h9w0d98jls03jsxvu1.png" alt="Products that may require better pricing or marketing strategies" width="800" height="240"&gt;&lt;/a&gt;&lt;br&gt;
The pricing flaw can be potentially resolved by reviewing pertinent pricing strategy.&lt;br&gt;
&lt;em&gt;Products receiving many reviews but having average ratings&lt;/em&gt;&lt;br&gt;
Products with many reviews but average ratings include:&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%2Fbijfyyme5hjfzd3iu7a5.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%2Fbijfyyme5hjfzd3iu7a5.png" alt="Products with many reviews but average ratings" width="798" height="163"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Products with high discounts but low customer engagement&lt;/em&gt;&lt;br&gt;
Products with high discount but low rating and low number of reviews qualify to be classed as having high discount but low customer engagement. These include: &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%2Ffhpcqolmd7kr5gec35bz.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%2Ffhpcqolmd7kr5gec35bz.png" alt="Products with high discounts but low customer engagement" width="800" height="250"&gt;&lt;/a&gt;&lt;/p&gt;

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

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

&lt;ul&gt;
&lt;li&gt;KPIs&lt;/li&gt;
&lt;li&gt;Product Performance information&lt;/li&gt;
&lt;li&gt;Trend Analysis&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Business Insights
&lt;/h2&gt;

&lt;p&gt;The analysis showed that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;There was no clear relationship between discounts and customer reviews.&lt;/li&gt;
&lt;li&gt;There was no clear relationship between product rating and pricing. &lt;/li&gt;
&lt;li&gt;Best performing best based on reviews and ratings are:&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%2Frqq3q933z3a9o08uh86t.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%2Frqq3q933z3a9o08uh86t.png" alt="Best performing best based on reviews and ratings" width="778" height="273"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Products that may need improved pricing strategies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There exist products with very high discounts but very low ratings. These include:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Wall-mounted Sticker Punch-free Plug Fixer&lt;/li&gt;
&lt;li&gt;5-PCS Stainless Steel Cooking Pot Set with Steamed Slices&lt;/li&gt;
&lt;li&gt;Electric LED UV Mosquito Killer Lamp, Outdoor/Indoor Fly Killer Trap Light -USB
For such products, lowering their prices further will not impact their appeal to customers. Here, the issue seems to be unsatisfactory quality.&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;On the other hand, we have products with high ratings but very low reviews.
These include:&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Anti-Skid Absorbent Insulation Coaster for Home Office&lt;/li&gt;
&lt;li&gt;Bedroom Simple Floor Hanging Clothes Rack Single Pole Hat Rack – White&lt;/li&gt;
&lt;li&gt;Classic Black Cat Cotton Hemp Pillow Case for Home Car
Such products could benefit from enhanced marketing.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;Jumia sellers should: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Replace products with high discounts but low ratings with alternatives of superior quality.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enhance marketing of products with high ratings but low reviews.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Price confidently because there is no clear relationship between pricing and rating/reviews. The sellers should not offer exaggerated discounts with the aim of increasing customer engagement.  &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>excel</category>
      <category>analysis</category>
      <category>dashboard</category>
    </item>
    <item>
      <title>Getting Started with Excel for Data Analytics: From Basics to Data Cleaning</title>
      <dc:creator>David Samuel</dc:creator>
      <pubDate>Tue, 01 Sep 2026 05:41:31 +0000</pubDate>
      <link>https://dev.to/iblack/getting-started-with-excel-for-data-analytics-from-basics-to-data-cleaning-58l0</link>
      <guid>https://dev.to/iblack/getting-started-with-excel-for-data-analytics-from-basics-to-data-cleaning-58l0</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;Excel is a spreadsheet program that enables crunching of numbers. The powerful software not allows one to organize data but also facilitates cleaning, formatting and analysis through application of a myriad of formulas and functions. Akin to other Microsoft software packages, Excel’s interface is relatively easy to navigate, even for a beginner. The interface majorly comprises a program frame, menu tabs, a ribbon, a formula bar, a workspace, sheet tabs, and a status bar as shown in the figure below:&lt;/p&gt;

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

&lt;p&gt;The workspace is made up cells, where each cell denotes a small rectangular box formed when a vertical column intersects with a horizontal row. The cells serve as data storage units where typing and editing of numbers, texts, formulas, and dates can be done. Each cell gets a unique name derived from a combination of its column letter and row number. For instance, cell A1 denotes the small box formed where column A meets row 1. Notably, a cell can hold diverse data forms such as numeric values, text labels, Boolean values, or formulas. It is also possible to format the appearance of a cell and its contents by adjusting elements such as size, number formats, fonts, and borders. A single spreadsheet consisting of columns and rows is called a worksheet. Usually, worksheets are located at the bottom at the Excel window. The complete Excel file that one creates, saves, and shares is referred to as a workbook. Markedly, a workbook can hold a single or multiple worksheets.&lt;/p&gt;

&lt;h1&gt;
  
  
  Data Cleaning
&lt;/h1&gt;

&lt;p&gt;It is common for data entered into an Excel spreadsheet to be inaccurate, duplicated, incomplete, or inconsistent. Such data is generally referred to as dirty data. Dirty data arises from factors such as human error and poor collection processes. To render the data reliable for business analysis, there is a need to find and fix errors, inconsistencies, and duplicates. This process is referred to as data cleaning.&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;Removal of Duplicates&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It is common for duplicates to occur in an Excel worksheet. Such occurrences can lead to erroneous analysis and inaccurate findings. As such, removal of duplicates is a key step in data cleaning. Removing duplicates is simple and entails selecting the entire data range, navigating to the data tab, and clicking remove duplicates as shown in the figure below:&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;Fixing Typos&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;Typos can result from misspellings, inclusion or exclusion of unwanted characters, presence of extra spaces in text, and a mix-up of upper- and lower-case characters in texts. Misspellings are corrected using the “Find and Replace” function. Here, one locates misspelt texts in each column and replaces it with the correct one. In a dataset where the word "finance" has been misspelt as "finanace", for example, the error can be fixed by relacing the erroneously spelt word with the correct one as shown in the figure below:&lt;/p&gt;

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

&lt;p&gt;On the other hand, presence of extra spaces in texts is corrected using the &lt;code&gt;TRIM(text)&lt;/code&gt; function. The function works by removing all leading and trailing spaces therefore leaving just a single space between words. In the dataset shown in my example below, the text “Paul” had 2 leading spaces that were corrected using the &lt;code&gt;TRIM(text)&lt;/code&gt; function.&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%2Fc6q4dky51u2z8u3v54o0.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%2Fc6q4dky51u2z8u3v54o0.png" alt="Trim Function" width="261" height="164"&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%2Fj32vu2i1jlosmcfttv0e.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%2Fj32vu2i1jlosmcfttv0e.png" alt="Trimmed Text" width="267" height="44"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In an event where upper and lower-case characters are mixed up in texts, the error can be rectified by using &lt;code&gt;UPPER(text)&lt;/code&gt;, &lt;code&gt;LOWER(text)&lt;/code&gt;, and &lt;code&gt;PROPER(text)&lt;/code&gt; functions accordingly. Notably, the &lt;code&gt;UPPER(text)&lt;/code&gt; function converts text to upper case while the &lt;code&gt;LOWER(text)&lt;/code&gt; and &lt;code&gt;PROPER(text)&lt;/code&gt; functions convert text to lower and proper cases respectively. The example below shows use of the &lt;code&gt;PROPER(text)&lt;/code&gt; function to correct "jAMeS" and yield the proper noun "James".&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%2F4wimuxg75v5ogfmix0l8.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%2F4wimuxg75v5ogfmix0l8.png" alt="Proper Function" width="348" height="138"&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%2F1ud4f02mog7988wcbd5v.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%2F1ud4f02mog7988wcbd5v.png" alt="Corrected Text" width="294" height="52"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Creating New Columns&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When cleaning data, it may be necessary to create new columns crucial for analysing the data. This can be done by either combining texts from different cells or extracting portions of the texts entered in an Excel sheet. Notably, combining texts from different cells applies the &lt;code&gt;CONCAT(text)&lt;/code&gt; function. On the other hand, extracting text from the left, right, and middle is done using the &lt;code&gt;LEFT(text)&lt;/code&gt;, &lt;code&gt;RIGHT(text)&lt;/code&gt;, or &lt;code&gt;MID(text)&lt;/code&gt; functions respectively. &lt;br&gt;
The example below shows how a country code can be extracted from a phone number by applying the &lt;code&gt;LEFT(text)&lt;/code&gt; function. Here, the first 4 characters from the left are extracted.&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%2Fr5ygzr6u3sdillhjzgh5.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%2Fr5ygzr6u3sdillhjzgh5.png" alt="Left Function" width="322" height="70"&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%2Fknroay2r13h1o4tarlnv.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%2Fknroay2r13h1o4tarlnv.png" alt="Extracted Text" width="309" height="31"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Fixing Data Formats&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Erroneous data formats in an Excel sheet can be fixed by highlighting the relevant column, navigating to the “Home” menu and then selecting the “Number” tab in the ribbon. From this section one can then select the correct data format or type that best suits their column. For example, currency figures entered as numbers can be changed to currency by selecting the necessary column, navigating to the “Numbers” tab, and selecting “Currency” from the drop-down menu. The same approach can be used to rectify any other erroneously classed data to the correct data type or format.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Handling Outliers and Missing Values&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;An outlier is a figure that lies an abnormal distance from other figures in a dataset. Such data points should be removed or adjusted accordingly, for example by replacing them with the median. Similarly, missing values can be handled by either filling blank cells or removing entire incomplete rows. Where filling is the most preferred approach, the missing values are filled using either the mean, mode, or median. Because a dataset may contain outliers which affect the mean significantly but have little to no effect on mode and median, the mode and the median are the most preferred figures for filling blanks. &lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Excel is an extremely powerful tool for data cleaning. Ordinarily, cleaning entails removing duplicates, fixing typos and data formats, creating new columns, and handling outliers and missing values. Data cleaning improves accuracy of the data and subsequently determines the quality and reliability of analysis.   &lt;/p&gt;

</description>
      <category>beginners</category>
      <category>analytics</category>
    </item>
    <item>
      <title>My First GitHub Project: From a Local Folder to GitHub Using Git and SSH</title>
      <dc:creator>David Samuel</dc:creator>
      <pubDate>Sun, 23 Aug 2026 19:29:13 +0000</pubDate>
      <link>https://dev.to/iblack/my-first-github-project-from-a-local-folder-to-github-using-git-and-ssh-1idb</link>
      <guid>https://dev.to/iblack/my-first-github-project-from-a-local-folder-to-github-using-git-and-ssh-1idb</guid>
      <description>&lt;p&gt;Creating my first GitHub project entailed use of diverse resources namely Git, GitHub, and VS Code. As the first step to creating the project, it was critical to have a deep understanding of concepts such as Git, Git Bash, GitHub, and VS Code. Without the understanding, it would have been impossible to link Git to GitHub and publish the new project.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Definition of Terms
&lt;/h2&gt;

&lt;p&gt;Git and GitHub can be confusing terms, especially for beginners. While GitHub is a relatively commonplace terminology for anyone that has some level of interaction with people in the field of tech, Git is rarely mentioned. At a personal level, I had encountered the term GitHub, but never had I come across Git. As such, differentiating the two and understanding both was a crucial step in building my first GitHub project. From the onset, I learned that Git is a software program that helps one track changes in files stored in their local machine. While the software is pre-installed in some operating systems, it has to be manually installed in Windows. Git is run using Git Bash, an interface for writing Git commands. On the other hand, GitHub is cloud-based website that stores Git projects and allows collaboration among developers. Unlike Git which is local, GitHub is remote and is used to publish code created on different code editors such as VS Code.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Creating a Local Folder
&lt;/h2&gt;

&lt;p&gt;Creating a local folder using Git Bash is an alternative to the traditional approach of right clicking on the screen and creating a new folder. Doing so is a step-wise procedure entailing selecting the directory within which you want to create the new folder as well as creating the new folder and the sub-folders and files within it. For my project, I created the folder on my desktop. &lt;br&gt;
To list all the directories on my pc, I ran the command below in my Git Bash terminal:&lt;br&gt;
&lt;code&gt;ls&lt;/code&gt;&lt;br&gt;
With Desktop being one of my directories and the directory within which I intended to create my new folder, I ran the command below to change directory to Desktop and consequently manipulate it as desired:&lt;br&gt;
&lt;code&gt;cd Desktop&lt;/code&gt;&lt;br&gt;
I then created my folder christened “My-First-GitHub-Project” within Desktop by running:&lt;br&gt;
&lt;code&gt;mkdir My-First-GitHub-Project&lt;/code&gt;&lt;br&gt;
Subsequently, I created 3 folders (Data, Notebook, Scripts) within “My-First-Desktop-Project” folder. This phase entailed two steps, the first one being changing directory from Desktop to “My-First-GitHub Project” folder using the command below:&lt;br&gt;
&lt;code&gt;cd My-First-GitHub-Project&lt;/code&gt;&lt;br&gt;
This step was followed by creating the aforementioned folders using the Git Bash commands below:&lt;br&gt;
&lt;code&gt;mkdir Data&lt;/code&gt;&lt;br&gt;
&lt;code&gt;mkdir Notebook&lt;/code&gt;&lt;br&gt;
&lt;code&gt;mkdir Scripts&lt;/code&gt;&lt;br&gt;
I also created two files within “My_First_GitHub_Project” folder using the commands below:&lt;br&gt;
&lt;code&gt;touch README.md&lt;/code&gt;&lt;br&gt;
&lt;code&gt;touch Analysis.py&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Linking and Pushing the Project to GitHub
&lt;/h2&gt;
&lt;h4&gt;
  
  
  Linking Git to GitHub
&lt;/h4&gt;

&lt;p&gt;Prior to pushing the project to GitHub, it was necessary to link Git to GitHub using the steps outlined below:&lt;br&gt;
&lt;em&gt;Step 1: Configuring Git&lt;/em&gt;&lt;br&gt;
The step entailed setting up my username and GitHub email using the commands below:&lt;br&gt;
&lt;code&gt;git config --global user.name "My Name"&lt;/code&gt;&lt;br&gt;
&lt;code&gt;git config --global user.email “my-name@gmail.com”&lt;/code&gt;&lt;br&gt;
&lt;em&gt;Step 2: Verifying Configuration&lt;/em&gt;&lt;br&gt;
To verify my configuration, I ran the command below:&lt;br&gt;
&lt;code&gt;git config --global –list&lt;/code&gt;&lt;br&gt;
&lt;em&gt;Step 3: SSH Key Generation&lt;/em&gt;&lt;br&gt;
To generate the SSH key, I ran the command below:&lt;br&gt;
&lt;code&gt;ssh-keygen -t ed25519 -C “my-name@gmail.com”&lt;/code&gt;&lt;br&gt;
The above step was followed by adding and confirming a blank passphrase. Subsequently, a public and a private key pair was generated as shown below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;id_ed25519
id_ed25519.pub

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

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Step 4: Copying Public Key&lt;/em&gt;&lt;br&gt;
To copy the public key, I ran the clip command with the path to where the key was stored as shown below: &lt;br&gt;
&lt;code&gt;clip &amp;lt; /c/Users/MyPC/.ssh/id_ed25519.pub&lt;/code&gt;&lt;br&gt;
&lt;em&gt;Step 5: Adding the Key to GitHub&lt;/em&gt;&lt;br&gt;
To add the key to my GitHub account, I first logged in, then navigated to profile, then settings, then SSH and GPG Keys where I selected “New SSH Key”.&lt;br&gt;
Next, I pasted the key I had copied in the “key” section and gave a brief description in the “title” section.&lt;br&gt;
&lt;em&gt;Step 6: Testing if The Key Was Added Properly&lt;/em&gt;&lt;br&gt;
I then tested if the key had been added properly by going to the Git Bash terminal and typing the command below:&lt;br&gt;
&lt;code&gt;ssh -T git@github.com&lt;/code&gt;&lt;br&gt;
From this command, I confirmed that the SSH connection had been established and was working properly. &lt;/p&gt;

&lt;h3&gt;
  
  
  Pushing to GitHub
&lt;/h3&gt;

&lt;p&gt;I used VS Code to push the project created on my local PC to GitHub using the steps outlined below:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Opened VS Code&lt;/li&gt;
&lt;li&gt;Clicked on “File”&lt;/li&gt;
&lt;li&gt;Clicked on “Open Folder”&lt;/li&gt;
&lt;li&gt;Selected the “My-First-GitHub-Project” folder created on my desktop&lt;/li&gt;
&lt;li&gt;Navigated to “Source Control” and selected “Initialize Repository”&lt;/li&gt;
&lt;li&gt;Wrote a “Commit Message” and then selected “Commit and Sync”&lt;/li&gt;
&lt;li&gt;Clicked “Publish Branch” and selected “Publish to GitHub as private repository” since I did not want the repository to be public&lt;/li&gt;
&lt;li&gt;Logged in to GitHub using the “Open on GitHub” button to check my newly created repository. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Overall, the whole exercise of creating my first GitHub project not only helped me conceptualize how to push a project from a local folder to GitHub but also instilled a deeper comprehension of the difference between Git and GitHub, various Git Bash commands, and how to navigate between VS Code and GitHub. &lt;/p&gt;

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