import pandas as pd import numpy as np from sklearn.decomposition import PCA from sklearn.preprocessing import StandardScaler import matplotlib.pyplot as plt import seaborn as sns df = pd.read_csv("RESSET_DRESSTK_2016_2020_1.csv") df = df[['Oppr','Hipr','Lopr','Clpr','Trdvol']] df = df.dropna() #标准化 scaler = StandardScaler() df_scaled = scaler.fit_transform(df) df_scaled = pd.DataFrame(df_scaled, columns=df.columns) pca=PCA() pca.fit(df_scaled) explained_variance = pca.explained_variance_ratio_ cumulative_variance = np.cumsum(explained_variance) n_components = np.argmax(cumulative_variance >= 0.95) + 1 print(f'Number of components to explain 95% of variance: {n_components}') # 使用确定的主成分数量重新拟合PCA pca = PCA(n_components=n_components) pca.fit(df_scaled) df_pca = pca.transform(df_scaled) df_pca = pd.DataFrame(df_pca, columns=[f'PC{i+1}' for i in range(n_components)]) # 5. 解释主成分的经济意义 loadings = pca.components_ loadings_df = pd.DataFrame(loadings, columns=df.columns, index=[f'PC{i+1}' for i in range(n_components)]) print('Loadings:') print(loadings_df) #累积方差图 plt.figure(figsize=(10, 6)) plt.plot(range(1, len(cumulative_variance) + 1), cumulative_variance, marker='o') plt.xlabel('Number of Components') plt.ylabel('Cumulative Explained Variance') plt.title('Cumulative Explained Variance by Principal Components') plt.grid(True) plt.show() # 主成分散点图 plt.figure(figsize=(10, 6)) sns.scatterplot(x=df_pca['PC1'], y=df_pca['PC2']) plt.xlabel('Principal Component 1') plt.ylabel('Principal Component 2') plt.title('Scatter Plot of Principal Components') plt.grid(True) plt.show() 逐句解释以上代码
时间: 2025-03-21 15:07:27 浏览: 71
以下是您提供的代码逐句解析:
```python
import pandas as pd
```
导入`pandas`库并将其简称为`pd`,用于数据处理和分析。
```python
import numpy as np
```
导入`numpy`库并简称其为`np`,这是Python中常用的科学计算库,主要用于数值运算及矩阵操作。
```python
from sklearn.decomposition import PCA
```
从`sklearn.decomposition`模块引入主成分分析(PCA),这是一个降维算法工具包。
```python
from sklearn.preprocessing import StandardScaler
```
从`sklearn.preprocessing`模块引入标准化工具`StandardScaler`,它会将数据转换成均值为0、标准差为1的形式。
```python
import matplotlib.pyplot as plt
import seaborn as sns
```
分别导入绘图库`matplotlib.pyplot`和增强版可视化库`seaborn`,以便绘制图表。
---
### 数据加载部分
```python
df = pd.read_csv("RESSET_DRESSTK_2016_2020_1.csv")
```
通过`read_csv()`函数读取CSV文件,并存储到DataFrame `df` 中。
```python
df = df[['Oppr', 'Hipr', 'Lopr', 'Clpr', 'Trdvol']]
```
选择需要使用的列名列表:开盘价 (`Oppr`)、最高价 (`Hipr`)、最低价 (`Lopr`)、收盘价 (`Clpr`) 和交易量 (`Trdvol`) ,并将它们赋给新的 DataFrame `df`。
```python
df = df.dropna()
```
删除所有包含缺失值的行。
---
### 标准化
```python
scaler = StandardScaler()
```
实例化一个`StandardScaler`对象以对数据进行标准化预处理。
```python
df_scaled = scaler.fit_transform(df)
```
调用`fit_transform()`方法对原始数据进行标准化处理。该步骤包括先求出每列的平均值和标准差,然后按公式 \(X_{\text{scaled}} = \frac{X - \mu}{\sigma}\) 进行变换。
```python
df_scaled = pd.DataFrame(df_scaled, columns=df.columns)
```
把经过标准化后的 NumPy 数组再次转回 Pandas 的 DataFrame 形式,同时保留原有的列名称。
---
### 主成分分析 (PCA)
#### 求解最佳主成分数量
```python
pca = PCA()
pca.fit(df_scaled)
```
创建一个默认配置下的PCA模型,并对其进行训练(即学习数据的主要特征方向)。
```python
explained_variance = pca.explained_variance_ratio_
```
获取每个主成分所解释的数据总方差的比例数组。
```python
cumulative_variance = np.cumsum(explained_variance)
```
累加各个主成分贡献率的结果作为累计方差比例。
```python
n_components = np.argmax(cumulative_variance >= 0.95) + 1
```
找出能够满足累积方差达到或超过95%的第一个索引位置对应的主成分数。
```python
print(f'Number of components to explain 95% of variance: {n_components}')
```
打印所需的最少主成分数目。
---
#### 对选定的主成分重新应用PCA
```python
pca = PCA(n_components=n_components)
pca.fit(df_scaled)
```
按照先前确定的最佳主成分数目重建PCA模型并完成适配工作。
```python
df_pca = pca.transform(df_scaled)
df_pca = pd.DataFrame(df_pca, columns=[f'PC{i+1}' for i in range(n_components)])
```
利用调整好的PCA模型将原标准化数据投影至低维度空间内;生成的新坐标系被命名为“第几号主成分”。
---
### 分析结果解读
```python
loadings = pca.components_
loadings_df = pd.DataFrame(loadings, columns=df.columns, index=[f'PC{i+1}' for i in range(n_components)])
print('Loadings:')
print(loadings_df)
```
提取各主成分与初始变量之间的线性组合系数表(因子荷载矩阵)。此部分内容有助于了解哪些因素对于某一特定主成分的影响较大。
---
### 可视化展示
#### 累积方差曲线
```python
plt.figure(figsize=(10, 6))
plt.plot(range(1, len(cumulative_variance)+1), cumulative_variance, marker='o')
plt.xlabel('Number of Components')
plt.ylabel('Cumulative Explained Variance')
plt.title('Cumulative Explained Variance by Principal Components')
plt.grid(True)
plt.show()
```
画一条折线表示随着选取更多主成分时所能涵盖的整体信息占比变化趋势图象。
#### 主成分散点分布图形
```python
plt.figure(figsize=(10, 6))
sns.scatterplot(x=df_pca['PC1'], y=df_pca['PC2'])
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.title('Scatter Plot of Principal Components')
plt.grid(True)
plt.show()
```
展现前两个主成分之间样本点的关系状况作二维散布图像表达形式。
---
阅读全文
相关推荐



















