<?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: Dorcas Chebet</title>
    <description>The latest articles on DEV Community by Dorcas Chebet (@dorcas_chebet).</description>
    <link>https://dev.to/dorcas_chebet</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%2F4070954%2F0facd9ba-bb92-4198-87ed-3e9925892ddb.png</url>
      <title>DEV Community: Dorcas Chebet</title>
      <link>https://dev.to/dorcas_chebet</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dorcas_chebet"/>
    <language>en</language>
    <item>
      <title>Building the JCars logistics Sale Dashboard in Power BI</title>
      <dc:creator>Dorcas Chebet</dc:creator>
      <pubDate>Fri, 02 Oct 2026 11:19:34 +0000</pubDate>
      <link>https://dev.to/dorcas_chebet/building-the-jcars-logistics-sale-dashboard-in-power-bi-599g</link>
      <guid>https://dev.to/dorcas_chebet/building-the-jcars-logistics-sale-dashboard-in-power-bi-599g</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;JCars Logistics sells vehicles out of nine yards around Kenya — Nairobi, Mombasa, Kisumu,&lt;br&gt;
Eldoret, Kakamega and a few others. The business wanted answers to three plain&lt;br&gt;
questions: where do our sales actually come from, what do they earn us, and can we trust vehicles to reach customers on time?&lt;br&gt;
The data I was handed couldn’t answer any of that.It was 273 order rows across 55 columns, and when I checked, only 69 of those rows barely a quarter were clean enough to use.The rest had something wrong with them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Investigating the data before touching it
&lt;/h2&gt;

&lt;p&gt;I didn’t open the file and start cleaning. First I wanted to know whether I could trust any of it.&lt;br&gt;
In Power Query I switched on Column quality, Column distribution and Column profile so I could see blanks and distinct values in every column at a glance. Then I started poking at the business logic. Does the recorded revenue match what the price, units and discount say&lt;br&gt;
it should be? Do delivery dates come after order dates, like they obviously should? Does each branch stay inside one region?&lt;br&gt;
Those checks surfaced five families of problems.&lt;br&gt;
Identity. 19 rows had no Order ID at all, and the ones that did used five different prefixes ORD, CAR, LCL, LCL-, LC. Without a key you can rely on, you can’t spot duplicates and you can’t build safe relationships.Prices, costs and fees were sitting in four currencies: KES, USD, EUR and ZAR.&lt;br&gt;
When I compared the converted figures against the originals, the implied rates were suspiciously constant (USD 129, EUR 151, ZAR 7.91), which told me someone had applied a fixed booking rate. Some rows had a currency I couldn’t identify, 10 showed negative revenue and 102 flat-out failed my reconciliation check. That check came straight from the&lt;br&gt;
data: Net Sales = Selling Price × Units × (1 − Discount), and the recorded revenue should&lt;br&gt;
equal either that or that plus the delivery fee. 102 rows matched neither.&lt;br&gt;
Time. Dates were stored as long text, like “Wednesday, March 26, 2025”. Once I converted &lt;br&gt;
them, the problems jumped out: 14 orders were apparently delivered before they were&lt;br&gt;
ordered (one of them 290 days before), 23 dates wouldn’t parse at all, and 56 were simply missing.&lt;br&gt;
Categories. The same thing was written several ways. Person and Individual. N.G.O and NGO, Saloon and Sedan, Wire, RTGS and Bank Transfer. Paid and Completed. Every spelling variant quietly splits a total that should have been one number.&lt;br&gt;
Logic. Delivered orders marked “Returned”. Cancelled orders carrying a “Completed”&lt;br&gt;
payment. Discounts as high as 50%. Vehicle years of 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cleaning and preparation:
&lt;/h2&gt;

&lt;p&gt;what I did, and why For every fix I wrote down three things — what I did, why I did it and what I was assuming when I did it. The assumptions matter more than the clicks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Steps What I did Why, and what I assumed.
&lt;/h3&gt;

&lt;p&gt;Keys Standardized the Order IDs and added a surrogate key.I assumed the number identifies the order, so LC1000 and LCL1000 are the same order, just typed differently.Types Converted dates, money and flags to proper data types.Text dates break every time-intelligence function Currency Converted everything to KES at the rates the data implied.I assumed those were the business’s own booking rates.Revenue Rebuilt Revenue as&lt;br&gt;
net sales plus delivery fee.The recorded figure failed reconciliation on 102 rows. ORD1009, for instance, had no recorded revenue, but the rule gives 2,920,000 × 0.93 +140,000 = 2,855,600&lt;br&gt;
Dates Kept the impossible date rows but flagged them I assumed the order is real and the date is just wrong — deleting it would throw away a genuine sale Categories Merged the variants with a mapping table Cleaner slicers, and totals that actually add up Missing value State each choice and what it changed Unit economics Added Unit Selling&lt;br&gt;
Price and Unit Cost columns needed them to work out cost and margin per&lt;br&gt;
vehicle&lt;br&gt;
A few of those decisions came back to bite me, and I caught them during validation:&lt;br&gt;
Zeros aren’t blanks. A missing logistics cost that loads as 0 makes an order look more profitable than it really was. That’s not a rounding issue — it’s a wrong answer.&lt;br&gt;
A currency bug hiding in plain sight. One delivery fee read 426.67 sitting right next to a&lt;br&gt;
logistics cost of 74,000. That 426.67 is clearly a USD figure that never got converted&lt;br&gt;
(426.67 × 129 ≈ 55,000 KES)&lt;br&gt;
A duplicated customer ID. After one of the merges I ended up with both Customer ID and dim_customer.Customer ID in the fact table. I kept one and dropped the other.&lt;/p&gt;

&lt;h2&gt;
  
  
  Modelling the data
&lt;/h2&gt;

&lt;p&gt;I built it as a star schema: one fact table (facts table, 276 rows) with five dimensions around&lt;br&gt;
it — dim_customer, dim_date, dim_location, dim_sale rep and dim_vehicle.&lt;br&gt;
Why a star schema rather than one big flat table?&lt;br&gt;
• Attributes like region, make and rep fall in exactly one place, so when I fix something, I fix it once.&lt;br&gt;
• The relationships are plain one-to-many, which keeps the DAX predictable and the reports quick.&lt;br&gt;
• dim_date is marked as the official date table, so time intelligence works properly.&lt;br&gt;
Delivery Date is a second date column, so it hangs off an inactive relationship and only wakes up inside measures that call USERELATIONSHIP.&lt;br&gt;
One limitation I made a point of writing down: the customer ID seems to track the source&lt;br&gt;
row number, which means a repeat buyer can get counted as several different customers.&lt;br&gt;
There are 181 distinct names across the 273 rows. So read any customer count with that&lt;br&gt;
caveat in mind — it’s an upper bound, not gospel.&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%2Ftn8dl94uryhn5wwkgkk7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftn8dl94uryhn5wwkgkk7.png" alt=" " width="799" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The DAX behind the numbers
&lt;/h3&gt;

