Python学习--简单数据分析练习

news/2025/2/13 19:11:12/

房源数据分析

将租房网站租房数据作为参考,分析统计如下指标:

  1. 统计每个区域的房源总数量,并使用热力图分析房源位置分布情况。
  2. 使用条形图分析哪种户型的数量最多、更受欢迎。
  3. 统计每个区域的平均租金,并结合柱状图和折线图分析各区域的房源数量和租金情况。
  4. 统计面积区间的市场占有率,并使用饼图绘制各区间所占的比例。

导入需要包

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
file_data = pd.read_csv('./data/房源数据.csv')
file_data
区域小区名称户型面积(㎡)价格(元/月)
0东城万国城MOMA1室0厅59.11平米10000
1东城北官厅胡同2号院3室0厅56.92平米6000
2东城和平里三区1室1厅40.57平米6900
3东城菊儿胡同2室1厅57.09平米8000
4东城交道口北二条35号院1室1厅42.67平米5500
..................
8218顺义怡馨家园3室1厅114.03平米5500
8219顺义旭辉26街区4房间2卫59平米5000
8220顺义前进花园玉兰苑3室1厅92.41平米5800
8221顺义双裕小区2室1厅71.81平米4200
8222顺义樱花园二区1室1厅35.43平米2700

8223 rows × 5 columns

数据基本信息

file_data.shape
(8223, 5)
file_data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 8223 entries, 0 to 8222
Data columns (total 5 columns):#   Column   Non-Null Count  Dtype 
---  ------   --------------  ----- 0   区域       8223 non-null   object1   小区名称     8223 non-null   object2   户型       8223 non-null   object3   面积(㎡)    8223 non-null   object4   价格(元/月)  8223 non-null   int64 
dtypes: int64(1), object(4)
memory usage: 321.3+ KB
file_data.describe()
价格(元/月)
count8223.000000
mean9512.297823
std9186.752612
min566.000000
25%4800.000000
50%6800.000000
75%10000.000000
max150000.000000

数据预处理

滤重

# 查看重复数据
file_data.duplicated()
0       False
1       False
2       False
3       False
4       False...  
8218    False
8219    False
8220    False
8221    False
8222    False
Length: 8223, dtype: bool
## 滤重
file_data = file_data.drop_duplicates()
file_data
区域小区名称户型面积(㎡)价格(元/月)
0东城万国城MOMA1室0厅59.11平米10000
1东城北官厅胡同2号院3室0厅56.92平米6000
2东城和平里三区1室1厅40.57平米6900
3东城菊儿胡同2室1厅57.09平米8000
4东城交道口北二条35号院1室1厅42.67平米5500
..................
8218顺义怡馨家园3室1厅114.03平米5500
8219顺义旭辉26街区4房间2卫59平米5000
8220顺义前进花园玉兰苑3室1厅92.41平米5800
8221顺义双裕小区2室1厅71.81平米4200
8222顺义樱花园二区1室1厅35.43平米2700

5773 rows × 5 columns

## 滤重后的数据
file_data.shape
(5773, 5)

处理空值

file_data = file_data.dropna()
file_data.shape
(5773, 5)

滤重及处理空值后shape一致,说明没有空值

数据类型转换

面积转化为float

file_data["面积(㎡)"].values
array(['59.11平米', '56.92平米', '40.57平米', ..., '92.41平米', '71.81平米','35.43平米'], dtype=object)
# 创建一个空的数组
data_new = np.array([])area = file_data["面积(㎡)"].valuesfor i in area:data_new = np.append(data_new, np.array(i[:-2]))
data_new
array(['59.11', '56.92', '40.57', ..., '92.41', '71.81', '35.43'],dtype='<U32')
# 转换data_new中的数据类型
data_new = data_new.astype(np.float64)
file_data.loc[:, "面积(㎡)"] = data_new
file_data
区域小区名称户型面积(㎡)价格(元/月)
0东城万国城MOMA1室0厅59.1110000
1东城北官厅胡同2号院3室0厅56.926000
2东城和平里三区1室1厅40.576900
3东城菊儿胡同2室1厅57.098000
4东城交道口北二条35号院1室1厅42.675500
..................
8218顺义怡馨家园3室1厅114.035500
8219顺义旭辉26街区4房间2卫59.005000
8220顺义前进花园玉兰苑3室1厅92.415800
8221顺义双裕小区2室1厅71.814200
8222顺义樱花园二区1室1厅35.432700

