本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:NYAirBNB:第一次作业是一个以Python编程为主的实践项目,它要求学生通过分析纽约AirBNB的数据集来理解数据处理、分析和可视化的流程。学生将使用Python库如Pandas、NumPy和Matplotlib探索数据集,进行数据导入、预处理、探索、可视化和特征工程。此外,学生还会进行数据分析和建模,以探究影响房价的因素并预测价格,这可能涉及相关性分析和回归模型。通过这个项目,学生能够加深对数据科学概念和实际问题解决能力的理解。 NYAirBNB:第一次作业

1. Python数据分析实践项目

1.1 数据分析的重要性

在当今数据驱动的时代,数据分析已经成为IT和相关行业不可或缺的一部分。它不仅帮助公司理解市场趋势,预测业务发展,还能优化运营效率,提升决策质量。Python作为一门强大的编程语言,凭借其丰富的数据分析库,如Pandas、NumPy和Matplotlib,已经成为数据分析领域的首选工具。

1.2 Python数据分析的优势

Python之所以在数据分析领域受到青睐,主要得益于其简洁易读的语法、庞大的社区支持和丰富的第三方库。使用Python,数据分析师可以轻松完成数据导入、预处理、探索性分析、数据可视化和建模等任务。Python的易用性和强大的功能使得数据分析变得更加高效和直观。

1.3 本书的结构与目标

本书旨在引导读者通过一个完整的数据分析项目,从零开始深入学习Python数据分析的各个方面。从数据导入与预处理,到探索性数据分析、数据可视化、特征工程、数据分析、数据建模,以及Pandas、NumPy、Matplotlib和Scikit-Learn的实用技巧,本书将提供一系列实战案例和详细代码,帮助读者掌握数据分析的核心技能。

2. 数据导入与预处理

2.1 数据的获取方式

在数据分析的实践中,数据的获取是一个非常重要的步骤。正确高效地获取数据,是进行后续分析的基础。本章节将介绍三种常见的数据获取方式:从CSV文件导入数据、从数据库导入数据以及通过网络爬虫获取数据。

2.1.1 从CSV文件导入数据

CSV(Comma-Separated Values)文件是一种通用的文本格式,用于存储表格数据。CSV文件中的数据通常以逗号分隔,每一行代表一个数据记录,每一列代表一个字段。使用Pandas库中的 read_csv 函数可以方便地从CSV文件中导入数据。

import pandas as pd

# 从CSV文件导入数据
data = pd.read_csv('data.csv')

上述代码中, pd.read_csv 函数的参数 'data.csv' 指定了需要导入的CSV文件的路径。函数执行后,将创建一个DataFrame对象,其中包含了CSV文件中的数据。

2.1.2 从数据库导入数据

从数据库导入数据是另一种常见的数据获取方式。在实际工作中,数据往往存储在关系型数据库中,如MySQL、PostgreSQL、SQLite等。Pandas库提供了 read_sql_query 函数,可以方便地从数据库中读取数据。

# 从数据库导入数据
from sqlalchemy import create_engine

# 创建数据库连接引擎
engine = create_engine('sqlite:///database.db')

# 使用SQLAlchemy引擎执行SQL查询
data = pd.read_sql_query('SELECT * FROM table_name', engine)

在上述代码中,首先导入了 sqlalchemy 模块中的 create_engine 函数用于创建数据库连接引擎。然后通过指定数据库的类型和连接信息创建了一个引擎对象。最后,使用 pd.read_sql_query 函数执行了一个SQL查询,从数据库中导入了数据。

2.1.3 网络爬虫获取数据

随着互联网的发展,网络爬虫成为了一种重要的数据获取手段。网络爬虫可以自动化地从网页上抓取数据。Python中的 requests 库和 BeautifulSoup 库是常用的网络爬虫工具。以下是一个简单的爬虫示例,用于从网页上抓取数据。

import requests
from bs4 import BeautifulSoup

# 发送HTTP请求
response = requests.get('***')

# 使用BeautifulSoup解析HTML内容
soup = BeautifulSoup(response.text, 'html.parser')

# 提取网页中的数据
data = []
for item in soup.find_all('div', class_='target-class'):
    data.append(item.text.strip())

在上述代码中,首先使用 requests.get 函数发送了一个HTTP GET请求到指定的URL,并获取了网页内容。然后使用 BeautifulSoup 解析了HTML内容,并提取了所有类名为 target-class div 元素的文本内容,将其添加到了数据列表中。

2.2 数据清洗

数据清洗是数据分析过程中不可或缺的一环。数据往往包含噪声和异常值,需要进行清洗和整理,以确保数据的质量和分析结果的准确性。本节将介绍三种常见的数据清洗操作:处理缺失值、数据类型转换以及异常值处理。

2.2.1 处理缺失值