&lt;p&gt;Each measure exists to answer one specific question. [Swap in your own measures.]&lt;br&gt;
Total Revenue =1.35bn&lt;br&gt;
CALCULATE&lt;br&gt;
Total Sales =SUM('facts table'[sales])&lt;br&gt;
Total= 1.82bn&lt;br&gt;
SUMX(&lt;br&gt;
 FILTER('facts table', 'facts table'[Delivery Status] &amp;lt;&amp;gt;&lt;br&gt;
"Cancelled"),&lt;br&gt;
 'facts table'[Units Sold] * 'facts table'[Unit Cost] + 'facts&lt;br&gt;
table'[Logistics Cost]&lt;br&gt;
)&lt;br&gt;
Unit Cost is per vehicle, so just summing the column would be nonsense. SUMX multiplies&lt;br&gt;
by units first, row by row.&lt;br&gt;
Gross Profit = [Total Revenue] - [Total Cost]&lt;br&gt;
total gross profit = 454.68m&lt;br&gt;
Gross Margin % = DIVIDE([Gross Profit], [Total Revenue])&lt;br&gt;
Gross Margin = 25%&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%2Fk3oru0n055b77d3nnn1d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk3oru0n055b77d3nnn1d.png" alt=" " width="336" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Designing the report
&lt;/h3&gt;

&lt;p&gt;I built the report around the three questions, one page each.&lt;br&gt;
Executive overview. KPI cards for Total sales, Gross Margin %,total cost and Total revenue recorded.&lt;br&gt;
Sales analysis. Revenue sliced by branch, sales rep, lead source, make and vehicle type,&lt;br&gt;
with slicers for year, region and make. This is the “where does the money come from?”&lt;br&gt;
Operations and delivery. Delivery days by branch, the spread of delivery times, and a table of the orders that ran late.&lt;br&gt;
A few design calls I stuck to:&lt;br&gt;
• A small palette, used consistently — the same colour always means the same thing.&lt;br&gt;
• Bars sorted by value, never alphabetically.&lt;br&gt;
• Drill-through from region down to branch down to the individual order.&lt;br&gt;
• Chart titles that say what you’re looking at, e.g. Revenue, total cost&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%2Fww3kh8qkmuvjoxk0uiwi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fww3kh8qkmuvjoxk0uiwi.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;• Riftvalley region brought in Ksh.3,044,400 of revenue, while Western managed only Ksh.1,872,800&lt;br&gt;
• online produced the most orders, but walk in had the highest average&lt;br&gt;
order value.&lt;br&gt;
• SUV gave the best gross margin at 14.72%, against 4.22% for Toyota.&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%2F26kptuwfi64w57tbl21j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F26kptuwfi64w57tbl21j.png" alt=" " width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Pin each recommendation to an insight above:&lt;br&gt;
• Move marketing spend toward the lead sources with the best margins, not just the&lt;br&gt;
most orders. Volume and profit aren’t the same thing.&lt;br&gt;
• Dig into the slow branches. Delays at [branch] are probably costing repeat business.&lt;br&gt;
• Revisit pricing and discounts on the lowest-margin makes.&lt;br&gt;
• Fix the data at the point of capture. Making currency and Order ID mandatory fields&lt;br&gt;
would have prevented most of what I found — remember that 75% of rows needed&lt;br&gt;
correcting.&lt;br&gt;
&lt;strong&gt;what i took away from it&lt;/strong&gt;&lt;br&gt;
Cleaning ate up most of the time, and that’s exactly where the real analytical decisions got&lt;br&gt;
made. The assumptions I logged turned out to matter as much as any chart.&lt;br&gt;
Checking my own work paid off. Validating the converted values and the filled-in blanks&lt;br&gt;
caught errors that would otherwise have shipped without a sound.&lt;br&gt;
I kept quality visible by holding on to an issues flag, so anyone can filter the report down to&lt;br&gt;
clean records and judge for themselves.&lt;br&gt;
And the big one: missing is not zero. Treat a blank cost or a blank revenue as 0 and you’ve silently poisoned every average built on top of it.&lt;br&gt;
If I did this again, I’d fix the capture process first. Clean inputs mean far less cleaning later.&lt;/p&gt;

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

&lt;p&gt;This project took the JCars Logistics dataset from a raw, inconsistent Excel file to an interactive Power BI report that management can use to make decisions. The process started with investigating and cleaning the data: fixing data types, handling missing values and duplicates, and standardizing text fields. I then shaped it into a star schema, with one facts table linked to the customer, date, location, sales rep and vehicle dimensions. That model made the DAX measures (revenue, gross profit, margin, logistics cost ratio, return rate and time comparisons) accurate and easy to reuse across every visual.&lt;/p&gt;

</description>
      <category>powerbi</category>
      <category>dataanalytics</category>
      <category>dax</category>
      <category>datavisualisation</category>
    </item>
    <item>
      <title>Assignment in power BI</title>
      <dc:creator>Dorcas Chebet</dc:creator>
      <pubDate>Tue, 22 Sep 2026 09:16:17 +0000</pubDate>
      <link>https://dev.to/dorcas_chebet/assignment-in-power-bi-19jl</link>
      <guid>https://dev.to/dorcas_chebet/assignment-in-power-bi-19jl</guid>
      <description>&lt;h2&gt;
  
  
  Data modelling in power Bi
&lt;/h2&gt;

&lt;p&gt;Data modelling is setting up tables, relationships, calculations and access for analysis scenarios.This helps so that data can be analyzed correctly and efficiently.&lt;br&gt;
for example, a sales department can have information about,&lt;/p&gt;

&lt;p&gt;-Order ID&lt;/p&gt;

&lt;p&gt;-Order date&lt;/p&gt;

&lt;p&gt;-Customer Name&lt;/p&gt;

&lt;p&gt;-City&lt;/p&gt;

&lt;p&gt;-Product&lt;/p&gt;

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

&lt;p&gt;-Amount&lt;/p&gt;

