<?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: Wanjira Njeri</title>
    <description>The latest articles on DEV Community by Wanjira Njeri (@wanjira01).</description>
    <link>https://dev.to/wanjira01</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%2F4071785%2Fade3b32a-8bb8-4ae4-8209-215fcfbe3bbd.png</url>
      <title>DEV Community: Wanjira Njeri</title>
      <link>https://dev.to/wanjira01</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/wanjira01"/>
    <language>en</language>
    <item>
      <title>Data Modelling, Relationships &amp; Joins in Power BI</title>
      <dc:creator>Wanjira Njeri</dc:creator>
      <pubDate>Mon, 14 Sep 2026 07:04:23 +0000</pubDate>
      <link>https://dev.to/wanjira01/data-modelling-relationships-joins-in-power-bi-1j39</link>
      <guid>https://dev.to/wanjira01/data-modelling-relationships-joins-in-power-bi-1j39</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Data modelling in Power BI is the process of organizing data into tables and defining how those tables are connected so that information can be analyzed correctly.&lt;/p&gt;

&lt;p&gt;A good model makes it easier to build reports,manage filters and write DAX calculations while keeping performance solid as the data keeps growing.&lt;/p&gt;

&lt;p&gt;In this article I work through three modelling approaches flat table, star schema and snowflake schema using the hospital visit records. It holds patient visits together with the doctor who saw them, the department they visited, the diagnosis given, the insurance provider on file and the resulting bill.&lt;/p&gt;

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

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

&lt;p&gt;A flat table stores transactional and descriptive data in one table. It's simple to set up and works fine for small datasets. As the dataset grows, it becomes harder to maintain the raw hospital export (&lt;code&gt;RawHospitalVisits&lt;/code&gt;) represents this structure: every visit row repeats the patient's name, the doctor's name, the department and the insurance provider.&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%2Fzmmiwojznew1iziwf8vg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzmmiwojznew1iziwf8vg.png" alt=" " width="799" height="191"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Simple to understand.&lt;/li&gt;
&lt;li&gt;Easy to import and start analyzing.&lt;/li&gt;
&lt;li&gt;Requires few or no relationships.&lt;/li&gt;
&lt;li&gt;Appropriate for small datasets.&lt;/li&gt;
&lt;li&gt;Convenient for simple dashboards.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Creates data redundancy.&lt;/li&gt;
&lt;li&gt;Doctor, department, and diagnosis information may be repeated.&lt;/li&gt;
&lt;li&gt;The table can become very wide.&lt;/li&gt;
&lt;li&gt;Data maintenance becomes harder.&lt;/li&gt;
&lt;li&gt;The model can become unnecessarily large.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;A star schema separates the data into a central fact table connected directly to dimension tables. This structure is cleaner, since it separates the business events (visits) from the descriptive information (who, where, when). It supports simple DAX, predictable filtering and good report performance.&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%2F7blvwt61ezfuidlww34d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7blvwt61ezfuidlww34d.png" alt=" " width="800" height="568"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Provides a clear and understandable model.&lt;/li&gt;
&lt;li&gt;Reduces unnecessary duplication.&lt;/li&gt;
&lt;li&gt;Makes DAX measures easier to create.&lt;/li&gt;
&lt;li&gt;Provides efficient filter propagation.&lt;/li&gt;
&lt;li&gt;Supports scalable reporting.&lt;/li&gt;
&lt;li&gt;Makes the model view easier to understand.&lt;/li&gt;
&lt;li&gt;Works well for analytical reporting.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Requires more planning than a flat table.&lt;/li&gt;
&lt;li&gt;May require Power Query transformations.&lt;/li&gt;
&lt;li&gt;Poorly designed keys can cause relationship problems.&lt;/li&gt;
&lt;li&gt;Users need to understand fact and dimension concepts.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;A snowflake schema is an advanced version of the star schema, splitting some dimension information into additional tables. In Hospital records, &lt;code&gt;DimDoctor&lt;/code&gt;'s Specialty was separated into its own &lt;code&gt;DimSpecialty&lt;/code&gt; table, &lt;code&gt;DimPatient&lt;/code&gt;'s Region into &lt;code&gt;DimRegion&lt;/code&gt;, and &lt;code&gt;DimDate&lt;/code&gt;'s Month into &lt;code&gt;DimMonth&lt;/code&gt;. This reduces redundancy but adds relationships and 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%2Fpubz30z8i2hr6gtzgdct.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpubz30z8i2hr6gtzgdct.png" alt=" " width="800" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Reduces duplication within dimensions.&lt;/li&gt;
&lt;li&gt;Can represent complex hierarchical structures.&lt;/li&gt;
&lt;li&gt;Can be useful when dimensions contain multiple levels.&lt;/li&gt;
&lt;li&gt;May be appropriate when source data is already highly normalized.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Creates more tables and relationships.&lt;/li&gt;
&lt;li&gt;Makes the model more complicated.&lt;/li&gt;
&lt;li&gt;Can make report development less intuitive.&lt;/li&gt;
&lt;li&gt;Can create longer filter paths.&lt;/li&gt;
&lt;li&gt;May require more complex DAX and relationship management.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Comparison
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Structure&lt;/th&gt;
&lt;th&gt;Advantages&lt;/th&gt;
&lt;th&gt;Disadvantages&lt;/th&gt;
&lt;th&gt;Best Fit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Flat&lt;/td&gt;
&lt;td&gt;One wide table&lt;/td&gt;
&lt;td&gt;Simple; few relationships&lt;/td&gt;
&lt;td&gt;Redundancy; wide table&lt;/td&gt;
&lt;td&gt;Small/simple datasets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Star&lt;/td&gt;
&lt;td&gt;Fact + dimensions&lt;/td&gt;
&lt;td&gt;Readable; scalable; DAX-friendly&lt;/td&gt;
&lt;td&gt;Requires planning&lt;/td&gt;
&lt;td&gt;Most BI projects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Snowflake&lt;/td&gt;
&lt;td&gt;Fact + normalized dimensions&lt;/td&gt;
&lt;td&gt;Less duplication; complex hierarchies&lt;/td&gt;
&lt;td&gt;More tables; longer filter paths&lt;/td&gt;
&lt;td&gt;Complex structures&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Keys, Cardinality &amp;amp; Referential Integrity
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;PatientID&lt;/code&gt; is unique in &lt;code&gt;DimPatient&lt;/code&gt;, making it the primary key. The same key appears many times in &lt;code&gt;FactVisits&lt;/code&gt; as a foreign key, since one patient can make multiple visits a &lt;strong&gt;one-to-many (1:*)&lt;/strong&gt; relationship.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Referential integrity&lt;/strong&gt; means every foreign key should have a matching record in the related table; when it doesn't, Power BI shows it as a blank, unresolved member usually a sign of a data-entry problem worth investigating.&lt;/p&gt;

