trend-analysis

v0.1.0

Detect long-term trends in time series data using parametric and non-parametric methods. Use when determining if a variable shows statistically significant i...

1· 92· 1 versions· 0 current· 0 all-time· Updated 11h ago· MIT-0

Install

openclaw skills install lake-warming-attribution-trend-analysis

Trend Analysis Guide

Overview

Trend analysis determines whether a time series shows a statistically significant long-term increase or decrease. This guide covers both parametric (linear regression) and non-parametric (Sen's slope) methods.

Parametric Method: Linear Regression

Linear regression fits a straight line to the data and tests if the slope is significantly different from zero.

from scipy import stats

slope, intercept, r_value, p_value, std_err = stats.linregress(years, values)

print(f"Slope: {slope:.2f} units/year")
print(f"p-value: {p_value:.2f}")

Assumptions

  • Linear relationship between time and variable
  • Residuals are normally distributed
  • Homoscedasticity (constant variance)

Non-Parametric Method: Sen's Slope with Mann-Kendall Test

Sen's slope is robust to outliers and does not assume normality. Recommended for environmental data.

import pymannkendall as mk

result = mk.original_test(values)

print(result.slope)  # Sen's slope (rate of change per time unit)
print(result.p)      # p-value for significance
print(result.trend)  # 'increasing', 'decreasing', or 'no trend'

Comparison

MethodProsCons
Linear RegressionEasy to interpret, gives R²Sensitive to outliers
Sen's SlopeRobust to outliers, no normality assumptionSlightly less statistical power

Significance Levels

p-valueInterpretation
p < 0.01Highly significant trend
p < 0.05Significant trend
p < 0.10Marginally significant
p >= 0.10No significant trend

Example: Annual Precipitation Trend

import pandas as pd
import pymannkendall as mk

# Load annual precipitation data
df = pd.read_csv('precipitation.csv')
precip = df['Precipitation'].values

# Run Mann-Kendall test
result = mk.original_test(precip)
print(f"Sen's slope: {result.slope:.2f} mm/year")
print(f"p-value: {result.p:.2f}")
print(f"Trend: {result.trend}")

Common Issues

IssueCauseSolution
p-value = NaNToo few data pointsNeed at least 8-10 years
Conflicting resultsMethods have different assumptionsTrust Sen's slope for environmental data
Slope near zero but significantLarge sample sizeCheck practical significance

Best Practices

  • Use at least 10 data points for reliable results
  • Prefer Sen's slope for environmental time series
  • Report both slope magnitude and p-value
  • Round results to 2 decimal places

Version tags

latestvk9793gagne4kmze19w5rye2w8584x4jx