&lt;p&gt;instead of putting everything into one large table ,the data can be organized into related tables.&lt;br&gt;
&lt;strong&gt;importance of a well designed model&lt;/strong&gt;&lt;br&gt;
1.Reporting and analytics&lt;br&gt;
it helps in data consistency by standardizing definitions and metrics across different systems so everyone uses the same number.it ensures filters and slicers automatically propagate across related visuals without missing or duplicating records.&lt;br&gt;
2.DAX calculations&lt;br&gt;
3.It prevents incorrect results when writting time-intelligence or cross table measures. &lt;br&gt;
4.it also simplifies code syntax.&lt;br&gt;
Performance&lt;br&gt;
5.A well-designed data model reduce unnecessary data duplication and improve power BI's ability to process queries efficiently.&lt;br&gt;
6.Scalability.It accommodate additional products, customers transactions and other data without the need of the entire structure to be redesigned.&lt;br&gt;
7.maintability.It makes it easier for another analyst to understand and modify the report.&lt;/p&gt;

&lt;h3&gt;
  
  
  Data modelling approaches
&lt;/h3&gt;

&lt;p&gt;1.&lt;strong&gt;Flat table&lt;/strong&gt; &lt;br&gt;
it is a single ,wide table that contains all your data,e.g Order ID,Order date,Customer name,City,Product category and amount&lt;br&gt;
Example&lt;/p&gt;

&lt;p&gt;2.&lt;strong&gt;star schema&lt;/strong&gt; &lt;br&gt;
Definition: One central fact table surrounded by dimension tables, each joined directly to the fact table. It looks like a star.&lt;br&gt;
Example,&lt;br&gt;
                  dim_doctors&lt;br&gt;
                     |&lt;br&gt;
                     |&lt;br&gt;
dim_patients --- Visits_fact --- dim_department&lt;br&gt;
                     |&lt;br&gt;
                     |&lt;br&gt;
              dim_diagnosis&lt;br&gt;
                     |&lt;br&gt;
              dim_procedure&lt;br&gt;
                     |&lt;br&gt;
                  dim_wards&lt;br&gt;
&lt;em&gt;Advantages&lt;/em&gt;&lt;br&gt;
• Simple, intuitive and the layout Power BI is optimized for.&lt;br&gt;
• Fast: one hop from dimension to fact and efficient compression.&lt;br&gt;
• Easy DAX and easy filtering.&lt;br&gt;
• Easy for report authors to understand.&lt;br&gt;
&lt;em&gt;Advantages&lt;/em&gt;&lt;br&gt;
• Dimensions are denormalised, so some repetition remains (for example, category name repeated per product).&lt;br&gt;
• Requires upfront design and transformation effort.&lt;br&gt;
When appropriate: Almost all analytical models. It is Microsoft's recommended default.&lt;br&gt;
Performance/complexity: Best balance. Few relationships, short filter paths, low comp&lt;/p&gt;

&lt;p&gt;3.&lt;strong&gt;Snowflake schema approach&lt;/strong&gt;&lt;br&gt;
It is a star schema where dimensions are normalised into further related tables, so dimensions have their own sub-dimensions.&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%2Fuldsxv1f5y7frplt07ut.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuldsxv1f5y7frplt07ut.png" alt=" " width="626" height="309"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;advantages&lt;/strong&gt;&lt;br&gt;
• Less redundancy, so easier to maintain hierarchies (Category → Product).&lt;br&gt;
• Mirrors normalised source databases.&lt;/p&gt;

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

&lt;p&gt;Easy to set up, with no need to handle any connections or relationships.&lt;br&gt;
Fine for quick, one-off exploration.&lt;/p&gt;

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

&lt;p&gt;-Heavy repetition of words many times, which makes the files bigger and the system slower.&lt;br&gt;
-Updating anomalies: when you rename a category, you have to change many rows.&lt;br&gt;
-It's difficult to create accurate time-based analysis without having a proper date table.&lt;br&gt;
Comparison&lt;br&gt;
1.&lt;strong&gt;Feature flat table star schema and snowflake schema&lt;/strong&gt;&lt;br&gt;
Tables can have one fact along with several dimensions, or they can include a fact along with dimensions and sub-dimensions.&lt;br&gt;
Redundancy High Moderate Low&lt;br&gt;
Performance in Power BI is poor when handling large data sets, but it's best when dealing with smaller data. It’s good, but slightly slower than the best.&lt;br&gt;
Model complexity Lowest Low Highest&lt;br&gt;
DAX simplicity Awkward Easy Moderate&lt;br&gt;
Recommended? Only small or ad hoc, yes (default), only when justified.&lt;br&gt;
2.&lt;em&gt;&lt;strong&gt;Fact table and Dimension Table&lt;/strong&gt;&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;A fact table keeps track of business events along with the numerical outcomes of those events. It typically contains:&lt;/p&gt;

&lt;p&gt;Foreign keys to dimensions (DateKey, ProductKey, CustomerKey)&lt;br&gt;
Numeric measures: Quantity, SalesAmount, Discount, Cost&lt;br&gt;
Sometimes degenerate dimensions such as an OrderNumber&lt;/p&gt;

&lt;p&gt;Fact tables are long because they have many rows, but they are not wide since they only have a few columns. Examples: FactSales, FactOrders, FactTransactions.&lt;br&gt;
Dimension tables&lt;/p&gt;

&lt;p&gt;A dimension table holds descriptive information that helps in filtering, grouping, and labeling the facts. It has a special key called the primary key and also includes text and category columns. Dimension tables are not very long, having fewer rows, but they have many columns that provide detailed descriptions.&lt;/p&gt;

&lt;p&gt;DimCustomer: CustomerKey, Name, Gender, Segment, Join Date&lt;br&gt;
DimProduct: ProductKey, Product Name, Category, Brand, Unit Price.&lt;br&gt;
DimDate: DateKey, Date, Month, Quarter, Year, Weekday&lt;br&gt;
DimLocation: LocationKey, City, County, Country&lt;br&gt;
Measures versus attributes&lt;br&gt;
Measures are numerical outcomes from business events that you combine by adding, averaging, or counting.&lt;br&gt;
Attributes are descriptive fields that you can use to break down or analyze your data, such as Category, City, or Month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Grain&lt;/strong&gt;&lt;br&gt;
The grain refers to what is represented by one row in the fact table. Examples:&lt;/p&gt;

