当前位置: 首页 > news >正文

Python、R语言Lasso、Ridge岭回归、XGBoost分析Airbnb房屋数据:旅游市场差异、价格预测|数据分享...

全文链接:https://tecdat.cn/?p=37839

分析师:Kefan Yu

在大众旅游蓬勃发展的背景下,乡村旅游已成为推动乡村经济、社会和文化发展的关键力量。当前,乡村旅游接待设施主要以招待所、小宾馆和农家乐等形式存在。然而,一方面这些设施的接待能力有限,另一方面为了维护乡村独特的景观特色,住宿设施也不宜完全照搬城市酒店的规模和形制点击文末“阅读原文”获取完整代码数据)。

民宿作为一种利用自家闲置房屋、以家庭经营为主且能提供多种特色服务的接待设施,恰好能满足上述两项需求。

本文包含:Python分析Airbnb 数据:洞察市场差异、价格因素与旅行价值|附数据代码和房源价格预测模型研究|附数据代码。通过对客户的这些数据的挖掘和研究,旨在揭示 Airbnb 房源在时间序列变化、用户评论情感分析以及房源各方面特征可视化等方面的规律,为乡村旅游接待设施的发展以及 Airbnb 平台的优化提供有价值的参考依据。同时,通过建模与分析过程,探索影响房源价格的关键因素,进一步提升对房源价格预测的准确性,为房东、租客和平台运营者提供决策支持。

Airbnb房屋数据集的房屋现状分析及价格预测

分别针对calendar、reviews和listings三张表查看文末了解数据免费获取方式进行探索性分析。

1.calendar表

时间序列分析

calendar表展示了西雅图2016年1月到2017年1月3818所房子的是否可定状态和每一天的房屋价格,通过对每一天的房屋价格取均值以及对每一天房屋可定状态的计数,我们可以分别得到价格的时间序列图和每日空闲房屋数量的时间序列图。

1e84bec3baec953c9d356ad7af3800d3.pngfe1e4fb062494a78420aa5902a1afed7.png

从这个图中我们可以看到民宿房屋的价格在7、8月达到了一个高峰,可以想见是因为7、8月正值放假外出游玩的时候,房屋的价格也相应上涨。于此同时,空闲房屋的数量在1月、7月分别有所下降,也就是说在这两个时间段订房人数急剧增长。由于空闲房间数量图时间序列特征并不明显,我们在此仅对房屋价格进行时间序列分析和预测。由于我们要进行的ARIMA时间序列分析需要的是一个平稳的序列,当我们得到的时间序列不平稳时,通过做时间序列的差分,直到得到一个平稳的时间序列。

这里分别采用了移动平均法和指数平均法进行平滑处理,得到下图:

1689bc4256279c3307adbc0abd0312fa.png

从上图可以发现窗口为12的移动平均能较好的剔除年周期性因素,而指数平均法是对周期内的数据进行了加权,能在一定程度上减小月周期因素,但并不能完全剔除,如要完全剔除可以进一步进行差分操作。先用pandas将序列差分好,然后在对差分好的序列进行ARIMA拟合。

2a0275df20f5d3a5289d4730e5b658f5.png

148dea8d8939c74b9fcf3858c599956c.png

从上面的统计检验结果可以看出,经过12阶差分和1阶差分后,该序列满足平稳性的要求了。

1.ARMA(0,1)模型:即自相关图在滞后1阶之后缩小为0,且偏自相关缩小至0,则是一个阶数q=1的移动平均模型;

2. ARMA(7,0)模型:即偏自相关图在滞后7阶之后缩小为0,且自相关缩小至0,则是一个阶层p=3的自回归模型;

3. ARMA(7,1)模型:即使得自相关和偏自相关都缩小至零。则是一个混合模型。

4. ARMA(8,0)模型:即偏自相关图在滞后8阶之后缩小为0,且自相关缩小至0,则是一个阶层p=3的自回归模型;

目前选择模型常用如下准则:

* AIC=-2 ln(L) + 2 k 中文名字:赤池信息量 akaike information criterion

* BIC=-2 ln(L) + ln(n)*k 中文名字:贝叶斯信息量 bayesian information criterion

* HQ=-2 ln(L) + ln(ln(n))*k hannan-quinn criterion

以上四个模型得到的AIC、BIC、HQ数值如下:

674c2753be6d91fd0b9966c8d4d7bf4f.png4d774e1f059d0600a798e2087c9f2266.png  2097245f5ded007a3fffb7e76f1f5c82.png64acfc0933ff00f36fa92ab284ff0b09.png

通过比较得到ARMA(8,0)各项数值都最小,因此是最佳模型。

通过ARMA(8,0)进行2017年-2018年房屋价格预测,得到结果如下:

b347353b7ab276a34e8786050c12c03b.png

可以看到房屋均价基本在135-140浮动,将预测数据与原数据进行对比,此处未对原数据进行平稳性处理,但是可以看出预测准确性还是比较好的,

71b1b1f4afb6b8196db172200f02b892.png

2.reviews表

文本处理——针对Airbnb房屋评论的情感分析

在listings、calendar和reviews这三张表中,含有多个文本型属性,但是对最终房屋的价格预测影响最大的还是用户对各房屋的评论内容。所以对reviews表中的comments内容通过情感分析进行量化处理,并用于最终的模型建立(价格预测)。具体过程如下:

2.1.文本一级清洗

首先查看reviews表中comments这一属性的缺失值情况:在84849条数据中,仅有17条评论信息是缺失的,占比很小而且作为文本型数据无法进行填补,故做删除缺失值处理。

cc6c033bcbe31db7ef1da35831a43e6c.jpeg

8c17374cc9ce7767f913458909ef8955.png

删除后,在review这张表中剩余84832条完整评论信息。将comments的类型转变为字符型,并利用removewords这一函数去除comments中的标点符号和stopwords中的停用词,通过tolower这一函数将所有的评论信息变成小写形式,最后输出前五条评论内容进行查看:

34665d1a629ab37279fd1e97c8c0e0fe.png

2744d0efebce52b4e2301433a6a3de9a.png

在利用tolower这一函数时,出现了报错:

996dcb5d7c78753af2e3eeb6f865b8af.png

经查看,发现comments中的文本内容较脏乱,不仅包含英文,还包含中文和日文等多种语言,但是在84832条评论数据中,除英文以外的字符非常少,而且一般形式表现为其他语言掺杂在英文中,英文仍是每条评论的主体,所以将除英文以外以其他语言形式存在的字符作为异常字符进行删除处理。做法是通过removerwords这一函数去除每条comments中除英文(大小写)和空格以外的字符,表现形式是利用正则表达式:[^A-Za-z0-9 _]

c592e823034a6ac1ec44bc8a52ca0174.png

去除异常字符后再将comments中的内容转变为小写形式,并查看前五条评论信息:

a69574d704125805eb3ab15a2d85ba6b.png

从以上两次数据对比可以看出小写转换成功。

2.2.文本二级清洗——词频、词云等可视化展示

为了更方便进行可视化内容,将review表中的comments内容赋给r这一变量。

a.保留词根

首先进行只保留词根(stemming)处理,当同一个单词结尾不同,但是却代表相同的含义的时候,我们通过只保留这些单词词根的方法来去掉冗余。例如argue, argued, argues, 以及 arguing代表的是相同的含义,但是被按照不同的单词来计数,因此可以通过只保留词根的方法,让他们用一个共同的词根argu代替。 故利用tm_map函数通过stemdocument这一功能保留r中的词根:

a8ce1d60e672778491394e2983c3df34.png

b.创建单词频率矩阵

利用documenttermmatrix函数建立单词频率矩阵,其中每一行代表每一条评论信息,每一列代表对应推文中出现的一个单词,矩阵中的数值为每个单词在每个观测值中出现的频率(次数)。具体过程和结果如下:

00d79c3bd5397e71ce1611362c840f22.jpeg

由此可见,frequencies中包含了84807个观测值和45881个单词。

查看第1-10行矩阵内容:

1d986ce296b2eec18ca18b709b766558.jpeg

查看出现至少1000次的高频词汇:

3a27df909f3ce3fd5a87bf079e74d077.jpeg

(部分高频词汇)

我们可以发现,在45881个单词当中,只有504个词出现的频率不少于1000次,因此我们可以去除一些低频词汇,因为这些低频词汇对于模型预测没有较大的帮助,且其存在会导致大量的计算,进而延长模型运算的时间。

fb1cf9688753c4da4ecc96da2541a12d.jpeg

将低频词汇剔除后,sparse中只包含了839个观测值。

c.画制词云

首先利用tm包中的VCorpus函数把comments的内容作为R对象、保存在内存中,建立动态语料库,然后再通过TermDocumentMatrix函数把comments转化为DTM矩阵形式,最后利用wordcloud包中的wordcloud函数画制评论的词云图像,具体过程和结果如下:

c2d2664400ed790ad9a799535947cb62.png

f5b824827280d7fe78dc2863fde95127.png

词云图像:

a6e84554bb716858087cf152c66d62df.png

2.3.情感分析并评分

首先从CSDN网站上下载英文的正负面情感词汇的txt文件,导入R中,分别命名为negative(消极)和positive(积极)。并将negative和positive中的词语加上权重(weight),设置negative中的每一个词语的权重(weight)都为-1,positive中的权重(weight)都为1,这也意味着最终评分结果越大说明该条评论越积极,评分越小说明该条评论越消极。,然后再利用cbind函数将negative 和positive通过term这一列名相同的属性合并起来,得到posneg这一带有权重的最终情感数据集。

Negative中含有1011条数据和term、weight两个变量,positive中含有773条数据和term、weight两个变量,posneg中含有1784条数据和term、weight两个变量。

413475d0d31673876386d0b0858eacd9.png

在posneg数据集中建立pn这一空数值型属性表示每条评论文本的情感得分情况。评分过程是利用两个for循环嵌套的形式,外面的循环是针对每一条评论信息进行搜索,里面的循环表示为针对每一条评论信息,将posneg中所有的词语搜索一遍,如果词语在评论信息中,pn(评分)则加上相应的weight值,若不在,pn(评分)则加上0。具体过程如下:

cdc305193fa65607f34627441d6dc8da.png

由于是双层嵌套,而且数据量较大,在经过10个多小时的等待后,最终在review表中加上了每条评论的情感分析评分值(pn),结果如下:

17080c48b97ecbefbfe55bff30ed9af6.png

2.4.合并listings表

首先将review表中的评分以listing_id为依据对pn(评分)进行分类取均值,并将id和av(平均评分)保存在变量av中。再利用merge函数以id为依据连接listings和av两张表,得到用于最终建立模型的lr数据集。lr中包含3191条数据,与最初的listings数据集相比,少627条数据,说明airbnb网站上的这627个房屋是没有用户对其进行过评论的。

f2e718c13c74609118d40831e24d8c10.png

3.listings表——可视化

利用ggplot函数对listings表中的信息进行可视化展示,主要从房屋整体评分、房东可信度、房屋情况、地理位置和评论情况五个角度出发探寻房屋各方面信息之间的关系。具体过程和结果如下:

3.1.房屋整体评分——主成分分析

主成分(PCA)分析的一般步骤如下:根据变量间的相关性来推导结果。用户可以输入原始数据矩阵或者相关系数矩阵到principal()和fa()函数中进行计算,在计算前请确保数据中没有缺失值。

(1)判断要选择的主成分数目(这里不涉及因子分析)。

(2)选择主成分(这里不涉及旋转)。

(3)解释结果。

(4)计算主成分得分。

接下来就对我们处理好的数据进行主成分分析,对于3190个房屋,我们通过princomp()函数得到27个主成分,接下来对这些主成分进行筛选。

605dc5e98da4ebd3bdea91958c672f71.png

下图中proportion of variance是它本身对原本所有数据的方差的解释程度,你可以理解为,这个成分包含了原始数据中12.38995%的信息;图中的Loadings那个矩阵就是由相关系数矩阵的特征向量按列组成的,比如Comp.1就是y=0.103*host\_since -0.103*host\_total\_listings\_count-0.102*property\_type+0.226*room\_type-0.298*accommodates-0.343*bathrooms-0.428*bedrooms-0.434*beds-0.298*amenities-0.352*guests\_included-0.156*extra\_people。

9284f8ce2763704bcd852b0ce5fb0bc1.png4725ae8c7b3c72451742a6514d83e5c5.pngaa903fd75946f5b64c6cdfbc7e4bd9af.pnge03ae9dce1161cf2dbb366986b0a5e99.png

接下来根据碎石图确定主成分个数,一般选择折线中最陡的作为主成分:

cf1a5c909e028451daa4353b8cd6acf1.png

根据上图,我们可以看到在1.0以上的主成分较多,而且图中并没有显示完整所有的主成分,于是我们简单地将proportion of variance累计加总超过80%的作为我们需要的主成分,经过计算,我们保留comp.1-comp.17。

接下来我们利用predict()函数计算得到各个样本主成分的数据:

ef9f478a41f09e3bd4be1f5146e0e0d4.png

那么最终的指标,就应该是:

Comp.1 + b Comp.2 + c Comp.3的形式,a、b、c的系数根据方差解释度加权计算。每个主成分的方差解释度就是权重。于是最终得到的结果是:0.144685474*comp1+0.103517783*comp2+0.088334388*comp3+0.080439282*comp4+0.064441851*comp5+0.059679916*comp6+0.054120375*comp7+0.049404508*comp8+0.047919824*comp9+0.043365062*comp10+0.042361952*comp11+0.042054807*comp12+0.040463786*comp13+0.038121588*comp14+0.036172379*comp15+0.032646371*comp16+0.032270655comp17。

我们可以直接用comp1-comp17作为变量组合进行后续的回归等分析,也可以直接用上面的式子对房屋状况进行打分,分数越高,房子的评价也就越好,我们对前六所房子的打分如下:

7fd42bc0174d9f6f21c5e7b14f1136b4.png

3.2. 房东可信度

a.利用变量host\_verifications、host\_response\_rate和host\_is\_superhost三个变量绘制点图,host\_verifications作为x轴,host\_response\_rate作为y轴,点的不同颜色表示为host\_is\_superhost不同的值。

a9d8caab92494c6eb2b6ebf1b89b67b0.jpeg

从上图可以看出:房东的认证方式越多,平均反应速度越快,可信度越高,而且普遍来看,大房东的平均反应速度快于二房东的平均反应速度。

b.房东入驻airbnb年份统计:

以对host_since进行年份提取后的变量year作为x轴,统计不同年份入住的房东人数并进行对比,结果如下:

825e576218bf07bf211e3f1c3b74a42d.png

从上图可以看出:airbnb的房东入驻人数是在逐年上升的,这说明该平台在不断的壮大,发展前景和趋势很好。但是增加的幅度却在减小,市场竞争压力大,在一定意义上,提醒着airbnb企业关注房屋资源的饱和度问题。

3.3. 地理位置——地理位置对价格的影响程度:

以经度作为x轴,维度作为y轴绘制点图,在平面图中以点的形式表现房屋的位置信息,并通过“color=price”这一表达式,以点的颜色深浅表示price的变化情况,结果如下:

368b995024b78ecefc1c34d8b3f25ed4.png

从上图可以看出:房屋主要集中在中间地带,而且价格变化并不剧烈,一般都在250美元以下。

3.4. 房屋情况

a.针对不同房屋类型、房间类型的频数展示