5773 rows × 5 columns

替换户型

house_data = file_data["户型"]
house_data
0        1室0厅
1        3室0厅
2        1室1厅
3        2室1厅
4        1室1厅...  
8218     3室1厅
8219    4房间2卫
8220     3室1厅
8221     2室1厅
8222     1室1厅
Name: 户型, Length: 5773, dtype: object
house_new = []
for i in house_data:
#      print(i)new_info = i.replace("房间", "室")house_new.append(new_info)file_data.loc[:,"户型"] = house_new
file_data
区域小区名称户型面积(㎡)价格(元/月)
0东城万国城MOMA1室0厅59.1110000
1东城北官厅胡同2号院3室0厅56.926000
2东城和平里三区1室1厅40.576900
3东城菊儿胡同2室1厅57.098000
4东城交道口北二条35号院1室1厅42.675500
..................
8218顺义怡馨家园3室1厅114.035500
8219顺义旭辉26街区4室2卫59.005000
8220顺义前进花园玉兰苑3室1厅92.415800
8221顺义双裕小区2室1厅71.814200
8222顺义樱花园二区1室1厅35.432700

5773 rows × 5 columns

图表分析

房源数量、位置分布分析

file_data["区域"].unique()
array(['东城', '丰台', '亦庄开发区', '大兴', '房山', '昌平', '朝阳', '海淀', '石景山', '西城','通州', '门头沟', '顺义'], dtype=object)
# 构造基础格式
new_df = pd.DataFrame({"区域": file_data["区域"].unique(), "数量": [0]*13})
new_df
区域数量
0东城0
1丰台0
2亦庄开发区0
3大兴0
4房山0
5昌平0
6朝阳0
7海淀0
8石景山0
9西城0
10通州0
11门头沟0
12顺义0
# 获取每个区域房源数量
area_count = file_data.groupby(by="区域").count()
area_count
小区名称户型面积(㎡)价格(元/月)
区域
东城282282282282
丰台577577577577
亦庄开发区147147147147
大兴362362362362
房山180180180180
昌平347347347347
朝阳1597159715971597
海淀605605605605
石景山175175175175
西城442442442442
通州477477477477
门头沟285285285285
顺义297297297297
new_df["数量"] = area_count.values
new_df
区域数量
0东城282
1丰台577
2亦庄开发区147
3大兴362
4房山180
5昌平347
6朝阳1597
7海淀605
8石景山175
9西城442
10通州477
11门头沟285
12顺义297
new_df.sort_values(by="数量", ascending=False)
区域数量
6朝阳1597
7海淀605
1丰台577
10通州477
9西城442
3大兴362
5昌平347
12顺义297
11门头沟285
0东城282
4房山180
8石景山175
2亦庄开发区147

户型数量分析

统计市场中哪种户型的房源数量偏多,并筛选出数量大于50的户型

file_data
区域小区名称户型面积(㎡)价格(元/月)
0东城万国城MOMA1室0厅59.1110000
1东城北官厅胡同2号院3室0厅56.926000
2东城和平里三区1室1厅40.576900
3东城菊儿胡同2室1厅57.098000
4东城交道口北二条35号院1室1厅42.675500
..................
8218顺义怡馨家园3室1厅114.035500
8219顺义旭辉26街区4室2卫59.005000
8220顺义前进花园玉兰苑3室1厅92.415800
8221顺义双裕小区2室1厅71.814200
8222顺义樱花园二区1室1厅35.432700

5773 rows × 5 columns

