PowerShell Advanced — Topic #9

Detect numeric anomalies (outliers)

Detectar anomalías numéricas (outliers)

Identify salaries, rates, quantities, or financial values that fall outside a predefined logical range.

Identificar salarios, tarifas, cantidades o valores financieros que se salgan de un rango lógico predefinido.

Cybersecurity & Production Environment Warning

Advertencia de ciberseguridad y ambiente de producción

This exercise is for learning and testing purposes only. Do not run scripts against production directories, payroll files, HR records, financial systems, business-critical repositories, or enterprise datasets without proper authorization, testing, backups, change-control approval, least-privilege permissions, and compliance with your organization's cybersecurity policies.

Este ejercicio es únicamente para aprendizaje y pruebas. No ejecutes scripts contra directorios de producción, nóminas, archivos de recursos humanos, sistemas financieros, repositorios críticos o datos empresariales sin autorización, pruebas, respaldos, aprobación de control de cambios, permisos mínimos y cumplimiento de las políticas de ciberseguridad de tu organización.

Business Scenario

Escenario de negocio

An organization receives a payroll, budget, billing, or operational CSV file. Most numeric values are reasonable, but some records contain values that are too high, too low, missing, or incorrectly entered. These outliers can distort totals, averages, forecasts, budgets, dashboards, and downstream calculations.

Una organización recibe un archivo CSV de nómina, presupuesto, facturación u operaciones. La mayoría de los valores numéricos son razonables, pero algunos registros contienen valores demasiado altos, demasiado bajos, vacíos o mal ingresados. Estos outliers pueden distorsionar totales, promedios, pronósticos, presupuestos, dashboards y cálculos posteriores.

What You Will Learn

Qué aprenderás

Sample Input

Entrada de ejemplo

EmployeeIDNameDepartmentSalary
1001Maria LopezFinance65000
1002Juan PerezIT72000
1003Ana TorresHR18000
1004Carlos DiazOperations158000
1005Laura SmithAdmin54000
1006Pedro RamosPublic Works210000

Base Example

Ejemplo base

The basic idea is to return only records where the salary is outside the logical range.

La idea base es devolver solamente los registros donde el salario está fuera del rango lógico.

Import-Csv "C:\Data\Nominas.csv" |
Where-Object { [int]$_.Salario -gt 150000 -or [int]$_.Salario -lt 20000 }

Step 1 — Define the Source File

Paso 1 — Definir el archivo fuente

$sourceFile = "C:\Data\Nominas.csv"
$cleanFile = "C:\Data\Nominas_Validas.csv"
$reviewFile = "C:\Data\Nominas_Outliers.csv"

Step 2 — Import the Data

Paso 2 — Importar los datos

$records = Import-Csv -Path $sourceFile

Step 3 — Define Logical Thresholds

Paso 3 — Definir rangos lógicos

For this exercise, salaries below 20,000 or above 150,000 will be flagged for review.

Para este ejercicio, los salarios menores de 20,000 o mayores de 150,000 serán marcados para revisión.

$minimumSalary = 20000
$maximumSalary = 150000

Step 4 — Detect Outliers

Paso 4 — Detectar outliers

$processed = foreach ($record in $records) {
    $salaryText = $record.Salary
    $salary = 0

    if (-not [int]::TryParse($salaryText, [ref]$salary)) {
        $status = "Review"
        $issue = "Salary is not numeric"
    }
    elseif ($salary -lt $minimumSalary) {
        $status = "Review"
        $issue = "Salary below minimum threshold"
    }
    elseif ($salary -gt $maximumSalary) {
        $status = "Review"
        $issue = "Salary above maximum threshold"
    }
    else {
        $status = "Valid"
        $issue = ""
    }

    $record | Add-Member -NotePropertyName ValidationStatus -NotePropertyValue $status -Force
    $record | Add-Member -NotePropertyName ValidationIssue -NotePropertyValue $issue -Force
    $record
}

Step 5 — Export Valid and Review Records

Paso 5 — Exportar registros válidos y para revisión

$validRecords = $processed | Where-Object { $_.ValidationStatus -eq "Valid" }
$reviewRecords = $processed | Where-Object { $_.ValidationStatus -eq "Review" }

$validRecords | Export-Csv -Path $cleanFile -NoTypeInformation
$reviewRecords | Export-Csv -Path $reviewFile -NoTypeInformation

Complete Script

Script completo

# PowerShell Advanced Topic #9
# Detect numeric anomalies / outliers

$sourceFile = "C:\Data\Nominas.csv"
$cleanFile = "C:\Data\Nominas_Validas.csv"
$reviewFile = "C:\Data\Nominas_Outliers.csv"

$minimumSalary = 20000
$maximumSalary = 150000

$records = Import-Csv -Path $sourceFile

$processed = foreach ($record in $records) {
    $salaryText = $record.Salary
    $salary = 0

    if (-not [int]::TryParse($salaryText, [ref]$salary)) {
        $status = "Review"
        $issue = "Salary is not numeric"
    }
    elseif ($salary -lt $minimumSalary) {
        $status = "Review"
        $issue = "Salary below minimum threshold"
    }
    elseif ($salary -gt $maximumSalary) {
        $status = "Review"
        $issue = "Salary above maximum threshold"
    }
    else {
        $status = "Valid"
        $issue = ""
    }

    $record | Add-Member -NotePropertyName ValidationStatus -NotePropertyValue $status -Force
    $record | Add-Member -NotePropertyName ValidationIssue -NotePropertyValue $issue -Force
    $record
}

$validRecords = $processed | Where-Object { $_.ValidationStatus -eq "Valid" }
$reviewRecords = $processed | Where-Object { $_.ValidationStatus -eq "Review" }

$validRecords | Export-Csv -Path $cleanFile -NoTypeInformation
$reviewRecords | Export-Csv -Path $reviewFile -NoTypeInformation

Write-Host "Numeric anomaly detection completed."
Write-Host "Valid records:" $validRecords.Count
Write-Host "Records requiring review:" $reviewRecords.Count

Expected Output

Resultado esperado

Valid records

Registros válidos

EmployeeIDNameSalary
1001Maria Lopez65000
1002Juan Perez72000
1005Laura Smith54000

Records for review

Registros para revisión

EmployeeIDNameSalaryIssue
1003Ana Torres18000Below minimum
1004Carlos Diaz158000Above maximum
1006Pedro Ramos210000Above maximum

Real-World Applications

Aplicaciones reales

Payroll validationBudget reviewBilling auditsGrant reportingHR analyticsFinancial data quality

Recommendations

Recomendaciones