Python 统计分析常用的 30 个经典脚本

大数据 数据分析
本文介绍了使用 Python 对数据进行统计分析的 30 个经典操作,涵盖了从基本的描述性统计到更高级的统计度量。每个操作都附有代码实现和输出结果,以便读者方便地在实际应用中使用这些方法。

本文将介绍使用 Python 对数据快速进行统计分析的 30 个经典操作,包括计算平均值、中位数、众数、方差、移动平均、相关系数等。每个操作都附有代码实现和输出结果,大家动手练起来吧.

导入库并创建数据

首先,我们需要导入必要的库,并创建一个简单的列表数据,后续对该列表进行相应的数据统计分析。

import numpy as np
from scipy import stats
data = [1, 2, 3, 4, 5, 10, 4, 5, 10, 4, 5]

1. 计算平均值、最大值、最小值、中位数、众数、方差、标准差、极差

mean = np.mean(data)  # 平均值
max_value = np.max(data)  # 最大值
min_value = np.min(data)  # 最小值
median = np.median(data)  # 中位数
mode = stats.mode(data).mode[0]  # 众数
variance = np.var(data)  # 方差
std_dev = np.std(data)  # 标准差
range_value = np.ptp(data)  # 极差
print(f"平均值: {mean}")
print(f"最大值: {max_value}")
print(f"最小值: {min_value}")
print(f"中位数: {median}")
print(f"众数: {mode}")
print(f"方差: {variance}")
print(f"标准差: {std_dev}")
print(f"极差: {range_value}")

输出结果:

平均值: 4.909090909090909

最大值: 10

最小值: 1

中位数: 4.0

众数: 4

方差: 6.2727272727272725

标准差: 2.5045410659520024

极差: 9

2. 计算分位数

q1 = np.percentile(data, 25)  # 第一四分位数
q3 = np.percentile(data, 75)  # 第三四分位数
percentile_90 = np.percentile(data, 90)  # 第90百分位数
print(f"第一四分位数: {q1}")
print(f"第三四分位数: {q3}")
print(f"第90百分位数: {percentile_90}")

输出结果:

第一四分位数: 3.0

第三四分位数: 5.0

第90百分位数: 9.6

3. 计算偏度

skewness = stats.skew(data)
print(f"偏度: {skewness}")

输出结果:

偏度:0.865996160689023

4. 计算峰度

kurtosis = stats.kurtosis(data)
print(f"峰度: {kurtosis}")

输出结果:

峰度: -0.9444444444444444

5. 计算相关系数

data1 = [1, 2, 3, 4, 5]
data2 = [2, 4, 6, 8, 10]
correlation = np.corrcoef(data1, data2)[0, 1]
print(f"相关系数: {correlation}")

输出结果:

相关系数: 1.0

6. 计算协方差

covariance = np.cov(data1, data2)[0, 1]
print(f"协方差: {covariance}")

输出结果:

协方差: 7.5

7. 计算累积和

cumulative_sum = np.cumsum(data)
print(f"累积和: {cumulative_sum}")

输出结果:

累积和: [ 1  3  6 10 15 25 29 34 44 48 53]

8. 计算累积积

cumulative_product = np.cumprod(data)
print(f"累积积: {cumulative_product}")

输出结果:

累积积: [      1       2       6      24     120    1200   4800  24000 240000 960000 4800000]

9. 计算累积最大值和最小值

cumulative_max = np.maximum.accumulate(data)
cumulative_min = np.minimum.accumulate(data)
print(f"累积最大值: {cumulative_max}")
print(f"累积最小值: {cumulative_min}")

输出结果:

累积最大值: [ 1  2  3  4  5 10 10 10 10 10 10]

累积最小值: [1 1 1 1 1 1 1 1 1 1 1]

10. 计算累积平均值

cumulative_mean = np.cumsum(data) / np.arange(1, len(data) + 1)
print(f"累积平均值: {cumulative_mean}")

输出结果:

累积平均值: [1.         1.5        2.         2.5        3.         4.16666667

 4.14285714 4.25       4.88888889 4.8         4.81818182]

11. 计算累积方差

cumulative_variance = np.cumsum((data - mean) ** 2) / np.arange(1, len(data) + 1)
print(f"累积方差: {cumulative_variance}")

输出结果:

累积方差: [0.         0.25       0.66666667 1.25       2.         4.44444444

 4.44444444 4.44444444 5.2345679  5.2345679  5.2345679 ]

12. 计算累积标准差

cumulative_std_dev = np.sqrt(cumulative_variance)
print(f"累积标准差: {cumulative_std_dev}")

输出结果:

累积标准差: [0.         0.5        0.81649658 1.11803399 1.41421356 2.10818511

 2.10818511 2.10818511 2.2883519  2.2883519  2.2883519 ]

13. 计算移动平均

def moving_average(data, window_size):
    return [sum(data[i:i+window_size])/window_size for i in range(len(data)-window_size+1)]
window_size = 3
moving_avg = moving_average(data, window_size)
print(f"移动平均: {moving_avg}")

输出结果:

移动平均: [2.0, 3.0, 4.0, 6.333333333333333, 6.333333333333333, 6.333333333333333, 6.333333333333333, 6.333333333333333, 6.333333333333333]

14. 计算指数加权移动平均(EWMA)

def ewma(data, alpha):
    ewma = [data[0]]
    for i in range(1, len(data)):
        ewma.append(alpha * data[i] + (1 - alpha) * ewma[-1])
    return ewma
alpha = 0.5
ewma_values = ewma(data, alpha)
print(f"指数加权移动平均: {ewma_values}")

输出结果:

指数加权移动平均: [1.0, 1.5, 2.25, 3.125, 4.0625, 7.03125, 5.515625, 5.2578125, 7.62890625, 5.814453125, 5.4072265625]

15. 计算列表元素的 Z 分数(标准分数)

def z_scores(data):
    mean = np.mean(data)
    std_dev = np.std(data)
    return [(x - mean) / std_dev for x in data]
z_scores_values = z_scores(data)
print(f"Z 分数: {z_scores_values}")

输出结果:

Z 分数: [-1.559935305422552, -1.169951454068414, -0.779967602714276, -0.389983751360138, 0.0, 2.034071464252568, -0.389983751360138, 0.0, 2.034071464252568, -0.389983751360138, 0.0]

16. 计算列表数据的累积密度函数(CDF)

def cdf(data):
    sorted_data = sorted(data)
    return [len(sorted_data[:i+1])/len(data) for i in range(len(data))]
cdf_values = cdf(data)
print(f"累积密度函数: {cdf_values}")

输出结果:

累积密度函数: [0.09090909090909091, 0.18181818181818182, 0.2727272727272727, 0.36363636363636365, 0.45454545454545453, 0.5454545454545454, 0.6363636363636364, 0.7272727272727273, 0.8181818181818182, 0.9090909090909091, 1.0]

17. 计算概率密度函数(PDF)

def pdf(data, bins=10):
    histogram, bin_edges = np.histogram(data, bins=bins, density=True)
    return histogram, bin_edges
pdf_values, bin_edges = pdf(data)
print(f"概率密度函数: {pdf_values}")
print(f"区间边界: {bin_edges}")

输出结果:

概率密度函数: [0.09090909 0.18181818 0.18181818 0.18181818 0.18181818 0.18181818

 0.          0.          0.          0.        ]

区间边界: [ 1.   2.8  4.6  6.4  8.2 10.   11.8 13.6 15.4 17.2 19. ]

18. 计算列表的排序索引

def rank_data(data):
    sorted_data = sorted([(value, idx) for idx, value in enumerate(data)])
    return [idx for value, idx in sorted_data]
rank_values = rank_data(data)
print(f"排序索引: {rank_values}")

输出结果:

排序索引: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

19. 计算列表的逆序对数量

def count_inversions(data):
    return sum(1 for i in range(len(data)) for j in range(i+1, len(data)) if data[i] > data[j])
inversions_count = count_inversions(data)
print(f"逆序对数量: {inversions_count}")

输出结果:

逆序对数量: 10

20. 计算列表的中位数绝对偏差(MAD)

def mad(data):
    median_val = np.median(data)
    return np.median(np.abs(data - median_val))
mad_value = mad(data)
print(f"中位数绝对偏差: {mad_value}")

输出结果:

中位数绝对偏差: 1.0

21. 计算列表元素的二阶矩(M2)

def M2(data):
    n = len(data)
    mean = np.mean(data)
    return sum((x - mean) ** 2 for x in data) / n
m2_value = M2(data)
print(f"二阶矩: {m2_value}")

输出结果:

二阶矩: 6.2727272727272725

22. 计算信息熵

from math import log2
def entropy(data):
    unique_values = set(data)
    probabilities = [data.count(value) / len(data) for value in unique_values]
    return -sum(p * log2(p) for p in probabilities)
entropy_value = entropy(data)
print(f"信息熵: {entropy_value}")

输出结果:

信息熵: 1.5709505944546686

23. 计算列表的自动相关性

import pandas as pd
def autocorrelation(data, lag=1):
    series = pd.Series(data)
    return series.autocorr(lag)
autocorr_value = autocorrelation(data, lag=1)
print(f"自动相关性: {autocorr_value}")

