深入浅出理解你的“数据”

对于想要学习数据分析的同学,如果你问我:"数据分析的第一步是什么?" 我的回答是:"理解数据本身。"

数据是我们所有分析工作的起点,本文主要探讨如何辨别我们面对的是什么样的数据,包括它的分类方法和描述维度。

1. 数据分类

数据并非千篇一律,它们有着不同的特征和属性。

正确理解数据的分类,是选择适当分析方法的前提。

通常,我们可以从以下三个维度来给数据进行分类。

1.1. 按结构属性来分

你的数据“整齐”吗?

  1. 结构化数据 :这类数据就像一个整理得井井有条的Excel表格或数据库。

它们有固定的格式,每一列都有明确的定义,比如姓名、年龄、消费金额等。

我们可以很方便地对其进行查询和分析。

比如,网上购物的订单记录,包括订单号、商品名称、价格、购买日期等,就是一个典型的结构化数据。

  1. 非结构化数据:这类数据则“随心所欲”得多,没有固定的结构。

我们日常接触到的信息,大部分都属于非结构化数据。

比如,发布的社交媒体帖子、观看的视频、收发的电子邮件,甚至是客服的通话录音,都属于非结构化数据。

分析这类数据通常需要更复杂的技术,比如自然语言处理和图像识别。

1.2. 按连续性特征分类

你的数据可以“无限细分”吗?

  1. 连续性数据 :这类数据可以取某个范围内的任意值,并且可以无限细分。

在生活中,一个人的身高、体重,或者室外的温度,都是连续性数据。

比如,我们可以说一个人的身高是175.5厘米,也可以更精确地说是175.52厘米。

  1. 离散型数据:这类数据只能取特定的、独立的数值,通常是整数。

比如,一个班级的学生人数、一本书的页数,或者你一天喝水的杯数,都是离散型数据。

我们不能说有25.8个学生。

1.3. 按测量尺度分类

你的数据能进行什么样的“数学运算”?

这是统计学中一个非常重要的概念,它决定了我们可以对数据进行哪些统计分析。

  1. 定类数据:这类数据只表示类别,没有顺序或大小之分。

比如,产品的分类(如“电子产品”、“服装”、“食品”)、性别(“男”、“女”)等。

我们只能说它们“不同”,但不能说“电子产品”比“服装”更大或更好。

  1. 定序数据:这类数据既有类别,又有明确的顺序或等级,但我们无法衡量等级之间的具体差距。

比如,用户满意度(“非常满意”、“满意”、“一般”、“不满意”)、考试的排名(第一名、第二名、第三名)。

我们知道“非常满意”比“满意”要好,但好多少是说不清楚的。

  1. 定距数据 :这类数据有顺序,并且数值之间的差值是有意义的,但它没有一个“绝对零点”。

比如,考试的成绩(80分比70分高10分,60分比50分也高10分,差距是相同的)、摄氏温度。

但是我们不能说30摄氏度是15摄氏度的两倍热。

  1. 定比数据:这是最高级别的测量尺度,它包含了定距数据的所有特性,并且拥有一个“绝对零点”(即0表示“没有”)。

比如,身高、体重、收入。一个人的收入为0元,就代表他没有任何收入。

我们可以说,收入10000元是5000元的两倍。

代码示例:

import numpy as np
from collections import Counter

# 不同类型数据的示例和分析方法
# 定类数据 - 性别
gender_data = ['男', '女', '男', '男', '女', '女', '男']
gender_counts = Counter(gender_data)
print("定类数据分析(性别频数):", gender_counts)

# 定序数据 - 教育水平(1=高中,2=本科,3=硕士,4=博士)
education_data = [1, 2, 2, 3, 1, 4, 2, 3]
print("定序数据中位数:", np.median(education_data))

# 定距数据 - 温度
temperature_data = [23.5, 24.0, 25.3, 22.8, 26.1]
print("温度平均值:", np.mean(temperature_data))

# 定比数据 - 月收入(有绝对零点)
income_data = [5000, 8000, 12000, 3500, 9000]
print("收入均值:", np.mean(income_data))
print("收入比值(最高/最低):", max(income_data)/min(income_data))

2. 数据的描述

了解了数据的类型后,下一步就是从宏观上描述我们手中的这批数据。

通常,我们会从三个维度来“素描”数据的全貌:

2.1. 集中趋势

集中趋势是用来描述数据集中趋势的一组统计量,它告诉我们数据的“中心点”或“典型值”在哪里。

  1. 算术平均值:这是我们最常用的指标,指所有数值的总和除以数值的个数。
    1. 简单算术平均值:适用于所有数值同等重要的情况。
    2. 加权算术平均值:适用于不同数值具有不同重要性的情况,比如计算课程的最终成绩,期末考试的权重可能比平时作业要高。
    3. 需要注意:算术平均值很容易受到数据中极大值或极小值(异常值)的影响。
  2. 几何平均值:适用于描述具有乘除关系的数据的集中趋势,常用于计算比率数据的平均值,比如投资回报率。
  3. 众数:指数据集中出现次数最多的数值。众数可能不止一个。
  4. 中位数:将数据集从小到大排序后,位于最中间的那个数。