在数据集中,缺失值是一个常见的问题。缺失值可能由于多种原因产生,如数据录入错误、数据传输丢失等。Pandas库提供了多种处理缺失值的方法,包括删除含有缺失值的记录、填充缺失值等。

# 处理缺失值
import pandas as pd

# 加载数据
data = pd.read_csv('data.csv')

# 删除含有缺失值的记录
data_cleaned = data.dropna()

# 填充缺失值
data_filled = data.fillna(value=0)

在上述代码中, dropna 方法用于删除含有缺失值的记录,而 fillna 方法则用于填充缺失值。参数 value=0 表示将所有缺失值填充为0。

2.2.2 数据类型转换

数据类型转换是数据清洗的一个重要步骤。数据类型转换可以提高数据处理的效率,并且能够确保数据在分析过程中的正确性。例如,将字符串类型的数据转换为数值类型,以便进行数学计算。

# 数据类型转换
data['column_name'] = data['column_name'].astype('float')

在上述代码中, astype 方法用于将列 column_name 中的数据类型转换为浮点数。

2.2.3 异常值处理

异常值是指那些显著偏离其他数据点的数据。异常值可能是由于数据录入错误、测量错误或其他异常事件产生的。处理异常值通常包括识别异常值、分析异常值产生的原因以及决定如何处理它们。

# 异常值处理
# 使用箱线图识别异常值
import seaborn as sns

# 绘制箱线图
sns.boxplot(x=data['column_name'])

# 识别异常值
data_filtered = data[(data['column_name'] > Q1 - 1.5 * IQR) & (data['column_name'] < Q3 + 1.5 * IQR)]

在上述代码中,使用 seaborn 库中的 boxplot 函数绘制了列 column_name 的箱线图。然后使用四分位数间距(IQR)方法识别并过滤掉了异常值。

2.3 数据规范化

数据规范化是将数据转换为统一的格式,以便于分析和模型训练。常见的数据规范化方法包括数据归一化、数据标准化和缺失值填充策略。本节将详细介绍这些方法。

2.3.1 数据归一化

数据归一化是将数值型特征缩放到一个小的特定区间,通常是[0, 1]。归一化可以消除不同特征之间的量纲影响,提高算法的收敛速度。

# 数据归一化
data_normalized = (data - data.min()) / (data.max() - data.min())

在上述代码中,使用了最小-最大归一化方法,将数据中的每个值减去该特征的最小值,然后除以该特征的最大值与最小值之差。

2.3.2 数据标准化

数据标准化(Z-score标准化)是将数值型特征的值减去其均值,然后除以标准差。标准化后的数据具有零均值和单位方差。

# 数据标准化
data_standardized = (data - data.mean()) / data.std()

在上述代码中,使用了 data.mean() data.std() 分别计算了数据的均值和标准差。

2.3.3 缺失值填充策略

缺失值填充是数据规范化过程中的一个重要步骤。常见的缺失值填充策略包括使用均值、中位数、众数或预测模型进行填充。本节将介绍这些策略的使用方法。

# 缺失值填充策略
# 使用均值填充
data_filled_with_mean = data.fillna(data.mean())

# 使用中位数填充
data_filled_with_median = data.fillna(data.median())

# 使用众数填充
data_filled_with_mode = data.fillna(data.mode().iloc[0])

# 使用预测模型填充
from sklearn.impute import KNNImputer

# 创建KNNImputer对象
imputer = KNNImputer(n_neighbors=2)

# 使用KNN模型填充缺失值
data_filled_with_knn = pd.DataFrame(imputer.fit_transform(data), columns=data.columns)

在上述代码中,分别使用了均值、中位数、众数以及KNN模型进行缺失值填充。 KNNImputer scikit-learn 库提供的一个缺失值填充工具,通过KNN算法进行预测。

通过本章节的介绍,我们可以了解到数据导入、预处理和规范化是数据分析中不可或缺的步骤。它们是数据清洗过程的重要组成部分,对于提高数据质量和分析结果的准确性具有重要作用。在本章节中,我们详细介绍了从CSV文件、数据库以及网络爬虫获取数据的方法,处理了缺失值、数据类型转换以及异常值等常见问题,并且探讨了数据归一化、标准化和缺失值填充策略等数据规范化技术。掌握这些技术对于进行有效的数据分析至关重要。

3. 数据探索与统计分析

3.1 描述性统计分析

描述性统计分析是数据分析中的基础,它帮助我们理解数据集的基本特征,如中心趋势、分布形态和离散程度。通过这一分析,我们可以对数据有一个直观的认识,为进一步的数据分析打下基础。

3.1.1 计算均值、中位数和标准差

在本章节中,我们将介绍如何使用Python进行描述性统计分析,重点包括计算均值、中位数和标准差。这些统计指标是我们理解数据集中心趋势和离散程度的关键。

均值 :均值是所有数据点的总和除以数据点的数量。它是最常用的中心趋势度量方法。

