数据集中度分析(不排序)

该文章介绍了一种在C语言中进行数据集中度分析的方法,无需对数据进行排序。通过生成随机数,计算平均值,然后找出在特定范围内的有效数据,以确定数据的集中程度。这种方法用于找出可靠性较高的数据,并在实际项目中可以根据需要调整参数。


说明

  1. 数据集中度分析的目的是为了在一堆数据中找出有效的数据,数据集中度分析认为集中度越高的数据越可靠。
  2. 本文中的数据为模拟方式的随机生成,文中的某些部分是为了演示使用,实际项目中可去掉。
  3. 集中度分析是寻找与目标值在一定范围内的数据为有效数据。

数据集中度分析(排序)

一、 宏定义及数据类型定义

#ifndef u8
typedef unsigned char																u8;
#endif

#ifndef u16
typedef unsigned short int															u16;
#endif

#ifndef u32
typedef unsigned int																u32;
#endif

#ifndef u64
typedef unsigned long long int														u64;
#endif

#ifndef s8
typedef signed char																	s8;
#endif

#ifndef s16
typedef signed short int															s16;
#endif

#ifndef s32
typedef signed int																	s32;
#endif

#ifndef s64
typedef signed long long int														s64;
#endif




#define ABS2(x , y)																	((x) > (y) ? (x) - (y) : (y) - (x))

#define DAT_SIZE (2000)
typedef struct
{
	u16 Dat[DAT_SIZE];
	u16 Count;
}DAT_TypeDef;

二、 获取平均值

u16 usGetDat_Average(DAT_TypeDef * pData)
{
	u16 i = 0;
	u32 sum = 0;

	if (!pData->Count)
	{
		return 0;
	}

	for (i = 0; i < pData->Count; ++i)
	{
		sum += pData->Dat[i];
	}

	sum = (sum * 10) / pData->Count;
	sum = (sum + 5) / 10;

	return (u16)sum;
}

三、 生成随机数

/* 生成随机数 */
void vGeneration_Random_Number(u16 * pDat, u16 maxVal, u16  minVal, u16 num)
{
	u16 i = 0;
	u16 dat = 0;
	u16 temp = 0;

	temp = maxVal - minVal + 1;
	srand(time(NULL));
	for (i = 0; i < num; ++i)
	{
		dat = (u16)((rand() % temp) + minVal);
		*(pDat + i) = dat;
	}
}

四、数据集中度分析(不排序)


DAT_TypeDef ResDat = { 0 };
DAT_TypeDef MemDat = { 0 };
DAT_TypeDef * pResDat = &ResDat;
DAT_TypeDef * pMemDat = &MemDat;


/* 数据集中度分析(不排序) */ 
/* pDat     : 分析的数据 */
/* len      : 分析的数据长度 */
/* datGap   : 有效数据范围 */
/* minCount : 最小集中度个数 */
u16 usConcentrate_Analyse_Unsorted(u16 * pDat, u16 len, u8 datGap, u8 minCount)
{
	u16 i = 0, j = 0, k = 0;
	u16 tmpDat = 0;
	u16 initVal = 0;
	u16 trueDat = 0;
	u16 minDat = 0, maxDat = 0;
	u16 maxCount = 0;
	u16 seekCount = 0;


	for (i = 0; i < len; ++i)
	{
		/* 找合法数据 */
		trueDat = *(pDat + i);
		if (!trueDat)
		{
			continue;
		}


		/* 清零参数 */
		pMemDat->Count = initVal = 0;
		minDat = 0xFFFF;
		maxDat = 0;
		for (j = 0; j < len; ++j)
		{
			/* 找合法数据 */
			tmpDat = *(pDat + j);
			if (!tmpDat)
			{
				continue;
			}

			/* 数据有效 */
			if (ABS2(trueDat, tmpDat) <= datGap)
			{
				/* 保存初始数据 */
				if (!pMemDat->Count)
				{
					initVal = trueDat;
				}

				/* 保存最值 */
				if (maxDat < tmpDat)
				{
					maxDat = tmpDat;
				}

				if (minDat > tmpDat)
				{
					minDat = tmpDat;
				}

				/* 保存有效数据 */
				pMemDat->Dat[pMemDat->Count++] = tmpDat;
			}
		}

		/* 有效数据量少 */
		if (pMemDat->Count < minCount)
		{
			continue;
		}

		printf("Analyse Succeed[%03u] Count:%-2u Init:%-5u Max:%-5u Min:%-5u ABS:%-5u AvgVal:%-5u\r\n", \
				seekCount++, pMemDat->Count, initVal, maxDat, minDat, (maxDat - minDat), \
				usGetDat_Average(pMemDat));

		printf("[%u   %u] ==> ", initVal, pMemDat->Count);
		for (k = 0; k < pMemDat->Count; ++k)
		{
			if ((k) && (!(k % 12)))
			{
				printf("\r\n");
			}

			printf("%-5u ", pMemDat->Dat[k]);
		}
		printf("\r\n\r\n");


		if (pMemDat->Count > maxCount)
		{
			/* 更新最大数量 */
			maxCount = pResDat->Count = pMemDat->Count;

			/* 将数据复制到结果缓存 */
			for (k = 0; k < pMemDat->Count; ++k)
			{
				pResDat->Dat[k] = pMemDat->Dat[k];
			}
			
			/* 有效数据量过多提前退出 */
			if (pMemDat->Count > ((len << 2) / 3))
			{
				return maxCount;
			}
		}
		else if (pMemDat->Count == maxCount)
		{
			/* 认为平均值小的数据更可靠 */
			if (usGetDat_Average(pResDat) > usGetDat_Average(pMemDat))
			{
				/* 将数据复制到结果缓存 */
				for (k = 0; k < pMemDat->Count; ++k)
				{
					pResDat->Dat[k] = pMemDat->Dat[k];
				}
			}
		}
	}

	return maxCount;
}

