题意
python整理代码
由于是第一次使用pandas进行数据分析,有很多不熟悉的地方,首先记录一下.
使用的是Jupyter Notebook完成,这个做数据分析确实非常好用,效果可以直接从网页中打开:
完整代码(颜色不清楚,请使用白色背景):数据处理,回归分析-改进
使用的头文件,和绘图所用的参数
pandas中用到的重要函数:
以这个表格为例表格例子,data.xlsx:
|
name |
5_price |
6_price |
size |
metro |
bus |
school |
hospital |
shop |
city |
year |
0 |
恒大名都 |
NaN |
13808 |
109.00 |
838.0 |
579.0 |
840.0 |
854.0 |
613.0 |
0 |
2012.0 |
1 |
锦园新世纪花园社区 |
NaN |
15822 |
145.00 |
1007.0 |
845.0 |
220.0 |
221.0 |
210.0 |
0 |
2004.0 |
2 |
万科金色悦城 |
NaN |
15352 |
72.00 |
833.0 |
719.0 |
467.0 |
1987.0 |
212.0 |
0 |
17.0 |
3 |
绿地香树花城 |
NaN |
15345 |
72.00 |
1195.0 |
297.0 |
836.0 |
994.0 |
471.0 |
0 |
15.0 |
4 |
万科金域东郡 |
NaN |
16539 |
281.00 |
611.0 |
561.0 |
984.0 |
654.0 |
842.0 |
0 |
17.0 |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
355 |
世纪锦城 |
NaN |
12373 |
122.08 |
238.0 |
150.0 |
513.0 |
123.0 |
501.0 |
11 |
13.0 |
356 |
怡景华庭 |
NaN |
16630 |
101.00 |
103.0 |
176.0 |
436.0 |
712.0 |
371.0 |
11 |
7.0 |
357 |
奥林匹克花园二期 |
NaN |
14491 |
127.00 |
761.0 |
238.0 |
658.0 |
300.0 |
324.0 |
11 |
16.0 |
358 |
同德晨曦园 |
NaN |
12443 |
116.73 |
2500.0 |
129.0 |
279.0 |
290.0 |
263.0 |
11 |
16.0 |
359 |
紫薇万科大都会 |
NaN |
15884 |
110.00 |
1900.0 |
280.0 |
1311.0 |
1086.0 |
802.0 |
11 |
19.0 |
360 rows × 11 columns
基础读入输出,简单分析
df.describe()
可以获得以下信息
|
5_price |
6_price |
size |
metro |
bus |
school |
hospital |
shop |
city |
year |
count |
79.000000 |
318.000000 |
318.000000 |
318.000000 |
318.000000 |
318.000000 |
318.000000 |
318.000000 |
318.000000 |
318.000000 |
mean |
15652.468354 |
15961.877358 |
119.421447 |
981.216981 |
515.022013 |
633.874214 |
957.610063 |
505.902516 |
5.679245 |
8.855346 |
std |
3844.218722 |
4330.880408 |
31.193733 |
711.182323 |
284.119598 |
343.198506 |
798.500147 |
340.196742 |
3.411468 |
4.899413 |
min |
8000.000000 |
7142.000000 |
38.000000 |
103.000000 |
44.000000 |
33.000000 |
61.000000 |
11.000000 |
0.000000 |
1.000000 |
25% |
12781.000000 |
13451.750000 |
100.542500 |
544.250000 |
306.750000 |
367.250000 |
455.500000 |
244.500000 |
3.000000 |
5.000000 |
50% |
14969.000000 |
15285.000000 |
117.070000 |
814.500000 |
464.000000 |
587.000000 |
768.500000 |
451.000000 |
6.000000 |
8.000000 |
75% |
17853.000000 |
17626.250000 |
133.622500 |
1170.500000 |
673.750000 |
833.500000 |
1110.750000 |
695.000000 |
9.000000 |
12.000000 |
max |
24597.000000 |
42113.000000 |
320.820000 |
5800.000000 |
2274.000000 |
2000.000000 |
5800.000000 |
1913.000000 |
11.000000 |
24.000000 |
获取与nan有关的信息
切片
切片均为深拷贝,下文中切片对应的是 pandas.core.series.Series
类,也就是切片类. 元素的类型与列的数据类型有关,不是 Series
类.
对于比较复杂的表格,.loc[]
更加好用,因为可以根据列的名称来取元素,可读性更高. 但由于行索引不一定是连续的,所以一般重排表格后,会使用 reset_index()
把索引重排一遍.
绘图
主要使用函数 df.plot()
,详细解释见 pandas.DataFrame.plot( )参数详解.
数据整理
这部分就很坑爹,需要自己在各大二手平台找各个小区的数据,如果会爬虫可能好一些,但是也肯定不容易. 我们人工找了 360 个数据,通过上述方法将 nan 值去除以后,筛选出了 318 个有效数据,将训练集和验证集进行按照 3:1 划分, 检验数据个数 79, 总计 318.
然后选择验证集中每个城区都均等分,一共12个城区,差不多在7到8个左右.
然后分析每一列的数据分布情况,从上图可以看出是基本满足正态分布的,也可以使用K-S检验,方法很简单:
效果其实不是很好,所以最终没有放到论文上去,但是大置曲线都是非常符合正态分布的. 绘图方法上文已经具体写了(绘图方法).
然后就是根据高斯分布,确定等级划分方法,思路是利用正态分布确定划分方法,设正态分布的均值为 a,标准差为 σ,高斯分布分为三个标准差范围即 [a−σ,a+σ],[a−2σ,a+2σ],[a−3σ,a+3σ],所以我们分别根据正态分布分为五个等级,分别为
(−∞,a−σ], [a−σ,a], [a,a+σ], [a+σ,a+2σ], [a+2σ,∞)
如下图所示
回归分析
原理如下,分为原版和改进以下后的版本(其实没什么很大的作用)
第一问
训练线性回归模型:单位平米房价与7种特征的关系
7种特征:地铁站距离,公交站距离,学校距离,医院距离,超市距离,所属市区,房龄. 设其对应的影响系数分别为 ai (i=1,2,⋯,7),线性回归模型为:
f(x1,⋯,x7)=a1x1+⋯+a7x7+b=i=1∑7aixi+b
其中 b 为待定常数项,记自变量向量为 x=[x1x2⋯x71]T,系数向量为 W=[a1a2⋯a7b]T. 则上式可写为如下形式
f(x1,⋯,x7)=f(x)=xTW
构造平方损失函数:
L(x,y)=21∣∣y−y^∣∣2
其中 y 为特征向量 x 所对应的标签,即单位平米房价,y^=f(x) 为模型做出的预测值.
梯度下降法极小化最优化模型:
W∈R8minR(W)=(x,y)∈D∑L(x,y)
其中 D 为训练集,包含 239 个训练样本.
求解下降方向:
d=∂W∂L=−x(y−xTW)
则修改 W 为:
W′=W−αd
其中 α 为步长因子,这里取为 1,d=∣∣d∣∣d 即进行单位化.
结果:
W=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡335.5733.79239.66682.37335.81739.09−221.189052.36⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤sign(W)⊙log(abs(W))=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡5.823.525.486.535.826.61−5.409.11⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤∼⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡地铁站公交站学校医院超市城区房龄常数项⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
其中 sign(⋅) 为取正负号,⊙ 为矩阵对应项相乘,abs(⋅) 为矩阵各项取绝对值.
评分计算式:
score(x)=5.82x1+3.52x2+5.48x3+6.53x4+5.82x5+6.61x6−5.40x7
第二问:改进算法
原模型预测的结果准确率方差为 17.43
,准确率在 -10%~10%
之间的数据有 35
个.
记训练集为 T,验证集为 E,改进风险函数如下:
W∈R8minR(W)=(x,y)∈E∑L(x,y)
使用 T∪E 中的数据进行训j练模型,最终结果为
W=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡252.00321.86440.56610.5676.52419.73−259.9610012.23⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤sign(W)⊙log(abs(W))=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡5.535.776.096.414.346.04−5.569.21⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤∼⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡地铁站公交站学校医院超市城区房龄常数项⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
改进的模型预测的结果准确率方差为 15.92
,准确率在 -10%~10%
之间的数据有 41
个,提高了 6 个.
线性回归代码
关键:单位化下降方向(不然步长太大,无法收敛),初始值选取(选取标准正态分布,或者一个随机值).
根据线性所得出的系数,得到每一种特征的重要性占比:
可以发现房龄是负贡献,这是符合现实情况的. 根据分布绘制饼状图如下:
最后相同的方法绘制准确率分布即可.