中位数 :中位数是将数据集排序后位于中间位置的值。如果数据点数量为偶数,则中位数是中间两个数的平均值。

标准差 :标准差衡量数据点相对于均值的离散程度。一个较小的标准差表示数据点更接近均值。

以下是使用Python计算这些统计指标的示例代码:

import numpy as np

# 示例数据
data = np.array([1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10])

# 计算均值
mean_value = np.mean(data)

# 计算中位数
median_value = np.median(data)

# 计算标准差
std_dev = np.std(data)

print(f"均值: {mean_value}")
print(f"中位数: {median_value}")
print(f"标准差: {std_dev}")

在上述代码中,我们使用了NumPy库中的 mean() , median() , 和 std() 函数来计算均值、中位数和标准差。这些函数分别对应于描述性统计分析中的三个关键指标。

3.1.2 数据分布的可视化

除了计算统计指标,数据分布的可视化也是描述性统计分析的重要组成部分。可视化可以帮助我们更直观地理解数据分布的特征,如偏斜度和峰度。

直方图 :直方图显示了数据分布的频率分布情况。

箱线图 :箱线图显示了数据的最小值、第一四分位数、中位数、第三四分位数和最大值。

以下是使用Matplotlib库绘制直方图和箱线图的示例代码:

import matplotlib.pyplot as plt

# 绘制直方图
plt.hist(data, bins=5, alpha=0.7, color='blue')
plt.title('Histogram of Data')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.show()

# 绘制箱线图
plt.boxplot(data, vert=False)
plt.title('Boxplot of Data')
plt.xlabel('Value')
plt.show()

在上述代码中,我们使用了Matplotlib库的 hist() boxplot() 函数来绘制直方图和箱线图。这些图表可以帮助我们从视觉上理解数据的分布情况。

3.2 相关性分析

相关性分析是研究两个或多个变量之间关系强度和方向的方法。在数据分析中,我们通常使用相关系数来量化变量之间的相关性。

3.2.1 计算相关系数

相关系数是一个介于-1和1之间的值,它表示变量之间线性关系的强度和方向。正值表示正相关,负值表示负相关,而接近0的值表示没有线性关系。

皮尔逊相关系数 :皮尔逊相关系数是最常用的度量两个连续变量之间线性相关程度的方法。

斯皮尔曼秩相关系数 :斯皮尔曼秩相关系数是基于秩次的方法,它对异常值不敏感。

以下是使用NumPy计算皮尔逊相关系数的示例代码:

# 示例数据
x = np.array([1, 2, 3, 4, 5])
y = np.array([5, 4, 3, 2, 1])

# 计算皮尔逊相关系数
pearson_corr = np.corrcoef(x, y)[0, 1]

print(f"皮尔逊相关系数: {pearson_corr}")

在上述代码中,我们使用了NumPy库的 corrcoef() 函数来计算皮尔逊相关系数。这个函数返回一个相关系数矩阵,我们取[0, 1]位置的值来获取x和y之间的相关系数。

3.2.2 相关性的可视化

相关性的可视化可以帮助我们更直观地理解两个变量之间的关系。散点图是常用的可视化方法之一。

以下是使用Matplotlib绘制散点图的示例代码:

plt.scatter(x, y)
plt.title('Scatter Plot of X vs Y')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

在上述代码中,我们使用了Matplotlib库的 scatter() 函数来绘制散点图。通过这个图表,我们可以直观地看到变量x和y之间的关系。

3.3 探索性数据分析(EDA)

探索性数据分析(EDA)是数据分析过程中的一个关键步骤,它涉及到对数据集进行初步的探索,以便更好地理解数据的结构和特征。

3.3.1 数据分布的探索

数据分布的探索可以帮助我们了解数据集的中心趋势、离散程度和分布形态。

密度图 :密度图显示了变量的概率密度分布。

累积分布函数(CDF) :CDF图显示了数据小于或等于某个值的概率。

以下是使用Seaborn库绘制密度图和CDF图的示例代码:

import seaborn as sns

# 密度图
sns.kdeplot(data, shade=True)
plt.title('Density Plot of Data')
plt.xlabel('Value')
plt.show()

# CDF图
sns.ecdfplot(data)
plt.title('ECDF Plot of Data')
plt.xlabel('Value')
plt.show()

在上述代码中,我们使用了Seaborn库的 kdeplot() ecdfplot() 函数来绘制密度图和CDF图。这些图表可以帮助我们更深入地理解数据的分布情况。

3.3.2 异常值的识别与处理

异常值是指那些不符合数据集整体模式的值。识别和处理异常值对于数据清洗和后续分析至关重要。

箱线图 :箱线图可以用来识别异常值,通常认为小于第一四分位数减去1.5倍的四分位距或大于第三四分位数加上1.5倍的四分位距的值为异常值。

