Skip to main content
Workforce LibreTexts

5.8: Tools and Workflow for EDA

  • Page ID
    48064
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)

    \( \newcommand{\dsum}{\displaystyle\sum\limits} \)

    \( \newcommand{\dint}{\displaystyle\int\limits} \)

    \( \newcommand{\dlim}{\displaystyle\lim\limits} \)

    \( \newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\)

    ( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\)

    \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)

    \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\)

    \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)

    \( \newcommand{\Span}{\mathrm{span}}\)

    \( \newcommand{\id}{\mathrm{id}}\)

    \( \newcommand{\Span}{\mathrm{span}}\)

    \( \newcommand{\kernel}{\mathrm{null}\,}\)

    \( \newcommand{\range}{\mathrm{range}\,}\)

    \( \newcommand{\RealPart}{\mathrm{Re}}\)

    \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)

    \( \newcommand{\Argument}{\mathrm{Arg}}\)

    \( \newcommand{\norm}[1]{\| #1 \|}\)

    \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)

    \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    \( \newcommand{\vectorA}[1]{\vec{#1}}      % arrow\)

    \( \newcommand{\vectorAt}[1]{\vec{\text{#1}}}      % arrow\)

    \( \newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vectorC}[1]{\textbf{#1}} \)

    \( \newcommand{\vectorD}[1]{\overrightarrow{#1}} \)

    \( \newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}} \)

    \( \newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}} \)

    \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \(\newcommand{\longvect}{\overrightarrow}\)

    \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)

    \(\newcommand{\ket}[1]{\left| #1 \right>}\)
    \(\newcommand{\bra}[1]{\left< #1 \right|}\)
    \(\newcommand{\braket}[2]{\left< #1 \vphantom{#2} \right| \left. #2 \vphantom{#1} \right>}\)
    \(\newcommand{\braopket}[3]{\left< #1 \vphantom{#2}\vphantom{#3} \right| #2 \vphantom{#1}\vphantom{#3} \left| #3 \vphantom{#1}\vphantom{#2} \right>}\)
    \(\newcommand{\qmvec}[1]{\mathbf{\vec{#1}}}\)
    \(\newcommand{\op}[1]{\hat{\mathbf{#1}}}\)
    \(\newcommand{\expect}[1]{\langle #1 \rangle}\)
    \(\newcommand{\dfn}[1]{\emph{\textbf{#1}}}\)

    \(\newcommand{\avec}{\mathbf a}\) \(\newcommand{\bvec}{\mathbf b}\) \(\newcommand{\cvec}{\mathbf c}\) \(\newcommand{\dvec}{\mathbf d}\) \(\newcommand{\dtil}{\widetilde{\mathbf d}}\) \(\newcommand{\evec}{\mathbf e}\) \(\newcommand{\fvec}{\mathbf f}\) \(\newcommand{\nvec}{\mathbf n}\) \(\newcommand{\pvec}{\mathbf p}\) \(\newcommand{\qvec}{\mathbf q}\) \(\newcommand{\svec}{\mathbf s}\) \(\newcommand{\tvec}{\mathbf t}\) \(\newcommand{\uvec}{\mathbf u}\) \(\newcommand{\vvec}{\mathbf v}\) \(\newcommand{\wvec}{\mathbf w}\) \(\newcommand{\xvec}{\mathbf x}\) \(\newcommand{\yvec}{\mathbf y}\) \(\newcommand{\zvec}{\mathbf z}\) \(\newcommand{\rvec}{\mathbf r}\) \(\newcommand{\mvec}{\mathbf m}\) \(\newcommand{\zerovec}{\mathbf 0}\) \(\newcommand{\onevec}{\mathbf 1}\) \(\newcommand{\real}{\mathbb R}\) \(\newcommand{\twovec}[2]{\left[\begin{array}{r}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\ctwovec}[2]{\left[\begin{array}{c}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\threevec}[3]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\cthreevec}[3]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\fourvec}[4]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\cfourvec}[4]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\fivevec}[5]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\cfivevec}[5]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\mattwo}[4]{\left[\begin{array}{rr}#1 \amp #2 \\ #3 \amp #4 \\ \end{array}\right]}\) \(\newcommand{\laspan}[1]{\text{Span}\{#1\}}\) \(\newcommand{\bcal}{\cal B}\) \(\newcommand{\ccal}{\cal C}\) \(\newcommand{\scal}{\cal S}\) \(\newcommand{\wcal}{\cal W}\) \(\newcommand{\ecal}{\cal E}\) \(\newcommand{\coords}[2]{\left\{#1\right\}_{#2}}\) \(\newcommand{\gray}[1]{\color{gray}{#1}}\) \(\newcommand{\lgray}[1]{\color{lightgray}{#1}}\) \(\newcommand{\rank}{\operatorname{rank}}\) \(\newcommand{\row}{\text{Row}}\) \(\newcommand{\col}{\text{Col}}\) \(\renewcommand{\row}{\text{Row}}\) \(\newcommand{\nul}{\text{Nul}}\) \(\newcommand{\var}{\text{Var}}\) \(\newcommand{\corr}{\text{corr}}\) \(\newcommand{\len}[1]{\left|#1\right|}\) \(\newcommand{\bbar}{\overline{\bvec}}\) \(\newcommand{\bhat}{\widehat{\bvec}}\) \(\newcommand{\bperp}{\bvec^\perp}\) \(\newcommand{\xhat}{\widehat{\xvec}}\) \(\newcommand{\vhat}{\widehat{\vvec}}\) \(\newcommand{\uhat}{\widehat{\uvec}}\) \(\newcommand{\what}{\widehat{\wvec}}\) \(\newcommand{\Sighat}{\widehat{\Sigma}}\) \(\newcommand{\lt}{<}\) \(\newcommand{\gt}{>}\) \(\newcommand{\amp}{&}\) \(\definecolor{fillinmathshade}{gray}{0.9}\)

    Tools and Workflow for EDA

    EDA can be facilitated by various tools, and having a clear workflow helps ensure a thorough and efficient analysis. In modern data analytics, a common environment for conducting EDA is an interactive notebook (such as Jupyter Notebook in Python or RMarkdown in R) which allows intermixing code, results, and commentary. This supports the iterative, step-by-step nature of EDA. Here we outline typical tools and workflow practices for EDA:

    Programming Languages and Libraries:

    Python and R are two of the most popular languages for EDA due to their rich ecosystem of data analysis libraries. In Python, pandas is a go-to library for data manipulation and basic analysis – it provides high-level data structures (DataFrames) and convenient functions to summarize and plot data. For example, with pandas one can quickly load data (pd.read_csv), check the first few rows (df.head()), get summary stats (df.describe()) and assess data types and missing values (df.info()), all of which are initial EDA steps. NumPy underlies pandas for numerical computations.

    For visualization in Python, Matplotlib and Seaborn are widely used. Matplotlib is a low-level plotting library, and Seaborn is built on top of it, providing high-level interfaces for statistical graphics. Seaborn, for example, has convenient functions for many EDA plot types: sns.histplot for histograms, sns.boxplot for box plots, sns.scatterplot (or sns.relplot) for scatter plots, sns.pairplot for scatter plot matrices, and sns.heatmap for correlation matrices. With a few lines of code, one can produce attractive and informative charts. For instance, to visualize the correlation matrix of a DataFrame df, one could do:

    import seaborn as sns
    corr = df.corr()            # compute correlation matrix
    sns.heatmap(corr, annot=True, fmt=".2f")
    plt.title("Correlation Matrix Heatmap")
    plt.show()

    This would display a color-coded matrix with correlation coefficients annotated, aiding EDA of multivariate relationships.

    In R, the analogous tools would be the tidyverse (dplyr for manipulation, ggplot2 for visualization, etc.). The philosophy is similar: provide quick ways to calculate summaries and create plots. R's ggplot2 is particularly powerful for layering data aesthetics and faceting for multivariate exploration.

    Interactive EDA Environments:

    Using interactive environments like Jupyter Notebook or JupyterLab (for Python) or RStudio (for R) is highly beneficial. These allow writing a bit of code, seeing the output (table or chart), and then writing more code – fostering an interactive dialogue with the data. One can keep notes, make headings (like a lab notebook), and even use widgets or sliders (via e.g. ipywidgets in Python) to interactively filter or modify plots. This interactivity speeds up EDA: you can tweak a plot on the fly (change bin size, add a hue grouping, etc.) to drill down into the data. Notebooks also help in documenting the EDA process, which is a good practice. By the end, you often have a narrative of what you tried and what you found, which can be shared with colleagues or used for reference when modeling.

    Other Tools:

    Apart from coding, there are GUI-based tools that can be used for EDA, such as Tableau, Power BI, or even spreadsheet software for simpler datasets. Tableau, for instance, allows quick drag-and-drop creation of plots and can be great for exploring data visually without writing code. There are also specialized EDA tools that generate automated reports; for example, Python has packages like Pandas Profiling (now YData Profiling), SweetViz, or DataPrep, which can produce an EDA report with distributions, correlations, missing value analysis, etc., with a single command. These can be a helpful start to identify areas to explore further, though they don’t replace careful human-driven analysis.

    Reproducibility and Version Control:

    When performing EDA, it’s easy to do a lot of ad-hoc exploration. It’s wise to keep the process reproducible – meaning someone else (or you, in the future) could rerun the steps and get the same results. Using notebooks helps, but it’s also important to save any substantial intermediate results (like data cleaning steps) or to use version control (like Git) for your analysis code. This ensures that if you modify data (say, remove outliers or impute values as part of exploration), you know exactly how it was done and can trace or undo it. Reproducibility is an academic virtue and also a practical one: it guards against mistakes and makes your EDA work reusable.

    Typical EDA Workflow:

    While EDA is not strictly linear, a commonly recommended workflow (which might iterate in cycles) is:

    1. Data Understanding: Load the data and understand its structure (.shape, .columns, .head()). Verify things like encoding, types, ranges.
    2. Data Cleaning: Perform initial cleaning if necessary (e.g., strip whitespace in strings, convert data types, handle obvious errors). This often happens in tandem with exploration.
    3. Univariate Exploration: For each variable:
    4. Plot its distribution (histogram for numeric, bar chart for categorical).
    5. Compute summary stats.
    6. Note any anomalies (outliers, many zeros, excessive missing, etc.).
    7. Bivariate Exploration: For pairs of variables (especially each feature vs target if there is a target, and feature vs feature for potential multicollinearity):
    8. Plot relationships (scatter, box plots, etc. as appropriate).
    9. Compute correlation or group differences.
    10. Look for interesting relationships or lack thereof.
    11. Multivariate/Conditional Exploration: Bring in third variables where relevant:
    12. If something interesting was seen in step 4, does it hold across categories? (e.g., maybe for one subgroup the trend is different).
    13. Use dimension reduction or cluster analysis if dealing with high dimensions to see overall structure.
    14. Synthesis: Summarize the findings:
    15. Which variables are important or promising?
    16. Which variables might be dropped or need transformation?
    17. What patterns have we found that could be hypotheses for why the data behaves a certain way?
    18. Any data quality issues to fix (missing data strategy, outlier handling, etc.).
    19. Formulate next steps (maybe design new data collection if needed, or proceed to modeling with the insights).
    20. The EDA Workflow Lifecycle. Details in caption.
    Figure \(\PageIndex{1}\): The EDA Workflow Cycle. This diagram depicts the iterative EDA workflow from data understanding through synthesis, emphasizing that the process is cyclical rather than strictly linear. (CC BY 4.0; Felix Amoruwa) Access to a detailed description of Figure \(\PageIndex{1}\)

    During all these steps, an analyst might loop back: e.g., a scatter plot might show an outlier, which leads back to re-checking the univariate distribution or the data entry, which then might lead to a decision to remove it and then re-plot, etc. EDA is inherently iterative and exploratory – as the name implies – so flexibility is key. One should be open to following the data down unforeseen paths; sometimes the most valuable findings are those you didn’t anticipate when you started.

    Lastly, remember that EDA is as much an art as a science. The tools provide the means, but the analyst’s curiosity and domain understanding drive the process. Two people might explore the same dataset differently, but the goal is that both end up with a solid understanding of the data’s story.


    This page titled 5.8: Tools and Workflow for EDA was last modified on Wed, 16 Sep 2026 23:30:51 GMT and is shared under a CC BY 4.0 license and was authored, remixed, and/or curated by Felix Amoruwa.

    • Was this article helpful?