如果数据集的个数是偶数,则取中间两个数的算术平均值。中位数不受极端值的影响。

代码示例:

import numpy as np
from scipy import stats

# 用户每日使用时长数据(分钟)
daily_usage = [25, 30, 15, 28, 30, 45, 22, 180]

# 计算算术平均值
mean_usage = np.mean(daily_usage)
print(f"算术平均值: {mean_usage:.2f} 分钟")

# 计算中位数
median_usage = np.median(daily_usage)
print(f"中位数: {median_usage:.2f} 分钟")

# 计算众数
# 注意:scipy.stats.mode返回众数和其出现次数
mode_usage = stats.mode(daily_usage)
print(f"众数: {mode_usage.mode[0]} 分钟")

从上面的示例可以看出:算术平均值46.88分钟)受到了极端值180分钟的显著影响,而中位数29.0分钟)则更好地反映了大部分用户的普遍使用时长。

2.2. 离散程度

离散程度描述了数据集中各个数值相对于其中心位置的变异程度,也就是数据的“胖瘦”。

  1. 极差:数据集中最大值与最小值的差值。它计算简单,但同样易受极端值影响。
  2. 平均偏差:数据集中每个数值与算术平均值差值的绝对值之和的平均数。
  3. 方差/ 标准差:这是衡量数据离散程度最常用的指标。标准差方差的平方根,它与原始数据的单位相同,更易于解释。

注意:对于样本方差/标准差,计算时,分母是 n-1(n为样本量),这是为了对总体方差进行无偏估计

  1. 变异系数:标准差与平均值的比值,可以用来比较不同单位或不同均值的数据集的离散程度。
  2. 四分位极差:第三四分位数(Q3,排序后75%位置的数值)与第一四分位数(Q1,排序后25%位置的数值)的差值。它包含了数据集中间的50%的数据,能够有效避免极端值的影响。

代码示例:

import numpy as np

daily_usage = [25, 30, 15, 28, 30, 45, 22, 180]

# 计算极差
range_usage = np.max(daily_usage) - np.min(daily_usage)
print(f"极差: {range_usage} 分钟")

# 计算方差 (默认计算总体方差,ddof=1表示计算样本方差)
variance_usage = np.var(daily_usage, ddof=1)
print(f"样本方差: {variance_usage:.2f}")

# 计算标准差
std_dev_usage = np.std(daily_usage, ddof=1)
print(f"样本标准差: {std_dev_usage:.2f} 分钟")

# 计算四分位极差
q1 = np.percentile(daily_usage, 25)
q3 = np.percentile(daily_usage, 75)
iqr = q3 - q1
print(f"第一四分位数 (Q1): {q1}")
print(f"第三四分位数 (Q3): {q3}")
print(f"四分位极差 (IQR): {iqr}")

2.3. 分布形态

在掌握了数据的中心和离散程度后,我们还想知道数据的整体分布形状。

概率分布就是描述随机变量取值规律的数学模型。

常见的概率分布:

  1. 离散型概率分布:
    1. 二项分布:描述在一系列独立的“是/非”试验中,成功发生次数的概率。

例如,抛10次硬币,正面朝上5次的概率。

2. **泊松分布**:描述在单位时间或空间内,某个随机事件发生的次数。

例如,一个客服中心平均每小时接到10个电话,下一个小时接到8个电话的概率。

  1. 连续型概率分布:
    1. 正态分布高斯分布):自然界和人类社会中许多现象都近似服从正态分布,其曲线呈钟形,对称分布。

例如,成年人的身高分布。

2. **指数分布**:描述独立随机事件发生的时间间隔。 

例如,两辆公交车到站的间隔时间。

3. **均匀分布**:表示在某个范围内的所有取值的概率都相等。

例如,掷一个均匀的骰子,每个点数出现的概率都是1/6。

代码示例:

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats

# 生成一个符合正态分布的随机数据集
# 均值为100,标准差为10
data_normal = np.random.normal(loc=100, scale=10, size=1000)

# 使用seaborn绘制直方图和核密度估计图
sns.histplot(data_normal, kde=True, color='skyblue')
plt.title('正态分布示例')
plt.xlabel('数值')
plt.ylabel('频率')
plt.show()

3. 总结

理解数据不同类型描述数据的方法,是我们进行后续所有分析工作的基础。

就像学画画要先认识颜料和画笔,我们也要先“看懂”手里的数据。

数据分析的第一步永远是理解你的数据。只有对数据有了充分的认识,才能选择适当的分析方法,得出可靠的结论。

posted @ 2025-11-20 12:20  wang_yb  阅读(2)  评论(0)    收藏  举报