Z分数 :Z分数是一个统计度量,它表示一个数据点距离平均值的标准化距离。通常认为Z分数大于3或小于-3的值为异常值。

以下是使用箱线图识别异常值的示例代码:

# 绘制箱线图
plt.boxplot(data, vert=False)
plt.title('Boxplot of Data')
plt.xlabel('Value')
plt.show()

# 计算Z分数
z_scores = (data - np.mean(data)) / np.std(data)

# 标记异常值
outliers = np.abs(z_scores) > 3
data_without_outliers = data[~outliers]

print(f"异常值: {data[outliers]}")
print(f"无异常值数据: {data_without_outliers}")

在上述代码中,我们使用了Matplotlib库的 boxplot() 函数来绘制箱线图,并计算了数据的Z分数。通过设置阈值,我们识别出了异常值,并展示了如何从数据集中去除这些异常值。

通过本章节的介绍,我们了解了如何使用Python进行描述性统计分析,包括计算均值、中位数、标准差,以及如何进行数据分布的可视化。此外,我们还学习了如何进行相关性分析,包括计算相关系数和相关性的可视化。最后,我们探索了探索性数据分析的方法,包括数据分布的探索和异常值的识别与处理。这些技能对于数据分析人员来说是非常重要的,它们可以帮助我们更好地理解数据,并为后续的数据分析工作奠定基础。

4. 数据可视化

数据可视化是数据分析过程中至关重要的一步,它能够帮助我们直观地理解数据的分布、趋势和模式。在本章节中,我们将深入探讨如何使用Python进行基础和高级数据可视化,以及如何应用常用的可视化工具库。

4.1 基础图表绘制

4.1.1 柱状图、折线图和散点图

柱状图、折线图和散点图是最常见的数据可视化类型,它们各自适用于不同的数据分析场景。

柱状图

柱状图主要用于展示离散型数据的频率分布,例如不同类别的销售量对比。

import matplotlib.pyplot as plt

# 示例数据
categories = ['Category A', 'Category B', 'Category C']
values = [23, 45, 56]

plt.bar(categories, values)
plt.xlabel('Categories')
plt.ylabel('Values')
plt.title('Bar Chart Example')
plt.show()

在上述代码中,我们使用了 matplotlib 库中的 bar 函数来绘制柱状图,其中 categories values 分别是类别的标签和对应的数值。 xlabel ylabel 分别用于设置x轴和y轴的标签,而 title 则设置了图表的标题。

折线图

折线图适合展示数据随时间变化的趋势,例如股票价格的变化。

import matplotlib.pyplot as plt

# 示例数据
x = [1, 2, 3, 4, 5]
y = [2, 3, 5, 7, 11]

plt.plot(x, y)
plt.xlabel('Time')
plt.ylabel('Price')
plt.title('Line Chart Example')
plt.show()

在这段代码中,我们使用 plot 函数来绘制折线图, x y 分别是时间序列和对应的价格数据。

散点图

散点图适用于展示两个变量之间的关系,例如身高与体重的关系。

import matplotlib.pyplot as plt

# 示例数据
x = [1, 2, 3, 4, 5]
y = [2, 3, 5, 7, 11]

plt.scatter(x, y)
plt.xlabel('Height')
plt.ylabel('Weight')
plt.title('Scatter Plot Example')
plt.show()

在散点图的代码示例中,我们使用了 scatter 函数来绘制散点图,其中 x y 分别是身高和体重的数据。

4.1.2 饼图和箱线图

饼图

饼图用于展示各部分占整体的比例,例如市场份额分布。

import matplotlib.pyplot as plt

# 示例数据
sizes = [30, 40, 20, 10]
labels = ['A', 'B', 'C', 'D']

plt.pie(sizes, labels=labels)
plt.title('Pie Chart Example')
plt.show()

在上述代码中, pie 函数用于绘制饼图, sizes labels 分别表示各部分的大小和对应的标签。

箱线图

箱线图用于展示数据的分布情况,包括中位数、四分位数和异常值。

import matplotlib.pyplot as plt
import numpy as np

# 示例数据
data = np.random.normal(0, 1, 100)

plt.boxplot(data)
plt.title('Box Plot Example')
plt.show()

在箱线图的示例代码中,我们使用 boxplot 函数绘制了100个正态分布的随机数据,展示了数据的最小值、第一四分位数、中位数、第三四分位数和最大值。

4.2 高级数据可视化

4.2.1 热力图

热力图是一种用于表示数据矩阵的图形表示方法,非常适合展示多变量之间的关系。

import seaborn as sns
import numpy as np

# 生成数据
data = np.random.rand(10, 12)

# 绘制热力图
sns.heatmap(data)
plt.title('Heatmap Example')
plt.show()

在热力图的代码示例中,我们使用了 seaborn 库的 heatmap 函数来绘制热力图, data 是一个10x12的随机数矩阵。

