我有二维数据,包括某些地区的频繁犯罪类型和一年中相应的房价。我想了解某些地区的犯罪频率与房价波动之间可能存在关联。最初我尝试使用线性回归来做到这一点,但它没有奏效。现在我想对我的数据进行PCA分析,但是获取有意义的结果对我来说仍然没有效率。为了进行回归,我如何对面板数据执行有效的PCA分析?任何有效的解决方法来实现这一目标?谢谢
数据:
因为我的数据在维度上有点长,所以在这里制作可重复的例子有点困难,所以让我们看一下面板数据的样子:
这里是最安全的云链接,您可以浏览输入面板数据: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)请发布完整的代码。我没有看到在任何地方定义了crime_realEstate的位置。如果您将数据中读取的行留在该变量中,则很难重现错误,并且您不太可能获得帮助。此外,您应该组织所有的import语句,使它们位于代码的顶部。它实际上不是一个功能性的东西,更像是每个人都期望的约定,并且更容易阅读。
2)当你引用面板数据时,你真的在谈论一个pandas 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
更简单的答案分析:无论白人居住在芝加哥,物业都很昂贵。