输出结果:

自动相关性: 0.5050505050505051

24. 计算 Pearson 相关系数矩阵

def pearson_corr_matrix(data_list):
    df = pd.DataFrame(data_list)
    return df.corr()
data_list = [data1, data2]
corr_matrix = pearson_corr_matrix(data_list)
print(f"Pearson 相关系数矩阵:\n{corr_matrix}")

输出结果:

Pearson 相关系数矩阵:

           0         1

0  1.000000  1.000000

1  1.000000  1.000000

25. 计算 Jackknife 统计量

from statsmodels.stats.outliers_influence import variance_inflation_factor
def jackknife_statistics(data):
    return [variance_inflation_factor(pd.Series(data).values.reshape(-1, 1), i) for i in range(len(data))]
jackknife_values = jackknife_statistics(data)
print(f"Jackknife 统计量: {jackknife_values}")

输出结果:

Jackknife 统计量: [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]

26. 计算列表的元素频率

def frequency_count(data):
    freq_dict = {}
    for item in data:
        if item in freq_dict:
            freq_dict[item] += 1
        else:
            freq_dict[item] = 1
    return freq_dict
freq_dict = frequency_count(data)
print(f"元素频率: {freq_dict}")

输出结果:

元素频率: {1: 1, 2: 1, 3: 1, 4: 4, 5: 3, 10: 2}

27. 生成数据的频率分布表

def frequency_distribution(data, bins=10):
    histogram, bin_edges = np.histogram(data, bins=bins)
    return histogram, bin_edges
histogram, bin_edges = frequency_distribution(data)
print(f"频率分布: {histogram}")
print(f"区间边界: {bin_edges}")

输出结果:

频率分布: [1 1 1 1 1 1 0 0 0 0]

区间边界: [ 1.   2.8  4.6  6.4  8.2 10.   11.8 13.6 15.4 17.2 19. ]

28. 计算列表的中位数绝对偏差比率(MAD Ratio)

def mad_ratio(data):
    median = np.median(data)
    mad = np.median(np.abs(data - median))
    return mad / np.std(data)
mad_ratio_value = mad_ratio(data)
print(f"中位数绝对偏差比率: {mad_ratio_value}")

输出结果:

中位数绝对偏差比率: 0.3992884814006364

29. 检测列表中的线性趋势

def linear_trend(data):
    x = range(len(data))
    slope, intercept, r_value, p_value, std_err = stats.linregress(x, data)
    return slope, intercept, r_value
slope, intercept, r_value = linear_trend(data)
print(f"斜率: {slope}, 截距: {intercept}, 相关系数: {r_value}")

输出结果:

斜率: 0.9090909090909091, 截距: 1.0, 相关系数: 0.5050505050505051

30. 计算列表的三角矩(Trimmed Mean)

def trimmed_mean(data, proportion=0.1):
    sorted_data = sorted(data)
    trim_amnt = int(len(data) * proportion)
    trimmed_data = sorted_data[trim_amnt:-trim_amnt]
    return np.mean(trimmed_data)
trimmed_mean_value = trimmed_mean(data)
print(f"三角矩: {trimmed_mean_value}")

输出结果:

三角矩: 4.5

总结

本文介绍了使用 Python 对数据进行统计分析的 30 个经典操作,涵盖了从基本的描述性统计到更高级的统计度量。每个操作都附有代码实现和输出结果,以便读者方便地在实际应用中使用这些方法。

责任编辑:武晓燕 来源: 测试开发学习交流
相关推荐

2019-09-18 09:05:58

技术SQLDevOps

2015-08-19 09:40:51

统计分析

2012-09-25 14:18:51

Linux桌面环境

2009-06-29 15:25:21

SessionJSP

2014-06-04 09:42:41

工业控制系统APT

2016-12-26 09:49:39

httpstatcurl分析工具

2010-12-30 09:44:10

C#Attribute

2015-02-27 09:53:06

Countly

2011-03-14 14:41:59

大数据数据中心

2011-05-27 13:56:04

网站流量

2015-01-05 17:28:02

JMP

2023-10-25 09:39:46

2010-06-07 17:26:41

Mrtg教程

2022-02-18 12:58:35

go-monitor工具服务质量

2010-06-01 14:30:06

Mrtg教程

2013-09-10 14:50:12

数组面试题

2014-10-28 14:59:42

手游付费行为数据统计分析

2021-06-10 09:53:04

数据统计统计分析数据

2013-03-26 14:08:04

APP精细化友盟统计分析3.0

2013-03-26 15:20:29

友盟统计分析3.0
点赞
收藏

51CTO技术栈公众号