4.2.2 多维度数据的可视化

在数据科学中,有时需要展示数据集中的多维特征。这里我们可以使用 seaborn pairplot 函数来实现。

import seaborn as sns
import pandas as pd

# 示例数据集
data = pd.DataFrame({
    'Feature A': np.random.normal(0, 1, 100),
    'Feature B': np.random.normal(0, 1, 100),
    'Feature C': np.random.normal(0, 1, 100)
})

# 绘制pairplot
sns.pairplot(data)
plt.show()

在这段代码中,我们创建了一个包含三个正态分布特征的数据集,并使用 pairplot 函数展示了所有特征之间的关系。

4.3 可视化工具的应用

4.3.1 Matplotlib库的使用

Matplotlib是Python中最基础的绘图库,它提供了一套类似于MATLAB的绘图API。

# Matplotlib的简单使用示例
plt.plot([1, 2, 3], [4, 5, 6])
plt.xlabel('X Axis')
plt.ylabel('Y Axis')
plt.title('Matplotlib Plotting Example')
plt.show()

在上述代码中,我们绘制了一个简单的线图,展示了如何使用Matplotlib的基本功能。

4.3.2 Seaborn库的使用

Seaborn是基于Matplotlib的高级可视化库,它提供了更多的默认样式和颜色选项。

import seaborn as sns

# Seaborn的简单使用示例
sns.set()  # 设置默认样式
plt.plot([1, 2, 3], [4, 5, 6])
plt.show()

在这段代码中,我们使用 set 函数设置了Seaborn的默认样式,并绘制了一个简单的线图。

通过本章节的介绍,我们可以看到Matplotlib和Seaborn提供了丰富的API来进行数据的可视化。从基础的柱状图、折线图到高级的热力图,这些可视化工具能够帮助我们在数据分析过程中更有效地传达信息。在接下来的章节中,我们将继续深入探讨如何使用这些工具进行更复杂的数据分析和模型评估。

5. 特征工程

特征工程是机器学习项目中的一个关键步骤,它涉及到从原始数据中提取和构建信息以提高模型的预测性能。在本章节中,我们将深入探讨特征选择、特征构造和特征转换的策略和方法。

5.1 特征选择

特征选择的目的是从大量特征中选择出对模型预测最有用的特征。这不仅可以提高模型的性能,还可以减少模型的复杂度和训练时间。

5.1.1 过滤法

过滤法通过统计测试选择相关的特征,不涉及任何机器学习算法。这种方法简单高效,但可能不会考虑到特征之间的相互作用。

import pandas as pd
from sklearn.feature_selection import SelectKBest, chi2

# 假设df是一个包含特征和标签的DataFrame
X = df.drop('label', axis=1)
y = df['label']

# 使用卡方检验选择K个最佳特征
select_k_best = SelectKBest(chi2, k=10)
X_new = select_k_best.fit_transform(X, y)

# 查看选择的特征
selected_features = X.columns[select_k_best.get_support()]
print(selected_features)
参数说明:
  • SelectKBest :选择K个最佳特征的类。
  • chi2 :使用卡方检验作为统计测试。
  • k :要选择的特征数量。
逻辑分析:

在上述代码中,我们首先从DataFrame中分离出特征和标签,然后使用 SelectKBest 类和卡方检验选择K个最佳特征。最后,我们输出被选择的特征。

5.1.2 包裹法

包裹法使用机器学习模型的性能来选择特征。它尝试所有的特征组合,找到对模型预测最有用的特征子集。

from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression

# 使用递归特征消除法
model = LogisticRegression()
rfe = RFE(estimator=model, n_features_to_select=5)
X_rfe = rfe.fit_transform(X, y)

# 查看选择的特征
selected_features = X.columns[rfe.support_]
print(selected_features)
参数说明:
  • RFE :递归特征消除的类。
  • estimator :用于特征选择的机器学习模型。
  • n_features_to_select :选择的特征数量。
逻辑分析:

在上述代码中,我们使用递归特征消除法(RFE)和逻辑回归模型来选择特征。RFE首先拟合数据,然后逐步移除最不重要的特征,直到只剩下指定数量的特征。

5.1.3 嵌入法

嵌入法结合了过滤法和包裹法的特点,它在模型训练过程中进行特征选择。这种方法通常使用带有正则化的机器学习算法。

from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestClassifier

# 使用随机森林选择特征
model = RandomForestClassifier()
sfm = SelectFromModel(estimator=model)
X_new = sfm.fit_transform(X, y)

# 查看选择的特征
selected_features = X.columns[sfm.get_support()]
print(selected_features)
参数说明:
  • SelectFromModel :选择特征的类,它基于模型的权重。
  • estimator :用于特征选择的机器学习模型。
逻辑分析:

在上述代码中,我们使用随机森林分类器作为特征选择的模型。 SelectFromModel 类根据模型的权重来选择特征,它会选择权重最高的特征。