以property\_type作为x轴,对3818个房屋的类型进行频数展示,再用不同的颜色表示不同的room\_type(房间类型)对每个房屋类型中的房间类型进行划分,结果如下:

596d2db5dd7306935098e74bdba0d4cc.png

从上图可以看出:apartment和house的房屋类型占比最大,而在不同的房屋类型中,房间类型的分布各不相同,但entire home/apt和private room的分布最为广泛。

b.房屋类型与价格的关系

以room\_type作为x轴,property\_type作为y轴,price作为color,展示房屋、房间的种类对房屋租赁价格的影响,结果如下:

192a12ec53ebebd95008b746a9bcd511.png

虽然价格的变化并不是很明显,但从上图仍可以看出不同的房间、房屋种类对房屋价格的影响程度。例如相对来说,entire home/apt的房间种类的价格偏高一些;Dorm这一房屋类型只包含shared room这一种房间类型,而且租赁价格很低。

c.最多最少居住时间和价格

以价格作为x轴,房屋的最多、最少居住天数之差作为y轴,绘制柱形图,探寻不同价格的房屋所允许的居住天数变化范围大小情况,结果如下:

61217f67153cb9bbcdfe333b36f2288e.png

从上图可以看出:价格越高的房屋允许居住天数的变化范围越小,价格越低的变化范围越大。这说明有些价格低的房屋可能是以居住时间的灵活性作为竞争优势来吸引用户,而价格高的房屋往往是由于自身的房屋条件和质量好,所以对居住时间的要求较严格。

d.房屋所含房间数量和设备数量:

以amenities(电视、空调等设备数量)作为x轴,acoommodates(房屋包含的房间数量)作为y轴,通过绘制点图探寻两者之间的关系,结果如下:

436b0d040e0f8fcf4a0ebccbb32f170a.png

从上图可以看出:amenities和acoommodates之间呈线性正相关的关系,房间的数量越多,房屋的设备越齐全,符合实际情况。

e.房屋价格的频数统计:

以price作为x轴,统计这3818个房屋的价格分布情况。结果如下:

9be2e5307b1860b0d19b1201f1b51c5e.png

从上图可以看出:price的分布确实以较小数值(低价格)为主,80%以上的房屋价格都在200美元以内。

3.5.评论情况

评论平均评分和价格的关系:

通过对reviews表中comment的打分,我们得出用户对listings中3818个房屋的平均评分情况——av。以av为x轴,price为y轴,绘制点图,探寻用户评分对于房屋价格的影响,结果如下:

b9f830a55e792bbaa555a302b28aff6f.png

从上图可以看出:用户评分对价格的影响并不大,影响更多的可能是用户对于同等价位房屋的选择,此外,在airbnb的网站上仍存在用户评分很高,但是价格并不高的物美价廉的房屋。

五、数据进一步处理

主要针对reviews和listings合并后的lr数据集做进一步的处理和填补,为建立最终的预测模型做准备。

1.转换

将分类属性转变为因子型

Lr的28个属性中,还包含一些分类属性,例如:host\_is\_superhost中含有t和f两类,利用factor将其转变为因子型,再通过as.numeric进行数值化转换,最终将分类属性量化成数字形式。由于这些分类属性中所含的类别较少,一般2~3类,故不需进行亚变量处理。此类变量有:is\_location\_exact、host\_identity\_verified、cancellation\_policy和host\_is_superhost。

2.填补

首先因为拿到手的数据集比较脏,里面不仅有明显的含有空值的数据,还有通过文本显示为空的数据,于是我们先将文本型的“NA”、“N/A”统一转化为NA。通过mice包中的md.pattern函数和aggr函数我们可以看到经过变量删除后的缺失值情况:

d8c7ae8fddbb67271bd9a6f296659602.png

可以看到缺失值大概占一个属性的15%左右,这是我们可以接受的;而且缺失值集中地分布在几个属性值中,我们可以推测这几个属性的数据是一起缺失的,具有较高的相关性,经过观察,我们发现这些一起缺失的属性都跟评论有关,或许是因为这些房子刚刚投入Airbnb使用,尚未有人居住过。于是我们先对其他属性中零星的缺失值(仅缺失1-2条的数据)进行简单的删除处理,经过此步还有3190条数据。

接下来通过corrplot包对缺失值之间的相关性进行一个分析,将lr中的数据根据是否缺失转化为0-1矩阵后,在这个矩阵中仅留下含缺失值的列,可视化结果如下:

ffbab0495e8e0216cc3de09ef5d500aa.png

通过图形,我们可以确切地看到所有关于reviews的数据缺失值的相关性已经高度接近1了,但如果采用对所有关于reviews的属性进行补缺,或许得到的完整的数据集可信度不高。经过讨论,我们决定将这些有关评论的属性进行直接删除,因为通过下文的文本挖掘处理,我们能直接得到关于评论的一个平均分数。于是在这一步仅对bedrooms,bathrooms,host\_response\_rate进行缺失值的插补。

对于bedrooms和bathrooms,因缺失值较少,我们仅进行均值插补处理,sub <- which(is.na(lr$bathrooms)),sub中存储了bathrooms中有缺失的行数,lr1存储了bathrooms无缺失值的整个数据集的子集,而lr2中存储了仅有缺失值的子集。

1939a33f1ced48470f0b446768011b68.png  通过avg_sales得到的均值,对lr2中的缺失值进行填补,再将lr1和lr2组合起来,得到补全后的数据集,对bedrooms的补缺同理。

而对于host\_response\_rate,因缺失值高达300余条,我们采用mice包中的函数进行多重插补处理。通过mice()函数利用平均值插补法生成了五个完整的数据集,提取其中的第三个作为我们的最终结果。

六.建模与分析过程

1.自相关分析

对最终数据集lr(listings和reviews连接后)中的28个属性绘制自相关图,结果如下:

ba49b08b080162dbcb19122732a37913.png

从上图可以看出,accommodates和amenities的相关性很大,number\_of\_reviews和reviews\_per\_month的相关性很大,所以在对price进行影响因素分析和预测时,可能存在自相关问题。


点击标题查阅往期内容

127127a7ad1cb8ee11e20d34fc2249c9.png

PYTHON用户流失数据挖掘:建立逻辑回归、XGBOOST、随机森林、决策树、支持向量机、朴素贝叶斯和KMEANS聚类用户画像

outside_default.png

左右滑动查看更多

outside_default.png

01

b832c3445a9a3c066a209e928af6dfa1.png

02

02bfbc9e179baef78668c21c98fcfadd.png

03

e80bb730756c5212bb035b1d8fe2d422.png

04

1f0f3a324c2ac60f6aec76c4e039d067.png

2.影响因素分析

采用线性回归的方式分析l中各变量对price的影响,并分别选取影响程度大的变量组成新的数据集l,用于对两者模型的建立和预测。

503eb79653f6bb0546bec554c1b5d35a.jpeg

aaba6bdc96f73dc0b942ae949de23a56.jpeg

对price影响大的变量有host\_is\_superhost、longitude、property\_type、room\_type、bathrooms、bedrooms、beds、guests\_included、reviews\_per_month这九个变量。整个线性回归模型的R^2为0.5622,调整后为0.5587,并不是很大。此外,在对price的影响自变量进行挑选过程中,剔除掉了自相关性很强的变量,正好解决了上述的自相关问题。

3.划分训练集和测试集

首先进行训练集和测试集的划分,以7:3的比例将数据集listings1分为训练集train和测试集test。

a5f8ee0bf8b58098fa4c4e6e3e203f7d.jpeg

4.建立模型

Price属于连续型数值变量,不能够像分类型变量一样简单地通过table这一操作才评估模型的好坏。因此,在评估price预测模型时,我们选择用R^2和MSE来评估,具体公式如下:

d48253d13deaba4e420fa17098deb6b1.png                  a7ca1a23ce6c4483484f25849bbc936c.png

(MSE)                                     (R^2)

4.1.回归分析

由于price是连续型变量,我们采用线性回归模型进行分析,通过lm()函数对测试集进行预测。

ee245364269da744e1e021d353e1252b.png

调整后的R^2=0,5534,说明线性回归模型的拟合效果一般。

4.2.lasso分析

Lasso回归又称为套索回归,是Robert Tibshirani于1996年提出的一种新的变量选择技术。Lasso是一种收缩估计方法,其基本思想是在回归系数的绝对值之和小于一个常数的约束条件下,使残差平方和最小化,从而能够产生某些严格等于0的回归系数,进一步得到可以解释的模型。R语言中有多个包可以实现Lasso回归,这里使用lars包实现。

36bd03c173d2271cff44461e068dcfca.png

可以看到lasso回归得到的模型拟合度为0.553,较低。框中部分为自变量加入模型的顺序,下图为这个过程的可视化展示。从这个过程中我们发现很有意思的一点是卧室的数量,其次是床的数量对于房屋的价格有着较高的影响,但是房东本人的一些数据反而对房屋价格影响不大,也就是说一个房屋的价格还是更多收到房屋本身的影响,而不怎么受到房东个人品质等的影响,不过这个结果也是情理之中的。

609673d199bffa6b602e656642fd4333.png

4.3.随机森林

考虑采用随机森林模型对price这一连续型变量进行预测。

首先确定随机森林中包含的最优决策树数量——ntree:

4ed94d6cc50ae5bfbcfaf07ba1543f48.jpeg

f5736b08cafe3260c527393c45fbcfe4.jpeg

根据上图中的结果显示,在决策树的数量等于200时,曲线稍微出现波动,200过后,趋于平缓,所以选择200作为ntree的值。

建立模型并查看模型变量的重要性以及模型的R^2和MSE值

5cb6222c3926d57266adb0512aa30b28.jpeg

1bf16457a5b1fe42ceb80dcdea637db0.jpeg

8d1fb9f3dfe008595f8f7880e8c33cc3.jpeg

结果显示,随机森林模型的R^2为0.615,虽然相比线性回归模型,R^2更大一些,但拟合效果仍不是很好。随机森林在解决回归问题时,确实没有像分类时表现的那么好,可能因为它并不能给出一个连续的输出。当进行回归时,随机森林不能够做出超越训练集数据范围的预测,这可能导致在某些特定噪声的数据进行建模时出现过度拟合。

Python分析Airbnb 数据:洞察市场差异、价格因素与旅行价值|附数据代码

接下来通过对 Airbnb 数据的深入分析,旨在探讨不同城市间 Airbnb 市场的差异、影响价格的主要因素、评价数据中的趋势和季节性,以及哪个城市提供更高的旅行价值。使用 Python 编程语言和相关数据分析库,对大量的 Airbnb 房源和评价数据进行处理和可视化,以得出有价值的结论。

随着共享经济的兴起,Airbnb 作为全球知名的短租平台,在旅游和住宿领域发挥着重要作用。了解不同城市的 Airbnb 市场特点、价格影响因素以及评价趋势,对于旅行者、房东和平台运营者都具有重要意义。本文将通过对 Airbnb 数据的详细分析,回答以下四个关键问题:

  1. 不同城市的 Airbnb 市场有哪些主要差异?

  2. 哪些属性对价格影响最大?

  3. 能否在评价数据中识别出趋势或季节性?

  4. 哪个城市提供更好的旅行价值?

数据来源与处理

(一)数据

数据涵盖了多个城市的 Airbnb 房源信息和用户评价。

(二)数据处理步骤
  1. 导入库:首先导入必要的 Python 库,包括 numpypandasdatetimematplotlib.pyplot 和 seaborn 等,用于数据处理、分析和可视化。

import numpy as npimport pandas as pdimport datetime as dtimport matplotlib.pyplot as pltimport seaborn as sns
  1. 加载数据集:使用 pandas 库读取房源列表和评价数据文件,设置适当的编码和内存参数,以确保数据能够正确加载。

# 加载房源数据集listings = pd.read\_csv("reviews/Airbnb Data/Listings.csv", encoding='latin', low\_memory=False)# 加载评价数据集reviews = pd.read_csv('/ngs-reviews/Airbnb Data/Reviews.csv')
  1. 数据类型转换和内存优化:检查房源数据的信息,确定数据类型和内存使用情况。将某些列的数据类型转换为分类数据类型,以减少内存占用。

# 查看房源数据信息listings.info()# 将特定列转换为分类数据类型cat\_cols = \['host\_is\_superhost', 'host\_has\_profile\_pic', 'host\_identity\_verified', 'neighbourhood', 'district', 'city', 'property\_type', 'room\_type', 'instant\_bookable'\]listings\[cat\_cols\] = listings\[cat_cols\].astype('category')# 再次查看房源数据信息listings.info()
  1. 检查重复值和空值:检查数据中是否存在重复行和空值。确保数据的完整性和准确性,以便进行后续分析。

# 检查重复行duplicates = listings\[listings.duplicated()\]# 检查特定列中的空值check\_nulls = \['listing\_id', 'name', 'host\_id', 'host\_since', 'host\_location','host\_response\_time', 'host\_response\_rate', 'host\_acceptance\_rate','host\_is\_superhost', 'host\_total\_listings\_count','host\_has\_profile\_pic', 'host\_identity\_verified', 'neighbourhood','district', 'city', 'latitude', 'longitude', 'property\_type','room\_type', 'accommodates', 'bedrooms', 'amenities', 'price','minimum\_nights', 'maximum\_nights', 'review\_scores\_rating','review\_scores\_accuracy', 'review\_scores\_cleanliness','review\_scores\_checkin', 'review\_scores\_communication','review\_scores\_location', 'review\_scores\_value', 'instant\_bookable'\]null\_data = listings\[listings\[check\_nulls\].isnull().all(axis = 1)\]
  1. 日期列处理:将房源数据中的 host_since 列转换为日期时间类型,并添加一个新的 year_month 列,用于后续的时间序列分析。

# 将 host\_since 列转换为日期时间类型listings\['host\_since'\] = pd.to\_datetime(listings\['host\_since'\])# 添加 year\_month 列listings\['year\_month'\] = listings\["host\_since"\].dt.to\_period('M')
  1. 数据合并:将房源数据和评价数据按照 listing_id 进行合并,以便进行综合分析。

# 合并房源和评价数据df  = listings.merge(reviews, how = 'inner', on = 'listing\_id')# 添加月份列df\['month'\] = pd.to\_datetime(df\['date'\]).dt.monthdf.info()

问题分析与结果

(一)不同城市的 Airbnb 市场差异
  1. 分析方法:通过对不同城市的房源按照是否可即时预订进行分组计数,并绘制柱状图,直观地展示不同城市之间的差异。

# 按城市分组统计即时预订房源数量并排序city\_instantbookable = listings.groupby('city')\['instant\_bookable'\].count().sort\_values(ascending=False)print(city\_instantbookable)# 绘制柱状图plt.figure(figsize=(15,8))city\_instantbookable.plot(kind='bar', color='#570eab')plt.title('Number of Listings per City by Instant Bookable')plt.xlabel('City')plt.ylabel('Number of Listings')plt.xticks(rotation=45, ha='right')for i, v in enumerate(city\_instantbookable):plt.text(i, v, str(v), ha='center', va='bottom')plt.show()
  1. 结果解读:巴黎的即时预订房源数量最多,达到 64690 个,而香港的即时预订房源数量最少,为 7087 个。这表明巴黎在 Airbnb 市场上的活跃度较高,而香港的市场相对较小。

ba347dcec95e8ab91cdf931f73e3c7b4.png