&lt;p&gt;"One row for each product in each order line" (FactSales).&lt;br&gt;
"One row per order" (FactOrders)&lt;br&gt;
One entry for each account every day, which is a daily balance summary.&lt;/p&gt;

&lt;p&gt;Define the grain first. Every measure and foreign key has to be accurate at that level of detail. Combining different types of grain values (such as order-level and line-level) in the same table leads to counting the same items twice.&lt;br&gt;
FactSales&lt;/p&gt;

&lt;p&gt;| Sales ID |Date key  |Customer key | Product key |Location key | Quantity |Sales amount|&lt;br&gt;
|---------|-----------|-------------|------------|--------------|&lt;br&gt;
|1        |20260105   | 11          |501         |3             |&lt;br&gt;&lt;br&gt;
|1        |65000&lt;br&gt;
|2        |20260105   |11           |502         |3             |&lt;br&gt;
|2        |3000&lt;br&gt;
|3        |20260106   |12           |501         |4             |&lt;br&gt;
|1        |65000      |&lt;/p&gt;

&lt;p&gt;Each foreign key refers to a dimension where the key is unique. Choosing "Mombasa" in the DimLocation or "Tech" in the DimProduct narrows down the FactSales data to only the rows that match those selections. This is the star schema presented in Section 1.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Relationships in Power BI
What is a relationship?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A relationship connects two tables by using a column in each, which helps Power BI understand how they are linked and allows it to pass filters from one table to the other. Without relationships, data from different tables can't be connected: if you select "Nairobi" in a slicer, it won't change the sales totals because Power BI won't know which rows of data belong to Nairobi.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keys, uniqueness and integrity
&lt;/h3&gt;

&lt;p&gt;Primary key (PK): A column that uniquely identifies every row in a table, like CustomerKey in DimCustomer.&lt;br&gt;
A foreign key is a column in one table that points to the primary key of another table, like the CustomerKey in the FactSales table.&lt;br&gt;
Unique values: The "one" side of a relationship should have distinct, non-empty values.&lt;br&gt;
Cardinality refers to the type of relationship between columns, such as one-to-many or other similar types.&lt;br&gt;
Referential integrity means that every value in a foreign key of the fact table must be found in the corresponding dimension table. If FactSales includes CustomerKey 99 but DimCustomer does not, those rows appear under a (Blank) category in visuals, making reports misleading.&lt;/p&gt;

&lt;p&gt;Why is CustomerID unique in DimCustomer but appears multiple times in FactSales: DimCustomer has one row for each customer, meaning each person is represented only once. FactSales records one entry for each time a customer makes a purchase, and a customer can make multiple purchases. CustomerID 11 is listed once in the DimCustomer table but appears many times in the FactSales table. That is exactly a one-to-many relationship.&lt;/p&gt;

&lt;p&gt;_One-to-many (1:*)&lt;/p&gt;

&lt;p&gt;How it works: A single row on the "one" side connects to multiple rows on the "many" side. Filters move from the single side to the multiple side.&lt;/p&gt;

&lt;p&gt;Example: DimProduct (1) → FactSales (*).&lt;/p&gt;

&lt;p&gt;DimProduct (1) ─────────────► (*) FactSales&lt;br&gt;
ProductKey PK ProductKey FK&lt;/p&gt;

&lt;p&gt;Use it: This is the standard, default relationship in star schemas. Use it whenever a dimension describes a fact.&lt;br&gt;
Avoid it: When the "one" column has duplicate entries. Power BI will then force a many-to-many.&lt;/p&gt;

&lt;p&gt;One-to-one (1:1)&lt;/p&gt;

&lt;p&gt;How it works: Each row in one table can match only one row in the other table, and both columns are unique. Filters propagate in both directions.&lt;/p&gt;

&lt;p&gt;Employees (EmployeeID) and EmployeeSensitiveDetails (EmployeeID), such as salary or national ID, are kept in a separate table for security.&lt;/p&gt;

&lt;p&gt;Employees (1) ◄────────────► (1) EmployeeDetails&lt;br&gt;
EmployeeID PK EmployeeID PK&lt;/p&gt;

&lt;p&gt;Use it: Occasionally, such as when dividing a table for security reasons or when two sources refer to the same entity.&lt;br&gt;
Usually, it's better to combine the two tables into one using Power Query, which makes the model easier to work with.&lt;/p&gt;

&lt;p&gt;Many-to-many (:)&lt;/p&gt;

&lt;p&gt;How it works: Neither column is unique, so there may be multiple rows that match on each side. Power BI doesn't require a unique key, but the results can vary based on how filters work and may be difficult to predict.&lt;/p&gt;

&lt;p&gt;Students and Courses, where a student enrolls in multiple courses and a course is attended by multiple students. Another example is budget data at the category level connected to sales data at the product level.&lt;/p&gt;

&lt;p&gt;Students (&lt;em&gt;) ◄────────► (&lt;/em&gt;) Enrollments?&lt;/p&gt;

&lt;p&gt;The recommended design is a bridge table:&lt;/p&gt;

&lt;p&gt;DimStudent has a one-to-many relationship with BridgeEnrollment, which in turn has a one-to-many relationship with DimCourse.&lt;/p&gt;

&lt;p&gt;Use it: Only when a bridge table isn't practical, or when you need to compare tables that have different levels of detail, like budget data grouped by month versus sales data grouped by day.&lt;br&gt;
Avoid it: As a shortcut to skip cleaning your data. It causes ambiguity and unexpected totals.&lt;/p&gt;

&lt;p&gt;Active and inactive relationships&lt;/p&gt;

&lt;p&gt;At any given time, only one active connection can exist between two tables, and this is shown as a solid line in the Model view. Additional ones are inactive (dotted).&lt;/p&gt;

&lt;p&gt;FactSales has OrderDate and ShipDate, both connecting to DimDate[Date]. OrderDate is the active relationship. To calculate sales by ship date, turn on the other one in DAX:&lt;/p&gt;

&lt;p&gt;DAX&lt;br&gt;
Sales by Ship Date =&lt;br&gt;
CALCULATE (&lt;br&gt;
SUM ( FactSales[SalesAmount] ),&lt;br&gt;
USERELATIONSHIP ( FactSales[ShipDate], DimDate[Date] )&lt;br&gt;
)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Filter Direction
How filters propagate&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Filters travel along relationships. In a standard star schema, when you apply a filter to a dimension, that filter is passed down to the fact table.&lt;/p&gt;

&lt;p&gt;Single-direction filtering&lt;/p&gt;