5.2 特征构造

特征构造是从原始数据中创建新特征的过程。这通常涉及到基于统计的方法和基于模型的方法。

5.2.1 基于统计的方法

基于统计的方法包括使用统计测试和模型来提取新的特征。

from sklearn.preprocessing import PolynomialFeatures

# 创建多项式特征
poly = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly.fit_transform(X)

# 查看生成的多项式特征数量
print(X_poly.shape)
参数说明:
  • PolynomialFeatures :用于创建多项式特征的类。
  • degree :多项式的度数。
逻辑分析:

在上述代码中,我们使用多项式特征来扩展原始特征空间。 PolynomialFeatures 类可以生成原始特征的多项式组合,这对于捕捉非线性关系非常有用。

5.2.2 基于模型的方法

基于模型的方法包括使用机器学习模型来生成新的特征。

from sklearn.decomposition import PCA

# 使用主成分分析(PCA)降维
pca = PCA(n_components=5)
X_pca = pca.fit_transform(X)

# 查看主成分的解释方差比
print(pca.explained_variance_ratio_)
参数说明:
  • PCA :主成分分析的类。
  • n_components :要保留的主成分数量。
逻辑分析:

在上述代码中,我们使用主成分分析(PCA)来减少特征的维度。PCA通过提取最重要的主成分来减少数据的复杂度,同时尽量保留原始数据的方差。

5.3 特征转换

特征转换包括将数据转换为更适合机器学习模型处理的形式。

5.3.1 离散特征编码

离散特征编码是将类别数据转换为数值数据的过程。

from sklearn.preprocessing import LabelEncoder

# 对分类特征进行编码
label_encoder = LabelEncoder()
X_encoded = label_encoder.fit_transform(X['categorical_column'])

# 查看编码后的结果
print(X_encoded)
参数说明:
  • LabelEncoder :用于标签编码的类。
逻辑分析:

在上述代码中,我们使用 LabelEncoder 类对分类特征进行编码。这种方法将字符串标签转换为整数编码,适用于大多数机器学习算法。

5.3.2 连续特征离散化

连续特征离散化是将连续数据分割为区间的过程。

from sklearn.preprocessing import KBinsDiscretizer

# 对连续特征进行离散化
discretizer = KBinsDiscretizer(n_bins=5, encode='ordinal', strategy='uniform')
X_discrete = discretizer.fit_transform(X[['continuous_column']])

# 查看离散化后的结果
print(X_discrete)
参数说明:
  • KBinsDiscretizer :用于连续特征离散化的类。
  • n_bins :要分割的区间数量。
  • encode :编码方式。
  • strategy :区间分配策略。
逻辑分析:

在上述代码中,我们使用 KBinsDiscretizer 类对连续特征进行离散化。这将连续数据分割成指定数量的区间,有助于模型处理非线性关系。

通过本章节的介绍,我们了解了特征工程的不同方面,包括特征选择、特征构造和特征转换。这些方法可以帮助我们从原始数据中提取有价值的信息,并为机器学习模型提供更准确的输入。在下一章节中,我们将继续探索数据可视化的方法,以便更好地理解数据并展示分析结果。

6. 数据分析

数据分析是Python数据分析实践项目中的关键步骤,它涉及到从数据中提取有价值的信息和见解。在本章节中,我们将深入探讨数据分析的几个重要方面,包括假设检验、因果分析和预测性分析。这些分析方法将帮助我们验证假设、探究变量之间的关系,并对未来的趋势进行预测。

6.1 假设检验

6.1.1 t检验和ANOVA

假设检验是统计学中的一个核心概念,它帮助我们确定样本数据是否支持某个假设。在Python中,我们可以使用SciPy库中的 stats 模块来进行t检验和方差分析(ANOVA)。

t检验

t检验用于比较两组数据的均值是否存在显著差异。以下是使用SciPy进行t检验的代码示例:

from scipy import stats

# 示例数据
group1 = [22, 25, 27, 23, 26, 24, 22]
group2 = [19, 23, 18, 21, 20, 19, 21]

# 进行独立样本t检验
t_statistic, p_value = stats.ttest_ind(group1, group2)

print("t统计量:", t_statistic)
print("p值:", p_value)

在这段代码中,我们首先导入了 stats 模块,然后创建了两个样本组 group1 group2 。使用 stats.ttest_ind 函数进行独立样本t检验,该函数返回t统计量和p值。如果p值小于显著性水平(通常为0.05),则我们拒绝原假设,认为两组数据的均值存在显著差异。

ANOVA

方差分析(ANOVA)用于检验三个或更多组数据的均值是否存在显著差异。以下是使用SciPy进行ANOVA的代码示例:

import numpy as np
from scipy import stats

# 示例数据
group1 = np.random.normal(10, 3, 30)
group2 = np.random.normal(12, 3, 30)
group3 = np.random.normal(11, 3, 30)

