DATA PORTFOLIO

Data Analyst Portfolio Projects With Messy Data

Tidy datasets do not show hiring managers much. Here are six traps real analysts meet, how to spot each one, how to write it up and a README that proves your work.

By EDWartens engineering team 19 October 2026 13 min
Data Analyst Portfolio Projects With Messy Data

A messy-data portfolio project shows how you handle problems real analysts meet: duplicate customers, totals that disagree between systems, a metric whose definition changed and a tracking outage. Recruiters want to see how you found each, what you decided and how you told the business. This guide gives six traps, how to detect them and a README that proves it.

One fact about our own offer, so you can judge this fairly. The EDWartens data analyst job simulation is a training project at a simulated company, done day by day with project documents, emails and tickets. It is not employment, an internship or a work placement. The first week is free and every ticket is checked as you hand it in. A graded, verifiable certificate is optional, and the longer Premium version is paid; prices show in your own currency before you pay. It shows on your EDWartens profile under Work experience, marked as a job simulation.

Why tidy datasets do not impress

Famous practice sets such as Titanic and Iris are useful for learning a library, but thousands of applicants have the same notebook. A hiring manager who opens it learns that you can follow a tutorial. A project built on faulty data, with a visible trail of how you found and handled each fault, shows what the job is actually like. What a reader opens first is not the notebook but the README and the memo, so those are where your effort should go.

Everything below uses an invented company, Tidewater Bikes, a made-up city bike hire firm. The data is synthetic. If you build your own version, say so on the first line of your README.

Start with a brief, not a dataset

Real analysis starts with a question from someone else. Write yours as a ticket, so the project has a purpose and a reader. For example: “Why did repeat bookings fall in September, and is the fall real?” Then write a small data dictionary so the reader knows what each field means.

Part of the briefExample for the Tidewater project
QuestionWhy did repeat bookings fall in September, and is it real?
RequesterHead of Operations (a role, not a person)
Decision it informsWhether to run a retention campaign in October
SourcesBooking system export, finance payment export, customer list, web tracking
Date range1 July to 30 September
Deadline and formatOne page and a chart, by Friday
Known limitsSynthetic data; web tracking has a gap; customer list was merged in August

Trap 1: profile before you analyse

Before any chart, look at what you have. Count the rows, check what should be unique, check the dates and look at blanks. Eight checks catch most of the damage. Keep the results in a log, because the log is part of the portfolio piece.

CheckWhat you askHow to run it
Row countDoes it match what the source says?COUNT(*) in SQL, len() in Python, ROWS() in a sheet
Key uniquenessIs each booking ID unique?GROUP BY id HAVING COUNT(*) > 1
NullsWhich fields are blank, and how many?Count nulls per column, as a percentage
Date rangeAre all dates inside the stated period?MIN and MAX; look for future dates
Valid valuesAre categories what the dictionary says?SELECT DISTINCT on each category field
DuplicatesAre there repeats under different IDs?Group on email, date and amount
Referential integrityDoes every booking have a real customer?LEFT JOIN, count the unmatched
PlausibilityAre amounts and durations believable?Min, max and a histogram; look for zeros and extremes

Trap 2: two sources that should agree and do not

The booking system says 4,812 completed bookings in the period. Finance says 4,775 paid. Neither is wrong; they measure different things. The job is not to pick one but to build a bridge that explains every difference.

StepCountReason
Bookings in the booking system4,812Starting point
Less refunded bookings21Paid, then refunded; finance counts net
Less test bookings9Created by staff, never paid
Less duplicates4Same booking submitted twice
Less paid in the next month3Timing difference at the period end
Equals finance paid bookings4,775Agrees with finance

The write-up sentence: “The booking system and finance differ by 37 bookings; all 37 are explained by refunds (21), test bookings (9), duplicates (4) and timing (3).” A bridge that ends at zero unexplained is the thing to show. If it does not, say how large the gap is and what you suspect.