&lt;p&gt;Filters only move from the "one" side to the "many" side.&lt;br&gt;
A user chooses the category "Tech" in the DimProduct slicer.&lt;/p&gt;

&lt;p&gt;DimProduct is filtered to FactSales, and the Total Sales shows only Tech sales.&lt;br&gt;
The slicer filters DimProduct to Tech products.&lt;br&gt;
That filters FactSales to include only the rows where the ProductKey matches the specified products.&lt;br&gt;
SUM(FactSales[SalesAmount]) returns Tech sales only.&lt;/p&gt;

&lt;p&gt;This is the default and preferred behaviour.&lt;/p&gt;

&lt;p&gt;Both (bidirectional) filtering&lt;/p&gt;

&lt;p&gt;Filters work both ways: a filter applied to the fact table also affects the dimension.&lt;/p&gt;

&lt;p&gt;DimProduct ◄──filter──► FactSales&lt;/p&gt;

&lt;p&gt;Legitimate use: For instance, a slicer on DimProduct that displays only products with actual sales, or many-to-many relationships handled through a bridge table.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;How to use it carefully&lt;/em&gt;&lt;br&gt;
Ambiguous filter paths: When multiple dimensions are linked to a single fact table, bidirectional filters can lead to different paths connecting two tables. Power BI might not allow the relationship to be activated or could cause unexpected outcomes.&lt;br&gt;
Unexpected results happen when filters affect the entire model, meaning a slicer applied to one dimension can also filter another.&lt;br&gt;
Performance cost: Using filters can make calculations slower because they require more processing work.&lt;br&gt;
The model becomes more difficult to understand and fix.&lt;/p&gt;

&lt;p&gt;Performance/complexity: Lowest modelling complexity but poor scalability. Memory usage increases rapidly when text columns are repeated.&lt;/p&gt;

&lt;p&gt;Star schema&lt;/p&gt;

&lt;p&gt;Definition: There is one main fact table with dimension tables around it, and each dimension table is connected directly to the fact table. It looks like a star.&lt;/p&gt;

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

&lt;p&gt;Best practice is to keep everything set to one direction by default, and only turn on two-way filtering when it's actually needed. Often the same outcome can be reached more safely in DAX by using CROSSFILTER() within a single measure.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Joins in Power Query
A join combines rows from two tables by matching them on a common column. In Power Query, you perform this action by going to the Home tab and selecting Merge Queries, or choosing Merge Queries as New. You pick two tables, choose the matching column in each one, select the type of join you want, and then expand the joined table to include its columns.
Example data&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Customers table&lt;br&gt;
|Customer ID| Name    |City&lt;br&gt;
|&lt;br&gt;
|-----------|---------|-----&lt;br&gt;
-|C1        | Brian   |Nairobi&lt;br&gt;
|&lt;br&gt;
|C2         | Amos    | Mombasa&lt;/p&gt;

&lt;p&gt;|C3         |Dorcas   |Kisumu&lt;/p&gt;

&lt;p&gt;|C4         |Cynthia  |Nakuru&lt;/p&gt;

&lt;p&gt;Orders&lt;/p&gt;

&lt;p&gt;OrderID CustomerID Amount&lt;br&gt;
O101 C1 5,000&lt;br&gt;
O102 C1 2,500&lt;br&gt;
O103 C3 8,000&lt;br&gt;
O104 C5 1,200&lt;/p&gt;

&lt;p&gt;Note: Brian (C2) and David (C4) have no orders, and order O104 belongs to C5, who is not in Customers. Merges always start by using Customers as the first table on the left and Orders as the second table on the right, pairing them based on the CustomerID.&lt;/p&gt;

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

&lt;p&gt;How it works: It keeps all the rows from the left table and only includes the matching rows from the right table.&lt;br&gt;
Records kept: All customers and corresponding order information are retained. Unmatched customers get nulls.&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%2Fp3fqmc7zobg93qhp50q7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp3fqmc7zobg93qhp50q7.png" alt=" " width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;How it works: It keeps all the rows from the right table and only the matching rows from the left.&lt;br&gt;
Records kept: Every order along with the corresponding customer information.&lt;/p&gt;

&lt;p&gt;CustomerID Name City OrderID Amount&lt;br&gt;
C1 Amina Nairobi O101 5,000&lt;br&gt;
C1 Amina Nairobi O102 2,500&lt;br&gt;
C3 Cynthia Kisumu O103 8,000&lt;br&gt;
null null null O104 1,200&lt;/p&gt;

&lt;p&gt;Use case: Display all orders and mark those that don't have a corresponding customer record.&lt;/p&gt;

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

&lt;p&gt;How it works: It keeps all the rows from both tables and matches them where possible.&lt;br&gt;
Records are kept: all information is stored; missing data is represented by nulls where there is no matching information.&lt;/p&gt;

&lt;p&gt;CustomerID Name City OrderID Amount&lt;br&gt;
C1 Amina Nairobi O101 5,000&lt;br&gt;
C1 Amina Nairobi O102 2,500&lt;br&gt;
C2 Brian Mombasa null null&lt;br&gt;
C3 Cynthia Kisumu O103 8,000&lt;br&gt;
C4 David Nakuru null null&lt;br&gt;
null null null O104 1,200&lt;/p&gt;

&lt;p&gt;Use case: Combining two systems to identify all the matches and differences in a single outcome.&lt;br&gt;
Inner Join&lt;/p&gt;

&lt;p&gt;How it works: It keeps only the rows that are the same in both tables.&lt;br&gt;
Records kept: Only customers who have placed orders, and orders that are linked to customers.&lt;/p&gt;

&lt;p&gt;CustomerID Name City OrderID Amount&lt;br&gt;
C1 Amina Nairobi O101 5,000&lt;br&gt;
C1 Amina Nairobi O102 2,500&lt;br&gt;
C3 Cynthia Kisumu O103 8,000&lt;/p&gt;

&lt;p&gt;Use case: "Analyze customers who are currently active and have made a purchase."&lt;/p&gt;

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

&lt;p&gt;How it works: It keeps the rows from the left table that do not have a matching row in the right table.&lt;br&gt;
Records retained: Customers with no orders.&lt;/p&gt;

&lt;p&gt;CustomerID Name City&lt;br&gt;
C2 Brian Mombasa&lt;br&gt;
C4 David Nakuru&lt;/p&gt;

&lt;p&gt;Use case: Identifying customers who have not placed any orders yet in order to run a marketing campaign.&lt;/p&gt;

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