&lt;h3&gt;
  
  
  Active &amp;amp; Inactive Relationships
&lt;/h3&gt;

&lt;p&gt;Power BI can hold more than one relationship between the same two tables, but only one is active at a time. &lt;code&gt;DimDate[Date]&lt;/code&gt; is actively related to &lt;code&gt;FactVisits[DateOfVisit]&lt;/code&gt;. A second, inactive relationship could connect &lt;code&gt;DimDate[Date]&lt;/code&gt; to &lt;code&gt;FactVisits[DateOfDischarge]&lt;/code&gt;, invoked deliberately in DAX with &lt;code&gt;USERELATIONSHIP()&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%2Fgva2q89a6c9ggiz0ywe6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgva2q89a6c9ggiz0ywe6.png" alt=" " width="800" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Filter Direction
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Single-direction filtering&lt;/strong&gt;-filters move from dimensions into &lt;code&gt;FactVisits&lt;/code&gt;-selecting "Oncology" in &lt;code&gt;DimDepartment&lt;/code&gt; filters the related visits. &lt;strong&gt;Bidirectional filtering&lt;/strong&gt; moves both ways, but should be used carefully since it can make filter paths harder to reason about.&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%2Fwibvhj95wf5yva88egd4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwibvhj95wf5yva88egd4.png" alt=" " width="799" height="195"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the Hospital records Model, Step by Step
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Import and inspect the data&lt;/strong&gt; &lt;code&gt;Home → Get Data → Excel Workbook&lt;/code&gt;, select the hospital records file. Clean in Power Query: numeric &lt;code&gt;Age&lt;/code&gt;/&lt;code&gt;Bill Amount&lt;/code&gt;, proper &lt;code&gt;Date of Visit&lt;/code&gt;, consistent text casing for &lt;code&gt;Doctor Name&lt;/code&gt; and &lt;code&gt;Diagnosis&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The flat table&lt;/strong&gt; loaded as-is, the cleaned sheet is one row per visit with every patient/doctor/department/insurance detail repeated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Building the star schema&lt;/strong&gt; split into &lt;code&gt;FactVisits&lt;/code&gt;, &lt;code&gt;DimPatient&lt;/code&gt;, &lt;code&gt;DimDoctor&lt;/code&gt;, &lt;code&gt;DimDate&lt;/code&gt;, &lt;code&gt;DimDepartment&lt;/code&gt;, then created these relationships in Model View:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DimPatient[PatientID]       1 -* FactVisits[PatientID]
DimDoctor[DoctorID]         1 -* FactVisits[DoctorID]
DimDepartment[DepartmentID] 1 -* FactVisits[DepartmentID]
DimDate[DateID]             1 -* FactVisits[DateOfVisit]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. The snowflake schema&lt;/strong&gt; -separated &lt;code&gt;Specialty&lt;/code&gt; out of &lt;code&gt;DimDoctor&lt;/code&gt; into &lt;code&gt;DimSpecialty&lt;/code&gt; (&lt;code&gt;FactVisits → DimDoctor → DimSpecialty&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Fact vs dimension tables&lt;/strong&gt; -&lt;code&gt;FactVisits&lt;/code&gt; holds the measure &lt;code&gt;Bill Amount (KES)&lt;/code&gt; plus foreign keys to every dimension. Grain = one row per visit (&lt;code&gt;VisitID&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Demonstrating Relationship Types
&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%2Fagg9eeio7pqcx0hth2hh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fagg9eeio7pqcx0hth2hh.png" alt=" " width="800" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One-to-Many (1:*)&lt;/strong&gt; -&lt;code&gt;DimPatient[PatientID]&lt;/code&gt; → &lt;code&gt;FactVisits[PatientID]&lt;/code&gt;. Used for every dimension-to-fact link.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-to-One (1:1)&lt;/strong&gt; -&lt;code&gt;DimPatient&lt;/code&gt; ↔ &lt;code&gt;PatientInsuranceProfile&lt;/code&gt;, each patient has exactly one insurance profile (NHIF Number, Coverage Tier).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Many-to-Many (*:*)&lt;/strong&gt; -&lt;code&gt;DimDoctor&lt;/code&gt; ↔ &lt;code&gt;DimDepartment&lt;/code&gt; (a doctor can consult across departments), resolved with a &lt;code&gt;BridgeDoctorDept&lt;/code&gt; table instead of a direct *:* relationship.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Two reference queries &lt;strong&gt;Patients&lt;/strong&gt; and &lt;strong&gt;Visits&lt;/strong&gt; with matching and non-matching records:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;PatientID&lt;/th&gt;
&lt;th&gt;Patient Name&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;6892&lt;/td&gt;
&lt;td&gt;Jane Mutua&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6413&lt;/td&gt;
&lt;td&gt;James Atieno&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4073&lt;/td&gt;
&lt;td&gt;John Kamau&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9754&lt;/td&gt;
&lt;td&gt;Anne Mutua&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6382&lt;/td&gt;
&lt;td&gt;Susan Odhiambo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;VisitID&lt;/th&gt;
&lt;th&gt;PatientID&lt;/th&gt;
&lt;th&gt;Diagnosis&lt;/th&gt;
&lt;th&gt;Bill Amount (KES)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;V1&lt;/td&gt;
&lt;td&gt;6892&lt;/td&gt;
&lt;td&gt;Diabetes&lt;/td&gt;
&lt;td&gt;28,108.15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V2&lt;/td&gt;
&lt;td&gt;6413&lt;/td&gt;
&lt;td&gt;Hypertension&lt;/td&gt;
&lt;td&gt;27,742.06&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V3&lt;/td&gt;
&lt;td&gt;4073&lt;/td&gt;
&lt;td&gt;Asthma&lt;/td&gt;
&lt;td&gt;21,428.48&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V4&lt;/td&gt;
&lt;td&gt;9754&lt;/td&gt;
&lt;td&gt;Diabetes&lt;/td&gt;
&lt;td&gt;24,371.93&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V5&lt;/td&gt;
&lt;td&gt;9999&lt;/td&gt;
&lt;td&gt;Malaria&lt;/td&gt;
&lt;td&gt;15,000.00&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;(Susan Odhiambo has no visit; V5 references an unregistered walk-in, PatientID 9999.)&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Join&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Left Outer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;All 5 patients + matches (Susan blank)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Right Outer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;All 5 visits + matches (V5 blank)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Full Outer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;All 6 records -everyone and every visit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Inner&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Only 4 matched rows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Left Anti&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1 row -Susan Odhiambo (never visited)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Right Anti&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1 row -V5 (unregistered PatientID 9999)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;p&gt;A &lt;strong&gt;merge&lt;/strong&gt; physically combines data during data prep merging Patients into Visits copies &lt;code&gt;Patient Name&lt;/code&gt; directly into the Visits query. A &lt;strong&gt;relationship&lt;/strong&gt; keeps &lt;code&gt;DimPatient&lt;/code&gt; and &lt;code&gt;FactVisits&lt;/code&gt; separate; it's created afterwards in Model View and only defines how the tables interact.&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%2Fza7xnx3lw1py991hrsv1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fza7xnx3lw1py991hrsv1.png" alt=" " width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Use a merge when data genuinely needs to become one dataset. For the main Hospital records model, relationships were the right choice excessive merging would rebuild a flat table like the original &lt;code&gt;RawHospitalVisits&lt;/code&gt; export.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Star schema&lt;/strong&gt;, with &lt;code&gt;FactVisits&lt;/code&gt; connected to &lt;code&gt;DimPatient&lt;/code&gt;, &lt;code&gt;DimDoctor&lt;/code&gt;, &lt;code&gt;DimDate&lt;/code&gt; and &lt;code&gt;DimDepartment&lt;/code&gt; via one-to-many, single-direction relationships. It gives the best balance of performance, simplicity and scalability the flat table creates repeated data as visits grow, and the snowflake schema adds complexity that isn't worth it for most reporting needs. Many-to-many relationships, bidirectional filtering, and merges are reserved for the specific cases like the doctor/department bridge table that genuinely need them.&lt;/p&gt;

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

&lt;p&gt;Flat tables, star schemas and snowflake schemas each have their place, but for this hospital dataset and most typical BI projects a star schema with one-to-many relationships and mainly single-direction filtering keeps the model organised, reduces unnecessary complexity and makes reporting, filtering and future changes easier to manage.&lt;/p&gt;

</description>
      <category>datanalytics</category>
      <category>powerbi</category>
      <category>joins</category>
      <category>datamodelling</category>
    </item>
    <item>
      <title>Building an Interactive Excel Dashboard for E-commerce Product Analysis: A Case Study of Jumia Products</title>
      <dc:creator>Wanjira Njeri</dc:creator>
      <pubDate>Sat, 05 Sep 2026 18:53:27 +0000</pubDate>
      <link>https://dev.to/wanjira01/building-an-interactive-excel-dashboard-for-e-commerce-product-analysis-a-case-study-of-jumia-370l</link>
      <guid>https://dev.to/wanjira01/building-an-interactive-excel-dashboard-for-e-commerce-product-analysis-a-case-study-of-jumia-370l</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;When I first looked at the Jumia product dataset for this project, it seemed fairly simple.There were product names,prices,discounts,reviews and ratings. At first glance, it looked like a dataset that could easily be summarized with a few Excel formulas and charts.&lt;/p&gt;

&lt;p&gt;But after opening the data and actually trying to analyze it, I quickly realized that the difficult part was not creating the charts. The real challenge was getting the data into a form that Excel could actually analyze correctly.&lt;/p&gt;

&lt;p&gt;Some prices contained currency symbols,ratings were written as text such as "4.5 out of 5" and the review data needed cleaning before it could be used confidently. This made the project a good practical example of what happens in a real data analysis process.&lt;/p&gt;

&lt;p&gt;For this project, I used Microsoft Excel to clean and analyze Jumia product data and then created an interactive dashboard to explore product pricing,discounts,customer reviews and ratings.&lt;/p&gt;

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

&lt;p&gt;The dataset contained information about 115 Jumia products.&lt;/p&gt;

&lt;p&gt;The original columns were;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Product&lt;/li&gt;
&lt;li&gt;Current Price&lt;/li&gt;
&lt;li&gt;Old Price&lt;/li&gt;
&lt;li&gt;Discount&lt;/li&gt;
&lt;li&gt;Review&lt;/li&gt;
&lt;li&gt;Rating&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These variables provided enough information to explore product pricing and customer engagement.&lt;/p&gt;

&lt;p&gt;The Current Price represented the selling price of the product while Old Price represented the price before the discount. The Discount column showed the percentage reduction, while Review and Rating provided information about customer engagement and satisfaction.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fold0egr1ch90n65mw0vu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fold0egr1ch90n65mw0vu.png" alt=" " width="520" height="730"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Raw data before cleaning&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Before starting the analysis, I first cleaned the dataset to make sure the information was consistent and suitable for analysis. I focused on several issues I identified in the original Jumia data.&lt;/p&gt;

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

&lt;p&gt;I first checked for duplicate products using Conditional Formatting in Excel. This made it easier to visually identify repeated records before removing them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Standardizing Text
&lt;/h3&gt;

&lt;p&gt;I standardized the text in the product column to make the product names more consistent.I did this by highlighting the columns then right clicking and then formating them to numbers. This is important because small differences in text formatting can make the same product appear as different values during analysis.&lt;/p&gt;

&lt;h3&gt;
  
  
  Removing Negative Values
&lt;/h3&gt;

&lt;p&gt;I also checked the review column for negative values and corrected the invalid entries by&lt;code&gt;Find and replace&lt;/code&gt; then standardised the numericals. &lt;/p&gt;

&lt;h3&gt;
  
  
  Standardizing the Rating Column
&lt;/h3&gt;

&lt;p&gt;The rating column was originally stored as text, with values such as_ 4.5 out of 5_. I converted these values into numerical ratings. &lt;br&gt;
I extracted the numerical part using:&lt;br&gt;
&lt;code&gt;Ctrl+H find out of 5 and replace with blank&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
This converted a value such as &lt;code&gt;4.5 out of 5&lt;/code&gt; into the numerical value &lt;code&gt;4.5&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Correcting Rating Spelling
&lt;/h3&gt;

&lt;p&gt;I also corrected inconsistencies and spelling issues in the rating related data so that the ratings followed one standard format.&lt;/p&gt;

&lt;h3&gt;
  
  
  Standardizing Prices
&lt;/h3&gt;

&lt;p&gt;The price columns also needed cleaning because some prices contained currency symbols, commas, or inconsistent formatting.&lt;br&gt;
For example:&lt;br&gt;
&lt;code&gt;KSh 1,525&lt;/code&gt;&lt;br&gt;
was converted into a numerical value that Excel could use for calculations.Then converted the columns to currency and used &lt;em&gt;Kes&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This allowed me to calculate statistics such as average price, minimum price, maximum price and discount amounts.&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%2F9abj93s7nn23df34a7es.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9abj93s7nn23df34a7es.png" alt=" " width="344" height="606"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Cleaned price columns&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating New Fields
&lt;/h2&gt;

&lt;p&gt;After cleaning the original columns, I created additional fields to make the analysis more useful.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.Discount Amount&lt;/strong&gt;&lt;br&gt;
I created a Discount Amount column by subtracting the current price from the old price:&lt;/p&gt;

&lt;p&gt;Discount Amount = Old Price − Current Price&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;KSh 1,525 − KSh 950 = KSh 575&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%2Fm6wuykoill22a5x4nt2l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm6wuykoill22a5x4nt2l.png" alt=" " width="344" height="606"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.Rating Categories&lt;/strong&gt;&lt;br&gt;
I grouped products into three rating categories,&lt;br&gt;
Poor: Below 3&lt;br&gt;
Average: 3–4&lt;br&gt;
Excellent: Above 4.5&lt;br&gt;
&lt;code&gt;=IF(I3&amp;lt;3,"Poor",IF(AND(I3&amp;gt;=3,I3&amp;lt;=4),"Average",IF(I3&amp;gt;4,"Excellent")))&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
This made it easier to compare groups of products and later use them in PivotTables and dashboard slicers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.Discount Categories&lt;/strong&gt;&lt;br&gt;
I also categorized discounts as,&lt;br&gt;
Low Discount: Below 20%&lt;br&gt;
Medium Discount: 20%–40%&lt;br&gt;
High Discount: Above 40%&lt;br&gt;
&lt;code&gt;=IF(G3&amp;lt;20%,"Low discount",IF(AND(G3&amp;gt;=20%,G3&amp;lt;=40%),"Medium discount",IF(G3&amp;gt;40%,"High discount")))&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4.Price Category&lt;/strong&gt;&lt;br&gt;
I created this field containing Low,Medium and High Price categories. This was particularly useful when creating the dashboard filters.&lt;br&gt;
&lt;code&gt;=IF(B2&amp;lt;1000,"Low price",IF(AND(B2&amp;gt;=1000,B2&amp;lt;=3000),"Medium price",IF(B2&amp;gt;3000,"High price")))&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

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

&lt;p&gt;Once the data was cleaned, I calculated some basic statistics to understand the dataset.&lt;/p&gt;

&lt;p&gt;The average current price was approximately KSh 2,355, while the average old price was approximately KSh 3,575.&lt;/p&gt;

&lt;p&gt;The average discount was approximately 36.8%.&lt;br&gt;
The minimum current price was KSh 38, while the maximum was approximately KSh 132,932.&lt;/p&gt;

&lt;p&gt;The large difference between the minimum and maximum prices showed that products on the platform covered a very wide price range.&lt;/p&gt;

&lt;p&gt;These statistics became the basis for the KPI section of my dashboard.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl9n096ngdjvcr88oxh02.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl9n096ngdjvcr88oxh02.png" alt=" " width="798" height="106"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Exploring Relationships in the Data
&lt;/h2&gt;

&lt;p&gt;After looking at the overall statistics, I wanted to investigate relationships between different variables.&lt;br&gt;
&lt;strong&gt;1.Discount vs Reviews&lt;/strong&gt;&lt;br&gt;
The first question I explored was,&lt;br&gt;
Do higher discounts lead to more customer engagement?&lt;/p&gt;

&lt;p&gt;I compared discount percentages with the number of reviews.&lt;br&gt;
The results showed that having a large discount did not automatically mean that a product had many reviews. Some highly discounted products had relatively low review counts, while some products with smaller discounts still received significant customer engagement.&lt;/p&gt;

&lt;p&gt;This suggests that discounts can attract attention but they are not the only factor influencing customer engagement.&lt;/p&gt;

&lt;p&gt;Product quality, usefulness, price, visibility and customer experience can also play an important role.&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%2Fsq9v7lok0jb8waabdhzp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsq9v7lok0jb8waabdhzp.png" alt=" " width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.Rating vs Reviews&lt;/strong&gt;&lt;br&gt;
This comparison was particularly interesting because the two variables measure different things.&lt;/p&gt;

&lt;p&gt;A review count can indicate customer engagement, while a rating can give an indication of customer satisfaction.&lt;/p&gt;

&lt;p&gt;For example, the 120W Cordless Vacuum Cleaners Handheld Electric Vacuum Cleaner had the highest review count at 69 reviews, but its rating was only 2.8.&lt;/p&gt;

&lt;p&gt;In contrast, the 137 Pieces Cake Decorating Tool Set Baking Supplies had 55 reviews and a rating of 4.6.&lt;/p&gt;

&lt;p&gt;A product with many reviews is not necessarily highly rated and a product with a perfect rating may have very few reviews.&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%2Furuvmjvp0xwyy3mtp9xd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Furuvmjvp0xwyy3mtp9xd.png" alt=" " width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.Price vs Rating&lt;/strong&gt;&lt;br&gt;
I also compared current prices with product ratings.&lt;/p&gt;

&lt;p&gt;The purpose was to find out whether more expensive products necessarily received better ratings.&lt;/p&gt;

&lt;p&gt;The analysis did not indicate that price alone determines customer satisfaction.&lt;/p&gt;

&lt;p&gt;Highly rated products appeared at different price levels, suggesting that factors such as product quality and perceived value may be more important than price alone.&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%2Fu0qm3q9ys50sx1rmc5dq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu0qm3q9ys50sx1rmc5dq.png" alt=" " width="800" height="367"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;The next step was to identify products that stood out based on discounts,reviews and ratings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Top Discounts&lt;/strong&gt;&lt;br&gt;
The highest discount recorded was 64%.&lt;/p&gt;

&lt;p&gt;Some of the products with the highest discounts included:&lt;br&gt;
6 In 1 Bottle Can Opener Multifunctional Easy Opener- 64%&lt;br&gt;
Creative Owl Shape Keychain Black- 61%&lt;br&gt;
5-PCS Stainless Steel Cooking Pot Set With Steamed Slices- 55%&lt;br&gt;
LASA 3 Tier Bamboo Shoe Bench Storage Shelf- 54%&lt;/p&gt;

&lt;p&gt;However, having the highest discount did not automatically mean that these were the best-performing products.&lt;/p&gt;

&lt;p&gt;This was one of the reasons I decided to compare discounts with ratings and reviews rather than looking at discounts alone.&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%2Fxueuss3vgauz97kty2ma.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxueuss3vgauz97kty2ma.png" alt=" " width="799" height="268"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Top Reviews and Ratings&lt;/strong&gt;&lt;br&gt;
The product with the highest recorded number of reviews was the 120W Cordless Vacuum Cleaners Handheld Electric Vacuum Cleaner, with 69 reviews.&lt;/p&gt;

&lt;p&gt;The dataset also contained several products with ratings of 5.0.&lt;br&gt;
However, I did not consider a 5.0 rating alone enough to determine overall product performance. A product with a perfect rating but very few reviews may not provide as much evidence as a product with a slightly lower rating and dozens of reviews.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;High Discounts and Low Ratings&lt;/strong&gt;&lt;br&gt;
Another analysis I found useful was identifying products that combined high discounts with low ratings.&lt;/p&gt;

&lt;p&gt;This is important because a seller might assume that reducing a product's price will solve poor performance.&lt;/p&gt;

&lt;p&gt;However, if customers are giving the product low ratings, the underlying problem may have more to do with product quality,expectations,packaging or the accuracy of the product description.&lt;/p&gt;

&lt;p&gt;For example, the 5-PCS Stainless Steel Cooking Pot Set With Steamed Slices appeared among highly discounted products while also having a relatively low rating.&lt;/p&gt;

&lt;p&gt;Instead of simply increasing the discount, a seller could investigate customer feedback and determine what is causing dissatisfaction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the Interactive Dashboard
&lt;/h2&gt;

&lt;p&gt;After completing the analysis, I brought the most important findings together into an interactive Excel dashboard.&lt;/p&gt;

&lt;p&gt;The dashboard included KPI cards for the main metrics, charts for product performance,category breakdowns and slicers.&lt;/p&gt;

&lt;p&gt;The slicers allowed the dashboard to be filtered according to:&lt;/p&gt;

&lt;p&gt;_- Rating Category&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Discount Category&lt;/li&gt;
&lt;li&gt;Price Category_&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This made the dashboard more interactive because users could focus on particular groups of products instead of viewing the entire dataset at once.&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%2Fezsw29cvub80do98qt39.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fezsw29cvub80do98qt39.png" alt=" " width="800" height="608"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;After completing the analysis, several key insights stood out.&lt;/p&gt;

&lt;p&gt;First, higher discounts did not automatically result in higher customer engagement. Discounting can help attract customers, but it is not enough by itself.&lt;/p&gt;

&lt;p&gt;Second, ratings and reviews should be considered together. A product with many reviews and a strong rating gives a better indication of both engagement and satisfaction.&lt;/p&gt;

&lt;p&gt;Third, price does not necessarily determine customer satisfaction. Highly rated products existed at different price levels.&lt;/p&gt;

&lt;p&gt;Finally, products with high discounts and low ratings deserve further investigation rather than simply receiving bigger discounts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recommendations for Jumia Sellers
&lt;/h2&gt;

&lt;p&gt;Based on the analysis, I would recommend that sellers,&lt;br&gt;
&lt;strong&gt;1.Use discounts strategically&lt;/strong&gt;&lt;br&gt;
Discounts should be combined with good product quality,accurate descriptions,attractive images and good customer service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.Monitor reviews and ratings&lt;/strong&gt;&lt;br&gt;
Sellers should regularly monitor both review volume and ratings instead of relying on one metric.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.Investigate low-rated products&lt;/strong&gt;&lt;br&gt;
Products receiving poor ratings should be investigated to understand the cause of customer dissatisfaction before additional promotions are introduced.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4.Review pricing based on performance&lt;/strong&gt;&lt;br&gt;
Not every product needs the same discount. Pricing strategies should take into account customer engagement,ratings,competition and product value.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5.Use customer feedback&lt;/strong&gt;&lt;br&gt;
Reviews provide useful information about product weaknesses and opportunities for improvement.&lt;/p&gt;

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

&lt;p&gt;This project helped me understand that Excel can be much more than a tool for entering data and performing simple calculations.&lt;/p&gt;

&lt;p&gt;I started with a raw Jumia dataset and used Excel to clean the data, convert text into usable numerical values,create calculated fields, categorize products,analyze relationships and identify product performance patterns.&lt;/p&gt;

&lt;p&gt;I learned the importance of questioning the data. Finding unusual values such as an invalid rating reminded me that even a well designed dashboard can produce misleading results if the underlying data is not properly validated.&lt;/p&gt;

&lt;p&gt;Overall, the project gave me practical experience with data cleaning, Excel formulas,Pivot tables,Pivot charts,slicers and dashboard design.&lt;/p&gt;

&lt;p&gt;More importantly, it showed me how to move from raw data to data that can actually be understood and used.&lt;/p&gt;

</description>
      <category>data</category>
      <category>analytics</category>
      <category>learning</category>
    </item>
    <item>
      <title>Getting Started with Excel for Data Analytics: From Basics to Data Cleaning</title>
      <dc:creator>Wanjira Njeri</dc:creator>
      <pubDate>Sat, 29 Aug 2026 19:48:23 +0000</pubDate>
      <link>https://dev.to/wanjira01/getting-started-with-excel-for-data-analytics-from-basics-to-data-cleaning-5bkl</link>
      <guid>https://dev.to/wanjira01/getting-started-with-excel-for-data-analytics-from-basics-to-data-cleaning-5bkl</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Excel is mainly known as a tool for creating tables,keeping records and performing calculations. However, its features also make it useful for preparing and analyzing data. A well organized spreadsheet makes it easier to identify patterns, correct errors, calculate useful measures, and prepare information for further analysis.&lt;br&gt;
This article demonstrates the use of Excel with a small sales dataset. The dataset contains customer information, regions, product categories, order dates, quantities, prices and order status. The main focus is on moving from basic spreadsheet operations to practical data cleaning. The process includes entering and formatting data, sorting and filtering records, correcting inconsistent text, removing duplicates, creating formulas, and checking the quality of the final dataset.&lt;/p&gt;

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

&lt;p&gt;Before working with a dataset, it is important to understand the basic Excel workspace. The Ribbon provides access to the main commands and features, while the Formula Bar displays the contents of the selected cell. The Name Box identifies the cell address, such as A1 or B5.&lt;br&gt;
The worksheet is organized into rows and columns. Each intersection forms a cell, and a collection of cells is known as a range. This structure is particularly useful for data analytics because each column can contain a specific field while each row represents an individual record.&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%2F9u73gf1n7hfkrsmiqor0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9u73gf1n7hfkrsmiqor0.png" alt=" " width="800" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Formating dataset
&lt;/h2&gt;

&lt;p&gt;Formatting improves the readability of a worksheet and helps distinguish different types of information. Column headings can be made bold, column widths can be adjusted, and borders can be added to make the table easier to follow.&lt;br&gt;
Number formatting is also useful. Prices and calculated sales values can be displayed with thousands separators or currency formatting, while dates can be displayed using a consistent format. Formatting does not change the underlying value; it changes how that value appears on the worksheet.&lt;br&gt;
A clean and simple layout is usually more useful than excessive formatting. The main purpose of formatting in a data worksheet is to make the information easy to read and understand&lt;/p&gt;

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

&lt;p&gt;Sorting is a quick way to arrange records in a meaningful order. A customer column can be sorted alphabetically, dates can be arranged from oldest to newest, and prices can be arranged from lowest to highest.It's particularly useful during data checking because unusual values can become easier to notice. For example, sorting Unit Price from largest to smallest makes the highest priced orders immediately visible.&lt;br&gt;
Filtering works differently because it temporarily hides records that do not meet selected conditions. The dataset can be filtered to show only orders from Nairobi, only completed orders or only sales above a particular value. The hidden records are not deleted and can be displayed again by removing the filter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Freezing Headings
&lt;/h2&gt;

&lt;p&gt;Large datasets can contain hundreds or thousands of rows. Scrolling through such a dataset can make it difficult to remember which column contains which information.&lt;br&gt;
Freeze Panes solves this problem.&lt;br&gt;
Freezing the top row keeps the headings visible while scrolling down the worksheet. This is a simple feature but it becomes very useful when working with larger datasets.&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%2F4qqsaj424e9x6m6ek31g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4qqsaj424e9x6m6ek31g.png" alt=" " width="800" height="410"&gt;&lt;/a&gt;&lt;em&gt;Raw data before cleaning&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Cleaning Customer Names
&lt;/h2&gt;

&lt;p&gt;The first cleaning step involves standardizing customer names. Extra spaces can cause problems when comparing values, while inconsistent capitalization makes the dataset look untidy and can interfere with grouping.&lt;br&gt;
The &lt;code&gt;TRIM()&lt;/code&gt; function removes unnecessary spaces from text. &lt;code&gt;PROPER()&lt;/code&gt; changes text so that the first letter of each word is capitalized. These functions can also be combined.&lt;br&gt;
For example:&lt;br&gt;
&lt;code&gt;=PROPER(TRIM(B2))&lt;/code&gt;&lt;br&gt;
This can convert an entry such as “  john doe ” into “John Doe”.&lt;br&gt;
The result is more consistent and easier to work with. &lt;br&gt;
Other text functions such as &lt;code&gt;UPPER()&lt;/code&gt;, &lt;code&gt;LOWER()&lt;/code&gt;,&lt;code&gt;LEFT()&lt;/code&gt;, &lt;code&gt;RIGHT()&lt;/code&gt;, &lt;code&gt;MID()&lt;/code&gt;, &lt;code&gt;LEN()&lt;/code&gt;, &lt;code&gt;FIND()&lt;/code&gt;and &lt;code&gt;SUBSTITUTE()&lt;/code&gt; can also be useful for different cleaning tasks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Standardizing Categories
&lt;/h2&gt;

&lt;p&gt;The Category column also needs consistent values. For example, “electronics”, “Electronics”, and “electronics ” may all refer to the same category even though the entries are written differently.&lt;br&gt;
Standardizing the categories ensures that records belonging to the same group remain together during analysis. Without this step, a summary of Electronics sales could incorrectly treat different spellings or capitalization as separate categories.&lt;br&gt;
This demonstrates why data cleaning is an analytical step rather than simply a formatting exercise. Small inconsistencies can affect the results of later calculations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Removing Duplicate Records
&lt;/h2&gt;

&lt;p&gt;A duplicate transaction was also identified in the dataset. The same Order ID and transaction details appeared more than once.&lt;br&gt;
Before removing a duplicate, the records should be checked carefully. A repeated customer name does not automatically mean a duplicate because one customer may place several legitimate orders. In this case, the repeated record represents the same transaction and it can be removed.&lt;br&gt;
Excel provides the Remove Duplicates feature under the Data tab. Removing confirmed duplicates prevents the same transaction from being counted twice and helps keep totals accurate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Working with Dates
&lt;/h2&gt;

&lt;p&gt;Dates are important in a sales dataset because they allow transactions to be sorted and filtered by time.All dates should be stored consistently and recognized by Excel as actual date values.&lt;br&gt;
The Order Date column was standardized so that all dates use the same display format. Once the dates are consistent, the records can be arranged chronologically and filtered by date more reliably.&lt;br&gt;
This becomes useful when analyzing monthly or yearly sales trends.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating a Sales Calculation
&lt;/h2&gt;

&lt;p&gt;After cleaning the basic information, a calculated column can be added to the dataset.&lt;br&gt;
The new column is called Sales (KES). It shows the total value of each order.&lt;br&gt;
The calculation is&lt;br&gt;
&lt;code&gt;=F2*G2&lt;/code&gt;&lt;br&gt;
If Quantity is stored in F2 and Unit Price is stored in G2, Excel multiplies the two values to calculate the sales amount.&lt;br&gt;
The formula can then be copied down the column. This is much faster than calculating every row manually.&lt;br&gt;
It also means that if the quantity or price changes, the sales value can update automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using Basic Excel Functions
&lt;/h2&gt;

&lt;p&gt;Excel provides many functions for summarizing data.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;SUM()&lt;/code&gt; function adds values together.
For example:
=SUM(I2:I16)
calculates the total sales.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;AVERAGE()&lt;/code&gt;function calculates the average value.
=AVERAGE(I2:I16)&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;MIN()&lt;/code&gt; function identifies the smallest value, while MAX() identifies the largest.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;COUNT()&lt;/code&gt; function counts cells containing numerical values.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;COUNTA()&lt;/code&gt; function counts all non blank cells.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;COUNTBLANK&lt;/code&gt; function counts all blanks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How to Use a Function:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click on an empty cell (e.g., B6)&lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;=SUM(B1:B5)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Press Enter&lt;/li&gt;
&lt;li&gt;Excel returns the total sum of B1 to B5
Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;=SUM(A2:A4)&lt;/code&gt; → Adds numbers in A2, A3, A4
2.&lt;code&gt;=AVERAGE(B1:B3)&lt;/code&gt; → Returns the average&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;=MAX(C1:C5)&lt;/code&gt; → Finds the largest number&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These functions provide a quick way to understand a dataset without manually calculating each result.&lt;/p&gt;

&lt;h3&gt;
  
  
  Relative and Absolute Cell References
&lt;/h3&gt;

&lt;p&gt;Cell references determine which cells a formula uses.&lt;br&gt;
A reference such as A1 is a relative reference. When the formula is copied to another cell, the reference normally changes.&lt;br&gt;
An absolute reference uses dollar signs, such as $A$1. This reference remains fixed when the formula is copied.&lt;br&gt;
Absolute references are useful when one value needs to be used repeatedly. For example, if a tax rate is stored in one cell, $A$1 can be used in several formulas without the reference changing.&lt;br&gt;
Understanding cell references is important because incorrect references can produce incorrect calculations.&lt;/p&gt;

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

&lt;p&gt;Conditional Formatting provides a visual way to identify important values.&lt;br&gt;
For example, sales values above a certain amount can be highlighted. Lower values can also be identified using a different rule.&lt;br&gt;
Conditional Formatting is useful when checking a dataset because unusual values can be spotted quickly.&lt;br&gt;
It does not change the actual values. Instead, it changes how the cells are displayed based on a selected condition.&lt;/p&gt;

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

&lt;p&gt;Data Validation helps control what can be entered into a cell.&lt;br&gt;
For example, the Status column can contain a dropdown list with three options&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Completed&lt;/li&gt;
&lt;li&gt;Pending&lt;/li&gt;
&lt;li&gt;Cancelled
This prevents users from entering different versions such as &lt;em&gt;complete _or _done&lt;/em&gt;.
Data Validation is useful because preventing inconsistent data is easier than cleaning it later.
It can also be used to restrict numbers, dates or the length of text entered into a cell.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  From Raw Data to Clean Data
&lt;/h3&gt;

&lt;p&gt;The difference between the raw and cleaned datasets may appear small, but it is important.&lt;br&gt;
The raw dataset contains inconsistent customer names, category formats, unnecessary spaces, and a duplicate record.&lt;br&gt;
The cleaned dataset has standardized names and categories, consistent dates, the duplicate removed, and a new Sales column containing calculated values.&lt;br&gt;
The cleaned version is therefore easier to filter, summarize and analyze.&lt;br&gt;
This process shows that data preparation should happen before conclusions are drawn from a dataset.&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%2F8dvk0musff5j4h8qqog2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8dvk0musff5j4h8qqog2.png" alt=" " width="799" height="417"&gt;&lt;/a&gt;&lt;em&gt;Cleaned data&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Data cleaning is important because errors in the original dataset can affect every stage that follows.&lt;br&gt;
A duplicate transaction can increase total sales. An inconsistent category can cause sales to be split between two groups. Extra spaces can prevent values from matching correctly.&lt;br&gt;
Cleaning therefore improves the reliability of the analysis.&lt;br&gt;
It also makes the dataset easier for another person to understand. A clean spreadsheet has consistent headings, values, formats, and structures.&lt;/p&gt;

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

&lt;p&gt;Excel provides a practical starting point for data analytics because it combines data organization, cleaning, calculations and basic analysis in one tool.&lt;br&gt;
The sales dataset demonstrates how a raw spreadsheet can be improved through a series of simple steps. Data is first entered and organized, followed by formatting, sorting and filtering. Problems such as unnecessary spaces, inconsistent capitalization, duplicate records and inconsistent categories are then corrected.&lt;br&gt;
Functions such as &lt;code&gt;TRIM()&lt;/code&gt;, &lt;code&gt;PROPER()&lt;/code&gt;, &lt;code&gt;SUM()&lt;/code&gt;, &lt;code&gt;AVERAGE()&lt;/code&gt;, &lt;code&gt;MIN()&lt;/code&gt; and &lt;code&gt;MAX()&lt;/code&gt; make it possible to clean and summarize the information efficiently. Features such as Conditional Formatting, Data Validation, Freeze Panes and Remove Duplicates provide additional support.&lt;/p&gt;

&lt;p&gt;The main lesson is that good analysis depends on good data. Cleaning may seem like a basic step but it has a direct effect on the accuracy of the final results. With these Excel skills raw information can be transformed into a structured and reliable dataset that is ready for further analysis.&lt;/p&gt;

</description>
      <category>datanalytics</category>
      <category>datascience</category>
      <category>data</category>
      <category>beginners</category>
    </item>
    <item>
      <title>My First GitHub Project: From a Local Folder to GitHub Using Git and SSH</title>
      <dc:creator>Wanjira Njeri</dc:creator>
      <pubDate>Sat, 22 Aug 2026 15:33:40 +0000</pubDate>
      <link>https://dev.to/wanjira01/my-first-github-project-from-a-local-folder-to-github-using-git-and-ssh-4fpb</link>
      <guid>https://dev.to/wanjira01/my-first-github-project-from-a-local-folder-to-github-using-git-and-ssh-4fpb</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;For my first GitHub project, I chose to create a simple &lt;strong&gt;Personal Expense Tracker&lt;/strong&gt;. The idea is to keep my expenses organized and eventually use data analysis to understand where my money goes. The project can contain an Excel file for recording expenses, a Python script for analysis and a &lt;code&gt;README.md&lt;/code&gt; file explaining the project.&lt;/p&gt;

&lt;h3&gt;
  
  
  Opening directories
&lt;/h3&gt;

&lt;p&gt;Open Gitbash and run &lt;code&gt;ssh -T git@github.com&lt;/code&gt; to confirm that my Git successfully connected to Github.&lt;/p&gt;

&lt;p&gt;Run &lt;code&gt;pwd&lt;/code&gt; to confirm my current location.This will show the home directory.&lt;br&gt;
Run &lt;code&gt;ls&lt;/code&gt; to list the files and folders in my current directory.&lt;br&gt;
Now move to the desktop by running &lt;code&gt;cd Desktop&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Create the Project Folder
&lt;/h3&gt;

&lt;p&gt;The project I am working on is Personal-Expense-Tracker&lt;/p&gt;

&lt;p&gt;Start by creating a folder for the project on my computer and navigating into it by running,&lt;br&gt;
&lt;code&gt;mkdir personal-expense-tracker&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Move into the folder I created by running,&lt;br&gt;
&lt;code&gt;cd personal-expense-tracker&lt;/code&gt;&lt;br&gt;
I now create more folders in my current directory,&lt;br&gt;
&lt;code&gt;mkdir data&lt;br&gt;
mkdir scripts&lt;/code&gt;&lt;br&gt;
I then create a file by running &lt;code&gt;README.md&lt;/code&gt; where I will explain the content of the entire project.&lt;/p&gt;

&lt;p&gt;I could create and add information to the file using the format &lt;code&gt;"echo Personal expense tracker"&amp;gt;README.md&lt;/code&gt;&lt;br&gt;
I can then check the contents using&lt;br&gt;
&lt;code&gt;cat README.md&lt;/code&gt;&lt;br&gt;
If I need to make further changes, I can open the file using&lt;br&gt;
&lt;code&gt;nano README.md&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Initialising Git
&lt;/h3&gt;

&lt;p&gt;After preparing my project,I initialise Git inside the project folder.&lt;br&gt;
I do this by running&lt;br&gt;
&lt;code&gt;git init&lt;/code&gt;&lt;br&gt;
I then check the repository to see what files Git could detect by running&lt;br&gt;
&lt;code&gt;git status&lt;/code&gt;&lt;br&gt;
After confirming that I am working in the correct project folder, I add my project files to the staging area&lt;br&gt;
&lt;code&gt;git add .&lt;/code&gt;&lt;br&gt;
The files are now ready to be saved. I creat my first commit with a message describing what I have added&lt;br&gt;
&lt;code&gt;git commit -m "Add personal expense tracker project"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The commit acts as a checkpoint, so I have a record of the project at that particular stage.&lt;/p&gt;

&lt;h3&gt;
  
  
  Connecting the Project to GitHub Using SSH
&lt;/h3&gt;

&lt;p&gt;The next step is to create an empty repository on GitHub. I then connect my local repository to the GitHub repository using its SSH address&lt;br&gt;
&lt;code&gt;git remote add origin git@github.com:USERNAME/personal-expense-tracker.git&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Here &lt;em&gt;origin&lt;/em&gt; is simply the name given to the remote GitHub repository. I can check that the connection is successful using&lt;br&gt;
&lt;code&gt;git remote -v&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The SSH method allows my local Git repository to communicate with the GitHub repository using the SSH connection configured for my GitHub account. &lt;/p&gt;

&lt;p&gt;Finally, I push my project to GitHub&lt;br&gt;
&lt;code&gt;git branch -M main&lt;br&gt;
git push -u origin main&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The first push connects my local &lt;code&gt;main&lt;/code&gt; branch with the &lt;code&gt;main&lt;/code&gt; branch on GitHub. After this, I can normally use just &lt;code&gt;git push&lt;/code&gt; for future updates. &lt;/p&gt;

&lt;h3&gt;
  
  
  Making Future Updates
&lt;/h3&gt;

&lt;p&gt;If I later add new features, such as a Python script that calculates my monthly spending or update my Excel analysis, I don't have to repeat the entire process. I simply follow the normal Git workflow,&lt;br&gt;
&lt;code&gt;git status&lt;br&gt;
git add .&lt;br&gt;
git commit -m "Update expense analysis"&lt;br&gt;
git push&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;I can check what has changed, stage the changes, commit them as a checkpoint and then push them to GitHub. &lt;/p&gt;

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

&lt;p&gt;This exercise helped me understand that GitHub is not just a place where I upload files. Git allows me to track the development of my project locally while GitHub gives me a remote place to store and share that project. Using Git with SSH gives me a practical way to move a project from my computer to GitHub and continue updating it as I work on it.&lt;/p&gt;

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