有什么有效的方法来建立面板数据的回归模型?
Any efficient way to build up regression model on panel data?
我有一些二维数据,包括某些地区的高发犯罪类型和对应的全年房价。我想了解某些地区的犯罪频率与房价波动之间可能存在的关联。最初我尝试使用线性回归来做到这一点,但效果不佳。现在我想尝试对我的数据进行 PCA 分析,但获取有意义的结果对我来说仍然效率不高。如何对面板数据执行有效的 PCA 分析以进行回归?任何有效的解决方法来实现这一目标?谢谢
数据 :
因为我的数据在维度上有点长,在这里做一个可重现的例子有点困难,所以让我们看看面板数据的样子:
这里是最安全的云link,您可以浏览输入面板数据: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不是一个好主意,那么有什么可能的回归模型可以捕捉到特定社区区域的犯罪频率与房价波动之间的关系?有什么想法吗?
几个想法:
1) 请post完成代码。我看不到 crime_realEstate 在哪里定义。如果您遗漏了将数据读入该变量的那一行,那么将很难重现您的错误,而且您也不太可能获得帮助。此外,您应该组织所有导入语句,使它们位于代码的顶部。它并不是真正的功能性东西,更多的是每个人都期望的约定,并且更容易阅读。
2) 当你引用面板数据时,你真的在谈论 pandas DataFrame 吗?这是一种 "typical" 存储此类内容以供分析的方法。您可能希望养成将数据称为数据框的习惯,以便您的听众更清楚。您还应该 post 完整的错误回溯,这样我们就可以看到到底是哪一行代码被轰炸了。
3) 我认为您可能误解了 PCA,或者至少误解了它的用途。 PCA(主成分分析)是一种数据转换方法,您可以在其中捕获跨多个变量的数据变化,并将该数据重新表示为捕获相同数量(或更少,取决于您保留的组件数量)的可变性的更少组件.一旦你 运行 PCA,你将无法看到哪些特征导致了犯罪,因为它们将被全新的组件所取代。如果识别与犯罪相关的特征很重要,那么 PCA 就不是个好主意。
请修正以上项目。
编辑
我并不是说 PCA 错误,我只是说您在上面提出的问题 ("how do I apply PCA and why is my code bombing") 并不是真正正确的问题.如果您认为有许多相关变量需要降低到较低的维度级别,则应使用 PCA。不过我不会从那里开始 - 看看不这样做可以获得什么样的准确性。您现在已经重新表述了一个更广泛的问题 "how do I make a predictive model for this data, preferably using a regression?",它可能应该转到 https://datascience.stackexchange.com/,但我会给您一个起点,说明我将如何编写该解决方案。
首先 - PCA 可能不是理想的起点,因为从 data/columns 来看,你的问题不是维度。你基本上在 5 年内犯下了 10 种不同的罪行。您也只有 58 行不同的行……或者这只是示例数据?此外,您的数据有点奇怪 - 多行的价格相同,但犯罪行为不同。我不知道这是否只是因为您正在 posting 示例数据。如果这确实是完整的数据集,请立即停止分析并获得更多 data/go 做其他事情。
我就如何处理这个问题做出了一些行政决定。所有这些都只是为了演示如何编写回归代码。我总结了所有年份的犯罪率(你可能想要平均值?最高?变化?这些都是你的设计决策)。我的指标是 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
对您的分析的更简单的回答:在白人住在芝加哥的任何地方,属性 都很贵。
我看了你的数据。这是我在几个预处理步骤上花费的 2 美分:
- 您需要重新排列它,使 Y 为 Price_For_Area_Year。例如您的第一条记录变为以下内容:
- 1 热编码 area/area_code
- 使用一些标准方法填补缺失值
- 使用 pca 等处理多重共线性。自变量具有很高的相关性。
我认为你应该得到一些有意义的线性相关性。如果不是,请尝试将一些变量转换为等级。请分享结果。
我有一些二维数据,包括某些地区的高发犯罪类型和对应的全年房价。我想了解某些地区的犯罪频率与房价波动之间可能存在的关联。最初我尝试使用线性回归来做到这一点,但效果不佳。现在我想尝试对我的数据进行 PCA 分析,但获取有意义的结果对我来说仍然效率不高。如何对面板数据执行有效的 PCA 分析以进行回归?任何有效的解决方法来实现这一目标?谢谢
数据 :
因为我的数据在维度上有点长,在这里做一个可重现的例子有点困难,所以让我们看看面板数据的样子:
这里是最安全的云link,您可以浏览输入面板数据: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不是一个好主意,那么有什么可能的回归模型可以捕捉到特定社区区域的犯罪频率与房价波动之间的关系?有什么想法吗?
几个想法:
1) 请post完成代码。我看不到 crime_realEstate 在哪里定义。如果您遗漏了将数据读入该变量的那一行,那么将很难重现您的错误,而且您也不太可能获得帮助。此外,您应该组织所有导入语句,使它们位于代码的顶部。它并不是真正的功能性东西,更多的是每个人都期望的约定,并且更容易阅读。
2) 当你引用面板数据时,你真的在谈论 pandas DataFrame 吗?这是一种 "typical" 存储此类内容以供分析的方法。您可能希望养成将数据称为数据框的习惯,以便您的听众更清楚。您还应该 post 完整的错误回溯,这样我们就可以看到到底是哪一行代码被轰炸了。
3) 我认为您可能误解了 PCA,或者至少误解了它的用途。 PCA(主成分分析)是一种数据转换方法,您可以在其中捕获跨多个变量的数据变化,并将该数据重新表示为捕获相同数量(或更少,取决于您保留的组件数量)的可变性的更少组件.一旦你 运行 PCA,你将无法看到哪些特征导致了犯罪,因为它们将被全新的组件所取代。如果识别与犯罪相关的特征很重要,那么 PCA 就不是个好主意。
请修正以上项目。
编辑
我并不是说 PCA 错误,我只是说您在上面提出的问题 ("how do I apply PCA and why is my code bombing") 并不是真正正确的问题.如果您认为有许多相关变量需要降低到较低的维度级别,则应使用 PCA。不过我不会从那里开始 - 看看不这样做可以获得什么样的准确性。您现在已经重新表述了一个更广泛的问题 "how do I make a predictive model for this data, preferably using a regression?",它可能应该转到 https://datascience.stackexchange.com/,但我会给您一个起点,说明我将如何编写该解决方案。
首先 - PCA 可能不是理想的起点,因为从 data/columns 来看,你的问题不是维度。你基本上在 5 年内犯下了 10 种不同的罪行。您也只有 58 行不同的行……或者这只是示例数据?此外,您的数据有点奇怪 - 多行的价格相同,但犯罪行为不同。我不知道这是否只是因为您正在 posting 示例数据。如果这确实是完整的数据集,请立即停止分析并获得更多 data/go 做其他事情。
我就如何处理这个问题做出了一些行政决定。所有这些都只是为了演示如何编写回归代码。我总结了所有年份的犯罪率(你可能想要平均值?最高?变化?这些都是你的设计决策)。我的指标是 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
对您的分析的更简单的回答:在白人住在芝加哥的任何地方,属性 都很贵。
我看了你的数据。这是我在几个预处理步骤上花费的 2 美分:
- 您需要重新排列它,使 Y 为 Price_For_Area_Year。例如您的第一条记录变为以下内容:
- 1 热编码 area/area_code
- 使用一些标准方法填补缺失值
- 使用 pca 等处理多重共线性。自变量具有很高的相关性。
我认为你应该得到一些有意义的线性相关性。如果不是,请尝试将一些变量转换为等级。请分享结果。