&lt;p&gt;How it works: It keeps the rows from the right table that do not have a matching row in the left table.&lt;br&gt;
Records retained: Orders with no matching customer.&lt;/p&gt;

&lt;p&gt;OrderID CustomerID Amount&lt;br&gt;
O104 C5 1,200&lt;/p&gt;

&lt;p&gt;Use case: Identifying records that are no longer linked to any other data, which is a data quality check to ensure that all references between data sets are correct and complete.&lt;/p&gt;

&lt;p&gt;Summary&lt;br&gt;
Join type Keeps&lt;br&gt;
Left Outer All left + matching right&lt;br&gt;
Right Outer All right + matching left&lt;br&gt;
Full Outer Everything from both&lt;br&gt;
Inner Matching rows only&lt;br&gt;
Left Anti Left rows with no match&lt;br&gt;
Right Anti Right rows with no match&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Power Query Joins vs Power BI Relationships&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Both link tables together, but they function in different steps and serve different reasons.&lt;/p&gt;

&lt;p&gt;Aspect Power Query join (Merge) Power BI relationship&lt;br&gt;
When it happens, it can occur during data loading or refreshing (ETL stage) or when a report or query is run.&lt;br&gt;
What it does is physically combines tables into a new table or adds columns. It keeps tables separate and links them logically.&lt;br&gt;
Result: One wider table (rows may multiply or shrink) Filters propagate between tables; no data merged.&lt;br&gt;
Join types include six kinds such as left, inner, anti, and others. Cardinality includes ratios like 1 to many, 1 to 1, and so on. Filter direction is also considered.&lt;br&gt;
Impact on model size can lead to larger size and extra copies. It is efficient because each entity is stored only once.&lt;br&gt;
Aggregation values are set at the row level. Dynamic: measures update based on the filter context.&lt;br&gt;
Best for data preparation: adding more information, fixing errors, making data easier to use, handling complex structures, and finding records that don't match. Analytical modeling: breaking down data into different categories to analyze it effectively.&lt;/p&gt;

&lt;p&gt;Rule of thumb:&lt;/p&gt;

&lt;p&gt;Use Power Query joins to clean and structure your data: simplify a snowflaked dimension, add more information to a table using a lookup column, or find rows that don’t have matches with an anti join.&lt;br&gt;
Use relationships to analyze data by linking a fact table to dimensions, allowing measures to react to slicers and filters.&lt;/p&gt;

&lt;p&gt;Merge the DimProduct and DimCategory tables in Power Query to create a single DimProduct table, which flattens the snowflake schema. Link the DimProduct table to the FactSales table using a one-to-many relationship. Combining FactSales with all dimensions into a single flat table is possible, but it reduces the performance, flexibility, and ease of maintenance that a star schema provides.&lt;/p&gt;

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

&lt;p&gt;A good Power BI model keeps facts like events and measurements separate from dimensions that provide descriptive details. It connects them with the right one-to-many relationships and uses filters that only go in one direction by default. The star schema is the preferred approach since it is efficient, straightforward, and works well with DAX. Power Query joins help organize the data and also show any issues with data quality by using anti joins, while relationships allow the final model to answer business questions in a flexible way.&lt;/p&gt;

</description>
      <category>modelling</category>
      <category>schemas</category>
      <category>joins</category>
      <category>relationships</category>
    </item>
    <item>
      <title>Building an interactive Excel Dashboard for E-commerce Product Analysis: A Case Study of Jumia Products</title>
      <dc:creator>Dorcas Chebet</dc:creator>
      <pubDate>Wed, 09 Sep 2026 11:06:44 +0000</pubDate>
      <link>https://dev.to/dorcas_chebet/building-an-interactive-excel-dashboard-for-e-commerce-product-analysis-a-case-study-of-jumia-4h43</link>
      <guid>https://dev.to/dorcas_chebet/building-an-interactive-excel-dashboard-for-e-commerce-product-analysis-a-case-study-of-jumia-4h43</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;The case study is about jumia products which has generated large amount of data that include a certain number of products, prices, discounts, ratings and customer review .It contains information on 113 products .It also include their current prices, old prices, discount percentage s,number of customer review and ratings .Informations help the business to know the product performance and identify areas that requires attention.&lt;br&gt;
The project involves transforming raw data into a structured dataset ,performing explolatory analysis and presenting the results through an interactive dashboard.&lt;/p&gt;

&lt;h1&gt;
  
  
  Project Objective.
&lt;/h1&gt;

&lt;p&gt;The main project objective of this project is to analyze data from jumia.&lt;br&gt;
the specific objectives are to analyze products by comparing current prices with the old prices.&lt;/p&gt;

&lt;p&gt;-To identify the discount offered in different products&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To identify products with high,medium and low discounts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To determine whether highly rated products receive more customer reviews&lt;/p&gt;

&lt;p&gt;-To calculate descriptive statistics such as average,current price,average old price,average discount,total discount,total reviews and number of products.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which project generated more reviews&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To use excel formulas  to organize, categorise and interpret the Jumia product data.&lt;/p&gt;

&lt;h1&gt;
  
  
  Dataset and Business Queastions
&lt;/h1&gt;

&lt;p&gt;The questions guiding the analysis were:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Does a higher discount correspond to more reviews?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;2.Do highly rated products receive more reviews?&lt;/p&gt;

&lt;p&gt;3.Is there a relationship between current price and ratings?&lt;/p&gt;

&lt;p&gt;4.Which products have the highest rating?&lt;/p&gt;

&lt;p&gt;5.Which products have the lowest discounts?&lt;/p&gt;

&lt;p&gt;6.Which products have the highest number of  reviews?&lt;/p&gt;

&lt;p&gt;7.Are there products with high discount but relatively weak ratings or engagements?&lt;br&gt;
The questions helped determine which calculations,pivot tables and visualization were needed.&lt;/p&gt;

&lt;h1&gt;
  
  
  Initial Data-Quality Audit
&lt;/h1&gt;

&lt;p&gt;Before cleaning i identified the problems before making the changes or cleaning the dataset inorder to understand whether the data was complete ,consistent ,accurate and suitable for analysis.&lt;br&gt;
For the jumia project the audit included:&lt;/p&gt;