(二)影响价格的因素
  1. 分析方法:首先确定与价格相关的数值型列,创建新的数据框。然后计算这些列与价格列之间的相关性矩阵,并对矩阵进行排序,找出与价格相关性最高的属性。同时,绘制热力图,直观地展示各个属性与价格之间的相关性。

# 创建数值型列列表numerics = \['accommodates', 'bedrooms', 'minimum\_nights', 'maximum\_nights','review\_scores\_rating','review\_scores\_accuracy', 'review\_scores\_cleanliness', 'review\_scores\_checkin','review\_scores\_communication', 'review\_scores\_location', 'review\_scores\_value'\]# 创建新的数据框numeric\_df = listings\[numerics + \['price'\]\]# 计算相关性矩阵correlation\_matrix = numeric\_df.corr()# 按价格相关性排序price\_correlation = correlation\_matrix\['price'\].sort\_values(ascending=False)print(price\_correlation)# 绘制热力图plt.figure(figsize=(10,8))sns.heatmap(correlation\_matrix, annot=True, cmap='coolwarm', fmt='.2f')plt.title('Attributes Correlation with Price')plt.show()
  1. 结果解读:从相关性矩阵可以看出,评价分数中的清洁度、可容纳人数和卧室数量与价格的相关性较高。这表明这些因素对 Airbnb 房源的价格有较大的影响。

d31d3e1ac87a000d18dc14930aeb424f.png

(三)评价数据中的趋势和季节性
  1. 分析方法:首先统计每个月加入 Airbnb 的房东数量,绘制时间序列图,观察房东加入的趋势。然后统计每天的预订数量,并按月份绘制预订数量的折线图,分析预订的季节性。

# 统计每个月加入的房东数量hosts\_per\_month = df\['year\_month'\].value\_counts().sort\_index()# 绘制房东加入趋势图plt.figure(figsize=(10,6))hosts\_per\_month.plot(kind='line', marker='.', color='#051399')plt.title('Number of Hosts Joined Airbnb Overtime')plt.xlabel('Year-Month')plt.ylabel('Number of Hosts Joined')plt.xticks(rotation=45)plt.grid(True)plt.show()# 统计每天的预订数量datewise\_bookings = df\['date'\].value\_counts().sort\_values(ascending=False)# 按月份绘制预订数量折线图df.groupby('month').agg('month').count().to_frame().plot(kind='line', figsize=(15,8), linewidth=2, marker='o', color='#e69305')plt.title('Montly Trend of Airbnb Bookings')plt.xlabel('Months')plt.ylabel('No: of Bookings')plt.xticks(range(1,13))plt.show()
  1. 结果解读:从房东加入趋势图可以看出,2015 年和 2017 年有大量房东加入 Airbnb,但在 2017 年出现了下降趋势。从预订数量折线图可以看出,9 月和 10 月的预订数量较多。

69a5d33f0a9d60a4514ca5da0c1276b3.png

598e19c3c0af762b14015e2f3f724e0b.png

(四)哪个城市提供更好的旅行价值
  1. 分析方法:计算每个城市的平均住宿价格,绘制柱状图,比较不同城市的价格水平。

# 计算每个城市的平均价格avg\_price\_city = listings.groupby('city')\['price'\].mean().sort\_values()print(avg\_price\_city)# 绘制平均价格柱状图plt.figure(figsize=(15,8))plt.bar(avg\_price\_city.index, avg\_price_city.values)plt.title('Average Accomodation Price of Airbnb in Each City')plt.ylabel('Average Price of Accomodation')plt.xlabel('City')plt.show()
  1. 结果解读:开普敦的平均住宿价格最高,而罗马的平均住宿价格最低。因此,罗马提供了更好的旅行价值。

e1149615831461932824eb9bce4e06f0.png

评价分数分布与超级房东状态分析:

首先,从listings_table表中选择与评价分数相关的列和房东是否为超级房东的列,创建Q3_df数据框。

然后,使用plotly.graph_objectsmatplotlib.pyplot库分别创建子图和直方图,展示不同超级房东状态下各评价分数的百分比分布。

review\_scores\_columns = \[i for i in listings\_df.columns if 'review\_score' in i\]print(review\_scores\_columns)Q3\_df = duckdb.sql('''SELECThost\_is\_superhost,review\_scores\_rating as review\_scores\_rating,review\_scores\_accuracy,review\_scores\_cleanliness,review\_scores\_checkin,review\_scores\_communication,review\_scores\_location,review\_scores\_valueFROMlistings\_table''').to\_df()# 使用 plotly 创建子图fig = make\_subplots(rows=len(review\_scores\_columns),cols=2,subplot\_titles=('False', 'True'),vertical\_spacing=0.05)# 使用 matplotlib 创建直方图fig, axes = plt.subplots(nrows=len(review\_scores\_columns), ncols=2, figsize=(10, 20))

0226d2f63ae7ef98badf3aafa8160f6d.png

香港地区房源分析

通过查询listings_table表,筛选出城市为香港(Hong Kong)的房源数据,创建hong_kong_listings_df数据框。

使用geopandas库将数据转换为地理数据框,并绘制香港地区的房源分布地图,同时添加底图。

使用folium库创建香港地区的交互式地图,展示房源位置。

