<?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: Shikothetechgirl</title>
    <description>The latest articles on DEV Community by Shikothetechgirl (@shikothetechgirl).</description>
    <link>https://dev.to/shikothetechgirl</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%2F4071714%2Fd334f173-7bfd-47d9-b38b-29f0c0b9fc40.png</url>
      <title>DEV Community: Shikothetechgirl</title>
      <link>https://dev.to/shikothetechgirl</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shikothetechgirl"/>
    <language>en</language>
    <item>
      <title>Data Modelling, Relationships &amp; Joins in PowerBI</title>
      <dc:creator>Shikothetechgirl</dc:creator>
      <pubDate>Sun, 13 Sep 2026 13:55:05 +0000</pubDate>
      <link>https://dev.to/shikothetechgirl/data-modelling-relationships-joins-in-powerbi-5elo</link>
      <guid>https://dev.to/shikothetechgirl/data-modelling-relationships-joins-in-powerbi-5elo</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Data Modelling in Power BI is about organizing data into tables and defining how these tables are connected to each other and support reporting and analysis. A good model will make it easier to build reports, manage filters, write DAX calculations (Data Analytics Expressions) while maintaining great performance as the data keeps on changing and growing. &lt;br&gt;
In this article, I will explore 3 main modelling approaches: flat table, star and snowflake schema. I will use a mart data set which shows different customers and other information related to them and their orders. The mart is called NovaMart.&lt;/p&gt;

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

&lt;p&gt;A flat table stores transactional and descriptive data in one table. Its simple to set up and works well for small datasets. However, as the data set grows, it might become harder to maintain and manager. In our NovaMart Dataset, the RawFlatSales represent this structure.&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%2Fy2f056brc26n3cb5lewf.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%2Fy2f056brc26n3cb5lewf.png" alt=" " width="800" height="546"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;A star schema is used for separating the data into a central fact table connected directly to the dimension tables. This structure is much cleaner as it separates the business events from the the descriptive information. It also supports simple DAX and predictable filtering and good report performance, although some descriptive data can still be repeated within dimensions. It is generally suitable for BI and reporting models.&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%2Fdblllwu3ztc3hmgw1su4.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%2Fdblllwu3ztc3hmgw1su4.png" alt=" " width="799" height="546"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;This is an advanced version of the star schema. It separates some dimension information into additional tables. This reduces data redundancy and is useful for complex dimensions. The additional tables and relationships however make the model more complex and may make the reporting and filtering less straight forward. The NovaMart project demonstrates each of these approaches practically in the sections that follow, using the model and screenshots created in Power BI.&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%2Fcbx5yzoqv0h3p3bhhr05.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%2Fcbx5yzoqv0h3p3bhhr05.png" alt=" " width="800" height="339"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Keys, Cardinality and Referential Integrity.
&lt;/h3&gt;

&lt;p&gt;In power BI, relationships depend on common keys (Primary Keys) between tables. In the NovaMart Model, the &lt;code&gt;CustomerID&lt;/code&gt; is unique in &lt;code&gt;DIMCustomer&lt;/code&gt; making it the primary key. This same key appears several times in the &lt;code&gt;FactSales&lt;/code&gt; as a foreign key since one customer can make multiple purchases, which creates a &lt;strong&gt;one-to-many relationship&lt;/strong&gt; *&lt;em&gt;(1:&lt;/em&gt;) **&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cardinality&lt;/strong&gt; describes how records in two tables relate, such as one-to-one, one-to-many or many-to-many. Referential integrity means that foreign key values should have matching records in the related table, helping maintain consistent and reliable data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Active and Inactive Relationships&lt;/strong&gt;&lt;br&gt;
Power BI can have more than one relationship between the same tables, but only one is normally active at a time. In NovaMart,&lt;code&gt;DimDate[Date]&lt;/code&gt; is actively related to &lt;code&gt;FactSales[OrderDate]&lt;/code&gt;, meaning it is used by default when analysing sales by date.&lt;br&gt;
A second relationship can connect &lt;code&gt;DimDate[Date]&lt;/code&gt; to &lt;code&gt;FactSales[DeliveryDate]&lt;/code&gt; but remain inactive. This avoids conflicting filter paths while still making the relationship available when delivery-date analysis is required.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Filter Direction&lt;/strong&gt;&lt;br&gt;
Filter direction determines how filters move between related tables. In the NovaMart star schema, I used &lt;em&gt;single-direction filtering&lt;/em&gt;, where filters move from the dimension tables to FactSales.&lt;br&gt;
For example, selecting a product category such as Electronics from&lt;code&gt;DimProduct&lt;/code&gt; filters the related transactions in &lt;code&gt;FactSales&lt;/code&gt;, allowing measures such as Total Sales to be calculated only for that category.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bidirectional filtering&lt;/strong&gt; allows filters to move in both directions. However, it should be used carefully as it can make filter paths and the overall model more complex.&lt;/p&gt;

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

&lt;p&gt;Data modelling in Power Bi is the process of organizing data into tables and then defining how these tables are related to each other before using the data for analysis and reporting. This step should be structured in a way that will make analysis easier. &lt;br&gt;
The structure of the model affects how easily reports can be created, how DAX calculations behave and how filters move between tables. It can also affect performance as the amount of data grows. A well-designed model should therefore be easy to understand, maintain and expand without introducing unnecessary duplication or complexity. In the NovaMart project, I used 3 approaches: a ** flat table,** ,&lt;strong&gt;star schema&lt;/strong&gt;, and &lt;strong&gt;snowflake schema&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Import and Inspect the Data
&lt;/h2&gt;

&lt;p&gt;Open Power BI Desktop, then go to Home → Get Data → Excel Workbook and select the NovaMart workbook.&lt;br&gt;
The workbook contains several project tables. The next step is data cleaning in transform data tab. Ensure all the fields are properly formated.&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%2Fnaxdhv8g6irlo7kktu9s.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%2Fnaxdhv8g6irlo7kktu9s.png" alt=" " width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Demonstrating Flat Tables
&lt;/h2&gt;

&lt;p&gt;A flat table is simple and convenient for small datasets, but repeated descriptive data can increase redundancy, make maintenance harder and reduce scalability.&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%2Faipqfwormub4nh4y2a2n.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%2Faipqfwormub4nh4y2a2n.png" alt=" " width="799" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Building a star schema
&lt;/h2&gt;