file_data.groupby(by="户型").count().sort_values(by="区域",ascending=False).head()
# .head()
区域小区名称面积(㎡)价格(元/月)
户型
2室1厅2249224922492249
1室1厅844844844844
3室1厅766766766766
3室2厅489489489489
2室2厅265265265265
# 聚合统计,输出一维结果Series
groupby_house = file_data.groupby(by="户型").count().sort_values(by="区域",ascending=False)["区域"]
# groupby_house[groupby_house["区域"] > 50]
groupby_house = groupby_house[groupby_house > 50]
groupby_house
户型
2室1厅    2249
1室1厅     844
3室1厅     766
3室2厅     489
2室2厅     265
1室0厅     244
4室2厅     191
1室1卫     126
2室1卫     120
3室1卫      92
4室1厅      58
Name: 区域, dtype: int64
groupby_house.shape
(11,)
groupby_house.index
Index(['2室1厅', '1室1厅', '3室1厅', '3室2厅', '2室2厅', '1室0厅', '4室2厅', '1室1卫', '2室1卫','3室1卫', '4室1厅'],dtype='object', name='户型')
groupby_house.values# for i in range(groupby_house.values.size):
#     print(groupby_house.values[i]) 
array([2249,  844,  766,  489,  265,  244,  191,  126,  120,   92,   58],dtype=int64)
house_size = groupby_house.index.sizeshow_houses = pd.DataFrame({"户型": [groupby_house.index[i] for i in range(house_size)],"数量": [groupby_house.values[i] for i in range(house_size)]})
show_houses
户型数量
02室1厅2249
11室1厅844
23室1厅766
33室2厅489
42室2厅265
51室0厅244
64室2厅191
71室1卫126
82室1卫120
93室1卫92
104室1厅58
# 设置索引
# show_houses.set_index("户型")
# 重置索引
# show_houses.reset_index(drop=True)
# 图形展示房屋类型house_type = show_houses["户型"]
house_type_num = show_houses["数量"]plt.barh(range(11), house_type_num)plt.yticks(range(11), house_type)
plt.xlim(0, 2500)plt.title("北京市各区域租房数量统计")
plt.xlabel("数量")
plt.ylabel("房屋类型")# 给每个条上面添加具体数字
for x, y in enumerate(house_type_num):# print(x, y)plt.text(y+0.5, x-0.2, "%s" % y)plt.show()

在这里插入图片描述

平均租金分析

分析各地区目前的平均租金情况

file_data
区域小区名称户型面积(㎡)价格(元/月)
0东城万国城MOMA1室0厅59.1110000
1东城北官厅胡同2号院3室0厅56.926000
2东城和平里三区1室1厅40.576900
3东城菊儿胡同2室1厅57.098000
4东城交道口北二条35号院1室1厅42.675500
..................
8218顺义怡馨家园3室1厅114.035500
8219顺义旭辉26街区4室2卫59.005000
8220顺义前进花园玉兰苑3室1厅92.415800
8221顺义双裕小区2室1厅71.814200
8222顺义樱花园二区1室1厅35.432700

5773 rows × 5 columns

# 合计各区域总租面积及价格
area_sum = file_data.groupby(by="区域").sum()
area_sum = area_sum.rename(columns={'面积(㎡)': '总面积', '价格(元/月)': '总金额'})
area_sum
总面积总金额
区域
东城27353.993945550
丰台50922.794404893
亦庄开发区15995.531318400
大兴35884.152286950
房山15275.41726750
昌平35972.922521515
朝阳166921.7220281396
海淀57210.397279350
石景山13956.671156500
西城37141.645636975
通州46625.232719600
门头沟20258.201048300
顺义33668.972190900
area_sum["每平米租金(元)"] = np.array(round(area_sum["总金额"] / area_sum["总面积"],2).values)
area_sum
总面积总金额每平米租金(元)
区域
东城27353.993945550144.24
丰台50922.79440489386.50
亦庄开发区15995.53131840082.42
大兴35884.15228695063.73
房山15275.4172675047.58
昌平35972.92252151570.09
朝阳166921.7220281396121.50
海淀57210.397279350127.24
石景山13956.67115650082.86
西城37141.645636975151.77
通州46625.23271960058.33
门头沟20258.20104830051.75
顺义33668.97219090065.07

之前创建的 new_df对象(各区域房源数量)与area_sum对象进行合并展示,由于这两个对象中都包含“区域”一列,所以这里可以采用主键的方式进行合并,也就是说通过 merge()函数来实现,具体代码如下。