#五、演示例程

int main(int argc, char * argv[])
{
	u16 xDat[100] = {0};
	u16 len = sizeof(xDat) / sizeof(xDat[0]);
	u16 i = 0;

	vGeneration_Random_Number(xDat, 3000, 800, len);
	printf("Original Data:\r\n");
	for (i = 0; i < len; ++i)
	{
		if(i && ((i % 10) == 0))
		{
			printf("\r\n");
		}
		printf("[%03u]%-5u ", i, xDat[i]);
	}
	printf("\r\n\r\n");

	i = usConcentrate_Analyse_Unsorted(xDat, len, 50, 10);
	if (i)
	{
		printf("\r\n\r\n");
		printf("Concentrate Analyse Succeed......Count:%-3u Avg:%u\r\n", pResDat->Count, usGetDat_Average(pResDat));
		for (i = 0; i < pResDat->Count; ++i)
		{
			if (i && (!(i % 12)))
			{
				printf("\r\n");
			}
			printf("%-5u ", pResDat->Dat[i]);
		}
	}
	else
	{
		printf("Concentrate Analyse Fail......\r\n");
	}


	printf("\r\n\r\n Compiler Date: %s  %s\r\n", __DATE__, __TIME__);
	while (1);
	return 0;
}

五、运行结果

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