&lt;p&gt;Load &lt;strong&gt;FactSales, DimCustomer, DimProduct, DimDate&lt;/strong&gt; and** DimLocation**. Go to Model View and create the below relationships. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;DimCustomer[CustomerID]  1 ─── *  FactSales[CustomerID]&lt;br&gt;
DimCustomer[CustomerID]  1 ─── *  FactSales[CustomerID]&lt;br&gt;
DimProduct[ProductID]    1 ─── *  FactSales[ProductID]&lt;br&gt;
DimLocation[LocationID]  1 ─── *  FactSales[LocationID]&lt;br&gt;
DimDate[Date]            1 ─── *  FactSales[OrderDate]&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%2F716kxogav4roe76697wv.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%2F716kxogav4roe76697wv.png" alt=" " width="800" height="751"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Demonstrating a snowflake Schema
&lt;/h2&gt;

&lt;p&gt;A snowflake schema extends the star schema by separating dimension data into additional related tables. In our model, Category was separated from &lt;strong&gt;DimProduct&lt;/strong&gt; into &lt;strong&gt;DimCategory&lt;/strong&gt;, creating the structure &lt;strong&gt;FactSales&lt;/strong&gt; → &lt;strong&gt;DimProduct&lt;/strong&gt; → &lt;strong&gt;DimCategory&lt;/strong&gt;. This reduces data redundancy but introduces additional relationships and model complexity.&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%2Fdsovpoafjlg0ko3kq40h.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%2Fdsovpoafjlg0ko3kq40h.png" alt=" " width="800" height="339"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Fact Tables, Dimension Tables
&lt;/h2&gt;

&lt;p&gt;A fact table stores measurable business events and numeric values, while dimension tables store descriptive attributes used to analyse those events. In our data, the Common fact tables include &lt;strong&gt;FactSales&lt;/strong&gt;, &lt;strong&gt;FactOrders ** and **FactTransactions&lt;/strong&gt;.&lt;br&gt;
In the NovaMart model, FactSales contains values such as Quantity, Discount and SalesAmount. It connects to DimCustomer, DimProduct, DimDate and DimLocation, which describe who purchased, what was purchased, when and where.&lt;br&gt;
The grain or granularity defines what each row in a fact table represents. In FactSales, each row represents an individual sales transaction line identified by SaleID.&lt;br&gt;
Together, these tables form a star schema, allowing sales to be analysed by customer, product, date and location.&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%2Frgcclk8tx5lwpzp8gehe.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%2Frgcclk8tx5lwpzp8gehe.png" alt=" " width="800" height="546"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Demonstrating Relationship Types
&lt;/h2&gt;

&lt;p&gt;** One-to-Many (1:&lt;em&gt;)&lt;/em&gt;*&lt;br&gt;
One &lt;strong&gt;CustomerID&lt;/strong&gt; appears once in &lt;strong&gt;DimCustomer&lt;/strong&gt; but may appear many times in &lt;strong&gt;FactSales&lt;/strong&gt;. &lt;strong&gt;DimCustomer[CustomerID] **acts as the primary key and **FactSales[CustomerID]&lt;/strong&gt; as the foreign key.&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%2Fo3r7t89f2woy03ti0p36.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%2Fo3r7t89f2woy03ti0p36.png" alt=" " width="799" height="546"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One-to-One (1:1)&lt;/strong&gt;&lt;br&gt;
A one-to-one relationship exists when each key appears only once in both related tables. In the NovaMart model, &lt;strong&gt;DimCustomer&lt;/strong&gt; and &lt;strong&gt;CustomerProfile&lt;/strong&gt; are connected through &lt;strong&gt;CustomerID&lt;/strong&gt;. Each customer has one customer record and one corresponding profile containing attributes such as Join Date and Loyalty Tier.&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%2Fy65wczyv0rj1ehwg70sb.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%2Fy65wczyv0rj1ehwg70sb.png" alt=" " width="800" height="745"&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%2Fd8u6t9w987b4hcnojgjj.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%2Fd8u6t9w987b4hcnojgjj.png" alt=" " width="800" height="203"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Many-to-Many&lt;/strong&gt;&lt;br&gt;
In the NovaMart model, products and promotions have a many-to-many relationship because a product can participate in several promotions, while a promotion can apply to several products. A &lt;strong&gt;BridgeProductPromotion&lt;/strong&gt; table was used between &lt;strong&gt;DimProduc&lt;/strong&gt;t and &lt;strong&gt;DimPromotion&lt;/strong&gt; to manage this relationship through two one-to-many relationships. This provides a clearer and more controlled model than using a direct many-to-many relationship.&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%2Fs9udk32dpcik4gauu16t.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%2Fs9udk32dpcik4gauu16t.png" alt=" " width="797" height="134"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Active and Inactive Relationships
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Active Relationship&lt;/strong&gt;&lt;br&gt;
Power BI uses the solid line for the active relationship and a dashed line for the inactive relationship. &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%2Fq47j65uy85acm1xoaqq4.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%2Fq47j65uy85acm1xoaqq4.png" alt=" " width="513" height="764"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Inactive Relationship&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%2Fe8ddrsnqf5dfpy6esdsi.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%2Fe8ddrsnqf5dfpy6esdsi.png" alt=" " width="455" height="841"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Filter Directions
&lt;/h2&gt;

&lt;p&gt;In the NovaMart star schema, filters normally flow in a single direction from dimension tables to FactSales. For example, selecting Electronics from DimProduct filters the related sales records and recalculates measures such as Total Sales. &lt;br&gt;
&lt;strong&gt;Single Direction Filtering&lt;/strong&gt;&lt;br&gt;
For this, we created a measure of total sales, then added a slicer showing the total sales. This demonstrates a single direction filtering.&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%2Fruspax11qx4ygoufj831.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%2Fruspax11qx4ygoufj831.png" alt=" " width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Both/Bidirectional Filtering&lt;/strong&gt;&lt;br&gt;
Bidirectional filtering allows filters to move in both directions, but it should be used carefully because it can create ambiguous filter paths and unnecessary model complexity.&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%2F6cbmi2o45es6sw18c22a.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%2F6cbmi2o45es6sw18c22a.png" alt=" " width="654" height="748"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Power Query Joins
&lt;/h2&gt;

