TutorialsPythonExploratory Data Analysis (EDA) Workflow

Exploratory Data Analysis (EDA) Workflow

A systematic 6-step EDA process every data analyst should follow on any new dataset

EDA is where analysis actually begins — not with the answer, but with the question: what is actually in this data? I have been running EDA on datasets since before most current data analysts were in school, and I can tell you that the analysts who skip it or rush it are the ones who present wrong conclusions in board meetings. The most embarrassing moment I ever witnessed in a data career was a senior analyst presenting a "customer growth" chart to the CEO. The chart showed 40% growth. Beautiful. The CEO was thrilled. Then someone in the room asked why the numbers were so different from last quarter's report. It took twenty minutes to discover the analyst had double-counted customers because two source systems overlapped — something a basic EDA check would have flagged in five minutes. EDA is not about making charts. It is about building enough understanding of the data that you cannot be surprised by it. You know its shape. You know which columns have nulls and why. You know the distributions — whether sales is skewed right, whether there are impossible values (negative quantities, future dates), whether two columns that should match actually do. The six-step workflow in this tutorial is the exact process I follow every time I touch a new dataset, whether it has 500 rows or 50 million. The steps do not change. Only the tools scale.

Example

The 6-step EDA workflow
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.read_csv("dataset.csv")

# STEP 1 — Shape and structure
print(df.shape)         # rows × columns
print(df.dtypes)        # column types
print(df.head())        # first few rows
df.info()               # non-null counts + dtypes

# STEP 2 — Missing values
null_pct = df.isnull().sum() / len(df) * 100
print(null_pct.sort_values(ascending=False).head(10))

# STEP 3 — Distributions (numeric)
df.describe()           # min, max, mean, std, quartiles
for col in df.select_dtypes(include="number").columns:
    df[col].hist(bins=30, figsize=(6, 3))
    plt.title(col)
    plt.show()

# STEP 4 — Distributions (categorical)
for col in df.select_dtypes(include="object").columns:
    print(f"\n{col} — {df[col].nunique()} unique values")
    print(df[col].value_counts().head(10))

# STEP 5 — Correlations
sns.heatmap(df.select_dtypes("number").corr(),
            annot=True, fmt=".2f", cmap="coolwarm")
plt.show()

# STEP 6 — Key business question charts
df.groupby("Region")["Sales"].sum().sort_values().plot(kind="barh")
plt.title("Total Sales by Region")
plt.show()
💡 EDA is iterative — each chart raises new questions. The workflow is a starting structure, not a rigid sequence.

Key Points

  • Always run df.info() and df.describe() first — they tell you what you are working with
  • Null percentage per column decides your handling strategy: drop / fill / flag
  • Distributions reveal: skewed data, outliers, data entry errors, bimodal patterns
  • Correlation heatmap shows which variables move together (or oppose each other)
  • EDA findings drive report structure — what questions does the data actually answer?

Practice Question

Which Pandas method gives you count, mean, std, min, and quartile statistics for all numeric columns at once?

Related Topics

Data Cleaning with PandasRename columns, fix data types, remove duplicates, and standardise messy real-world dataHandling Missing Values (Nulls)Detect, fill, and drop NaN values — essential for accurate analysisDescriptive Statistics in PythonCalculate mean, median, mode, variance, standard deviation and percentilesSeaborn for Statistical ChartsCreate beautiful distribution, correlation and categorical charts with Seaborn