# 重置索引
area_sum = area_sum.reset_index()
area_sum 
区域总面积总金额每平米租金(元)
0东城27353.993945550144.24
1丰台50922.79440489386.50
2亦庄开发区15995.53131840082.42
3大兴35884.15228695063.73
4房山15275.4172675047.58
5昌平35972.92252151570.09
6朝阳166921.7220281396121.50
7海淀57210.397279350127.24
8石景山13956.67115650082.86
9西城37141.645636975151.77
10通州46625.23271960058.33
11门头沟20258.20104830051.75
12顺义33668.97219090065.07
df_merge = pd.merge(new_df, area_sum)
df_merge
区域数量总面积总金额每平米租金(元)
0东城28227353.993945550144.24
1丰台57750922.79440489386.50
2亦庄开发区14715995.53131840082.42
3大兴36235884.15228695063.73
4房山18015275.4172675047.58
5昌平34735972.92252151570.09
6朝阳1597166921.7220281396121.50
7海淀60557210.397279350127.24
8石景山17513956.67115650082.86
9西城44237141.645636975151.77
10通州47746625.23271960058.33
11门头沟28520258.20104830051.75
12顺义29733668.97219090065.07
# 图形可视化num = df_merge["数量"]
price = df_merge["每平米租金(元)"]
lx = df_merge["区域"]
l = [i for i in range(13)]fig = plt.figure(figsize=(10, 8), dpi=100)# 显示折线图
ax1 = fig.add_subplot(111)
# "or-" 显示那个小红圆点
ax1.plot(l, price, "or-", label="价格")
for i, (_x, _y) in enumerate(zip(l, price)):plt.text(_x+0.2, _y, price[i])
ax1.set_ylim([0, 160])
ax1.set_ylabel("价格")
plt.legend(loc="upper right")# 显示条形图
ax2 = ax1.twinx()
plt.bar(l, num, label="数量", alpha=0.2, color="green")
ax2.set_ylabel("数量")
plt.legend(loc="upper left")
plt.xticks(l, lx)plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kKXxW3pR-1612017777844)(output_57_0.png)]

从图中可以看出,西城区、东城区、海淀区、朝阳区的房租价格相对较高,这主要是因为东城区和西城区作为北京市的中心区,租金相比其他几个区域自然偏高一些,而海淀区租金较高的原因推测可能是海淀区名校较多,也是学区房最火热的地带,朝阳区内的中央商务区聚集了大量的世界500强公司,因此这四个区域的房租相对其他区域较高。

面积区间分析

下面我们将房屋的面积数据按照一定的规则划分成多个区间,看一下各面积区间的上情况,便于分析租房市场中哪种房屋类型更好出租,哪个面积区间的相房人数最多.

将数据划分为若干个区间,则可以使用Pame中的cut()函数来实现,首先,使用max()与min()方法分别计算出房屋面积的最大值和最小值,具体代码如下。

# 查看房屋的最大面积和最小面积
print('房屋最大面积是%d平米'%(file_data['面积(㎡)'].max()))
print('房屋最小面积是%d平米'%(file_data['面积(㎡)'].min()))# 查看房租的最高值和最小值
print('房租最高价格为每月%d元'%(file_data['价格(元/月)'].max()))
print('房屋最低价格为每月%d元'%(file_data['价格(元/月)'].min()))
房屋最大面积是1133平米
房屋最小面积是11平米
房租最高价格为每月150000元
房屋最低价格为每月566元
# 面积划分
# 将房屋面积划分为8个区间。
area_divide = [1, 30, 50, 70, 90, 120, 140, 160, 1200]
area_cut = pd.cut(list(file_data["面积(㎡)"]), area_divide)
area_cut
[(50, 70], (50, 70], (30, 50], (50, 70], (30, 50], ..., (90, 120], (50, 70], (90, 120], (70, 90], (30, 50]]
Length: 5773
Categories (8, interval[int64]): [(1, 30] < (30, 50] < (50, 70] < (70, 90] < (90, 120] < (120, 140] < (140, 160] < (160, 1200]]
# 使用describe()方法显示各个区间出现的次数( counts表示)以及频率(freps表示)
area_cut_num = area_cut.describe()
area_cut_num
countsfreqs
categories
(1, 30]410.007102
(30, 50]7100.122986
(50, 70]15660.271263
(70, 90]10940.189503
(90, 120]10820.187424
(120, 140]3810.065997
(140, 160]2740.047462
(160, 1200]6250.108263
# 图像可视化
area_per = (area_cut_num["freqs"].values)*100labels = ['30平米以下', '30-50平米', '50-70平米', '70-90平米','90-120平米', '120-140平米', '140-160平米', '160平米以上']plt.figure(figsize=(20, 8), dpi=100)
# plt.axes(aspect=1)plt.pie(x=area_per, labels=labels, autopct="%.2f %%")plt.legend()
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gS3nYvI1-1612017777845)(output_63_0.png)]


