首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有有效的方法来建立面板数据的回归模型?

有没有有效的方法来建立面板数据的回归模型?
EN

Stack Overflow用户
提问于 2019-04-25 15:04:57
回答 2查看 569关注 0票数 0

我有二维数据,包括某些地区的频繁犯罪类型和全年相应的房价。我想了解某些地区的犯罪频率与房价波动之间的可能联系。一开始,我尝试用线性回归来实现这一点,但效果并不好。现在我想尝试对我的数据进行PCA分析,但对我来说,获取有意义的结果仍然是不有效的。如何对面板数据进行有效的PCA分析以进行回归?有什么有效的解决办法来实现这一点吗?谢谢

data

因为我的数据在维数方面有点长,所以在这里很难制作可重复的示例,所以让我们看看面板数据是什么样子的:

以下是您可以浏览输入面板数据的最安全的云链接:示例数据片段

更新:我的尝试

由于@ flyingmeatball指出使用PCA不是一个好主意,我尝试了简单的线性回归,但它没有帮助我捕捉犯罪频率与房价之间的关系。以下是我所做的:

代码语言:javascript
复制
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import scale
import re
import urllib
import pandas as pd

# download data from cloud
u = "https://filebin.net/ml0sjn455gr8pvh3/crime_realEstate?t=7dkm15wq"
crime_realEstate = urllib.request.urlretrieve (u, "Ktest.csv")

# or just manually download data first and read
crime_realEstate = pd.read_csv('crime_realEstate.csv')
cols_2012 = crime_realEstate.filter(regex='_2012').columns
crime_realEstate['Area_Name']=crime_realEstate['Area_Name'].apply(lambda x: re.sub(' ', '_', str(x)))
regDF_2012 = crime_realEstate[cols_2012]
regDF_2012 = regDF_2012.assign(community_code=crime_finalDF['community_area'])
regDF_2012.dropna(inplace=True)
X_feats = regDF_2012.drop(['Avg_Price_2012'], axis=1)
y_label = regDF_2012['Avg_Price_2012'].values

poly = PolynomialFeatures(degree=2)
sc_y = StandardScaler()
X = poly.fit_transform(X_feats)
y= sc_y.fit_transform(y_label.reshape(-1,1)).flatten()
X = log(X)
y = log(y)
regModel = LinearRegression()
regModel.fit(X, y)

上面的代码对我没有帮助,因为我想看看哪一种特性导致了全年房价的波动。对如何实现这一点有什么想法吗?

目标

我试图实现的是建立模型,解释某些地区的犯罪频率与相应的房价波动之间的动态关系。有什么有效的解决办法来实现这一点吗?

更新

如果PCA不是一个好主意,那么有什么可能的回归模型可以捕捉特定社区地区的犯罪频率与房价波动之间的关系?知道吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-25 15:17:38

有几个想法:

1)请张贴完整的代码。我不知道crime_realEstate是在哪里定义的。如果您省略了将数据中的数据读入该变量的行,就很难重现您的错误,而且您也不太可能得到帮助。此外,您应该组织所有导入语句,以便它们位于代码的顶部。这并不是一个真正的功能,更多的惯例,每个人都期待,并使它更容易阅读。

2)当你参考面板数据时,你真的是在说熊猫DataFrame吗?这是一种“典型的”方式来存储这类东西进行分析。您可能希望养成将数据作为数据引用的习惯,这样对您的受众来说就更清晰了。您还应该发布完整的错误跟踪,这样我们就可以看到到底是哪一行代码爆炸了。

3)我认为你可能误解了PCA,或者至少是为了什么。PCA (主成分分析)是一种数据转换方法,在这种方法中,您要捕获跨多个变量的数据的变化,并将该数据作为捕获相同数量(或更少,取决于您保留的组件数量)的变量的更少的组件来重新描述。一旦您运行PCA,您将无法看到哪些功能正在助长犯罪,因为它们将被全新的组件所取代。如果确定与犯罪相关的特征很重要,那么PCA是个坏主意。

