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

时间:2019-04-25 15:04:57

标签: python regression panel-data

我有二维数据,包括某些地区的频繁犯罪类型以及一年中的相应房价。我想了解某些地区的犯罪频率与房价波动之间的可能关联。最初,我尝试使用线性回归来做到这一点,但是效果并不理想。现在,我想对数据进行PCA分析,但是获取有意义的结果对我而言仍然不够有效。为了进行回归分析,如何对面板数据进行有效的PCA分析?任何有效的解决方法来实现这一目标?谢谢

数据

由于我的数据在维数上有点长,因此在此处难以复制示例,所以让我们看一下面板数据的样子:

enter image description here enter image description here

这是最安全的云链接,您可以浏览输入面板数据:example data snippet

更新:我的尝试

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

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不是一个好主意,那么任何可能的回归模型都可以捕获某些社区区域的犯罪频率与房价波动之间的关系?有什么主意吗?

2 个答案:

答案 0 :(得分:2)

一些想法:

1)请发布完整的代码。我看不到哪里定义了Crime_realEstate。如果您将数据读入该变量的行省略了,那么它真的很难重现错误,并且您获得帮助的可能性也较小。另外,您应该组织所有导入语句,使其位于代码的顶部。这并不是真正的功能,更多的是每个人都期望的约定,并使其更易于阅读。

2)当您参考面板数据时,您是否真的在谈论熊猫DataFrame?这是存储此类资料以进行分析的“典型”方式。您可能想要养成将数据称为数据框的习惯,以便您的听众更容易理解。您还应该发布完整的错误回溯,以便我们可以确切地看到哪一行代码在轰炸。

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

请修复上面的项目。

编辑

我并不是说PCA是错误,我只是说您在上面提出的问题(“我如何应用PCA以及为什么我的代码轰炸”)并不是真正的正确的问题。如果您认为有许多相关变量需要减少到较低的维数,则应使用PCA。不过,我不会从那里开始-看看不这样做就能获得什么样的准确性。现在,您已经重新提出了一个更广泛的问题:“如何为该数据创建预测模型,最好使用回归分析?”,应该改为使用https://datascience.stackexchange.com/,但我给您一个起点。我将如何编码该解决方案的要点。

首先-PCA可能不是理想的起点,因为从仅查看数据/列来看,您的问题不是维度。在5年内,您基本上有10种不同的犯罪。您也只有58个不同的行...还是仅仅是示例数据?另外,您的数据有点奇怪-多行价格相同,但犯罪率不同。我不知道是否只是因为您要发布示例数据。如果确实是完整的数据集,请立即停止分析并获取更多数据/执行其他操作。

我就如何处理该问题做出了一些行政决定。所有这些只是为了演示如何编写回归代码。我总结了所有年份的犯罪情况(您可能想要平均吗?最高?变化多少?这些都是您的设计决策)。我的指标是2012-2016年的价格变化,即您拥有犯罪数据的时间表。我按犯罪类型归一化了犯罪计数。没有缩放目标变量。

这就是我的开始方式:

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

对您的分析的简单回答:无论白人居住在芝加哥何处,房产都很昂贵。

答案 1 :(得分:0)

我查看了您的数据。这是我几个预处理步骤的2美分:

  1. 您需要重新排列,以使Y为Price_For_Area_Year。例如您的第一条记录将转换为以下内容:

enter image description here

  1. 1个热编码区域/区域代码
  2. 使用某些标准方法填充缺失值
  3. 使用pca等处理多重共线性。自变量具有高度相关性。

我认为您应该获得一些有意义的线性相关性。如果不是,请尝试将某些变量转换为等级。务必分享结果。