Sunday, May 3, 2026

The “Sturdy” Information Scientist: Successful with Messy Information and Pingouin

The “Sturdy” Information Scientist: Successful with Messy Information and Pingouin
Picture by Editor

 

Introduction

 
A harsh reality to start with: textbook information science often turns into a lie in the true world. Ideas and methods are taught on finely curated, fantastically bell-curved information variables, however as quickly as we enterprise into the wild of actual initiatives, we’re hit with a number of outliers, unduly skewed distributions, and indomitable variances.

A earlier article on constructing an exploratory information evaluation (EDA) pipeline with Pingouin confirmed the best way to detect, by assessments, instances when the info violates quite a lot of assumptions like homoscedasticity and normality. However what if the assessments fail? Throwing the info away is not the answer: turning strong is.

This text uncovers the craftsmanship of utilizing strong statistics in information science processes. These are mathematical strategies significantly constructed to yield dependable and legitimate outcomes even when the info doesn’t meet classical assumptions or is pervaded by outliers and noise. By adopting a “select your personal journey” strategy, we are going to create a trio of situations utilizing Python’s Pingouin to handle the ugliest elements throughout the information chances are you’ll encounter in your every day work.

 

Preliminary Setup

 
Let’s begin by putting in (if wanted) and importing Pingouin and Pandas, after which we are going to load the wine high quality dataset out there right here.

!pip set up pingouin pandas

import pandas as pd
import pingouin as pg

# Loading our messy, real-world-like dataset, containing pink and white wine samples
url = "https://uncooked.githubusercontent.com/gakudo-ai/open-datasets/refs/heads/predominant/wine-quality-white-and-red.csv"
df = pd.read_csv(url)

# Take a small peek at what we're about to cope with
df.head()

 

For those who seemed on the earlier Pingouin article, you already know this can be a notoriously messy dataset that failed to fulfill a number of frequent assumptions. Now we are going to embark on three completely different “adventures”, every highlighting a situation, a core downside, and a proposed strong repair to handle it.

 

// Journey 1: When the Normality Check Fails

Suppose we run normality assessments on two teams: white wine samples and pink wine samples.

white_wine_alcohol = df[df['type'] == 'white']['alcohol']
red_wine_alcohol = df[df['type'] == 'pink']['alcohol']

print("Normality check for White Wine Alcohol content material:")
print(pg.normality(white_wine_alcohol))
print("nNormality check for Pink Wine Alcohol content material:")
print(pg.normality(red_wine_alcohol))

 

You can find that neither distribution is regular, with extraordinarily low p-values. Though non-normality itself does not straight sign outliers or skewness, a powerful deviation from normality typically suggests such traits could also be current within the information. Evaluating means by a t-test on this state of affairs could be harmful and more likely to yield unreliable outcomes.

The strong repair for a situation like that is the Mann-Whitney U check. As a substitute of evaluating averages, this check compares the ranks within the information — sorting all wines in a bunch from lowest to highest alcohol content material, as an illustration. This rank-based strategy is the grasp trick that strips outliers of their typically harmful magnitude. Here is how:

# Separating our two teams
red_wine = df[df['type'] == 'pink']['alcohol']
white_wine = df[df['type'] == 'white']['alcohol']

# Working the strong Mann-Whitney U check
mwu_results = pg.mwu(x=red_wine, y=white_wine)
print(mwu_results)

 

Output:

         U_val different     p_val       RBC      CLES
MWU  3829043.5   two-sided  0.181845 -0.022193  0.488903

 

Because the p-value shouldn’t be beneath 0.05, there isn’t a statistically important distinction in alcohol content material between the 2 wine varieties — and this conclusion is assured to be outlier-proof and skewness-proof.

 

// Journey 2: When the Paired T-Check Fails

Say you now wish to evaluate two measurements taken from the identical topic — e.g. a affected person’s sugar degree earlier than and after a drug prototype, or two properties measured in the identical bottle of wine. The main target right here is on how the variations between paired measurements are distributed. When such variations usually are not usually distributed, a typical paired t-test will yield unreliable confidence intervals.

The perfect repair on this situation is the Wilcoxon Signed-Rank Check: the strong sibling of the paired t-test, which works by observing the variations between columns and rating their absolute values. In Pingouin, this check is known as utilizing pg.wilcoxon(), passing within the two columns containing the paired measures throughout the similar topic — e.g. two varieties of wine acidity.

# Run the strong Wilcoxon signed-rank check for paired information
wilcoxon_results = pg.wilcoxon(x=df['fixed acidity'], y=df['volatile acidity'])
print(wilcoxon_results)

 

Consequence:

          W_val different  p_val  RBC  CLES
Wilcoxon    0.0   two-sided    0.0  1.0   1.0

 

The end result above reveals a statistically important distinction, or “excellent separation,” between the 2 measurements. Not solely are the 2 wine properties completely different, however in addition they function at fully completely different magnitude tiers throughout the dataset.

 

// Journey 3: When ANOVA Fails

On this third and last journey, we wish to test whether or not residual sugar ranges in wine differ considerably throughout distinct high quality scores — observe that the latter vary between 3 and 9, taking integer values, and may due to this fact be handled as discrete classes.

If Pingouin’s Levene check of homoscedasticity fails dramatically — as an illustration, as a result of sugar variance in mediocre wines is big however very small in top-quality wines — a classical one-way ANOVA could produce deceptive outcomes, as this check assumes equal variances amongst teams.

The repair is Welch’s ANOVA, which penalizes teams with excessive variance, thereby balancing out scales and making comparisons fairer throughout a number of classes. Right here is the best way to run this strong different to conventional ANOVA utilizing Pingouin:

# Run Welch's ANOVA to match sugar throughout high quality scores
welch_results = pg.welch_anova(information=df, dv='residual sugar', between='high quality')
print(welch_results)

 

Consequence:

    Supply  ddof1      ddof2          F         p_unc       np2
0  high quality      6  54.507934  10.918282  5.937951e-08  0.008353

 

Even the place a one-way ANOVA might need struggled attributable to unequal variances, Welch’s ANOVA delivers a strong conclusion. The very small p-value is obvious proof that residual sugar ranges differ considerably throughout wine high quality scores. Keep in mind, nevertheless, that sugar is just a small piece of the puzzle influencing wine high quality — some extent underscored by the low eta-squared worth of 0.008.

 

Wrapping Up

 
By three instance situations, every pairing a messy-data downside with a sturdy statistical technique, we’ve got discovered that being a talented information scientist doesn’t suggest having excellent information or tuning it completely — it means figuring out what to do when the info will get troublesome for various causes. Pingouin’s features implement quite a lot of strong assessments that assist escape the failed-assumptions lure and extract mathematically sound insights with little further effort.
 
 

Iván Palomares Carrascosa is a pacesetter, author, speaker, and adviser in AI, machine studying, deep studying & LLMs. He trains and guides others in harnessing AI in the true world.

Related Articles

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Latest Articles