&lt;p&gt;For this part, &lt;strong&gt;Join_Customers&lt;/strong&gt; and &lt;strong&gt;Join_Orders&lt;/strong&gt; contain matching and non matching records. We will use them to obtain the different join types&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%2Fo2x1gxxn92nw8txsflbn.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%2Fo2x1gxxn92nw8txsflbn.png" alt=" " width="649" height="191"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Left Outer Join&lt;/strong&gt;&lt;br&gt;
This join displays all the customers and their matching orders&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%2Ft2fwcgo8wypv0gsm8o3d.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%2Ft2fwcgo8wypv0gsm8o3d.png" alt=" " width="614" height="548"&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%2Fa0s21zdjg7nshxkjryuj.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%2Fa0s21zdjg7nshxkjryuj.png" alt=" " width="800" height="363"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Right Outer Join&lt;/strong&gt;&lt;br&gt;
A right outer join retains all records from the second table and matching records from the first. In this example, all orders were retained, including the order for Customer C005, even though that customer did not exist in the Customers table.&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%2Fs57cp2d7850g501jyrvh.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%2Fs57cp2d7850g501jyrvh.png" alt=" " width="800" height="245"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Full Outer Join&lt;/strong&gt;&lt;br&gt;
A full outer join retains all records from both tables. Matching records are combined, while unmatched records from either table are retained with null values where no corresponding data exists.&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%2Fs0tliuqh4fwfpx9la9bw.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%2Fs0tliuqh4fwfpx9la9bw.png" alt=" " width="633" height="582"&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%2F1p544wnnbvt0lhfgioiy.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%2F1p544wnnbvt0lhfgioiy.png" alt=" " width="800" height="254"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inner Join&lt;/strong&gt;&lt;br&gt;
An inner join returns only records with matching values in both tables. Any unmatched records from either table are excluded.&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%2Fclmzyc086pp6z8xos9sr.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%2Fclmzyc086pp6z8xos9sr.png" alt=" " width="800" height="309"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Left Anti Join&lt;/strong&gt;&lt;br&gt;
Returns rows from the first table that have no matching record in the second table. It is useful for identifying missing or unmatched records.&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%2Fw4r7u8taniqlocj1ywju.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%2Fw4r7u8taniqlocj1ywju.png" alt=" " width="799" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Right Anti Join&lt;/strong&gt;&lt;br&gt;
Returns records from the second table that have no matching record in the first table. In the NovaMart example, it identifies orders associated with customers that do not exist in the Customers table.&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%2F9p67yhpwx900keyp9ifh.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%2F9p67yhpwx900keyp9ifh.png" alt=" " width="800" height="238"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Power Query joins and Power BI relationships both connect data, but they serve different purposes. A Power Query join physically combines data from two tables during the data preparation stage. For example, merging JoinCustomers with JoinOrders adds order information to the resulting query.&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%2Fo3huzcn0trh6t5qcl4zj.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%2Fo3huzcn0trh6t5qcl4zj.png" alt=" " width="800" height="238"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While working on the NovaMart model, I used both Power Query merges and Power BI relationships. A Power Query merge physically combines data during the data preparation stage. For example, when I merged JoinCustomers and JoinOrders using CustomerID, fields such as OrderID and OrderAmount became part of the resulting query.&lt;/p&gt;

&lt;p&gt;Relationships work differently. When I connected DimCustomer to FactSales using CustomerID, the tables remained separate. The relationship only defines how the tables interact and is created during the data modelling stage.&lt;/p&gt;

&lt;p&gt;I would use a merge when data from different tables needs to become one dataset. For the main NovaMart model, relationships were more suitable because the fact and dimension tables needed to remain separate while still working together during analysis.&lt;/p&gt;

&lt;p&gt;Excessive merging can create large flat tables with repeated information, similar to RawFlatSales. Keeping the fact and dimension tables separate reduces duplication, maintains the star schema structure and makes the model easier to manage as it grows.&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%2Fjxyjh0kpmvhecsckulxj.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%2Fjxyjh0kpmvhecsckulxj.png" alt=" " width="799" height="223"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;For a typical business intelligence project, I would recommend a star schema, with a central fact table connected to dimension tables using mainly one-to-many relationships.&lt;/p&gt;

&lt;p&gt;From the three approaches explored, I found the star schema gives the best balance between performance, simplicity and scalability. A flat table is easier to set up but can create repeated data as it grows, while a snowflake schema reduces redundancy but introduces additional tables and relationships.&lt;/p&gt;

&lt;p&gt;In the NovaMart model, &lt;strong&gt;FactSales&lt;/strong&gt; is connected to &lt;strong&gt;DimCustomer&lt;/strong&gt;, &lt;strong&gt;DimProduct&lt;/strong&gt;, &lt;strong&gt;DimDate&lt;/strong&gt; and &lt;strong&gt;DimLocation&lt;/strong&gt;. This structure keeps the model readable, simplifies DAX and report creation, and makes it easier to maintain and expand.&lt;/p&gt;

&lt;p&gt;I would also use one-to-many relationships with single-direction filtering from the dimension to the fact table. This provides a clear and predictable filter flow. Bidirectional filtering would only be used where necessary because it can make the model more complex.&lt;/p&gt;

&lt;p&gt;Overall, I prefer the star schema because it provides good performance, less redundancy, simpler DAX, clear filter propagation and lower model complexity, while remaining easy to maintain as the model grows.&lt;/p&gt;

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

&lt;p&gt;The NovaMart project demonstrates how different modelling choices can affect the structure and usability of a Power BI model. While flat tables, star schemas and snowflake schemas each have their place, the choice depends on the data being used and what the report needs to achieve.&lt;/p&gt;

&lt;p&gt;For a typical BI project, I would use a star schema with one-to-many relationships and mainly single-direction filtering. It keeps the model organised, reduces unnecessary complexity and makes reporting, filtering and future changes easier to manage.&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>data</category>
      <category>database</category>
    </item>
    <item>
      <title>Building a Jumia Product Performance Dashboard using Excel</title>
      <dc:creator>Shikothetechgirl</dc:creator>
      <pubDate>Sat, 05 Sep 2026 14:06:46 +0000</pubDate>
      <link>https://dev.to/shikothetechgirl/building-a-jumia-product-performance-dashboard-using-excel-59c0</link>
      <guid>https://dev.to/shikothetechgirl/building-a-jumia-product-performance-dashboard-using-excel-59c0</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Data is essential in making business decisions and analysing product performance. For this project, I will document how I performed product performance analysis using Excel and created visual representations of the findings. The analysis focuses on product prices, discounts, ratings, and reviews, with the final output presented through an interactive Excel dashboard.&lt;/p&gt;

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

