第五章:数理统计-综合实例
1. 揭开数据的面纱:真实样本数据的探索与可视化
在人工智能(AI)应用中,数据是构建算法和模型的基石,而数理统计则为我们提供了理解和处理这些数据的工具。数据探索和可视化是数理统计中至关重要的步骤,它们不仅能帮助我们理解数据的分布、关系和趋势,还能够为后续的建模工作提供依据。
本节将通过五个实际案例,展示如何使用数理统计和可视化技术对真实样本数据进行探索。每个案例都包括具体的描述、分析步骤、所用算法、Python代码及详细注释,帮助读者更好地理解数据探索和可视化的核心思想与技巧。
案例1:客户购买行为的探索与可视化
1.1 案例描述
我们假设有一个电商平台的数据集,包含了多个客户的购买记录。数据集中包括了客户的基本信息(如年龄、性别、收入等)以及购买记录(如购买的商品种类、购买时间、购买金额等)。我们的目标是通过探索性数据分析(EDA)来了解客户购买行为的模式,从而为个性化营销提供数据支持。
1.2 案例分析
在这个案例中,我们将关注以下几个问题:
- 客户的购买行为是否受到年龄、性别和收入等因素的影响?
- 哪些商品类别在不同客户群体中受欢迎?
- 客户的购买金额和购买频率之间是否存在关联?
通过这些问题,我们可以获得有关客户购买行为的重要洞察,从而为后续的模型建设奠定基础。
1.3 案例算法步骤
- 数据预处理:处理缺失值、异常值,并将类别变量进行编码。
- 描述性统计:计算并分析各变量的统计量(均值、标准差、分布等)。
- 可视化分析:绘制各类数据的分布图、箱型图、散点图等。
- 相关性分析:使用相关系数或热力图分析各特征之间的关系。
1.4 Python代码实现及详解
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
# 模拟生成客户购买数据
np.random.seed(42)
data = pd.DataFrame({
'age': np.random.randint(18, 70, 5),
'income': np.random.randint(3000, 10000, 5),
'purchase_amount': np.random.uniform(50, 500, 5),
'gender': np.random.choice(['Male', 'Female'], 5),
'product_category': np.random.choice(['Electronics', 'Clothing', 'Home'], 5)
})
# 1.1 描述性统计
print(data.describe())
# 1.2 可视化:年龄分布
plt.figure(figsize=(10, 6))
sns.histplot(data['age'], bins=5, kde=True)
plt.title('客户年龄分布')
plt.xlabel('年龄')
plt.ylabel('频数')
plt.show()
# 1.3 可视化:购买金额与收入的关系
plt.figure(figsize=(10, 6))
sns.scatterplot(x=data['income'], y=data['purchase_amount'], hue=data['gender'])
plt.title('购买金额与收入的关系')
plt.xlabel('收入')
plt.ylabel('购买金额')
plt.show()
# 1.4 相关性分析:热力图
corr_matrix = data[['age', 'income', 'purchase_amount']].corr()
plt.figure(figsize=(8, 6))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', fmt='.2f')
plt.title('特征之间的相关性')
plt.show()
1.5 代码详解
data.fillna(data.mean(), inplace=True)
:填充数据中的缺失值,这里我们使用均值填充。sns.histplot(data['age'], bins=5, kde=True)
:使用Seaborn绘制年龄的直方图,并添加核密度估计(KDE)曲线,展示年龄的分布情况。sns.scatterplot(x=data['income'], y=data['purchase_amount'], hue=data['gender'])
:通过散点图展示收入与购买金额的关系,并根据性别进行分色。sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', fmt='.2f')
:绘制相关性热力图,帮助分析特征之间的线性关系。
案例2:房价预测数据分析与可视化
2.1 案例描述
假设我们有一个房地产市场的数据集,包含房屋的各种特征(如面积、卧室数量、楼层、年份、地理位置等),以及每个房屋的销售价格。我们希望通过探索性数据分析,理解哪些特征与房价关系最密切,从而为建立房价预测模型提供指导。
2.2 案例分析
我们关注以下问题:
- 房屋面积、卧室数量等特征与房价之间的关系如何?
- 是否存在某些地理位置上的房价差异?
- 哪些变量的分布是偏态的,需要进行转换?
2.3 案例算法步骤
- 数据清理:处理缺失值和异常值。
- 特征工程:对地理位置等类别特征进行编码。
- 描述性统计分析:分析数值特征的均值、方差等。
- 可视化:绘制各特征与房价的关系图、房价分布图等。
2.4 Python代码实现及详解
# 模拟生成房价数据
housing_data = pd.DataFrame({
'area': np.random.randint(50, 200, 5),
'bedrooms': np.random.randint(1, 5, 5),
'floor': np.random.randint(1, 15, 5),
'year_built': np.random.randint(1990, 2020, 5),
'location': np.random.choice(['Downtown', 'Suburbs', 'Countryside'], 5),
'price': np.random.randint(50, 500, 5) # 单位:万元
})
# 2.1 房屋面积与房价的关系
plt.figure(figsize=(10, 6))
sns.scatterplot(x=housing_data['area'], y=housing_data['price'])
plt.title('房屋面积与房价的关系')
plt.xlabel('房屋面积 (平方米)')
plt.ylabel('房价 (万元)')
plt.show()
# 2.2 地理位置与房价的关系
plt.figure(figsize=(10, 6))
sns.boxplot(x=housing_data['location'], y=housing_data['price'])
plt.title('不同地理位置的房价分布')
plt.xlabel('地理位置')
plt.ylabel('房价 (万元)')
plt.xticks(rotation=45)
plt.show()
# 2.3 房价的分布情况
plt.figure(figsize=(10, 6))
sns.histplot(housing_data['price'], bins=5, kde=True)
plt.title('房价分布')
plt.xlabel('房价 (万元)')
plt.ylabel('频数')
plt.show()
2.5 代码详解
sns.scatterplot(x=housing_data['area'], y=housing_data['price'])
:使用散点图展示房屋面积与房价的关系。sns.boxplot(x=housing_data['location'], y=housing_data['price'])
:通过箱型图展示不同地理位置的房价分布情况。sns.histplot(housing_data['price'], bins=5, kde=True)
:展示房价的分布情况,并叠加KDE曲线,分析房价的偏态性。
案例3:社交媒体情感分析
3.1 案例描述
我们有一组社交媒体评论数据,目标是分析这些评论的情感倾向(如正面、负面或中性)。通过探索性数据分析,我们希望了解评论长度、发布频率、用户活跃度等特征对情感分析结果的影响。
3.2 案例分析
- 评论的情感分布如何?是否有偏向某一情感?
- 评论长度与情感之间是否存在某种关系?
- 用户活跃度(如发帖频率)与情感是否有关联?
3.3 案例算法步骤
- 文本数据预处理:清洗评论内容,去除停用词和标点符号。
- 描述性统计:分析评论长度、发布频率等变量。
- 可视化分析:展示情感分布、评论长度与情感的关系。
3.4 Python代码实现及详解
from textblob import TextBlob
# 模拟生成社交媒体评论数据
comments = pd.DataFrame({
'comment': [
'I love this product, it is amazing!',
'Worst purchase I ever made, totally regret it.',
'Not bad, but could be improved.',
'Absolutely fantastic! Will buy again.',
'It was okay, not great but not terrible.'
]
})
# 3.1 评论情感分析
comments['sentiment'] = comments['comment'].apply(lambda x: TextBlob(x).sentiment.polarity)
comments['sentiment_label'] = comments['sentiment'].apply(lambda x: 'positive' if x > 0 else ('negative' if x < 0 else 'neutral'))
# 3.2 情感分布
plt.figure(figsize=(8, 6))
sns.countplot(x='sentiment_label', data=comments)
plt.title('评论情感分布')
plt.xlabel('情感')
plt.ylabel('评论数量')
plt.show()
# 3.3 评论长度与情感的关系
comments['comment_length'] = comments['comment'].apply(len)
plt.figure(figsize=(10, 6))
sns.scatterplot(x=comments['comment_length'], y=comments['sentiment'], hue=comments['sentiment_label'])
plt.title('评论长度与情感的关系')
plt.xlabel('评论长度')
plt.ylabel('情感得分')
plt.show()
3.5 代码详解
TextBlob(x).sentiment.polarity
:使用TextBlob
库来计算每条评论的情感得分。polarity
返回一个浮动值,范围从 -1(负面情感)到 +1(正面情感)。comments['sentiment_label']
:根据情感得分将评论分类为positive
(正面)、negative
(负面)或neutral
(中性)。sns.countplot(x='sentiment_label', data=comments)
:绘制情感分布的条形图,展示正面、负面和中性评论的数量。comments['comment_length'] = comments['comment'].apply(len)
:计算每条评论的长度(字符数)。sns.scatterplot(x=comments['comment_length'], y=comments['sentiment'], hue=comments['sentiment_label'])
:通过散点图展示评论长度与情感得分的关系,并根据情感标签对评论进行颜色区分。
案例4:股票市场波动分析
4.1 案例描述
假设我们有一个股票市场的数据集,记录了某股票在过去五个交易日的收盘价。通过探索性数据分析,我们希望分析股票价格的波动性,并了解股票收盘价的分布情况及其变化趋势。
4.2 案例分析
我们关注以下几个问题:
- 股票价格在过去五天的变化趋势如何?
- 股票价格的波动性如何?是否存在较大的波动日?
- 股票价格的分布是否偏态?
4.3 案例算法步骤
- 数据可视化:绘制股票收盘价的时间序列图,展示价格变化趋势。
- 统计分析:计算股票价格的均值、标准差等统计量,分析波动性。
- 分布分析:绘制股票价格的直方图,判断价格分布是否呈现偏态。
4.4 Python代码实现及详解
# 模拟生成股票收盘价数据
stock_data = pd.DataFrame({
'date': pd.date_range(start='2025-01-01', periods=5, freq='D'),
'closing_price': np.random.uniform(100, 200, 5)
})
# 4.1 股票价格时间序列图
plt.figure(figsize=(10, 6))
plt.plot(stock_data['date'], stock_data['closing_price'], marker='o', color='b')
plt.title('股票收盘价变化趋势')
plt.xlabel('日期')
plt.ylabel('收盘价')
plt.xticks(rotation=45)
plt.show()
# 4.2 股票价格波动性分析:标准差
price_std = stock_data['closing_price'].std()
print(f'股票价格的标准差(波动性):{price_std:.2f}')
# 4.3 股票价格分布情况:直方图
plt.figure(figsize=(10, 6))
sns.histplot(stock_data['closing_price'], bins=5, kde=True)
plt.title('股票价格分布')
plt.xlabel('收盘价')
plt.ylabel('频数')
plt.show()
4.5 代码详解
pd.date_range(start='2025-01-01', periods=5, freq='D')
:生成五个连续日期的数据,模拟一个股票的收盘价。plt.plot(stock_data['date'], stock_data['closing_price'], marker='o', color='b')
:使用折线图绘制股票收盘价的变化趋势,标出每个点的收盘价。stock_data['closing_price'].std()
:计算股票收盘价的标准差,衡量股票价格的波动性。sns.histplot(stock_data['closing_price'], bins=5, kde=True)
:绘制股票价格的直方图,并叠加核密度估计(KDE)曲线,分析价格分布情况。
案例5:电商网站用户活跃度分析
5.1 案例描述
我们有一个电商网站的数据集,记录了每个用户在过去一个月内的登录次数、浏览的商品数量以及是否进行了购买。我们希望通过这些数据分析网站用户的活跃度,并了解哪些因素会影响用户的购买行为。
5.2 案例分析
我们关注以下几个问题:
- 用户的登录频率和浏览商品的数量是否与购买行为相关?
- 哪些用户群体更活跃?活跃度如何影响购买决策?
- 用户活跃度的分布是否呈现正态分布?
5.3 案例算法步骤
- 数据分析:计算每个用户的活跃度(如登录次数、浏览商品数量等)。
- 相关性分析:分析活跃度和购买行为之间的关系。
- 可视化:展示活跃度和购买行为的分布情况。
5.4 Python代码实现及详解
# 模拟生成用户活跃度数据
user_data = pd.DataFrame({
'user_id': range(1, 6),
'logins': np.random.randint(1, 20, 5),
'browsed_items': np.random.randint(5, 30, 5),
'purchased': np.random.choice([0, 1], 5) # 0 表示未购买,1 表示已购买
})
# 5.1 活跃度与购买行为的关系:散点图
plt.figure(figsize=(10, 6))
sns.scatterplot(x=user_data['logins'], y=user_data['browsed_items'], hue=user_data['purchased'])
plt.title('用户登录次数与浏览商品数量的关系')
plt.xlabel('登录次数')
plt.ylabel('浏览商品数量')
plt.show()
# 5.2 购买行为与活跃度分析:相关性
correlation = user_data[['logins', 'browsed_items', 'purchased']].corr()
print('活跃度与购买行为之间的相关性:\n', correlation)
# 5.3 活跃度分布情况:登录次数与浏览商品数量的分布
plt.figure(figsize=(10, 6))
sns.histplot(user_data['logins'], bins=5, kde=True, color='blue', label='Logins')
sns.histplot(user_data['browsed_items'], bins=5, kde=True, color='orange', label='Browsed Items')
plt.title('用户活跃度分布')
plt.xlabel('频率')
plt.ylabel('用户数量')
plt.legend()
plt.show()
5.5 代码详解
sns.scatterplot(x=user_data['logins'], y=user_data['browsed_items'], hue=user_data['purchased'])
:使用散点图展示用户的登录次数与浏览商品数量的关系,并根据是否购买进行颜色区分。user_data[['logins', 'browsed_items', 'purchased']].corr()
:计算登录次数、浏览商品数量和购买行为之间的相关性。sns.histplot(user_data['logins'], bins=5, kde=True, color='blue', label='Logins')
:绘制用户登录次数的分布,并叠加KDE曲线。sns.histplot(user_data['browsed_items'], bins=5, kde=True, color='orange', label='Browsed Items')
:绘制用户浏览商品数量的分布,并叠加KDE曲线。
这些案例展示了如何通过数理统计的分析手段和可视化技术,深入探索和理解真实样本数据。通过这些案例的分析,我们可以发现数据中的潜在模式,为后续的模型构建和预测提供有价值的信息。