<think>我们正在讨论集中度分析指标,这些指标用于衡量数据分布的集中程度或分散程度。常见的集中度分析指标包括均值、中位数、众数、方差、标准差、变异系数、基尼系数、赫芬达尔-赫希曼指数(HHI)等。根据用户提供的引用,我们可以重点参考引用[3]和引用[4]中关于均值、中值、变异系数的内容。集中度分析指标的定义和用法:1.**均值(Mean)**:-**定义**:均值是数据集中所有数值的总和除以数值的个数。它是数据集中趋势的最常用度量。-**特性**(引用[3]):-数据组中每个数值减去均值后的结果相加,和等于0。-均值是最能反映数据集中趋势的单一指标,因为它使每个数值减去均值后的平方和最小(即最小二乘性质)。-对极值敏感,当存在极大或极小值时,均值可能能很好地代表数据的中心。-**用法**:适用于数据分布对称且没有极端异常值的情况。例如,计算平均收入、平均成绩等。2.**中位数(Median)**:-**定义**:将数据按大小顺序排列后,位于中间位置的数值。如果数据个数为偶数,则取中间两个数的平均值。-**特性**(引用[3]):-对极值敏感。当数据中存在极值时,中位数比均值更能代表数据的集中趋势。-**用法**:适用于数据分布偏斜或有异常值的情况。例如,收入数据通常有右偏分布(少数人收入极高),此时中位数更能反映典型收入。3.**众数(Mode)**:-**定义**:数据集中出现频率最高的数值。-**用法**:适用于分类数据,也可用于数值型数据。例如,最常销售的产品型号。4.**方差(Variance)和标准差(StandardDeviation)**:-**定义**:方差是各数值与均值之差的平方的平均值(通常使用样本方差时采用贝塞尔校正,即除以n-1)。标准差是方差的平方根。-**用法**:衡量数据的离散程度。标准差与原始数据单位一致,更便于解释。例如,标准差越大,数据越分散。5.**变异系数(CoefficientofVariation,CV)**:-**定义**:变异系数是标准差与均值的比值,通常以百分比表示(引用[4]):$$CV=\frac{\text{标准差}}{\text{均值}}\times100\%$$-**特性**:-用于比较同量级数据集的离散程度。例如,比较身高和体重的离散程度,因为它们的单位同,直接比较标准差没有意义。-变异系数越大,数据越离散。-当均值接近0时,变异系数会很大,此时适用(引用[4])。-一般超过15%则可能认为数据存在异常(引用[4])。-**用法**:在金融、生物等领域,用于比较同投资项目的风险(标准差代表风险,均值代表收益)或同实验组的相对变异程度。6.**集中度的其他指标**:-**基尼系数(GiniCoefficient)**:用于衡量收入或财富分布的平等程度。取值范围在0到1之间,0表示完全平等,1表示完全平等。-**赫芬达尔-赫希曼指数(Herfindahl-HirschmanIndex,HHI)**:用于衡量市场集中度。计算方法为市场中每个公司市场份额的平方和。指数范围从0到1(或0到10000,如果使用百分比平方和),数值越大,市场集中度越高。7.**四分位间距(InterquartileRange,IQR)**:-**定义**:第三四分位数(Q3)与第一四分位数(Q1)的差,即IQR=Q3-Q1。它包含了中间50%的数据。-**用法**:与中位数一起使用,描述数据的离散程度,对异常值敏感。常用于箱线图。8.**偏度(Skewness)和峰度(Kurtosis)**:-**偏度**:衡量数据分布的对称性。正偏(右偏)表示右侧有长尾,负偏(左偏)表示左侧有长尾。-**峰度**:衡量数据分布的尖峰程度。高峰度表示数据集中在均值附近,且尾部较重。总结:-集中度分析指标包括集中趋势指标(均值、中位数、众数)和离散程度指标(方差、标准差、变异系数、四分位间距等)。-选择指标时需考虑数据的分布特征(是否对称、有无异常值)和分析目的(比较同量级的数据、衡量平等或市场集中度等)。根据用户提供的引用,我们重点参考了均值、中值(中位数)和变异系数的定义和特性(引用[3]和引用[4])。如果用户需要更具体的应用场景,可以结合业务指标(如引用[1]和引用[2])进行说明,例如在用户属性分析中,可以使用集中度指标分析用户年龄的集中趋势(平均年龄或中位年龄)以及离散程度(年龄的变异系数)。相关问题:1.如何根据数据分布选择合适的集中趋势指标?2.变异系数在金融风险分析中的具体应用是什么?3.基尼系数和HHI指数如何计算?请举例说明。4.在存在异常值的数据集中,为什么中位数比均值更能代表集中趋势?</think>### 集中度分析指标的定义与用法 集中度分析指标用于衡量数据分布的集中程度或离散程度,在统计学、经济学和市场分析中广泛应用。以下是核心指标的定义和用法,结合您提供的引用内容进行说明: --- #### 一、核心指标定义 1. **均值(Mean)** - **定义**:数据的总和除以数据个数 $$ \bar{x} = \frac{\sum_{i=1}^{n} x_i}{n} $$ - **特性**(引用[3]): - 数据组中每个数值减去均值后的和为0 - 对极值敏感,易受异常值影响 - 正态分布中与中位数、众数相等 2. **中位数(Median)** - **定义**:数据排序后的中间值(n为奇数时取第$(n+1)/2$个值;n为偶数时取中间两数平均值) - **特性**(引用[3]): - 对极值敏感,适用于偏态分布 - 比均值更能反映存在异常值时的集中趋势 3. **变异系数(Coefficient of Variation, CV)** - **定义**:标准差与均值的比值 $$ CV = \frac{\sigma}{\bar{x}} \times 100\% $$ - **特性**(引用[4]): - 消除量纲影响,适用于比较同量级数据集的离散程度 - 超过15%可能表示数据异常 - 值越大,数据离散程度越高 4. **空间自相关指标(如Moran's I)** - **定义**:衡量空间邻近区域指标的相似性(引用[5]) $$ I = \frac{n}{\sum_{i}\sum_{j} w_{ij}} \cdot \frac{\sum_{i}\sum_{j} w_{ij}(x_i - \bar{x})(x_j - \bar{x})}{\sum_{i}(x_i - \bar{x})^2} $$ - **意义**: - $I > 0$:空间集聚(高值/低值聚集) - $I < 0$:空间离散 - $I = 0$:随机分布 --- #### 二、实际应用场景 | **指标** | **典型应用场景** | **案例说明**(引用来源) | |----------------|---------------------------------------------------------------------------------|---------------------------------------------| | **均值** | 对称分布数据的中心定位 | 计算用户平均收入、APP日均使用时长 | | **中位数** | 偏态数据(如收入分布)、异常值较多场景 | 分析用户收入中位数避免极端值影响[^3] | | **变异系数** | 跨量级数据比较(如同产品线的销售额波动) | 评估同省市用户消费行为的稳定性[^4] | | **空间自相关** | 地理数据分析(人口迁移、选举投票率) | 分析意大利人口迁移的空间集聚模式[^5] | --- #### 三、关键使用原则 1. **指标选择逻辑** ```mermaid graph LR A[数据分布形态] --> B{对称且无异常值?} B -->|是| C[使用均值] B -->|否| D[使用中位数] E[需跨数据集比较] --> F[使用变异系数] G[含空间位置信息] --> H[使用空间自相关] ``` 2. **注意事项** - 均值应用前提:数据需近似正态分布(引用[3]) - 变异系数限制:均值接近0时失效(引用[4]) - 空间分析要求:需明确定义空间权重矩阵$w_{ij}$(引用[5]) --- #### 四、业务分析实例 **场景**:评估各城市APP用户消费集中度 1. **计算中位数消费金额** → 避免超高消费用户扭曲结果 2. **计算变异系数**: - 若CV=8%(<15%),说明消费水平均匀 - 若CV=25%(>15%),需排查异常城市[^4] 3. **空间自相关分析**: - 若Moran's I=0.32(P<0.05)→ 消费行为呈现区域聚集性 - 可进一步定位高消费城市群[^5] ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值