&lt;p&gt;The first step was to inspect and clean the dataset before performing the analysis. I checked for missing values, duplicates, inconsistent formats, and values that could affect the accuracy of the results. Every step that involved removing duplicates, using average values for range values e.t.c was documented in the data dictionary&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%2Fx7kle82xi6q8ggspqvjp.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%2Fx7kle82xi6q8ggspqvjp.png" alt=" " width="800" height="555"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The main cleaning activities included standardizing product prices, extracting numeric ratings, correcting negative review values, handling missing values, and removing duplicate records.&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%2Fev09qzskvtu4ialme2f5.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%2Fev09qzskvtu4ialme2f5.png" alt=" " width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Price Cleaning
&lt;/h3&gt;

&lt;p&gt;Some prices contained the &lt;code&gt;KSh&lt;/code&gt; currency label, commas, and spaces. I removed these characters and converted the values into numbers using:&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%2Fgw5yn6xj9h4jq7pq1bw8.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%2Fgw5yn6xj9h4jq7pq1bw8.png" alt=" " width="112" height="610"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;=VALUE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(TRIM(B2),"KSh",""),",","")," ",""))&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This allowed the price columns to be used in calculations such as averages, discounts, and price categorization.&lt;/p&gt;

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

&lt;p&gt;The first step was to inspect and clean the dataset before performing the analysis. I checked for missing values, duplicates, inconsistent formats, and values that could affect the accuracy of the results.&lt;/p&gt;

&lt;p&gt;The main cleaning activities included standardizing product prices, extracting numeric ratings, correcting negative review values, handling missing values, and removing duplicate records.&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%2F3nlfn10pqqqlk7o1vadz.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%2F3nlfn10pqqqlk7o1vadz.png" alt=" " width="795" height="52"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Price Cleaning
&lt;/h3&gt;

&lt;p&gt;Some prices contained the &lt;code&gt;KSh&lt;/code&gt; currency label, commas, and spaces. I removed these characters and converted the values into numbers using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=VALUE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(TRIM(B2),"KSh",""),",","")," ",""))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This allowed the price columns to be used in calculations such as averages, discounts, and price categorisation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rating Cleaning
&lt;/h3&gt;

&lt;p&gt;Ratings were originally stored as text, for example &lt;code&gt;4.5 out of 5&lt;/code&gt;. I extracted the numeric rating using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=VALUE(LEFT(F2,FIND(" ",F2)-1))
&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%2F6ugss7z3awvtkuk0za8o.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%2F6ugss7z3awvtkuk0za8o.png" alt=" " width="180" height="283"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Missing ratings were retained as missing instead of being represented as zero.&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%2Fn8fqyyfnw3qd024f2ijr.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%2Fn8fqyyfnw3qd024f2ijr.png" alt=" " width="83" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Review Cleaning
&lt;/h3&gt;

&lt;p&gt;Negative review values were corrected using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=ABS(E2)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Missing reviews were kept separate from zero values because a missing value represents unavailable information rather than a product with no reviews.&lt;/p&gt;

&lt;p&gt;After cleaning and removing duplicates, the final dataset contained &lt;strong&gt;111 products&lt;/strong&gt;.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Data Transformation
&lt;/h2&gt;