http://www.ppmy.cn/news/522217.html

相关文章

华硕电脑重装win10专业版后设备管理器认不到3060laptop显卡了

求助求助求助&#xff01;&#xff01; 华硕电脑重装win10专业版后设备管理器认不到3060laptop显卡了&#xff01;

笔记本升级intel显卡驱动失败如何手动安装-驱动人生

驱动人生收到用户描述说&#xff0c;有些笔记本在驱动人生8更新intel显卡驱动时提示&#xff0c;无法为此计算机验证验证正在安装的驱动程序&#xff0c;安装程序将要退出。   我们先来分析一下&#xff0c;驱动人生8提供的显卡驱动&#xff0c;都是来自intel官方&#xff0…

【玩机】华为,vivo系统,iqoo通过adb关闭系统升级更新

1.首先说一下九黎为什么要去除更新&#xff1f; 因为就个人感觉&#xff0c;还是喜欢最开始的那版系统 2.为什么不直接关掉自动更新按钮呢&#xff1f; 关闭之后有小红点&#xff0c;看起来不舒服&#xff0c;偶尔会点到 免责声明:本博客提供的所有内容仅供学习、分享与交流&am…

win10+英伟达mx150安装cuda,cudnn,GPU版本pytorch(荣耀magicbook2018)

最近打算给笔记本装一个gpu版本的pytorch,装了有半天才搞完&#xff0c;中间也出现了不少问题看了不少博客&#xff0c;现在总结一下出现的问题以及解决办法&#xff0c;希望能给遇到同样问题的提供一些帮助。本人水平有限&#xff0c;有问题还请指正。 我这里装的是pytorch1.…

【GPU加速】笔记本双显卡如何切换

Nvidia的双显卡切换设置&#xff1a; NVIDIA开发的optimus技术&#xff0c;不需要用户自己干预&#xff0c;系统会自动判断当前任务&#xff0c;然后选择显卡执行任务。当然如果驱动无法正确识别&#xff0c;或者有些程序不需要使用独立显卡&#xff0c;但是用户想用独立显卡运…

iPhone、iPad、iPadMini界面设计标准

一&#xff1a;iPhone 4.0‘ Display&#xff1a; iPhone 5、iPhone 5S、iPhone 5C。 分辨率&#xff1a;1136 * 960 设计标准参照下图iPhone5 3.5’ Display: iPhone4S、iPhone4、iPhone3GS&#xff08;非Retina屏&#xff09; 分辨率&#xff1a; 960 * 640 设计标准…

给 iOS 装上旧版 APP,十年前的 iPad mini 重获新生!

不知道有没有人像我一样&#xff0c;还留着五年前、十年前的老 iPad、老 iPhone&#xff0c;如果有&#xff0c;你们一定知道有些老 iPad、老 iPhone 已经停在一个系统版本无法再继续升级了&#xff0c;或者因为害怕升级变卡顿&#xff0c;所以我们选择了不给系统升级&#xff…

小马哥----高仿三星note3 N9006主板型号A202 高通芯片刷机拆机图示

高仿三星note3 N9006主板型号A202 v3.0 A202有两种芯片 一种是mtk6589 一种是高通芯片 注意鉴别 上图