导入库并创建数据
首先,我们需要导入必要的库,并创建一个简单的列表数据,后续对该列表进行相应的数据统计分析。
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 个经典操作,涵盖了从基本的描述性统计到更高级的统计度量。每个操作都附有代码实现和输出结果,以便读者方便地在实际应用中使用这些方法。