&lt;p&gt;1.Identifying if there was duplicate&lt;br&gt;
2.Identify if there was missing values in important field such as price ,rating ,discount or reviews.&lt;br&gt;
3.incorrect values :values that do not add up, such as current price being the same as the old price while a discount is still recorded.&lt;br&gt;
4.Data type errors :to ensure prices are stored as numbers ,discounts as percentages/numbers, ratings as numbers and products names as text.&lt;/p&gt;

&lt;h1&gt;
  
  
  Excel techniques ,formulas and analysis performed.
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Calculating the Discount amount
&lt;/h2&gt;

&lt;p&gt;I calculated the discount amount by subtracting the current price from the old price.&lt;br&gt;
formula:&lt;br&gt;
=old price-current price&lt;br&gt;
use of IF statements to classify products into different categories based on their ratings, discounts and prices.&lt;br&gt;
I classified into categories such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Excellent&lt;/li&gt;
&lt;li&gt;Average&lt;/li&gt;
&lt;li&gt;Poor&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Missing&lt;br&gt;
Discounts were categorized as:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;High discount&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Medium discount&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Low discount&lt;/p&gt;
&lt;h2&gt;
  
  
  Analysis performed
&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Rating analysis
I analyzed and group product ratings into categories to determine which products have excellent, average, poor or missing ratings to help evaluate overall customer satisfaction.&lt;/li&gt;
&lt;li&gt;Discount analysis
I analyzed and categorized into high, medium and low discounts .I also compared the old prices with the current price to determine the amount customers could save.&lt;/li&gt;
&lt;li&gt;Trend analysis
The project was used to examine relationships between:
-Discount percentage and number of customer review
-Product rating and number of customer reviews
-Product price and product rating.
The analysis indicates that a higher discount percentage did not result in more customer reviews and highly rated products did not necessarily receive more reviews.
#Dashboard creation process
The final stage of the project was to transform the analysis into an interactive dashboard .Top most of the Dashboard was the heading written in bold.
The key performance indicators were&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Total products&lt;/li&gt;
&lt;li&gt;Average Current price KSh 1,097&lt;/li&gt;
&lt;li&gt;Average Discount 48%&lt;/li&gt;
&lt;li&gt;Average rating  5
-Total reviews  723
Beneath this KPIs the slicers used were:&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;price category-it categorized data into High price ,Low price and Medium price.
Discount category- it categorized data into High discount ,Low discount and medium discount.
Rating Category-Categorized data into average, excellent ,poor and missing for missing values.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;key insights and business recommendation.&lt;/p&gt;

&lt;p&gt;1.Higher discounts do not necessarily lead to higher customer engagement .Products with higher discount percentages doo not consistently receive more customer review.&lt;br&gt;
2.Customer reviews vary across products&lt;br&gt;
3.Discounting should not be the only strategy&lt;br&gt;
4.Products performance should consider both ratings and reviews.&lt;br&gt;
5.Highly rated products do not necessarily receive more reviews.it does not guarantee strong customer engagement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recommendations&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The sellers should focus on customer satisfaction by improving quality 
and customer service to maintain good ratings.&lt;/li&gt;
&lt;li&gt;the sellers should use data to make pricing decisions&lt;/li&gt;
&lt;li&gt;Review products with low engagement.&lt;/li&gt;
&lt;li&gt;Use target discounts .Strategically on products where they are likely to improve sales or engagement.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Screenshot of original data, cleaned data ,pivot tables and dashboards&lt;/strong&gt; &lt;/p&gt;

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

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

&lt;p&gt;3.Pivot tables&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foerix7lj9dlific39vqx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foerix7lj9dlific39vqx.png" alt=" " width="800" height="420"&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%2Fwb5atblk7dv08ej4hug3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwb5atblk7dv08ej4hug3.png" alt=" " width="580" height="451"&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%2Fd6abg2247u411i4i4i3f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd6abg2247u411i4i4i3f.png" alt=" " width="752" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

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

</description>
      <category>analysis</category>
      <category>data</category>
      <category>software</category>
    </item>
    <item>
      <title>ASSIGNMENT WEEK 2</title>
      <dc:creator>Dorcas Chebet</dc:creator>
      <pubDate>Sun, 30 Aug 2026 07:49:35 +0000</pubDate>
      <link>https://dev.to/dorcas_chebet/assignment-week-2-455j</link>
      <guid>https://dev.to/dorcas_chebet/assignment-week-2-455j</guid>
      <description>&lt;h1&gt;
  
  
  Getting Started with Excel For Data Analysis
&lt;/h1&gt;

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

&lt;p&gt;Excel is one of the tools commonly used for working data .It is used to enter, organize ,clean, calculate and analyze information using spreadsheets .learning excel gives good foundation on how data is handled before other advanced tools such as python ,SQL and Power BI are used.&lt;br&gt;
In data analysis ,raw data can have errors, duplicates, missing values or unorganized information.&lt;/p&gt;

&lt;h3&gt;
  
  
  Excel Basics
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Dataset- It is a collection of related information organized into rows and columns .Example,&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Employee ID&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Department&lt;/th&gt;
&lt;th&gt;Age&lt;/th&gt;
&lt;th&gt;Salary&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1102&lt;/td&gt;
&lt;td&gt;Marion&lt;/td&gt;
&lt;td&gt;Finance&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;45000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1103&lt;/td&gt;
&lt;td&gt;Peter&lt;/td&gt;
&lt;td&gt;IT&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;70000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1104&lt;/td&gt;
&lt;td&gt;June&lt;/td&gt;
&lt;td&gt;HR&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;td&gt;60000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1105&lt;/td&gt;
&lt;td&gt;Irene&lt;/td&gt;
&lt;td&gt;Finance&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;80000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1106&lt;/td&gt;
&lt;td&gt;Dennis&lt;/td&gt;
&lt;td&gt;IT&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;65000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Explanation&lt;br&gt;
_column-is a verticle line of data that runs straight from top to bottom&lt;br&gt;
_row-it is a horizontal line of data that runs from left to right.&lt;br&gt;
_cell-it is an intersection of a row and column&lt;br&gt;
_Header-The name of a column.&lt;br&gt;
entering data into Excel&lt;br&gt;
for the case of our dataset, it is entered as,&lt;br&gt;
A1:Employees ID&lt;br&gt;
B2:Name&lt;br&gt;
C1:Department&lt;br&gt;
D1:Age&lt;br&gt;
E1:Salary&lt;br&gt;
It is important to organize data rather than putting two different pieces of information in the same column. For example:&lt;br&gt;
Employee ID &lt;br&gt;
1102,Marion,finance&lt;br&gt;
instead;&lt;br&gt;
Employee ID     Name     Department&lt;br&gt;
1102            Marion   Finance&lt;br&gt;
Hence the data will be easier to analyze.&lt;/p&gt;

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