# 将数据组合成一个数组
data = np.concatenate([group1, group2, group3])

# 进行ANOVA
f_statistic, p_value = stats.f_oneway(group1, group2, group3)

print("F统计量:", f_statistic)
print("p值:", p_value)

在这段代码中,我们生成了三组正态分布的随机数据,并使用 stats.f_oneway 函数进行ANOVA。该函数返回F统计量和p值。同样地,如果p值小于显著性水平,我们拒绝原假设,认为至少两组数据的均值存在显著差异。

6.1.2 卡方检验

卡方检验是一种非参数统计检验方法,常用于检验分类变量之间是否独立。以下是使用SciPy进行卡方检验的代码示例:

from scipy import stats

# 创建一个2x2列联表
observed = np.array([[20, 15], [10, 25]])

# 进行卡方检验
chi2, p, dof, expected = stats.chi2_contingency(observed)

print("卡方统计量:", chi2)
print("p值:", p)

在这段代码中,我们首先创建了一个2x2的列联表 observed ,然后使用 stats.chi2_contingency 函数进行卡方检验。该函数返回卡方统计量、p值、自由度以及期望频数表。如果p值小于显著性水平,我们拒绝原假设,认为两个分类变量之间存在关联。

6.2 因果分析

6.2.1 回归分析

回归分析是因果分析的一种常用方法,它可以帮助我们了解一个或多个自变量如何影响因变量。在Python中,我们可以使用 statsmodels 库来进行回归分析。

线性回归

以下是使用 statsmodels 进行简单线性回归的代码示例:

import numpy as np
import statsmodels.api as sm

# 示例数据
X = np.array([1, 2, 3, 4, 5])
Y = np.array([2, 4, 5, 4, 5])

# 添加常数项,构建模型矩阵
X = sm.add_constant(X)

# 创建模型
model = sm.OLS(Y, X)

# 拟合模型
results = model.fit()

# 输出模型结果
print(results.summary())

在这段代码中,我们首先导入了 numpy statsmodels.api 模块,然后创建了自变量X和因变量Y。使用 sm.add_constant 函数添加常数项,构建模型矩阵。接着,我们使用 OLS 类创建了一个线性模型,并使用 fit 方法拟合模型。最后,我们使用 summary 方法输出模型的结果。

多元回归

以下是使用 statsmodels 进行多元线性回归的代码示例:

import numpy as np
import statsmodels.api as sm

# 示例数据
X = np.array([[1, 2], [2, 1], [3, 2], [4, 3], [5, 3]])
Y = np.array([1, 2, 3, 4, 5])

# 添加常数项,构建模型矩阵
X = sm.add_constant(X)

# 创建模型
model = sm.OLS(Y, X)

# 拟合模型
results = model.fit()

# 输出模型结果
print(results.summary())

在这段代码中,我们创建了两个自变量X和一个因变量Y。我们同样添加了常数项,并构建了模型矩阵。然后,我们创建了一个多元线性回归模型并拟合它。最后,我们输出了模型的结果。

6.2.2 实验设计

实验设计是因果分析中的一个重要环节,它涉及到如何设计实验以准确地评估变量之间的因果关系。实验设计的基本原则包括随机化、对照组和盲法。

6.3 预测性分析

6.3.1 时间序列分析

时间序列分析是预测性分析的一种,它用于分析时间序列数据的趋势、季节性和周期性。在Python中,我们可以使用 statsmodels 库来进行时间序列分析。

ARIMA模型

ARIMA模型是一种常用的时间序列预测模型,它包括自回归(AR)、差分(I)和移动平均(MA)三个部分。

以下是使用 statsmodels 进行ARIMA模型拟合的代码示例:

import numpy as np
import pandas as pd
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.tsa.stattools import adfuller

# 示例时间序列数据
data = np.random.randn(100)

# 检验时间序列的平稳性
result = adfuller(data)
print('ADF Statistic: %f' % result[0])
print('p-value: %f' % result[1])

# 如果时间序列是平稳的,进行ARIMA模型拟合
if result[1] < 0.05:
    model = ARIMA(data, order=(1, 0, 0))
    results = model.fit()
    print(results.summary())

在这段代码中,我们首先生成了一个随机时间序列 data 。然后,我们使用 adfuller 函数来检验时间序列的平稳性。如果p值小于显著性水平(通常为0.05),则时间序列被认为是平稳的,我们可以进行ARIMA模型拟合。在模型拟合后,我们输出模型的结果。

6.3.2 预测模型的评估

在进行预测性分析时,我们需要评估模型的预测能力。在Python中,我们可以使用不同的方法来评估模型的性能,例如均方误差(MSE)和均方根误差(RMSE)。

以下是使用均方误差(MSE)评估预测模型性能的代码示例:

from sklearn.metrics import mean_squared_error

# 真实值
actual = np.array([1, 2, 3, 4, 5])

# 预测值
predicted = np.array([1.2, 2.1, 2.9, 3.8, 4.6])

# 计算MSE
mse = mean_squared_error(actual, predicted)

print("均方误差:", mse)

在这段代码中,我们首先导入了 mean_squared_error 函数,然后定义了真实值和预测值。使用 mean_squared_error 函数计算MSE,并输出结果。

通过本章节的介绍,我们了解了数据分析中假设检验、因果分析和预测性分析的基本概念和方法。我们学习了如何使用Python中的SciPy和statsmodels库进行t检验、ANOVA、卡方检验、线性回归、多元回归、时间序列分析等。此外,我们还探讨了如何评估预测模型的性能。这些知识和技能将为我们在实际项目中进行数据分析打下坚实的基础。

7. 数据建模(预测任务)

在数据分析的旅程中,数据建模是一个至关重要的环节。它不仅能够帮助我们从数据中预测未来,还能够揭示变量之间的复杂关系。在本章中,我们将深入探讨监督学习和非监督学习建模,以及模型评估与优化的技巧。

7.1 监督学习建模

监督学习的目标是从带有标签的数据中学习一个模型,以便能够对未知数据进行预测。以下是几种常见的监督学习模型:

7.1.1 线性回归

线性回归是一种基本的预测建模技术,用于估计两个或多个变量之间的关系。例如,我们可能想根据房屋的大小预测其价格。在Python中,我们可以使用Scikit-Learn库来实现线性回归。

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

# 假设 X 是特征数据,y 是目标变量
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
model = LinearRegression()
model.fit(X_train, y_train)

7.1.2 逻辑回归

逻辑回归虽然名字中有“回归”二字,但它实际上是一种分类算法,常用于处理二分类问题。例如,我们可以用它来预测电子邮件是否为垃圾邮件。

from sklearn.linear_model import LogisticRegression

model = LogisticRegression()
model.fit(X_train, y_train)

7.1.3 决策树和随机森林

决策树是一种基于树结构的分类器,它通过一系列的判断规则对数据进行分类。随机森林是由多棵决策树组成的集成学习方法,通常能够提供更稳定和准确的预测。

from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier

# 决策树分类器
dt_model = DecisionTreeClassifier()
dt_model.fit(X_train, y_train)

# 随机森林分类器
rf_model = RandomForestClassifier()
rf_model.fit(X_train, y_train)

7.2 非监督学习建模

非监督学习不依赖于带有标签的数据集,它试图从数据中发现隐藏的结构或模式。以下是两种常用的非监督学习模型:

7.2.1 K均值聚类

K均值聚类是一种简单而强大的聚类算法,它将数据集分为K个集群。每个集群由其集群中心点代表,并且每个点被分配到最近的中心点所在的集群。

from sklearn.cluster import KMeans

model = KMeans(n_clusters=3)
model.fit(X)

7.2.2 层次聚类

层次聚类构建了一个树状的集群层次结构。这种技术适用于较少数量的数据点,因为它要求计算所有点对之间的距离,计算成本较高。

from sklearn.cluster import AgglomerativeClustering

model = AgglomerativeClustering(n_clusters=3)
model.fit(X)

7.3 模型评估与优化

7.3.1 交叉验证

交叉验证是一种强大的技术,用于评估模型的泛化能力。在k折交叉验证中,数据集被分成k个小子集。模型在k-1个小子集上训练,并在剩余的一个小子集上进行验证。这个过程重复k次,每次使用不同的小子集作为验证集。

from sklearn.model_selection import cross_val_score

scores = cross_val_score(model, X, y, cv=5)

7.3.2 模型的超参数调优

超参数调优是通过搜索最佳的参数组合来提高模型性能的过程。网格搜索和随机搜索是常用的超参数优化方法。

from sklearn.model_selection import GridSearchCV

param_grid = {'n_estimators': [100, 200], 'max_depth': [3, 5]}
grid_search = GridSearchCV(estimator=rf_model, param_grid=param_grid, cv=5)
grid_search.fit(X_train, y_train)

在本章中,我们介绍了多种监督学习和非监督学习模型,以及如何评估和优化这些模型。这些技能对于完成预测任务至关重要,它们将帮助我们构建出既准确又可靠的预测模型。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:NYAirBNB:第一次作业是一个以Python编程为主的实践项目,它要求学生通过分析纽约AirBNB的数据集来理解数据处理、分析和可视化的流程。学生将使用Python库如Pandas、NumPy和Matplotlib探索数据集,进行数据导入、预处理、探索、可视化和特征工程。此外,学生还会进行数据分析和建模,以探究影响房价的因素并预测价格,这可能涉及相关性分析和回归模型。通过这个项目,学生能够加深对数据科学概念和实际问题解决能力的理解。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