&lt;p&gt;After cleaning the data, I created additional columns to support the analysis (Helper 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%2Ff99j12pc8yq4l5jisnr6.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%2Ff99j12pc8yq4l5jisnr6.png" alt=" " width="799" height="481"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Discount Amount
&lt;/h3&gt;

&lt;p&gt;The difference between the old price and current price was calculated using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=[@[Old Price]]-[@[Current Price]]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The discount percentage was calculated using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IFERROR(([@[Old Price]]-[@[Current Price]])/[@[Old Price]],"")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Product Categories
&lt;/h3&gt;

&lt;p&gt;To make comparisons easier, products were grouped based on ratings, discounts, prices, and engagement.&lt;/p&gt;

&lt;p&gt;Ratings were classified as &lt;strong&gt;Poor, Average, or Excellent&lt;/strong&gt;, while discounts were classified as &lt;strong&gt;Low, Medium, or High&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For price categories, I used the first and third quartiles (Q1 and Q3) to classify products as Low, Medium, or High Price:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&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;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using quartiles allowed the categories to be based on the distribution of the dataset rather than manually selected price ranges.&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%2F9yk937njqqkcbp5zenzd.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%2F9yk937njqqkcbp5zenzd.png" alt=" " width="800" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Product Performance Analysis
&lt;/h2&gt;

&lt;p&gt;I created additional performance flags to identify products that may require further investigation.&lt;/p&gt;

&lt;p&gt;For example, products with a high discount but low rating were identified using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF([@Rating]="Missing Rating","Missing Rating",IF(AND([@Discount]&amp;gt;=[@[Discount Q3]],[@Rating]&amp;lt;3),"High Discount - Low Rating","Other"))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I also identified products with &lt;strong&gt;high discounts and low engagement&lt;/strong&gt;, as well as products with &lt;strong&gt;many reviews but average ratings&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;These combinations helped analyse product performance using more than one measure at a time.&lt;/p&gt;

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

&lt;p&gt;PivotTables were used to summarize the cleaned dataset and compare different product measures.&lt;/p&gt;

&lt;p&gt;The analysis included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rating distribution&lt;/li&gt;
&lt;li&gt;Discount distribution&lt;/li&gt;
&lt;li&gt;Average rating by price category&lt;/li&gt;
&lt;li&gt;Engagement by discount category&lt;/li&gt;
&lt;li&gt;Top 10 products by rating&lt;/li&gt;
&lt;li&gt;Top 10 products by reviews&lt;/li&gt;
&lt;li&gt;Top 10 products by discount&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For product rankings, ties were considered using reviews and ratings as additional measures where applicable.&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%2F595gz4mn61llvnx6xoak.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%2F595gz4mn61llvnx6xoak.png" alt=" " width="800" height="644"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Scatter plots and trendlines were used to examine relationships between discounts, reviews, prices, and ratings.&lt;/p&gt;

&lt;h3&gt;
  
  
  Discount vs Reviews
&lt;/h3&gt;

&lt;p&gt;The relationship between discount and reviews had an &lt;strong&gt;R² value of 0.021&lt;/strong&gt;, indicating a very weak relationship. Larger discounts were therefore not strongly associated with higher review engagement.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rating vs Reviews
&lt;/h3&gt;

&lt;p&gt;The relationship between ratings and reviews had an &lt;strong&gt;R² value of 0.107&lt;/strong&gt;. This was also a weak relationship, meaning products with more reviews were not necessarily the highest-rated products.&lt;/p&gt;

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

&lt;p&gt;Price and rating had an &lt;strong&gt;R² value of 0.012&lt;/strong&gt;, showing almost no relationship between the two variables. Higher-priced products were therefore not necessarily rated better.&lt;/p&gt;

&lt;p&gt;These results show associations within the dataset and should not be interpreted as causation.&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%2F6ztckqvogn1dkcvjtuqw.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%2F6ztckqvogn1dkcvjtuqw.png" alt=" " width="800" height="599"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;The final analysis was presented through an interactive Excel dashboard.&lt;/p&gt;

&lt;p&gt;The dashboard contains five main KPIs:&lt;br&gt;
| KPI | Result |&lt;br&gt;
| --- | ---: |&lt;br&gt;
| Total Products | 111 |&lt;br&gt;
| Average Current Price | KSh 1,192.77 |&lt;br&gt;
| Average Discount | 37% |&lt;br&gt;
| Average Rating | 3.89 |&lt;br&gt;
| Total Reviews | 723 |&lt;/p&gt;

&lt;p&gt;The dashboard also contains product rankings, category analysis, relationship charts, and product distribution charts.&lt;/p&gt;

&lt;p&gt;Slicers were added for &lt;strong&gt;Rating Category, Discount Category, and Price Category&lt;/strong&gt;, allowing users to filter the dashboard and analyse different groups of products interactively.&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%2Fnju4ymzv98imhmicu0qc.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%2Fnju4ymzv98imhmicu0qc.png" alt=" " width="799" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;The analysis showed that larger discounts were not strongly associated with higher review engagement. Sellers can therefore consider testing different discount levels rather than relying on larger discounts alone.&lt;/p&gt;

&lt;p&gt;Products with many reviews were also not necessarily the highest rated. Products with high engagement but average ratings may provide an opportunity to investigate product quality and customer experience.&lt;/p&gt;

&lt;p&gt;Finally, higher-priced products were not necessarily better rated. This suggests that factors beyond price may have a stronger influence on customer ratings.&lt;/p&gt;

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

&lt;p&gt;The dataset does not contain units sold or revenue. Reviews were therefore used as an &lt;strong&gt;engagement proxy&lt;/strong&gt; and do not represent confirmed sales.&lt;/p&gt;

&lt;p&gt;Listing age was also unavailable, which may affect review counts because older products may have had more time to accumulate reviews.&lt;/p&gt;

&lt;p&gt;Other factors such as product category, brand, and customer expectations may also influence product performance but were not included in this analysis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Learnings
&lt;/h2&gt;

&lt;p&gt;Through this project, I gained practical experience in cleaning and preparing business data in Excel, applying formulas for data transformation, building PivotTables and Pivot Charts, and creating an interactive dashboard using slicers.&lt;/p&gt;

&lt;p&gt;The project demonstrated how Excel can be used to transform raw product data into structured analysis and business insights.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Repository
&lt;/h2&gt;

&lt;p&gt;The complete project, including the dataset, Excel workbook, dashboard, and documentation, is available on &lt;a href="https://github.com/maggykamau/jumia-product-performance-dashboard" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>datascience</category>
      <category>microsoft365</category>
    </item>
    <item>
      <title>Getting Started with Excel for Data Analytics: From Basics to Data Cleaning &amp; Analysis</title>
      <dc:creator>Shikothetechgirl</dc:creator>
      <pubDate>Fri, 28 Aug 2026 17:23:34 +0000</pubDate>
      <link>https://dev.to/shikothetechgirl/getting-started-with-excel-for-data-analytics-from-basics-to-data-cleaning-analysis-56i7</link>
      <guid>https://dev.to/shikothetechgirl/getting-started-with-excel-for-data-analytics-from-basics-to-data-cleaning-analysis-56i7</guid>
      <description>&lt;h1&gt;
  
  
  What is Data Analytics?
&lt;/h1&gt;

&lt;p&gt;Data Analytics is the concept of examining data to find trends, patters or even information that will aid in decision making. Several tools can be used for data analysis. However, today, we will focus on excel. Excel is widely used in organizations to organize, calculate, analyze and store data. Different users can use it for different use cases. In this article, we will start from basic excel capabilities and gradually build up to advanced data cleaning. &lt;/p&gt;

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

&lt;p&gt;Before starting any data analysis, let's understand the tabs in excel. We will interact with different tabs including File, Home, Insert, Data, Review, View. The below list describes the functions of each of the tabs. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Home&lt;/strong&gt; — basic formatting, alignment, number formats, and editing tools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Insert&lt;/strong&gt; — used to insert tables, PivotTables, charts, and other visual elements.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Page Layout&lt;/strong&gt; — controls how worksheets are arranged and displayed when printed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Formulas&lt;/strong&gt; — provides access to Excel functions and formula-related tools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data&lt;/strong&gt; — used for data analytics. It contains tools for sorting, filtering, removing duplicates, data validation, and other data management activities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review&lt;/strong&gt; — includes tools for reviewing, commenting, and protecting worksheets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;View&lt;/strong&gt; — controls how the workbook and worksheets are displayed.&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%2Fp0rgja212dv0w3lhcyz2.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%2Fp0rgja212dv0w3lhcyz2.png" alt=" " width="797" height="65"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Rows, Columns, Cells
&lt;/h2&gt;

&lt;p&gt;👍Rows- runs horizontally across the worksheet and are usually represented by numbers. &lt;br&gt;
💯 Columns - runs vertically across the worksheet and are represented by letters.&lt;br&gt;
👎Cell - Formed when a row and a column meet e.g D7&lt;br&gt;
⭐ Name Box (Cell Address) - displays the reference of the currently selected cell. &lt;br&gt;
👀Formula Bar - displays the value or formula contained in the displayed cell. &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%2F8m4rnlircynieau4bdny.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%2F8m4rnlircynieau4bdny.png" alt=" " width="800" height="685"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;A data type is basically the different information contained in a cell. It can take different forms e.g Text, Numbers, Currency, Percentage. To view the different data types click, &lt;code&gt;Home - Number&lt;/code&gt;. In excel, data may appear as number but its actually stored as text. &lt;/p&gt;

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

&lt;h2&gt;
  
  
  Formatting and Organizing Data in Excel
&lt;/h2&gt;

&lt;p&gt;Formatting is used to make data easier to read, analyze and understand. Excel has different features that enhance data depending on the use-case. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Font – Changes how text is displayed, think of different handwritings. &lt;/li&gt;
&lt;li&gt;Font Size – Increases or decreases the size of the text.&lt;/li&gt;
&lt;li&gt;Bold – Makes text darker and is commonly used to emphasize headings or important values.&lt;/li&gt;
&lt;li&gt;Italic – Slants text and can be used to emphasize specific information.&lt;/li&gt;
&lt;li&gt;Underline – Places a line underneath text to make it stand out.&lt;/li&gt;
&lt;li&gt;Font Color – Changes the color of the text.&lt;/li&gt;
&lt;li&gt;Fill Color – Changes the background color of a cell.&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%2Fil42sevmp1kcmmx87qax.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%2Fil42sevmp1kcmmx87qax.png" alt=" " width="470" height="128"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating Tables
&lt;/h2&gt;

&lt;p&gt;Tables consist of several rows and columns. Tables can have headers which define the titles of the different columns. To create a table, Click &lt;code&gt;insert - Table&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%2Fvir40bo8z9bm2gb2z71g.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%2Fvir40bo8z9bm2gb2z71g.png" alt=" " width="522" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Sorting and filtering data aid in exploring and organizing data to get more insights about it. We can sort text from &lt;code&gt;A-Z&lt;/code&gt;, &lt;code&gt;Z-A&lt;/code&gt;. We can sort numbers from &lt;code&gt;Largest-Smallest&lt;/code&gt; or &lt;code&gt;Smallest-Largest&lt;/code&gt;We can even sort by color. Another advanced sorting mechanism is adding levels during sorting. &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%2Fohmegzt6qny9ht9y51gq.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%2Fohmegzt6qny9ht9y51gq.png" alt=" " width="597" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Filtering data allows us to display the conditions we need and hide the undesired conditions. We can do a custom filter to display the conditions required e.g Only filter quantity equals  to 7&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%2Ffnlv53y1736izvvauyxz.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%2Ffnlv53y1736izvvauyxz.png" alt=" " width="479" height="517"&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%2Ft2hz3kml78wqzujxr4jj.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%2Ft2hz3kml78wqzujxr4jj.png" alt=" " width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Data cleaning is the process of identifying, removing incorrect, incomplete, duplicate or unwanted data values before performing data analysis. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data Cleaning Techniques&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Missing Values Identification - for this, we can utilize filter, then select blanks. Another way can be through &lt;code&gt;COUNTBLANK&lt;/code&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%2Ft44z5oz1as10mi1g8eob.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%2Ft44z5oz1as10mi1g8eob.png" alt=" " width="388" height="493"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Removing duplicates - to remove duplicates, highlight the selection, Data- Remove duplicates. &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%2Fuwp8qnjez6gh248177ge.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%2Fuwp8qnjez6gh248177ge.png" alt=" " width="800" height="230"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Removing spaces from a word - you can use the &lt;code&gt;TRIM&lt;/code&gt; function for this. &lt;/li&gt;
&lt;li&gt;Text standardization - this can be formatting text into different cases. &lt;code&gt;UPPER&lt;/code&gt;, &lt;code&gt;LOWER&lt;/code&gt;, &lt;code&gt;PROPER&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Find &amp;amp; Find and Replace - to look for certain values or data from your excel, use &lt;code&gt;FIND&lt;/code&gt;&lt;code&gt;(CTRL+ F)&lt;/code&gt;. We can also choose to replace what we find with desired data using &lt;code&gt;FIND &amp;amp; REPLACE&lt;/code&gt; &lt;code&gt;CTRL+H&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All these techniques can be used to clean data before jumping into analysis. &lt;/p&gt;

&lt;h2&gt;
  
  
  Working with Formulas and Functions in Excel
&lt;/h2&gt;

&lt;p&gt;Formulas and functions come in handy in excel. Imagine you're trying to find the sum of company owned assets in a company with thousands of employees. All formulas in excel must start with the &lt;code&gt;=&lt;/code&gt;sign. &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%2F7smgboiwpd5vhxo52lgk.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%2F7smgboiwpd5vhxo52lgk.png" alt=" " width="433" height="117"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Functions in excel are designed to perform a particular operation. Instead of manually writing the calculation, we can specify the cell range and use a function e.g &lt;code&gt;=SUM(G2:G20)&lt;/code&gt;.&lt;br&gt;
Other basics functions we can work with are &lt;code&gt;SUM, AVERAGE, COUNT, AVERAGE, MIN, MAX, MEDIAN, MODE, COUNT, COUNTA, COUNTBLANK&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;AVERAGE - Calculates the average of numerical values&lt;br&gt;
COUNT   - Counts cells containing numbers&lt;br&gt;
COUNTA  - Counts cells that are not empty&lt;br&gt;
COUNTBLANK- Counts cells which are blank&lt;br&gt;
MIN - Returns the smallest value&lt;br&gt;
MAX - Returns the largest value&lt;br&gt;
MEDIAN  - Returns the middle value&lt;br&gt;
MODE    - Returns the most frequently occurring value&lt;/p&gt;

&lt;p&gt;Check the return of the functions for the below 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%2Fdmoywo5s0nvwcoljahb6.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%2Fdmoywo5s0nvwcoljahb6.png" alt=" " width="391" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Conditional functions or conditional aggregations perform calculations based on specific conditions and criteria. We can count, sum, average, when defined conditions are met.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;COUNTIF- Counts the number of cells that meet one specified condition. &lt;code&gt;=COUNTIF(range, criteria)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;COUNTIFS - Counts the number of records that meet multiple conditions.&lt;code&gt;=COUNTIFS(criteria_range1, criteria1, criteria_range2, criteria2, ...)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;SUMIF - Adds values that meet one specified condition.&lt;code&gt;=SUMIF(range, criteria, [sum_range])&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;SUMIFS - Adds values that meet multiple conditions.&lt;code&gt;=SUMIFS(sum_range, criteria_range1, criteria1, criteria_range2, criteria2, ...)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;AVERAGEIF - Calculates the average of values that meet one specified condition.&lt;code&gt;=AVERAGEIF(range, criteria, [average_range])&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;AVERAGEIFS - Calculates the average of values that meet multiple conditions. &lt;code&gt;=AVERAGEIFS(average_range, criteria_range1, criteria1, criteria_range2, criteria2, ...)&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, you can tell that IF is for one condition, and IFS specifies multiple conditions. &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%2Fmsl02psiyai09jsv5n9b.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%2Fmsl02psiyai09jsv5n9b.png" alt=" " width="799" height="250"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Date and Time Functions in Excel
&lt;/h2&gt;

&lt;p&gt;Date and Time functions in excel help us extract parts from a date, like the number of days, months, years, difference between dates and the working days e.tc.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;TODAY()&lt;/code&gt; Returns the current date.&lt;br&gt;
&lt;code&gt;NOW()&lt;/code&gt;    Returns the current date and current time.&lt;br&gt;
&lt;code&gt;DAY()&lt;/code&gt;    Extracts the day from a date.&lt;br&gt;
&lt;code&gt;MONTH()&lt;/code&gt; Extracts the month number from a date.&lt;br&gt;
&lt;code&gt;YEAR()&lt;/code&gt; Extracts the year from a date.&lt;br&gt;
&lt;code&gt;DATE()&lt;/code&gt; creates a date using a specified year, month, and day.&lt;br&gt;
&lt;code&gt;DATEDIF()&lt;/code&gt; - Calculates the difference between two dates in days, months, or years. You can specify with (D) for days, (M) for months, (Y) for years&lt;br&gt;
&lt;code&gt;NETWORKDAYS()&lt;/code&gt; - Calculates the number of working days between two dates, excluding weekends. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;DATEDIF() example&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%2F4k4cw4kw1x8t0nk12zk7.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%2F4k4cw4kw1x8t0nk12zk7.png" alt=" " width="344" height="101"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;PivotTables come in handy when you need to summarize and analyze a large amount of data. Think of a telco engineer who wants to analyze the KPIs of all sites across the country. It might take time analyzing one by one. &lt;/p&gt;

&lt;p&gt;TO create a pivotable in excel, follow the following steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Select all or the section of data you need to work with.&lt;/li&gt;
&lt;li&gt;Click insert - pivotable. Excel might open a new worksheet for the pivotables. &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%2Fqvvazrx70ya4eon24x2u.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%2Fqvvazrx70ya4eon24x2u.png" alt=" " width="799" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You can choose different fields to use as filters, columns, rows and values, by dragging and dropping them. With the data below, we can analyze the sum of sales for the different products. &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%2Fzgtxubnzwy5f46n7vkuj.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%2Fzgtxubnzwy5f46n7vkuj.png" alt=" " width="800" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;If you need a graphical analysis, you can proceed to insert pivot charts. Click on &lt;code&gt;Insert - Pivot chart - choose the chart type&lt;/code&gt; and you will have a graphical representation of your analysis. &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%2F19lhvvwjjo4zfuz0uk8c.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%2F19lhvvwjjo4zfuz0uk8c.png" alt=" " width="800" height="367"&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%2Fzx47xfwi7ywo66mgbvnx.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%2Fzx47xfwi7ywo66mgbvnx.png" alt=" " width="749" height="346"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Excel is a great tool for working with data. We have explored excel from basics, understanding the different tabs, formatting, creating tables, using different functions and even creating pivot tables and charts. Excel is capable of much more and is a great foundation for data analytics. &lt;/p&gt;

</description>
    </item>
    <item>
      <title>My First Github Project: From a Local Folder to Github Using Git and SSH</title>
      <dc:creator>Shikothetechgirl</dc:creator>
      <pubDate>Sat, 22 Aug 2026 12:03:48 +0000</pubDate>
      <link>https://dev.to/shikothetechgirl/my-first-github-project-from-a-local-folder-to-github-using-git-and-ssh-2oaj</link>
      <guid>https://dev.to/shikothetechgirl/my-first-github-project-from-a-local-folder-to-github-using-git-and-ssh-2oaj</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;Github and Git are commonly used in software and data projects to organize work, track changes and collaborate easily with project contributors. Github is a cloud based web platfrom where users can store and manage code while Git is the local software tool used to track changes in the code. in this article, I will demostrate how to move a project from a local folder using Git to Github while using SSH.SSH is the secure authentication channel that will allow our computer to communicate to Github without requiring authetication of a username or password each time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up Git
&lt;/h2&gt;

&lt;p&gt;Before uploading the project to Github, we will configure Git on the local machine. This will establish the default branch or channel that will be used. &lt;/p&gt;

&lt;h3&gt;
  
  
  Configuring the Git Username and Email
&lt;/h3&gt;

&lt;p&gt;After downloading Git, we will assign the user name and email address for our commits. &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%2Fcwoefch7ibppct10n2p6.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%2Fcwoefch7ibppct10n2p6.png" alt=" " width="481" height="222"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git config --global user.name "Your Name"&lt;br&gt;
git config --global user.email "your_email@example.com"&lt;br&gt;
git config --global init.defaultBranch main&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
The &lt;code&gt;--global&lt;/code&gt; option will apply the above settings to all the Got repositories and they will not be limited to the current project. To verify the configurations, we will use &lt;code&gt;git config --global --list&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%2Fg1tcbvgwebos9ee53ihk.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%2Fg1tcbvgwebos9ee53ihk.png" alt=" " width="378" height="130"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up Github and SSH Authentication
&lt;/h2&gt;

&lt;p&gt;After configuring Git, which will track changes to our project locally, we will configure Github which will manage and store our Git repositories on the cloud. To create a communication channel between the two, we will use SSH authentication. SSH is a secure communication protocal which will allow our computer to authenticate itself to Github.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checking for Existing SSH Keys &amp;amp; Generating an SSH Key
&lt;/h2&gt;

&lt;p&gt;We will run &lt;code&gt;ssh -V&lt;/code&gt; in Git to display the SSH version running in our computer. Let's also check for any existing SSH keys by running &lt;code&gt;ls -la ~/.ssh&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%2Fgo1a9l3hqzal53tbt5dy.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%2Fgo1a9l3hqzal53tbt5dy.png" alt=" " width="606" height="187"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Although we already have an SSH key, we will generate a new one by using &lt;code&gt;ssh-keygen -t ed25519 -C "project@example.com"&lt;/code&gt;. We will be prompted to specify the file to save the key and also set up a passphrase for it. The public key we will use for github will be stored in the &lt;code&gt;.pub&lt;/code&gt; file. We should then verify the key exists by &lt;code&gt;ls -la ~/.ssh&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%2F53pwwee2xoax4iq83zpc.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%2F53pwwee2xoax4iq83zpc.png" alt=" " width="592" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To display the contents of the public key created, we will run &lt;code&gt;cat ~/.ssh/id_ed25519_keyname.pub&lt;/code&gt; which will return the key&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding our Public SSH key to Github
&lt;/h2&gt;

&lt;p&gt;Assuming you already have a Github account, we will navigate to settings, &lt;code&gt;SSH and PG Keys&lt;/code&gt; then select &lt;code&gt;New SSH Key&lt;/code&gt;and add the public SSH key copied from Git Bash. Don't forget to give it a descriptive title. With this, Git and Github have a secure communication channel.&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%2Fkr1f37de6cim8p8tcelr.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%2Fkr1f37de6cim8p8tcelr.png" alt=" " width="428" height="481"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing the SSH Connection to GitHub
&lt;/h2&gt;

&lt;p&gt;To test that we have SSH connection between Git and Github, we will run &lt;code&gt;ssh -T git@github.com&lt;/code&gt; and receive below successful connection message.&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%2Fare47epk49y16m9d6v0r.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%2Fare47epk49y16m9d6v0r.png" alt=" " width="757" height="100"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Initializing our local Folder as a Git Repository
&lt;/h2&gt;

&lt;p&gt;Before we push anything to Github, we will ensure we create a folder which containers folder data and a README.md 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%2Fb74xecuqwdxz7icq1sml.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%2Fb74xecuqwdxz7icq1sml.png" alt=" " width="573" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We have used the below commands:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;mkdir "Data Science&lt;/code&gt; -make a folder called Data Science&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;cd Data Science&lt;/code&gt; -change directory to data science folder&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;pwd&lt;/code&gt; - print the current working directory&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;mkdir data&lt;/code&gt; - create a subfolder called data&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;touch README.md&lt;/code&gt; - create a file name which uses Markdown. This file will describe the project and other information related to it.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Initializing the Repository
&lt;/h3&gt;

&lt;p&gt;To initialize Git in this folder, we will run &lt;code&gt;git init&lt;/code&gt;. This will create an empty .git folder which will store information Git will use to manage the 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%2Fb6jshk3snauoj8dp026r.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%2Fb6jshk3snauoj8dp026r.png" alt=" " width="594" height="167"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Adding Data to the Data Folder &amp;amp; Staging
&lt;/h3&gt;

&lt;p&gt;After this verification, we will add an excel file into the data folder. The excel file contains health data. To stage we will use &lt;code&gt;git add .&lt;/code&gt; After this, our project is ready for the fist 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%2Fklzxa8v2h7vhypqeqhuh.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%2Fklzxa8v2h7vhypqeqhuh.png" alt=" " width="618" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Git Commit
&lt;/h3&gt;

&lt;p&gt;The commit step does not upload the project to Github yet. It is still stored locally in the computer. To send the project to Github, we will use &lt;code&gt;git push&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%2F6abwaynvbiqblsmwr9e5.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%2F6abwaynvbiqblsmwr9e5.png" alt=" " width="644" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating a Github Repository (Repo)
&lt;/h3&gt;

&lt;p&gt;For this step, we will go to Github, Home - New - then create 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%2Ff4wfu0dkeet9wuddsgi9.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%2Ff4wfu0dkeet9wuddsgi9.png" alt=" " width="800" height="679"&gt;&lt;/a&gt;&lt;br&gt;
After that, we will connect the local Git repo to our remote repo in Github. This creates a matching to where projects will be uploaded and where changes can be gotten from (fetching &amp;amp; pushing. We also verified the connection using &lt;code&gt;git remote -v&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%2Fl3ob71883chhp74aakc7.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%2Fl3ob71883chhp74aakc7.png" alt=" " width="604" height="241"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Pushing our Local Repository to Github
&lt;/h3&gt;

&lt;p&gt;Since both the repositories are connected, we can now push the local project files to Github using &lt;code&gt;git push -u origin main&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%2Ftavf3amxi7mlzsymnohh.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%2Ftavf3amxi7mlzsymnohh.png" alt=" " width="577" height="232"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Verify the Project on GitHub
&lt;/h3&gt;

&lt;p&gt;After pushing the repo to Github, we will check the empty remote repository in Github to confirm the local repo was pushed successfully. &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%2Fofdd4vivutog9zbouvbv.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%2Fofdd4vivutog9zbouvbv.png" alt=" " width="800" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating new changes through READ.ME file modification
&lt;/h3&gt;

&lt;p&gt;The README.md file provides information about the project. Let's add a description and push the changes to Github&lt;br&gt;
We will use the command &lt;code&gt;nano README.md&lt;/code&gt; add the text&lt;/p&gt;

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

&lt;p&gt;&lt;code&gt;cat README.md&lt;/code&gt; to display the changes made to the 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%2Fi7zmakr5e1ebe7k5rb59.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%2Fi7zmakr5e1ebe7k5rb59.png" alt=" " width="586" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Adding the changes, Committing and  pushing to Github&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%2Fhrqjy1rt7con2p8xd0do.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%2Fhrqjy1rt7con2p8xd0do.png" alt=" " width="800" height="571"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The screenshot below shows that the changes we made have been successfuly pushed to Github&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%2Fk3tl6xwjcdgqwyj6vjay.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%2Fk3tl6xwjcdgqwyj6vjay.png" alt=" " width="800" height="228"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;In this article, we went through the process of setting up Git and GitHub. We configured Git, set up SSH authentication, created a local repository then configured Github as the remote repository where we pushed all the work. The article shows the Git workflow from making changes, staging, committing and pushing. This will ensure easy project tracking and changes management. Additionally, other users can also see and contribute to our project. &lt;/p&gt;

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