请把上面的东西修好。

编辑

我不是说PCA是错的,我只是说你上面问的问题(“我如何应用PCA,为什么我的代码轰炸”),并不是真正正确的问题。如果您认为有许多相关的变量需要降到较低的维度,则应该使用PCA。不过,我不会从这里开始--看看你能不能做到什么样的精确性。现在,您已经重新制定了一个更广泛的问题,“如何为这些数据建立一个预测模型,最好是使用回归?”,可能应该转到https://datascience.stackexchange.com/,但我将给您一个如何编写该解决方案的起点。

首先,PCA可能不是理想的起点,因为从数据/列的角度来看,您的问题不是维度。在过去5年里,你基本上有10种不同的犯罪。你也只有58个不同的rows...or,那只是样本数据吗?而且,你的数据有点奇怪--多行的价格是一样的,但犯罪情况不同。我不知道是不是因为你发布了样本数据。如果这确实是完整的数据集,请立即停止分析,获取更多数据/执行其他操作。

我做了一些关于如何处理这个问题的行政决定。所有这些只是为了演示如何编写回归代码。我总结了多年来的犯罪(你可能想要平均水平?最高的?换衣服?这些都是你的设计决策)。我的衡量标准是2012-2016年价格的变化,这是你有犯罪数据的时间框架。我按犯罪类型标准化了犯罪数量。没有缩放目标变量。

以下是我开始的方式:

代码语言:javascript
复制
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import r2_score
from sklearn.preprocessing import scale
import pandas as pd

# Load data
filePath = 'L:\\crime_realEstate.txt'
crime_df = pd.read_csv(filePath, sep = '\t').drop(['Unnamed: 0','community_area'],axis = 1)

#calculate price change between 2016 and 2012 - same timeframe you have crime data
crime_df['price_change'] = crime_df['Avg_Price_2016'] - crime_df['Avg_Price_2012']
crime_df.drop(['Avg_Price_2012','Avg_Price_2013','Avg_Price_2014','Avg_Price_2015','Avg_Price_2016','Avg_Price_2017','Avg_Price_2018','Avg_Price_2019'],axis = 1,inplace = True)

#split years if they are data over time
crime_df.columns =  pd.MultiIndex.from_tuples([(x.split('_20')[1] if '_20' in x else x ,x.split('_20')[0]) for x in crime_df.columns])
#sum across years for crimeFields
crime_df = crime_df.groupby(level=[1],axis = 1).sum(axis = 1)

#split out tgt var
price_growth = crime_df['price_change']

#create dummy variable from area name
dummy_df = pd.get_dummies(crime_df['Area_Name'])


crime_df.drop(['Area_Name','price_change'],axis = 1,inplace = True)

#scales crime variables
scaler = StandardScaler()
crime_df[crime_df.columns] = scaler.fit_transform(crime_df)

crime_df = pd.merge(crime_df,dummy_df,left_index = True, right_index = True)

regModel = LinearRegression()

#split to training testing
train_df = crime_df.sample(frac=0.8,random_state=200)
test_df = crime_df.drop(train_df.index)

regModel.fit(train_df, price_growth[train_df.index])

#R2 
r2_score(price_growth.drop(train_df.index),regModel.predict(test_df))
0.7355837132941521

你的分析更简单的回答是:无论白人住在芝加哥哪里,房产都是昂贵的。

票数 2
EN

Stack Overflow用户

发布于 2019-04-25 23:14:32

我看了你的数据。以下是几个预处理步骤的2美分:

  1. 你需要重新排列它,这样Y就是Price_For_Area_Year。例如,您的第一张记录转换为:

  1. 1热编码区域/区域代码
  2. 用某种标准方法计算缺失值
  3. 利用主成分分析( pca )等方法处理多元共线性问题,自变量具有较高的相关性。

我认为你应该得到一些有意义的线性相关。如果没有,请尝试将一些变量转换为级别。分享一下这是怎么回事。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55852410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档