Trap 3: a metric whose definition changed

“Active riders” sounds clear and is not. Suppose the dashboard counted a rider as active if they took at least one ride in the last 30 days (version 1), and in August the business changed it to include anyone with a paid membership, riding or not (version 2). Show both side by side, never silently switch.

DefinitionActive riders in SeptemberWhat changed
Version 1: at least one ride in 30 days3,940Original dashboard definition
Version 2: ride or paid membership in 30 days5,210Used from August
Difference1,270Members who did not ride

The lesson for the memo: a figure that “rose” from August to September may only have crossed the definition change. State which definition each chart uses, and when you must compare across the change, recompute the older months with the new rule.

Trap 4: merged records and blank sources

Systems get merged and fields get left blank. After a hypothetical customer list merge on 3 August, check two things. First, how many rows now share an email with another row. Second, how many have no source recorded at all.

MeasureRowsShare of 7,420
Rows sharing an email with another row3184.3 percent
Rows with a blank acquisition source1,10614.9 percent
Rows in both groups120.2 percent
Rows with at least one fault (318 + 1,106 - 12)1,41219.0 percent
Clean, unique rows with a source6,00881.0 percent

Watch the overlap: twelve rows are in both groups, so you subtract them once when you add the groups. Always check your own arithmetic when sets overlap. The point is to put a size on the damage, and to say what you will not fill in. You do not guess missing sources, and you do not merge people on a similar name. You report the effect: any analysis by acquisition source leaves out about 15 percent of customers.

Trap 5: a tracking outage

A conversion rate is bookings divided by website sessions. If the tracker stops for three days, sessions drop to zero while bookings carry on, and the rate becomes meaningless on those days. A naive weekly average that treats the zeros as real shows a crash that did not happen.

Day typeSessionsBookingsRate
Normal day2,4001656.9 percent
Outage day (tracker down)0 recorded160Undefined
Wrong: outage days counted as zero conversionn/an/aWeek average of 4 normal and 3 outage days falls to 3.9 percent
Right: outage days excluded and marked on the chartn/an/aRate stays near 6.9 percent

Detect it by plotting daily sessions and looking for a flat line at zero. Handle it by excluding the days from the rate, saying so on the chart and, if the business needs a number, estimating sessions from a source you can defend, clearly labelled as an estimate.

Trap 6: is the fall real?

Repeat booking rates were 412 of 5,200 customers in the north (7.92 percent) and 356 of 5,100 in the south (6.98 percent). Is the gap real or chance? A two-proportion test answers it. The NIST handbook covers the method.

  1. Pooled rate: (412 + 356) / (5,200 + 5,100) = 768 / 10,300 = 7.46 percent.
  2. Standard error: the square root of 0.0746 x 0.9254 x (1/5,200 + 1/5,100) = 0.00518.
  3. Difference: 7.92 percent minus 6.98 percent = 0.94 percentage points.
  4. z = 0.0094 / 0.00518 = 1.82. The two-sided p-value is about 0.07.

At the usual 5 percent level that is not significant. It is not proof there is no difference either. The honest sentence is: “The north repeats more often, but with these sample sizes the gap could easily be chance; I would not run a campaign on it alone.” That sentence shows more skill than a confident wrong claim.

The privacy request

Hiring managers also like to see judgement. A realistic scenario: a manager emails asking for the full customer list with emails, to send to an outside agency by this afternoon. A good response asks what the purpose is, whether customers agreed to that use, and whether the agency needs personal data at all. It offers aggregated counts instead, and refers the request to whoever handles data protection. The ICO's UK GDPR guidance and the Government of India data protection framework set the rules in those places. Never put real personal data in a public portfolio.

The README and memo

A one-page README is the front door. Use this order: the question; the data and its limits; the checks you ran; the decisions and why; the result in plain words; and what you would do next. Put the memo, a short note for a non-technical reader, first. Host everything somewhere free and public, such as a code repository with a short page, and put the link in your CV.

