You can't get a data analyst job without experience — but you can build that experience yourself before anyone hires you. This complete guide walks you through setting up a free home lab with SQL, Python, and Tableau, finding real-world datasets, and building a portfolio that proves you can do the work.
Here's the hiring paradox that trips up nearly every aspiring data analyst: employers want candidates with experience, but you need a job to get experience. You send out applications, and the rejections come back with politely worded versions of "we need someone who has already done this work." It's maddening — and it's also completely solvable.
The answer is a home lab. In the world of data analytics, a home lab isn't a room full of servers. It's a curated collection of free tools installed on your laptop, real-world datasets you've downloaded from public sources, and a set of projects you've built yourself, from scratch, that prove you can actually do the job. Companies can't give you experience, but they can absolutely evaluate work you've already done. A well-constructed home lab lets you walk into any interview with a portfolio of projects you built before anyone ever paid you to do it.
By the end of this lesson, you'll have a working data analyst environment on your machine, know exactly where to find practice data that mirrors what you'd encounter in a real job, and have a roadmap of projects that will teach you the actual skills — not just the theory — that employers are looking for.
What you'll learn:
You don't need any prior data experience for this lesson. You should be comfortable installing software on your computer (Windows, Mac, or Linux all work fine), and you should know how to navigate your file system — creating folders, moving files, that sort of thing. That's it.
Most people studying data analytics spend their time watching tutorials. They follow along, the instructor's code runs, everything looks great — and then they close the laptop and retain maybe 20% of it. This is called passive learning, and it's the enemy of real skill development.
A home lab forces active learning. When you set up your own environment and work with your own datasets, you run into real problems: a CSV file with inconsistent date formats, a database query that returns the wrong number of rows, a chart that looks visually confusing. Solving those problems is where the actual learning happens.
The other reason people skip home labs is that setting one up sounds intimidating. It shouldn't be. You're going to install three tools, grab some data, and start building. Let's get into it.
A working data analyst environment needs three things: a way to query databases (SQL), a way to write and run code for data wrangling and analysis (Python), and a way to build visualizations and dashboards (a BI tool). Everything else is optional at this stage.
SQL (Structured Query Language) is the language you use to communicate with databases. Think of a database as an enormous, organized spreadsheet system — SQL is how you ask it questions. "Give me all orders from customers in Ohio placed in the last 90 days" becomes a SQL query.
DBeaver is a free, open-source database client that connects to virtually any database system. It's what many working analysts actually use day-to-day.
You'll also need a practice database to connect to. The easiest option is SQLite — a lightweight database that lives in a single file on your computer, no server required.
To create a SQLite connection in DBeaver: click Database → New Database Connection, choose SQLite from the list, then click Create to make a new database file. Save it somewhere you'll remember, like a folder called home-lab on your desktop. Name the file practice.db. Click Finish.
You now have a running database on your laptop.
Python is the programming language most data analysts use for tasks that are too complex or repetitive for SQL alone: cleaning messy data, running statistical calculations, automating reports, and building visualizations in code.
Anaconda is a distribution — a bundled package — that installs Python along with dozens of data science libraries and a tool called Jupyter Notebook all at once. This saves you hours of configuration headaches.
jupyter notebook then press Enter.Your browser will open to a file browser interface. This is Jupyter Notebook — your Python workspace. You can create a new notebook by clicking New → Python 3 (ipykernel) in the top right.
Type print("Home lab is live") in the first cell and press Shift+Enter to run it. If you see the output, Python is working.
This is your visualization and dashboarding tool — the software you'll use to turn data into charts and dashboards that stakeholders can actually understand.
Power BI Desktop is free on Windows (download from powerbi.microsoft.com). It's the industry standard in most corporate environments.
Tableau Public is free on both Windows and Mac (download from public.tableau.com). Your work gets published publicly, which is actually a feature for portfolio purposes — you get a URL you can share with employers.
For this lesson, we'll reference Tableau Public since it works on both platforms, but the concepts translate directly to Power BI.
After installation, open Tableau Public and you'll see the Start screen, which has a left panel labeled "Connect." That's where you'll load data.
Tip: Don't try to master all three tools at once. In week one, focus on SQL. In week two, add Python. In week three, bring in the BI tool. Sequential learning builds stronger skills than trying to do everything simultaneously.
Before you download a single dataset, set up a folder structure you'll actually use consistently. This matters more than it sounds — a well-organized home lab signals professional habits to any employer who looks at your GitHub profile.
Create a folder called data-analyst-lab somewhere stable on your machine (not the Downloads folder). Inside it, create these subdirectories:
data-analyst-lab/
├── datasets/
│ ├── raw/
│ └── processed/
├── projects/
│ ├── 01-coffee-shop-sales/
│ ├── 02-ecommerce-analysis/
│ └── 03-hr-attrition/
├── sql-practice/
├── python-notebooks/
└── README.md
The raw/ folder holds data exactly as you downloaded it — you never modify files here. The processed/ folder holds cleaned versions you've transformed in Python or SQL. This separation is a real-world best practice called maintaining data lineage, and doing it from day one builds the right habits.
The README.md file is a plain text file where you'll track what you've built. Open it in any text editor and write a brief description of your lab as you build it.
The datasets you practice with matter enormously. A toy dataset with five columns and 100 perfectly clean rows won't prepare you for the reality of real-world data, which is messy, inconsistent, and full of edge cases.
Here are the best sources for free, high-quality practice data:
Kaggle is the world's largest data science community and hosts thousands of public datasets. Create a free account. The datasets come in CSV format (CSV stands for Comma-Separated Values — a plain text file where each line is a row and commas separate the columns) and are ready to use.
Recommended starting datasets on Kaggle:
This is the U.S. government's open data portal. It has hundreds of thousands of datasets covering everything from public health to transportation to agriculture. The quality varies, but the messiness is realistic — and learning to handle it is exactly the point.
A search engine specifically for datasets. Type any topic you're genuinely interested in, and it will surface CSV and Excel files from universities, governments, and research organizations around the world. If you find a topic interesting, you'll work on it longer.
Warning: Avoid datasets that are already perfectly clean with no missing values and no weird formatting. They're less realistic and won't teach you the data cleaning skills that consume 60–80% of a real analyst's time.
Here's where the real skill-building happens. Each project below targets a specific skill set and builds on the previous one. Don't skip ahead — the sequence matters.
Goal: Practice writing SQL queries against a real-looking transactional dataset.
Download the Coffee Shop Sales dataset from Kaggle. It contains transaction records including date, time, store location, product category, and revenue.
Load it into your SQLite database using DBeaver. To do this: right-click your practice.db connection in the Database Navigator, choose SQL Editor → New SQL Script. Then use the DBeaver import wizard: right-click the database, choose Import Data, point it at your CSV file, and follow the prompts to create a new table called coffee_sales.
Now write queries that answer real business questions:
-- How much total revenue did each store location generate?
SELECT
store_location,
ROUND(SUM(transaction_qty * unit_price), 2) AS total_revenue
FROM coffee_sales
GROUP BY store_location
ORDER BY total_revenue DESC;
-- Which product category sells best on weekends vs. weekdays?
SELECT
product_category,
CASE
WHEN STRFTIME('%w', transaction_date) IN ('0', '6') THEN 'Weekend'
ELSE 'Weekday'
END AS day_type,
SUM(transaction_qty) AS total_units_sold
FROM coffee_sales
GROUP BY product_category, day_type
ORDER BY product_category, day_type;
Work through at least ten queries before moving on. Write them to answer questions you'd actually want answered if you owned this coffee shop. What hour of the day is busiest? Which product has the highest average transaction value? Are there any days where revenue was zero that might indicate a data quality problem?
Document every query in a SQL file saved in your sql-practice/ folder, with a comment above each one explaining what question it answers.
Goal: Clean a messy dataset in Python, then analyze it with SQL.
Download the E-Commerce Shipping Dataset from Kaggle. Open Jupyter Notebook and create a new notebook in your python-notebooks/ folder called ecommerce_cleaning.ipynb.
The first stage of any analysis project is Exploratory Data Analysis (EDA) — a systematic process of understanding what's in your dataset before you start drawing conclusions. Think of it as reading every page of a book before you try to summarize it.
import pandas as pd
# Load the raw data
df = pd.read_csv('../datasets/raw/ecommerce_shipping.csv')
# First look: how big is this dataset?
print(f"Rows: {df.shape[0]}, Columns: {df.shape[1]}")
# What columns do we have and what types are they?
print(df.dtypes)
# Are there missing values anywhere?
print(df.isnull().sum())
# What do the first five rows look like?
df.head()
You'll likely find columns with unexpected data types, missing values in key fields, or text fields with inconsistent formatting (some rows say "High" and others say "high" for the same category). These are exactly the kinds of issues a real analyst has to catch and fix.
# Standardize the 'Warehouse_block' column (inconsistent capitalization)
df['Warehouse_block'] = df['Warehouse_block'].str.upper().str.strip()
# Fill missing 'Customer_rating' values with the median rating
median_rating = df['Customer_rating'].median()
df['Customer_rating'] = df['Customer_rating'].fillna(median_rating)
# Save the cleaned version
df.to_csv('../datasets/processed/ecommerce_shipping_clean.csv', index=False)
Once the data is clean, load the processed CSV into your SQLite database and write SQL queries to answer questions like: Do products shipped from certain warehouse blocks arrive on time more often? Is there a relationship between customer rating and late delivery?
Goal: Build a dashboard that tells a story to a non-technical audience.
Download the IBM HR Analytics Employee Attrition dataset from Kaggle. This one is already relatively clean, which is fine — this project is about visualization, not data cleaning.
Open Tableau Public. On the Start screen, under "Connect," click Text file and navigate to the CSV you downloaded.
Tableau will show you the Data Source tab, where you can see your data in a grid. Click Sheet 1 at the bottom to go to the workspace.
Build three charts:
Attrition by Department: Drag Department to Columns and drag Employee ID (or any field) to Rows, setting the aggregation to Count. Then drag Attrition to the Color shelf. This creates a stacked bar chart showing headcount by department, split by whether employees left.
Age Distribution by Attrition: Drag Age to Columns and set it to a dimension (not aggregated). Drag Employee ID to Rows with Count aggregation. Drag Attrition to Color again. This gives you a histogram showing which age groups have higher attrition rates.
Overtime and Attrition: Drag OverTime to Columns and Attrition to Rows. Add a Count measure. This simple chart often shows a striking result — employees who work overtime leave at significantly higher rates.
Arrange all three charts on a Dashboard (click Dashboard → New Dashboard) and add a title: "HR Attrition Analysis — Key Drivers." Write two or three sentence explanations as text boxes next to each chart.
Publish to your Tableau Public profile (click Server → Tableau Public → Save to Tableau Public). You now have a URL you can link to in your resume.
Put the three projects together into a coherent GitHub portfolio. Here's how:
data-analyst-portfolio.This README is often the first thing a recruiter or hiring manager sees. Writing clear, non-jargon explanations of your analytical findings is one of the most important — and most underrated — skills in this field.
Tip: Commit your work to GitHub as you go, not all at once at the end. A commit history that spans several weeks shows genuine engagement with the work, whereas a single massive upload looks like you crammed everything in the night before.
"My Jupyter Notebook won't start."
If you're on Windows and get an error in the Anaconda Prompt, try running conda update jupyter first, then try again. On Mac, if the browser doesn't open automatically, look for a URL in the terminal output that starts with http://localhost:8888/ and paste it into your browser manually.
"My CSV file won't import into DBeaver." The most common cause is that the CSV uses a delimiter other than a comma — some files use semicolons or tabs. Open the file in a text editor (Notepad on Windows, TextEdit on Mac) and look at the first few lines. If values are separated by semicolons, you need to set the delimiter option to semicolon in the DBeaver import dialog.
"My SQL queries return way more rows than I expect." This is almost always a JOIN problem. When you join two tables, if the join condition is wrong or too loose, you get a Cartesian product — every row in table A matched with every row in table B. Double-check that your join condition references the correct key column on both sides.
"I don't know what questions to ask of my dataset." This is the most common home lab problem, and the solution is to pretend you're a business owner. If you owned this coffee shop, what would keep you up at night? Revenue trends, slow-selling products, underperforming locations. Start with those, and the questions will multiply naturally.
"My Tableau charts look cluttered and hard to read." Less is more in data visualization. Remove gridlines (Format → Lines → set everything to None), use a clean white background, and limit yourself to two or three colors per chart. Every visual element should earn its place by communicating something specific.
You now have a concrete, actionable setup for a data analyst home lab that mirrors the tools and workflows used in real jobs. You've installed DBeaver for SQL, Anaconda/Jupyter for Python, and Tableau Public for visualization. You know where to find datasets that are genuinely challenging, and you have three project blueprints that build on each other progressively.
The most important thing to remember: consistency beats intensity. Thirty minutes in your home lab five days a week will develop your skills faster than a twelve-hour weekend marathon followed by a week off. Data work is learned through repetition and problem-solving, not through watching.
What to tackle next:
ROW_NUMBER(), RANK(), and LAG().matplotlib and seaborn libraries for creating visualizations directly from Python code, which gives you far more control than a BI tool.Your home lab isn't a side project. It is your proof of work. Treat it like one.