我有二维数据,包括某些地区的频繁犯罪类型以及一年中的相应房价。我想了解某些地区的犯罪频率与房价波动之间的可能联系。最初,我尝试使用线性回归来做到这一点,但是效果并不理想。现在,我想对数据进行PCA分析,但是获取有意义的结果对我而言仍然不够有效。为了进行回归分析,如何对面板数据执行有效的PCA分析?任何有效的解决方法来实现这一目标?谢谢
资料:
因为我的数据在维数上有点长,所以在这里很难制作出可重复的示例,所以让我们看一下面板数据的样子:
这是最安全的云链接,您可以浏览输入面板数据:示例数据片段。
更新:我的尝试:
由于@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 = "/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_ = crime_realEstate.filter(regex='_').columns
crime_realEstate['Area_Name']=crime_realEstate['Area_Name'].apply(lambda x: re.sub(' ', '_', str(x)))
regDF_ = crime_realEstate[cols_]
regDF_ = regDF_.assign(community_code=crime_finalDF['community_area'])
regDF_.dropna(inplace=True)
X_feats = regDF_.drop(['Avg_Price_'], axis=1)
y_label = regDF_['Avg_Price_'].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。如果您将数据读入该变量的行省略了,那么它真的很难重现错误,并且您获得帮助的可能性也较小。另外,您应该组织所有导入语句,使其位于代码的顶部。这并不是真正的功能,更多的是每个人都期望的约定,并使其更易于阅读。
2)当您参考面板数据时,您是否真的在谈论熊猫DataFrame?这是存储此类资料以进行分析的“典型”方式。您可能想要养成将数据称为数据框的习惯,以便您的听众更容易理解。您还应该发布完整的错误回溯,以便我们可以看到确切的代码行正在轰炸。
3)我认为您可能误会了PCA,或者至少是误解了它的用途。PCA(原理成分分析)是一种数据转换方法,您可以捕获跨多个变量的数据中的变化,并以捕获相同数量(或更少,取决于您保留的成分数)的更少的成分来重述该数据。 。一旦运行PCA,您将无法查看哪些功能正在助长犯罪,因为它们将被全新的组件所取代。如果确定与犯罪相关的功能很重要,那么PCA是个坏主意。
请修复上面的项目。
编辑
我并不是说PCA是错误的,而是您在上面提出的问题(“我如何应用PCA以及为什么我的代码轰炸”)并不是真正的正确问题。如果您认为有许多相关变量需要减少到较低的维度,则应使用PCA。不过,我不会从那里开始-看看不这样做就能获得什么样的准确性。您现在已经重新提出了一个更广泛的问题:“如何为该数据创建预测模型,最好使用回归模型?”,应该改为访问/,但是我我将为您提供如何对该解决方案进行编码的起点。
首先-PCA可能不是理想的起点,因为从仅查看数据/列来看,您的问题不是维度。在5年内,您基本上有10种不同的犯罪。您也只有58个不同的行...还是仅仅是示例数据?另外,您的数据有些奇怪-多行的价格相同,但犯罪情况不同。我不能说这仅仅是因为您要发布示例数据。如果确实是完整的数据集,请立即停止分析并获取更多数据/执行其他操作。
我对如何处理该问题做出了一些行政决策。所有这些只是为了演示如何编写回归代码。我总结了所有年份的犯罪情况(您可能想要平均吗?最高?变化多少?这些都是您的设计决策)。我的指标是-的价格变化,即您拥有犯罪数据的时间表。我按犯罪类型归一化了犯罪计数。没有缩放目标变量。
这是我的开始方式:
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 and - same timeframe you have crime data
crime_df['price_change'] = crime_df['Avg_Price_'] - crime_df['Avg_Price_']
crime_df.drop(['Avg_Price_','Avg_Price_','Avg_Price_','Avg_Price_','Avg_Price_','Avg_Price_','Avg_Price_','Avg_Price_'],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
对您的分析的简单回答:无论白人居住在芝加哥哪里,房产都是昂贵的。