Ten things a reviewer looks for

  • A clear question and a stated reader.
  • A line saying the data is public or synthetic.
  • A data quality log with counts, not just words.
  • A reconciliation that ends at zero unexplained, or states the gap.
  • Each metric defined, with changes in definition shown.
  • Blank and merged records sized, not hidden.
  • Gaps in data marked on charts.
  • A significance test explained in plain words.
  • A decision or recommendation, with its limits.
  • Code or queries someone else could run.

Where to get messy data and where to practise

Real faults are easy to find. Both data.gov.uk and data.gov.in publish files that contain blanks, odd formats and changed categories. Pick one that interests you, ask a question and keep a log. If you prefer a guided setting, the data analyst job simulation gives you a ticket, several sources with planted faults and a deadline at a simulated company, and each ticket is checked as you hand it in. The machine learning engineer simulation and the AI business analyst simulation extend the same habits, and all sit on the job simulation hub.

A finished simulation shows on your EDWartens profile under Work experience, marked as a job simulation, and the optional certificate has a public page where anyone can verify it. In your own portfolio, describe it honestly as practice work with invented data. For wording, read our guide on whether job simulations are worth it. To see how course work becomes a portfolio, see how to build an engineering portfolio from course projects, and for a guided path, the data science internship plan for beginners and the data science internship track. The jobs board lists current openings.

Last updated 19 October 2026. The company, data and figures in this post are invented and the data is synthetic.

Practise with us

Internship

SCADA and HMI

Free internship: 4 weeks, a free certificate and nothing to buy. Premium adds mentor calls and the graded certificate.

See the internship

Lab

Process lab

Practise in your browser. Free, nothing to install.

Open the lab (opens in a new tab)

Roles

IIoT and networks

Roles that ask for this skill, 6 open in this country now. Free to see and to apply. We are not a recruitment agency.

See roles

Take the free course

Questions

How many portfolio projects does a data analyst need?

Three to five good ones beat ten shallow ones. Include at least one project with several sources that disagree, because that is what real work looks like. Give each a one-page write-up, so a busy reader can understand the question, the checks and the result in two minutes.

Where can I find messy data for practice?

Open government portals such as data.gov.uk and data.gov.in publish real files with real faults. You can also take a clean dataset and add faults on purpose, such as duplicates, blank fields and a changed definition, provided you say clearly that the faults are synthetic and list exactly what you added.

Is Kaggle enough for a portfolio?

It is fine for practice, but a copied notebook looks like every other copied notebook. Pick your own question, add a second source or a data quality log, and write a short memo for a non-technical reader. The thinking you add is the part a hiring manager can judge.

Should I use SQL, Python or Excel?

Use the tool the jobs you want ask for, and show you can check your own work in it. The reasoning, the checks and the clarity of the write-up matter more than the tool. A short SQL query with a reconciliation check beats a long notebook with no checks.

How do I show data cleaning without sharing private data?

Use public or synthetic data only, never a real customer list, and keep a log of every change: what you found, how many rows, what you did and why. The log is the proof. Remove names, emails and any identifier that could point to a person before anything goes online.

Do I need statistics to be a data analyst?

You need the basics and the ability to explain them in plain words: averages and spread, sample size, confidence and a simple significance test. The goal is to say whether a change is real or likely to be chance, and how sure you are, without hiding behind jargon.

Can a job simulation count as a portfolio piece?

Yes, as practice work, if you describe it as a simulation with invented data and show the memo and checks you wrote yourself. Do not present it as employment or as a real client project, and do not copy the simulation's own answers into your write-up.

How long should a project README be?

One page. State the question, the data and its limits, the checks you ran, the decisions you made, the result and what you would do next. A reviewer will read that page before opening any code, so it is worth more care than the notebook.

Sources

Written by the EDWartens engineering team for general education. Product names are trademarks of their owners; mentioning them does not imply endorsement. Prices and terms of other providers were checked on the date shown and can change.