duckdb.sql('''SELECT\*FROMlistings\_tableWHERElower(city) like '%hong%'limit 2''').to\_df()hong\_kong\_listings\_df = duckdb.sql('''SELECT\*FROMlistings\_tableWHEREcity = 'Hong Kong'''').to\_df()# 转换为地理数据框并绘制地图gdf = gpd.GeoDataFrame(hong\_kong\_listings\_df, geometry=gpd.points\_from\_xy(hong\_kong\_listings\_df.longitude, hong\_kong\_listings\_df.latitude))gdf.crs = "EPSG:4326"fig, ax = plt.subplots(figsize=(10, 10))gdf.plot(ax=ax, color='blue', marker='o', markersize=10)try:ctx.add\_basemap(ax, crs=gdf.crs.to\_string(), source=ctx.providers.Stamen.Terrain)except AttributeError:ctx.add\_basemap(ax, crs=gdf.crs.to\_string(), source=ctx.providers.OpenStreetMap.Mapnik)ax.set\_xlim(113.8, 114.4)ax.set\_ylim(22.15, 22.6)ax.set\_title("Points over Hong Kong Map")ax.axis('off')plt.show()# 创建交互式地图map\_hk = folium.Map(location=\[22.3193, 114.1694\],zoom\_start=12,tiles='https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',attr='Map data © OpenStreetData contributors')for \_, row in hong\_kong\_listings\_df.iterrows():folium.CircleMarker(location=\[row\['latitude'\], row\['longitude'\]\],radius=5,color='blue',fill=True,fill\_color='blue',fill\_opacity=0.7,).add\_to(map\_hk)map\_hk.save('HongKongMap.html')map_hk

f793e003e2376bc5ce40d732a0f8bdba.png

房源价格预测模型研究|附数据代码

随着共享经济的快速发展,Airbnb 作为全球知名的短租平台,其房源价格的合理预测对于房东制定价格策略、租客选择合适房源以及平台的运营管理都具有重要意义。通过对 Airbnb 房源数据的深入分析,构建不同的回归模型,以提高对房源价格预测的准确性。

数据来源与预处理

  1. 数据来源:数据来源于../data/listings_cleaned.csv文件,以房源的唯一标识id作为索引列。

  2. 数据预处理:

  • 删除列:确定要删除的列,如security_depositavailability_365maximum_minimum_nightsminimum_maximum_nights等,通过以下代码实现删除操作:

to\_drop = \['security\_deposit','availability\_365','maximum\_minimum\_nights','minimum\_maximum\_nights'\]data = data.drop(to\_drop,axis=1)
  • 数据标准化:使用StandardScaler对数据进行标准化处理,使不同特征具有相同的尺度。例如:

scaler = StandardScaler()X\_scaled = scaler.fit\_transform(X)y\_scaled = scaler.fit\_transform(y.values.reshape(-1,1))
  • 数据集划分:将数据划分为训练集和测试集,使用train_test_split函数,设置随机种子为 0,测试集比例为 0.25。代码如下:

X\_train, X\_test, y\_train, y\_test = train\_test\_split(X\_scaled,y\_scaled, random\_state=0,test\_size = 0.25)

回归模型构建与评估

线性回归:

使用LinearRegression构建线性回归模型,并在训练集上进行训练,然后在训练集和测试集上分别进行预测。通过计算r2_score评估模型性能。代码如下:

linreg = LinearRegression()linreg.fit(X\_scaled,y\_scaled)y\_train\_pred = linreg.predict(X\_train)y\_test\_pred = linreg.predict(X\_test)print("\\nTraining r2:", round(r2\_score(y\_train, y\_train\_pred),4))print("Validation r2:", round(r2\_score(y\_test, y\_test\_pred),4))
  • 结果显示,训练集和验证集的r2值分别为一定数值,表明线性回归模型在一定程度上能够解释房源价格的变化。

Lasso 回归:

通过LassoCV进行 Lasso 回归,设置不同的alpha值范围进行交叉验证,找到最佳的alpha值。

alphas = 10**np.linspace(-2,4,200)lasso = LassoCV(alphas=alphas,cv=10).fit(X\_train,y\_train.ravel())print("Score without interactions: {:.4f}".format(lasso.score(X\_test, y\_test)))print('Best alpha value: {:.3f}'.format(lasso.alpha_))
  • 还绘制了 LASSO 路径图,展示系数随正则化程度的变化。

alphas, _, coefs = lars\_path(X\_train, y_train.ravel(), method='lasso')xx = np.sum(np.abs(coefs.T), axis=1)xx /= xx\[-1\]plt.figure(figsize=(12,8))plt.plot(xx, coefs.T)ymin, ymax = plt.ylim()plt.vlines(xx, ymin, ymax, linestyle='dashed')plt.xlabel('|coef| / max|coef|')plt.ylabel('Coefficients')plt.title('LASSO Path')plt.axis('tight')plt.legend(X.columns,loc = 'best')plt.show()
  • 结果表明 Lasso 回归在一定程度上能够进行特征选择,提高模型的解释性。

08db88435cd1f2f553ecd30902c46ac9.png

fd05f3dd0c01a35d0aeaeadd572b4bdf.png

带有多项式特征的回归:
  • 分别构建带有多项式特征的 Lasso 回归和 Ridge 回归模型。首先使用PolynomialFeatures生成多项式特征,然后分别使用LassoCVRidgeCV进行回归。

fd2d58d0fc5746d440b8fee8e3763f9e.png

0a9b67830d48bf140e520b8bb61dad1d.png

Ridge 回归:

使用RidgeCV进行 Ridge 回归,设置不同的alpha值范围进行交叉验证。代码如下:

ridge = RidgeCV(normalize=False,alphas=alphas,cv=10).fit(X\_train, y\_train)print("R^2 Score: {:.4f}".format(ridge.score(X\_test, y\_test)))print('Best alpha value: {:.3f}'.format(ridge.alpha_))
  • 结果显示 Ridge 回归也能够在一定程度上提高模型的性能。

带有多项式特征的回归:

分别构建带有多项式特征的 Lasso 回归和 Ridge 回归模型。首先使用PolynomialFeatures生成多项式特征,然后分别使用LassoCVRidgeCV进行回归。代码如下:

poly = PolynomialFeatures(degree=2).fit(X\_train)X\_train\_poly = poly.transform(X\_train)X\_test\_poly = poly.transform(X\_test)alphas = 10\*\*np.linspace(-2,2,100)lasso = LassoCV(alphas=alphas,cv=5,tol=0.5).fit(X\_train\_poly, y\_train.ravel())y\_train\_pred = lasso.predict(X\_train\_poly)y\_test\_pred = lasso.predict(X\_test\_poly)print("Lasso Regression with Polynomial Features")print("\\nTraining r2:", round(r2\_score(y\_train, y\_train\_pred),4))print("Validation r2:", round(r2\_score(y\_test, y\_test\_pred),4))poly = PolynomialFeatures(degree=2).fit(X\_train)X\_train\_poly = poly.transform(X\_train)X\_test\_poly = poly.transform(X\_test)alphas = 10\*\*np.linspace(-2,2,100)ridge = RidgeCV(normalize=True,alphas=alphas,cv=5,).fit(X\_train\_poly, y\_train.ravel())y\_train\_pred = ridge.predict(X\_train\_poly)y\_test\_pred = ridge.predict(X\_test\_poly)print("Ridge Regression with Polynomial Features")print("\\nTraining r2:", round(r2\_score(y\_train, y\_train\_pred),4))print("Validation r2:", round(r2\_score(y\_test, y\_test\_pred),4))

带有多项式特征的回归模型在一定程度上可以提高模型的拟合能力,但也可能存在过拟合的风险。

XGBoost:

使用xgb.XGBRegressor构建 XGBoost 回归模型,设置目标函数为reg:squarederror,学习率、最大深度等参数。代码如下:

xg\_reg = xgb.XGBRegressor(objective ='reg:squarederror', learning\_rate = 0.15, max\_depth = 4, booster='gbtree')xg\_reg.fit(X\_train,y\_train)y\_train\_pred = xg\_reg.predict(X\_train)y\_test\_pred = xg\_reg.predict(X\_test)print("XGBoost")print("\\nTraining r2:", round(r2\_score(y\_train, y\_train\_pred),4))print("Validation r2:", round(r2\_score(y\_test, y\_test\_pred),4))fig, ax = plt.subplots(figsize=(14, 8))plot\_importance(xg\_reg, ax=ax)

XGBoost 模型在训练集和测试集上的表现相对较好,通过绘制特征重要性图,可以了解各个特征对房源价格的影响程度。

19e5d6cc297f6d26096d1fd499d77fb1.png

结论

通过对 Airbnb 房源和评价数据的分析,我们得出以下结论:

  1. 巴黎和纽约的 Airbnb 预订数量最多,香港的预订数量最少。

  2. Airbnb 的价格受到评价分数、清洁度、可容纳人数和卧室数量等因素的影响。

  3. 2015 年至 2017 年期间,加入 Airbnb 的房东数量大幅增加,但在 2017 年出现了下降趋势。9 月和 10 月是 Airbnb 预订的高峰期。

  4. 罗马提供了更好的旅行价值,因为其平均住宿价格相对较低,而开普敦的平均住宿价格最高。

  5. 洗衣机、空调和洗发水是最热门的房源设施。

  6. 不同城市的房东位置信息中包含城市名称的比例有所不同,纽约、巴黎等城市的比例较高。

  7. 超级房东在评价分数方面表现相对较好,不同超级房东状态下的评价分数分布存在差异。

  8. 超级房东的即时预订比例相对较高。

  9. 香港地区的房源分布可以通过地理数据框和交互式地图进行直观展示。

通过对多种回归模型的构建和评估,我们可以得出以下结论:

  1. 线性回归、Lasso 回归、Ridge 回归等传统线性模型在一定程度上能够解释 Airbnb 房源价格的变化,但性能相对有限。

  2. 带有多项式特征的回归模型可以提高模型的拟合能力,但需要注意过拟合的风险。

  3. XGBoost 模型在训练集和测试集上的表现相对较好,具有较高的预测准确性和泛化能力。

分析师

在此对Kefan Yu对本文所作的贡献表示诚挚感谢,她在上海财经大学完成了信息管理与信息系统专业的学位,专注于数据采集、数据清洗和深度学习领域。擅长 R 语言、Python。

数据获取

在公众号后台回复“airbnb数”,可免费获取完整数据。

cf20805625d6aeb992783e4c3f645e8f.jpeg

本文中分析的数据、代码分享到会员群,扫描下面二维码即可加群! 

9f11f680499b3b5714f47987cdd521a7.png


资料获取

在公众号后台回复“领资料”,可免费获取数据分析、机器学习、深度学习等学习资料。

8617a3e0681e148b54ac5c4bc99f4484.jpeg

点击文末“阅读原文”

获取全文完整代码数据资料。

本文选自《Python、R语言Lasso、Ridge岭回归、XGBoost分析Airbnb房屋数据:旅游市场差异、价格预测|数据分享》。

点击标题查阅往期内容

Python对商店数据进行lstm和xgboost销售量时间序列建模预测分析

PYTHON集成机器学习:用ADABOOST、决策树、逻辑回归集成模型分类和回归和网格搜索超参数优化

R语言集成模型:提升树boosting、随机森林、约束最小二乘法加权平均模型融合分析时间序列数据

Python对商店数据进行lstm和xgboost销售量时间序列建模预测分析

R语言用主成分PCA、 逻辑回归、决策树、随机森林分析心脏病数据并高维可视化

R语言基于树的方法:决策树,随机森林,Bagging,增强树

R语言用逻辑回归、决策树和随机森林对信贷数据集进行分类预测

spss modeler用决策树神经网络预测ST的股票

R语言中使用线性模型、回归决策树自动组合特征因子水平

R语言中自编基尼系数的CART回归决策树的实现

R语言用rle,svm和rpart决策树进行时间序列预测

python在Scikit-learn中用决策树和随机森林预测NBA获胜者

python中使用scikit-learn和pandas决策树进行iris鸢尾花数据分类建模和交叉验证

R语言里的非线性模型:多项式回归、局部样条、平滑样条、 广义相加模型GAM分析

R语言用标准最小二乘OLS,广义相加模型GAM ,样条函数进行逻辑回归LOGISTIC分类

R语言ISLR工资数据进行多项式回归和样条回归分析

R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型

R语言用泊松Poisson回归、GAM样条曲线模型预测骑自行车者的数量

R语言分位数回归、GAM样条曲线、指数平滑和SARIMA对电力负荷时间序列预测

R语言样条曲线、决策树、Adaboost、梯度提升(GBM)算法进行回归、分类和动态可视化

如何用R语言在机器学习中建立集成模型?

R语言ARMA-EGARCH模型、集成预测算法对SPX实际波动率进行预测

在python 深度学习Keras中计算神经网络集成模型

R语言ARIMA集成模型预测时间序列分析

R语言基于Bagging分类的逻辑回归(Logistic Regression)、决策树、森林分析心脏病患者

R语言基于树的方法:决策树,随机森林,Bagging,增强树

R语言基于Bootstrap的线性回归预测置信区间估计方法

R语言使用bootstrap和增量法计算广义线性模型(GLM)预测置信区间

R语言样条曲线、决策树、Adaboost、梯度提升(GBM)算法进行回归、分类和动态可视化

Python对商店数据进行lstm和xgboost销售量时间序列建模预测分析

R语言随机森林RandomForest、逻辑回归Logisitc预测心脏病数据和可视化分析

R语言用主成分PCA、 逻辑回归、决策树、随机森林分析心脏病数据并高维可视化

Matlab建立SVM,KNN和朴素贝叶斯模型分类绘制ROC曲线

matlab使用分位数随机森林(QRF)回归树检测异常值

9451a3191efd840f68dd5a7b0a030c4c.jpeg

2e4d1c112fb18a3c88898b52c68895c7.png

4acf1621049415d224b622ea5a9f07ba.png

ad3c14af4e9f24f1af4bc01134639892.jpeg

28684820c39d9bbf4c067744c213f38a.png

相关文章:

Python、R语言Lasso、Ridge岭回归、XGBoost分析Airbnb房屋数据:旅游市场差异、价格预测|数据分享...

全文链接&#xff1a;https://tecdat.cn/?p37839 分析师&#xff1a;Kefan Yu 在大众旅游蓬勃发展的背景下&#xff0c;乡村旅游已成为推动乡村经济、社会和文化发展的关键力量。当前&#xff0c;乡村旅游接待设施主要以招待所、小宾馆和农家乐等形式存在。然而&#xff0c;一…...

Spring Boot驱动的交互式作业管理系统:师生共评功能实现

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…...

基于SSM的旅游网站【附源码】

基于SSM的旅游网站&#xff08;源码L文说明文档&#xff09; 目录 4 系统设计 4.1 系统概要设计 4.2 系统功能结构设计 4.3 数据库设计 4.3.1 数据库E-R图设计 4.3.2 数据库表结构设计 5 系统实现 5.1 管理员功能介绍 5.1.1 用户管理 5.1.2 …...

Python实现将目标文本批量存入Word,并将文本段落的开头进行缩进处理(11)

前言 本文是该专栏的第11篇,后面会持续分享Python办公自动化干货知识,记得关注。 在用python对目标文本进行批量自动化操作的时候,你可能会遇到这样的需求——“现有大批量的文本内容,需要通过python将其批量存入docx(word)文档中,而且每个段落的开头需要进行缩进处理”…...

el-select 下拉框选项文字过长解决方案

首先给下拉框设置类名&#xff0c;即popper-class属性&#xff0c;并且给el-option增加title属性 <el-selectv-model"item.portrayalItem"v-loadmore"{ method: lazyItemList, item, index }"multiplefilterableremotepopper-class"dropDown-sele…...

C语言基础语法——类型转换

数据有不同的类型&#xff0c;不同类型数据之间进行混合运算时涉及到类型的转换问题。 转换的方法有两种&#xff1a; 自动类型转换&#xff08;隐式转换&#xff09;&#xff1a;遵循一定的规则&#xff0c;由编译系统自动完成强制类型转换&#xff08;显示转换&#xff09;…...

来电无通话界面问题分析

1、问题描述 场测反馈&#xff0c;无法接到电话&#xff0c;被叫失败。 2、Log分析 从Modem log看&#xff0c;空口确实有上报到有相关通话信息 排查AT相关Log&#xff0c;确实有上报AT< EAIC相关命令 查看相关AT指令 /* * EAIC: <call_id>,<number>,<type…...

物理学基础精解【70】

文章目录 加速度平均加速度和瞬时加速度一、定义二、性质三、数学原理与公式四、例子例题例题一例题二 曲线运动中加速度速率&#xff08;速度大小&#xff09;与曲线运动加速度方向与曲线运动总结 加速度和角加速度加速度与角加速度的基本定义圆周运动中的关系其他运动类型中的…...

HCIP--以太网交换安全(三)MAC地址漂移防止与检测

MAC地址漂移防止与检测 一、MAC地址漂移防止与检测知识点 1.1MAC地址漂移的概述 MAC地址漂移是指交换机上一个vlan内有两个端口学习到同一个MAC地址&#xff0c;后学习到的MAC地址表项覆盖原MAC地址表项的现象。 1.2.MAC地址漂移的防止方法 &#xff08;1&#xff09;配置…...

CSS3--美若天仙!?

免责声明&#xff1a;本文仅做分享~ 目录 CSS引入方式 选择器 盒子尺寸和背景色 文字控制属性 单行文字 垂直居中 字体族 font复合属性 文本对齐方式 文本修饰线 color 文字颜色 ----- 复合选择器 伪类选择器 超链接伪类 CSS特性 继承性 层叠性 优先级 Emmet …...

详细版的Jsoncpp的使用,包括在VS环境下配置

目录 准备环境VS 环境下配置编译使用 基础概述Json 数组Json 对象 Jsoncpp 的使用ValueFastWriterReader示例 如果想要 Json 部署在 Linux 上 参考: https://blog.csdn.net/2303_76953932/article/details/142703683?spm1001.2014.3001.5502 C中原生不支持 Json&#xff0c;所…...

开发指南070-3d模型

平台集成了应用于3d展示场景的相关底层&#xff0c;支持fbx和gltf两种模型格式。 样例如下&#xff1a; <div class"fullcontainer"> <div style"width:80%"> <iframe :src"url" width"100%" height"…...

问卷调查毕设计算机毕业设计投票系统SpringBootSSM框架

目录 一、引言‌ ‌二、需求分析‌ 用户角色‌&#xff1a; ‌功能需求‌&#xff1a; ‌非功能需求‌&#xff1a; ‌三、系统设计‌ ‌技术选型‌&#xff1a; ‌数据库设计‌&#xff1a; ‌界面设计‌&#xff1a; ‌四、实现步骤‌ ‌后端实现‌&#xff1a; …...

JavaWeb三大组件之Servlet

1. Servlet 一、Servlet介绍 1、概念 Servlet&#xff08;Server Applet&#xff09;是Java Servlet的简称&#xff0c;称为小服务程序或服务连接器&#xff0c;用Java编写的服务器端程序&#xff0c;具有独立于平台和协议的特性&#xff0c;主要功能在于交互式地浏览和生成…...

C++设计模式学习详解(23种)

C设计模式学习详解 设计模式是软件开发中常见问题的可复用解决方案。它们不是可以直接转换为代码的成品&#xff0c;而是描述解决问题的通用方法。C 中常用的设计模式可以分为三大类&#xff1a;创建型模式、结构型模式和行为型模式。 一、创建型模式 (Creational Patterns) …...

Matlab中实现类属性仅在首次创建类实例时初始化

背景描述: 在自定义类中&#xff0c;需要定义一些属性(标志位)用于触发某些方法&#xff0c;标志位只需要在类对象第一次实例化时赋初值&#xff0c;之后的值需要在特定的地方设置。怎样保证在不同实例中&#xff0c;标志位的值仅在特定的时候改变&#xff0c;其他时候保持不变…...

FLINK SQL动态表连续查询

SQL动态表 在Apache Flink中&#xff0c;动态表是Flink SQL处理流数据的核心概念之一。与静态表&#xff08;如关系数据库中的传统表&#xff09;不同&#xff0c;动态表的内容是随时间不断变化的&#xff0c;因为它们能够反映数据流的最新状态。动态表可以看作是对数据流的一…...

C++ | Leetcode C++题解之第468题验证IP地址

题目&#xff1a; 题解&#xff1a; class Solution { public:string validIPAddress(string queryIP) {if (queryIP.find(.) ! string::npos) {// IPv4int last -1;for (int i 0; i < 4; i) {int cur (i 3 ? queryIP.size() : queryIP.find(., last 1));if (cur st…...

每日学习一个数据结构-图

文章目录 图基础一、图的定义二、图的相关概念三、图的分类四、图的使用场景 和图相关的算法一、图的遍历算法二、最短路径算法三、最小生成树算法四、图匹配算法五、网络流算法 图基础 一、图的定义 在数学中&#xff0c;图是描述于一组对象的结构&#xff0c;其中某些对象对…...

kali(专业的渗透测试虚拟机)|kali下载链接地址 |kali安装 |kali部署指南

介绍 kali 是Debian开源linux系统体系下的子分支之一 Debian-kali 扩展&#xff1a;Ubuntu也是Debian开源linux系统体系下的子分支之一 Debian-ubuntu 安装kali 2023.03 稳定版 Index of /kali-images/kali-2023.1/ 安装可以参考他的教程&#xff0c; 写的很详细了…...

中国地级市生态韧性数据及城市生态韧性数据(2000-2022年)

一测算方式&#xff1a; 参考C刊《管理学刊》楚尔鸣&#xff08;2023&#xff09;老师的做法&#xff0c;城市生态韧性主要衡量一个城市在面临生态环境系统压力或突发冲击时&#xff0c;约束污染排放、维护生态环境状态和治理能力提升的综合水平。 参考郭海红和刘新民的研究&a…...

应对网络安全挑战:App等保测评的重要性与策略

在全球数字化转型的大潮中&#xff0c;移动应用(App)作为连接人们日常生活与互联网世界的桥梁&#xff0c;其数量与日俱增&#xff0c;功能日趋多样化。与此同时&#xff0c;App背后潜藏的网络安全风险也随之上升&#xff0c;数据泄露、隐私侵犯、恶意软件植入等问题频发&#…...

vue后台管理系统从0到1搭建(4)各组件的搭建

文章目录 vue后台管理系统从0到1搭建&#xff08;4&#xff09;各组件的搭建Main.vue 组件的初构 vue后台管理系统从0到1搭建&#xff08;4&#xff09;各组件的搭建 Main.vue 组件的初构 根据我们的效果来看&#xff0c;分析一下&#xff0c;我们把左边的区域分为一个组件&am…...

LabVIEW开关磁阻电机特性测量系统

基于LabVIEW软件和特定硬件组件的开关磁阻电机&#xff08;SRM&#xff09;特性测量系统&#xff0c;结合多功能数据采集卡&#xff0c;统能够准确地测量并分析SRM的电磁特性&#xff0c;从而支持电机模型的精确建立和性能优化。 项目背景 在工业生产和家用电器领域&#xff0…...

在当前网络环境中查看所有IPv4与Mac地址的方法

在powershell界面中&#xff1a; # 获取并显示所有网络接口的MAC地址和IPv4地址 Get-NetAdapter | Select-Object -Property Name, MacAddress, Status Get-NetAdapter | Get-NetIPAddress -AddressFamily IPv4 | Select-Object -Property InterfaceAlias, IPAddress, PrefixL…...

CSS @规则(At-rules)系列详解___@charset规则使用方法

CSS 规则(At-rules)系列详解 ___charset规则使用方法 本篇目录&#xff1a; 零、时光宝盒 一、charset规则定义和用法 二、CSS charset语法 三、charset 使用方法例子 1、正确使用方法 2、无效的&#xff0c;错误的使用方法 零、时光宝盒 &#xff08;https://blog.csd…...

黑马程序员C++核心编程学习笔记

黑马程序员C核心编程学习笔记 一、内存 1.1 内存四区 C程序在执行时&#xff0c;将内存大致分为4个区域&#xff1a;代码区&#xff0c;全局区&#xff0c;栈区&#xff0c;堆区 代码区&#xff1a;存放函数体的的二进制代码&#xff0c;操作系统管理。 &#x1f535;特点&a…...

六自由度平台

力姆泰克六自由度平台 安装方便&#xff0c;维护简单 多重机械电气安全保护 向下翻动查看更多 力姆泰克伺服系统集成 全新革命性结构设计与六轴先进伺服控制原理的结合&#xff0c;力姆泰克公司引进国外的专业技术在国内全新推出 全电动六自由度平台。将完全替代市场上原有的…...

【Node.js 下载及npm安装配置】亲测可用

Node.js 下载及npm安装配置 安装nodejs设置安装angular 安装nodejs 下载适用自己系统的node.js&#xff0c;官网&#xff1a;https://nodejs.cn/download/。默认安装即可。查看是否安装成功&#xff0c;node -v&#xff0c;npm -v &#xff0c;出现版本号即安装成功。 设置 …...

Qt C++设计模式->访问者模式

访问者模式&#xff08;Visitor Pattern&#xff09;是一种行为型设计模式&#xff0c;它将操作与对象结构分离&#xff0c;使得你可以在不改变对象结构的前提下定义作用于这些对象的新操作。访问者模式通过引入一个访问者对象&#xff0c;允许你在不修改类的前提下向已有类添加…...