全文链接:tecdat.cn/?p=37013
原文出处:拓端数据部落公众号
随着城市化进程的加速,住房问题日益成为城市居民关注的焦点。公租房作为政府为解决中低收入家庭住房困难而推出的一种重要住房保障形式,其租金水平、居住条件及租住体验直接关系到广大租户的切身利益和生活质量。因此,深入研究公租房租金满意度的影响因素,不仅有助于提升公租房的管理和服务水平,还能为政府制定更加科学合理的住房政策提供有力支持。
近年来,数据分析与可视化技术在社会科学领域的应用日益广泛,为复杂问题的研究提供了强有力的工具。Python作为一种功能强大的编程语言,凭借其丰富的数据处理库和可视化工具,成为了数据分析领域的首选工具之一。本文旨在利用Python的回归、聚类及相关分析等方法,对上海地区公租房租金满意度的影响因素进行深入探讨,并通过数据可视化的方式直观展示分析结果,以期为相关政策制定者和管理者提供有价值的参考。
这份数据集涵盖了上海地区公租房租户的多方面信息,既有个人基本信息、工作与生活状况,也有对租住体验及政策看法的详细调查。
描述统计分析
python复制
import pandas as pd
# 读取上传的Excel文件
file_path = '/mnt/data/data.xls'
df = pd.read_excel(file_path)
# 显示数据的前几行以了解其结构
df.head()
根据提供的数据,我们可以从以下几个方面进行分析:
- 居住空间与通勤成本的关联:分析公租房的分布特点与就业热点区域之间的空间关系,评估不同居住位置对通勤时间、交通费用等通勤成本的影响。
- 交通设施与通勤效率:考察公共交通系统(地铁、公交、共享单车等)的覆盖程度、运营效率及对群体通勤的便利性,探讨如何通过优化交通网络降低通勤成本。
- 政策效应评估:分析公租房政策在缓解住房压力的同时,对其通勤成本产生的直接或间接影响,评估政策的有效性与改进空间。
- 生活空间优化建议:基于上述分析,从城市住房政策调整、公租房布局优化、交通基础设施建设与升级等多个维度,提出降低外来群体通勤成本、提升其生活品质的具体建议。
我将首先创建饼图,然后逐步进行其他类型的图表。
python复制
# 选择适合绘制饼图的分类变量 - 例如“您的性别.”
gender_counts = df['您的性别.'].value_counts()
# 绘制饼图
plt.figure(figsize=(8, 8))
plt.pie(gender_counts, labels=gender_counts.index, autopct='%1.1f%%', startangle=140, colors=normalized_colors[:2])
plt.title('性别分布')
plt.show()
分析结果
-
饼图 - 性别分布
- 图表展示了调查对象中性别的分布情况。
接下来,创建环状直方图来展示数值变量的分布。由于环状直方图不是常见的图表类型,使用一个创新的方法来呈现数值变量的分布。
# 选择适合绘制环状直方图的数值变量 - 例如“您的平均月收入是.”
# 首先将收入分为几个区间
income_bins = [0, 2000, 4000, 6000, 8000, 10000, 15000, 20000, 30000, 50000]
income_labels = ['0-2000', '2001-4000', '4001-6000', '6001-8000', '8001-10000', '10001-15000', '15001-20000', '20001-30000', '30001-50000']
df['收入区间'] = pd.cut(df['您的平均月收入是.'].astype(str).str.extract('(\d+)')[0].astype(float), bins=income_bins, labels=income_labels)
# 统计每个区间的人数
income_counts = df['收入区间'].value_counts().sort_index()
# 绘制环状直方图
theta = np.linspace(0.0, 2.0 * np.pi, len(income_counts), endpoint=False)
width = np.pi / 4 * np.ones_like(theta)
fig, ax = plt.subplots(figsize=(8, 8), subplot_kw={'projection': 'polar'})
bars = ax.bar(theta, income_counts, width=width, bottom=0.0, color=normalized_colors[1:4])
ax.set_xticks(theta)
ax.set_xticklabels(income_counts.index)
ax.set_title('平均月收入分布 - 环状直方图')
plt.show()
import numpy as np
# 重新绘制环状直方图
theta = np.linspace(0.0, 2.0 * np.pi, len(income_counts), endpoint=False)
width = np.pi / 4 * np.ones_like(theta)
fig, ax = plt.subplots(figsize=(8, 8), subplot_kw={'projection': 'polar'})
bars = ax.bar(theta, income_counts, width=width, bottom=0.0, color=normalized_colors[1:4])
ax.set_xticks(theta)
ax.set_xticklabels(income_counts.index)
ax.set_title('平均月收入分布 - 环状直方图')
plt.show()
分析结果
-
环状直方图 - 平均月收入分布
- 图表展示了调查对象的平均月收入分布情况,每个区间的宽度代表该收入区间的人数。
接下来,进行数据分析。
1. 居住空间与通勤成本的关联分析
分析公租房的分布特点与就业热点区域之间的空间关系。 这里我们使用“您的工作所在地”和“您的平均月收入”作为代表。
python复制
import matplotlib.pyplot as plt
import seaborn as sns
# 设置中文字体,以便在图表中显示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
work_location_counts = df['您的工作所在地.'].value_counts()
average_income = df['您的平均月收入是.'].value_counts()
# 绘制工作所在地的分布图
plt.figure(figsize=(10, 6))
sns.barplot(x=work_location_counts.values, y=work_location_counts.index)
plt.title('工作所在地分布')
plt.xlabel('人数')
plt.ylabel('工作地点')
plt.show()
# 绘制平均月收入的分布图
plt.figure(figsize=(10, 6))
sns.barplot(x=average_income.values, y=average_income.index)
plt.title('平均月收入分布')
plt.xlabel('人数')
plt.ylabel('平均月收入')
plt.show()
分析结果
-
居住空间与通勤成本的关联
- 工作所在地分布:图表显示了不同工作地点的人数分布。可以看出,某些地区的工作人数较多,这可能与公租房的分布有关。
- 平均月收入分布:此图展示了不同收入水平的人数分布。收入水平可能与通勤成本相关,因为不同的收入群体可能选择不同的交通方式和居住区域。
接下来,继续分析交通设施与通勤效率,以及政策效应评估的部分。
2. 交通设施与通勤效率
分析公共交通系统的覆盖程度、运营效率及对群体通勤的便利性 这里我们使用“您平时常使用的主要交通工具是”作为代表
transport_modes = df[['您平时常使用的主要交通工具是.1', '您平时常使用的主要交通工具是.2', '您平时常使用的主要交通工具是.3']]
# 统计各种交通工具的使用频率
transport_counts = transport_modes.apply(pd.Series.value_counts).fillna(0)
transport_counts = transport_counts.sum(axis=1)
# 绘制交通工具使用频率的分布图
plt.figure(figsize=(10, 6))
sns.barplot(x=transport_counts.values, y=transport_counts.index)
plt.title('主要交通工具使用频率')
plt.xlabel('人数')
plt.ylabel('交通工具')
plt.show()
分析结果
- **主要交通工具使用频率**:图表展示了受访者主要使用的交通工具及其使用频率。可以看出,地铁是最受欢迎的交通工具,其次是出租车和私家车。这表明地铁在通勤效率上可能具有明显优势,而其他交通方式则根据个人偏好和实际情况有所不同。
接下来,进行政策效应评估的分析。
3. 政策效应评估
分析公租房政策对通勤成本的影响,这里我们使用“您对公租房租住体验满意吗.租金”作为代表
python复制
rent_satisfaction = df['您对公租房租住体验满意吗.租金'].value_counts()
# 绘制租金满意度的分布图
plt.figure(figsize=(8, 5))
sns.barplot(x=rent_satisfaction.values, y=rent_satisfaction.index)
plt.title('公租房租金满意度')
plt.xlabel('人数')
plt.ylabel('满意度')
plt.show()
分析结果
-
政策效应评估
- 公租房租金满意度:图表展示了受访者对于公租房租金的满意度分布。从图中可以看出,对于公租房租金的满意度呈现一定的分化,有相当一部分人对租金表示不满。这可能反映出公租房政策在租金方面仍有改进空间。
综合以上分析,我们可以得出以下结论和建议:
- 居住空间与通勤成本关联紧密:工作地点的分布与公租房的位置选择密切相关,不同居住位置对通勤成本有显著影响。
- 优化交通网络降低通勤成本:地铁作为主要的通勤工具,显示了其在通勤效率上的优势。建议进一步优化公共交通网络,特别是地铁线路,以降低通勤成本。
- 公租房政策需进一步优化:租金满意度的调查显示,公租房政策在租金方面还有改进的空间。建议对公租房租金政策进行调整,以更好地满足不同收入群体的需求。
这些分析和建议有助于上海实现更加“以人为本”的城市化进程,提升外来群体的生活品质。
相关性分析
变量间关系:探索不同变量之间的相关性,如年龄与婚姻状况、月收入与公租房租金、通勤时间与交通费用等。这有助于揭示变量之间的潜在联系和因果关系。 通勤与居住条件:分析通勤时间、交通费用与居住地点(如工作所在地、公租房位置)、房型等变量之间的关系,了解居住条件对通勤效率的影响。
首先,我将重新处理数据,确保特征和目标变量被正确处理。然后,我将使用相关性分析来探索不同变量之间的相关性。由于数据中存在一些缺失值,我将首先处理这些缺失值,然后构建模型。处理缺失值的常用方法包括删除含有缺失值的行或用某种策略填充缺失值。在这里,我将选择删除含有缺失值的行。
接下来,我将进行以下步骤:
- 数据清洗:处理缺失值、异常值和数据类型转换。
- 特征工程:提取和构造与变量间关系相关的特征。
- 相关性分析:使用相关性分析来探索不同变量之间的相关性。
- 结果可视化:展示相关性分析的结果。
import seaborn as sns
# 数据清洗和特征工程
# 1. 年龄段编码
data['年龄段编码'] = label_encoder.fit_transform(data['您的年龄.'])
# 2. 婚姻状况编码
data['婚姻状况编码'] = label_encoder.fit_transform(data['您是否已婚.'])
# 3. 工作所在地编码
data['工作所在地编码'] = label_encoder.fit_transform(data['您的工作所在地.'])
# 4. 房型编码
data['房型编码'] = label_encoder.fit_transform(data['您租住的公租房房型是.'])
# 5. 租金水平编码
data['租金水平'] = data['您所租住的公租房的月租金是.'].apply(process_rent)
# 6. 通勤时间处理
data['通勤时间'] = data['您每天上班和下班.上学.放学.所需的时间合在一起大约是.'].apply(process_commute_time)
# 7. 交通费用处理
data['交通费用'] = data['在交通上.您每日所花费的平均费用是多少.'].apply(process_commute_cost)
# 选择用于相关性分析的特征
features_correlation = ['年龄段编码', '婚姻状况编码', '收入水平', '租金水平', '工作所在地编码', '房型编码', '通勤时间', '交通费用']
# 处理缺失值:删除含有缺失值的行
data_clean = data.dropna(subset=features_correlation)
# 相关性分析
correlation_matrix = data_clean[features_correlation].corr()
# 可视化相关性分析结果
plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt=".2f")
plt.title('变量间相关性分析')
plt.show()
相关性分析的结果已经可视化。从热图中可以看出不同变量之间的相关性系数。相关性系数的范围是-1到1,其中1表示完全正相关,-1表示完全负相关,0表示没有相关性。
回归分析
-
满意度影响因素:分析哪些因素显著影响租住者对公租房的满意度,如房型、租金、交通便利性等。这有助于识别改进公租房管理和服务的关键领域。
首先,重新处理数据,确保特征和目标变量被正确处理。然后,将使用多元线性回归模型来分析影响租住者对公租房满意度的因素。由于数据中存在一些缺失值,我将首先处理这些缺失值,然后构建模型。处理缺失值的常用方法包括删除含有缺失值的行或用某种策略填充缺失值。在这里,我将选择删除含有缺失值的行。
接下来,进行以下步骤:
-
数据清洗:处理缺失值、异常值和数据类型转换。
-
特征工程:提取和构造与租住者满意度相关的特征。
-
构建模型:使用多元线性回归模型分析影响租住者对公租房满意度的因素。
-
结果可视化:展示模型的结果和误差。
python复制
# 数据清洗和特征工程
# 1. 处理收入水平,将其转换为数值类型
data['收入水平'] = data['您的平均月收入是.'].apply(process_income)
# 2. 房型编码
data['房型编码'] = label_encoder.fit_transform(data['您租住的公租房房型是.'])
# 3. 家庭结构特征:家庭人数、工作人数、就学人数、退休人数
data['工作人数'] = data['您在上海居住的家庭结构是.其中工作人数..']
data['就学人数'] = data['您在上海居住的家庭结构是.其中就学人数..']
data['退休人数'] = data['您在上海居住的家庭结构是.其中退休人数..']
# 4. 满意度处理:将满意度转换为数值类型(这里简化处理,实际应用中可能需要更复杂的转换方式)
def process_satisfaction(satisfaction_str):
satisfaction_mapping = {'非常满意': 5, '满意': 4, '一般': 3, '不满意': 2, '非常不满意': 1}
return satisfaction_mapping.get(satisfaction_str, None)
data['满意度'] = data['您对公租房租住体验满意吗.室内装修'].apply(process_satisfaction)
# 选择用于分析的特征和目标变量
features = ['房型编码', '家庭人数', '工作人数', '就学人数', '退休人数', '收入水平']
target = '满意度'
# 处理缺失值:删除含有缺失值的行
data_clean = data.dropna(subset=features + [target])
# 分离特征和目标变量
X = data_clean[features]
y = data_clean[target]
# 构建并训练模型
model_satisfaction = LinearRegression().fit(X, y)
# 预测
y_pred_satisfaction = model_satisfaction.predict(X)
# 计算模型评估指标
mse_satisfaction = mean_squared_error(y, y_pred_satisfaction)
r2_satisfaction = r2_score(y, y_pred_satisfaction)
# 可视化模型结果和误差
plt.figure(figsize=(7, 6))
plt.scatter(y, y_pred_satisfaction, color='#229810') # 深蓝色
plt.plot([y.min(), y.max()], [y.min(), y.max()], 'k--', lw=4) # 黑色
plt.xlabel('真实值')
plt.ylabel('预测值')
plt.title('租住者满意度模型结果和误差')
plt.tick_params(axis='x', colors='#229810')
plt.tick_params(axis='y', colors='#229810')
plt.show()
# 输出模型评估指标和模型参数
mse_satisfaction, r2_satisfaction, model_satisfaction.coef_, model_satisfaction.intercept_
对于租住者满意度模型:
- 均方误差(MSE): 1.094
- 决定系数(R²): 0.196
- 模型参数: [-0.228, 0.014, 0.522, -0.500, 0.491, -0.0001]
- 截距: 2.990
模型的评估指标显示决定系数(R²)为0.196,这表明模型只解释了约19.6%的目标变量的变异。
KMeans聚类分析
首先,我将选择一些可能适合进行聚类的变量,然后使用KMeans算法进行聚类分析。最后,我将可视化聚类结果,并输出模型参数。
由于数据集较大,包含多个变量,我将选择几个代表性的变量进行聚类分析。让我们开始吧。
python复制
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import seaborn as sns
# 选择适合进行聚类的变量
selected_columns = ['您的年龄.', '您的户籍.', '您的平均月收入是.', '您的工作所在地.']
# 对分类变量进行编码
for column in selected_columns:
le = LabelEncoder()
df[column] = le.fit_transform(df[column])
# 提取选定的列
X = df[selected_columns]
# 使用KMeans进行聚类分析
kmeans = KMeans(n_clusters=3, random_state=0)
df['Cluster'] = kmeans.fit_predict(X)
python复制
# 修正颜色代码格式
colors = ['#E55468', '#051C2C', '#91C3FF'] # 分别对应红色、黑色、天蓝色
# 重新进行可视化
plt.figure(figsize=(10, 6))
sns.scatterplot(data=df, x='您的平均月收入是.', y='您的工作所在地.', hue='Cluster', palette=colors)
plt.title('KMeans聚类结果')
plt.xlabel('平均月收入')
plt.ylabel('工作所在地')
plt.show()
# 输出模型参数
print("KMeans模型参数:")
print(kmeans.cluster_centers_)
print("KMeans模型误差:")
print(kmeans.inertia_)
KMeans聚类分析结果
聚类结果可视化
从上图中,我们可以看到KMeans聚类分析的结果。图中的点代表不同的数据点,颜色表示它们所属的聚类。可以看出,数据被分为三个不同的聚类。
模型参数和误差
-
模型参数(聚类中心) :
- 聚类1:[2.5, 0.95, 2.6, 13.6]
- 聚类2:[2.45, 0.73, 2.91, 2.82]
- 聚类3:[2.05, 0.84, 2.58, 8.00]
-
模型误差(Inertia) :1345.55
分析
- 聚类中心代表了每个聚类的平均特征值,这些值可以用来描述每个聚类的特征。
- 误差值(Inertia)表示模型在聚类过程中的总误差,较小的误差值通常意味着更好的聚类效果。
总结
通过KMeans聚类分析,我们可以看到数据在“平均月收入”和“工作所在地”两个维度上的聚类情况。不同的聚类可能代表了不同的收入和工作地点特征的人群。这有助于我们更好地理解数据中的不同群体。