☰
C语言实现数据统计分析(均值、标准差、中位数、Z-score标准化)完整代码
2026/10/11 3:13:56 网站建设 项目流程

一、项目简介

在数据分析、机器学习、数据预处理场景中,均值、标准差、中位数、数据标准化是最基础且核心的操作。数据标准化可以消除量纲影响,让不同维度数据具备可比性,是算法建模前置必备步骤。

本文使用纯C语言实现全套基础数据统计功能,无第三方库依赖,代码简洁易懂、可直接编译运行,适合初学者学习、课程作业、数据结构基础实训、CSDN发文复盘。

本次实现功能清单:

  • 计算数据集均值(平均值)

  • 计算总体标准差(数据离散程度)

  • 计算数据集中位数

  • Z-score标准化(均值为0,标准差为1)

二、核心算法原理

1、均值(Mean)

均值是所有数据的平均值,反映数据集中趋势。

公式:所有数据求和 ÷ 数据个数

2、标准差(Standard Deviation)

标准差用于衡量数据的离散程度,数值越小,数据越集中;数值越大,数据越分散。本文实现总体标准差。

3、中位数(Median)

将数据从小到大排序后,处于中间位置的数值。中位数不受极端异常值影响,比均值更能反映数据真实水平。

  • 数据个数为奇数:取中间单个数值

  • 数据个数为偶数:取中间两个数值的平均值

4、Z-score标准化

最常用的数据标准化方法,将原始数据转换为均值为0、标准差为1的标准数据,消除单位和量纲差异。

公式:标准化值 = (原始值 - 数据集均值) / 数据集标准差

三、完整可运行源码

#include <stdio.h> #include <stdlib.h> #include <math.h> /** * @brief 计算数据集均值 * @param data 原始数据数组 * @param n 数据个数 * @return 均值结果 */ double mean(double *data, int n) { double sum = 0; for (int i = 0; i < n; i++) { sum += data[i]; } return sum / n; } /** * @brief 计算总体标准差 * @param data 原始数据数组 * @param n 数据个数 * @return 标准差结果 */ double std_dev(double *data, int n) { double m = mean(data, n); double sum_sq = 0; // 计算离均差平方和 for (int i = 0; i < n; i++) { sum_sq += (data[i] - m) * (data[i] - m); } // 总体标准差:除以n return sqrt(sum_sq / n); } /** * @brief Z-score标准化数据 * @param data 原始数据 * @param n 数据个数 * @param result 输出标准化结果数组 */ void normalize(double *data, int n, double *result) { double m = mean(data, n); double s = std_dev(data, n); // 逐一对数据标准化 for (int i = 0; i < n; i++) { result[i] = (data[i] - m) / s; } } /** * @brief 计算数据集中位数 * @param data 原始数据数组 * @param n 数据个数 * @return 中位数结果 */ double median(double *data, int n) { // 动态开辟内存,拷贝数据(不修改原数据) double *sorted = (double*)malloc(n * sizeof(double)); for (int i = 0; i < n; i++) { sorted[i] = data[i]; } // 冒泡排序,对数据升序排序 for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - 1 - i; j++) { if (sorted[j] > sorted[j + 1]) { double temp = sorted[j]; sorted[j] = sorted[j + 1]; sorted[j + 1] = temp; } } } double result; // 奇偶个数判断,计算中位数 if (n % 2 == 0) { result = (sorted[n/2 - 1] + sorted[n/2]) / 2; } else { result = sorted[n/2]; } // 释放动态内存,避免内存泄漏 free(sorted); return result; } int main() { // 测试数据集 double data[] = {25, 30, 35, 40, 28, 32, 45, 50, 55, 60}; int n = 10; printf("=== 基础统计指标计算 ===\n"); printf("均值: %.4f\n", mean(data, n)); printf("标准差: %.4f\n", std_dev(data, n)); printf("中位数: %.4f\n", median(data, n)); // 数据标准化处理 double normalized[10]; normalize(data, n, normalized); printf("\n=== Z-score标准化后数据 ===\n"); for (int i = 0; i < n; i++) { printf("%.4f ", normalized[i]); } printf("\n"); return 0; }

四、代码逐模块解析

1、均值计算函数

遍历数组累加所有数据,最后除以数据总个数,精准计算数据集平均值,是最基础的统计指标。

2、标准差计算函数

先计算数据集均值,再遍历计算每个数据与均值的差值平方和,求平均值后开平方,得到总体标准差,精准反映数据波动情况。

3、数据标准化函数

基于均值和标准差,通过Z-score公式对每一个原始数据进行转换,最终得到标准化数据集,解决多维度数据量纲不统一的问题。

4、中位数计算函数

为了不破坏原始数据,动态拷贝一份数据,通过冒泡排序完成升序排列,再根据数据个数奇偶性,区分计算中位数,最后释放动态内存,杜绝内存泄漏。

五、编译与运行结果

编译命令

代码依赖数学函数库,编译时需要加-lm参数:

gcc stats.c -o stats -lm ./stats

运行输出结果:

=== 基础统计指标计算 === 均值: 40.0000 标准差: 10.7703 中位数: 37.5000 === Z-score标准化后数据 === -1.3927 -0.9285 -0.4642 0.0000 -1.1142 -0.7428 0.4642 0.9285 1.3927 1.8570

六、核心知识点总结

  • 均值:反映数据整体平均水平,易受极端值影响

  • 标准差:衡量数据离散、波动程度,数值越小数据越稳定

  • 中位数:抗干扰能力强,适合存在异常值的数据集统计

  • Z-score标准化:数据分析预处理核心操作,统一数据尺度,广泛用于回归、聚类、机器学习算法

  • 代码规范:动态开辟的内存必须手动free释放,避免内存泄漏

七、拓展优化方向

  1. 适配动态输入数据,支持自定义数据集,无需修改源码

  2. 新增样本标准差计算(除以n-1),适配抽样统计场景

  3. 新增最大值、最小值、极差、方差统计功能

  4. 优化排序算法,替换冒泡排序为快速排序,提升大数据量计算效率

  5. 新增最大最小值归一化(Min-Max标准化),丰富预处理方式

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询