&lt;p&gt;Formatting in excel involves,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Bold headings&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Number of formatting&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Alignment&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adjusting column width&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dates&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Borders&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Percentages&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Currency&lt;br&gt;
formatting makes easy to interpret data but it doesn't clean the data.&lt;/p&gt;
&lt;h4&gt;
  
  
  Formulas applied in Excel.
&lt;/h4&gt;

&lt;p&gt;A formula directs on how to perform a calculation .For example when you enter&lt;br&gt;
=60+85&lt;br&gt;
Excel calculates as 145&lt;br&gt;
To calculate average salary the formula is&lt;br&gt;
=AVERAGE(range criteria)&lt;br&gt;
=AVERAGE(D2:D5)&lt;br&gt;
To calculate the highest salary&lt;br&gt;
=MAX(D2:D5)&lt;br&gt;
To calculate the lowest salary&lt;br&gt;
=MIN(D1:D5)&lt;br&gt;
To count the number of employees&lt;br&gt;
=COUNTA(A1:A5)&lt;/p&gt;
&lt;h2&gt;
  
  
  Sorting
&lt;/h2&gt;

&lt;p&gt;sorting is organizing data in a particular order.&lt;br&gt;
Example :Employees can be sort according to their departments,&lt;br&gt;
Names      Departments&lt;br&gt;
Marion     Finance&lt;br&gt;
Peter      IT&lt;br&gt;
June       HR&lt;br&gt;
Irene      Finance&lt;br&gt;
Dennis     IT&lt;br&gt;
This sorted data enables the analyst to quickly identify an employee which department the employees comes from.&lt;/p&gt;
&lt;h2&gt;
  
  
  Filtering of data
&lt;/h2&gt;

&lt;p&gt;Filtering hides data that does not meet a particular condition.&lt;br&gt;
For example, since our dataset contains employees from different departments, we can filter the column to only show employees in IT departments ,filtering does not delete the other records .It only hides since it does not match the selected condition.&lt;/p&gt;
&lt;h2&gt;
  
  
  Data cleaning
&lt;/h2&gt;

&lt;p&gt;It is the process of finding and correcting errors in a dataset.&lt;br&gt;
Common errors in a dataset involves,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Missing values&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Duplicate values&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Inconsistent information&lt;br&gt;
In data cleaning ,excel functions are:&lt;br&gt;
UPPER&lt;br&gt;
=UPPER(A2) It helps changes the text to uppercase&lt;br&gt;
LOWER&lt;br&gt;
=lOWER it help changes the text to lowercase&lt;br&gt;
TRIM&lt;br&gt;
=TRIM(A2) It help removes unnecessary spaces from text.&lt;/p&gt;
&lt;h2&gt;
  
  
  Preparation of data for analysis.
&lt;/h2&gt;

&lt;p&gt;It is the process of cleaning, organizing raw data to be accurately ready for analysist avoid misleading results.&lt;br&gt;
The analyst should ensure that the dataset is well structured, complete ,consistent ,accurate and identify missing values.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  GitHub Repository
&lt;/h2&gt;

&lt;p&gt;You can find my Excel data analysis project on GitHub:&lt;/p&gt;

&lt;p&gt;[&lt;a href="https://github.com/chebetdorcas3-bot/my-second-project" rel="noopener noreferrer"&gt;view my GitHub Repository&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>ASSIGNMENT WEEK 1</title>
      <dc:creator>Dorcas Chebet</dc:creator>
      <pubDate>Sun, 23 Aug 2026 11:37:33 +0000</pubDate>
      <link>https://dev.to/dorcas_chebet/assignment-week-1-334a</link>
      <guid>https://dev.to/dorcas_chebet/assignment-week-1-334a</guid>
      <description>&lt;h1&gt;
  
  
  Understanding the Git workflow.
&lt;/h1&gt;

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

&lt;p&gt;Git is a system that is used incase one needs to track their projects or check if there was changes or need to get back to the initial project.&lt;br&gt;
Git is important since it simplify the work of re-writting the project over again by keeping track on the initial project through tracking the changes in the file or checking on what has changed or under certain changes.&lt;br&gt;
A complete work flow involves,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;working directory&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;staging area&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;commit&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;push&lt;/p&gt;
&lt;h2&gt;
  
  
  working directory.
&lt;/h2&gt;

&lt;p&gt;It is a folder in your laptop or computer where you work on your project .Working directory is where you:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;create files&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;edit files &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;delete files&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add data and make changes to your project.&lt;br&gt;
The commands that are used in the working directory include,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;pwd-it shows your current location&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ls_it is used for listing files and a folder. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cd folder-it moves into a folder.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cd..-it is used if one needs to move back to the previous folder.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;mkdir-it creates a new file folder.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;touch file-wit creates a new empty folder.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;git status-command used in tracking a folder.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;git add-moves changes to staging area.&lt;/p&gt;
&lt;h2&gt;
  
  
  staging area.
&lt;/h2&gt;

&lt;p&gt;It is where you put the changes you have chosen to save in your next commit in git.&lt;/p&gt;
&lt;h3&gt;
  
  
  The commands that are used in staging area:
&lt;/h3&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;git add- stage all the changes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;git status- check what is staged&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;git diff--staged -sees what is exactly staged&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;git restore--staged-it removes a file from staging&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;git commit -m -it ensure you run git add before committing&lt;/p&gt;
&lt;h2&gt;
  
  
  Commit
&lt;/h2&gt;

&lt;p&gt;It is a back up of the changes that have been placed in the staging area. &lt;br&gt;
Good commit messages can tell what happened.&lt;/p&gt;
&lt;h2&gt;
  
  
  Push
&lt;/h2&gt;

&lt;p&gt;Git push is a command that takes the commits made in a computer and send them to a repository such as Github.It is the final stage in working directory that sends the project to remote or local repository.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>beginners</category>
      <category>git</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>assignment</title>
      <dc:creator>Dorcas Chebet</dc:creator>
      <pubDate>Thu, 20 Aug 2026 10:15:21 +0000</pubDate>
      <link>https://dev.to/dorcas_chebet/assignment-4jjo</link>
      <guid>https://dev.to/dorcas_chebet/assignment-4jjo</guid>
      <description>&lt;p&gt;assinment week 1 article submission&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
