Есть ли эффективный способ построения регрессионной модели на панельных данных? - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть двумерные данные, включая данные о частоте преступлений в определенных регионах и соответствующие цены на жилье в течение года. Я хочу понять возможную связь между частотой преступлений в определенных регионах и колебаниями цен на жилье. Сначала я пытался использовать линейную регрессию, но это не сработало. Сейчас я хочу попробовать PCA-анализ своих данных, но я все еще не могу получить значимые результаты. Как я могу выполнить эффективный анализ PCA на панельных данных с целью проведения регрессии? любой эффективный обходной путь, чтобы это произошло? спасибо

данные :

, поскольку мои данные немного длинны с точки зрения измерения, сделать здесь воспроизводимый пример довольно сложно, поэтому давайте посмотрим, как выглядят данные панели:

enter image description here enter image description here

вот самая безопасная облачная ссылка, по которой вы можете просматривать данные панели ввода: пример фрагмента данных .

обновление: моя попытка :

поскольку @ 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 ]

2 голосов
/ 25 апреля 2019

Пара мыслей:

1) Пожалуйста, отправьте полный код. Я не вижу, где Crime_realEstate определяется где-либо. Если вы пропустите строку, в которой вы читаете данные в этой переменной, вам будет очень трудно воспроизвести вашу ошибку, и вы с меньшей вероятностью получите помощь. Кроме того, вы должны организовать все ваши операторы импорта так, чтобы они были в верхней части вашего кода. Это на самом деле не функциональная вещь, скорее соглашение, которое все ожидают и которое облегчает чтение.

2) Когда вы ссылаетесь на данные панели, вы действительно говорите о панде DataFrame? Это своего рода «типичный» способ хранения такого рода вещей для анализа. Вы можете захотеть ссылаться на данные как на фреймы данных, чтобы они были понятнее вашей аудитории. Вам также следует опубликовать полный текст трассировки ошибок, чтобы мы могли точно увидеть, какая строка кода бомбардировала.

3) Я думаю, что вы неправильно понимаете PCA или, по крайней мере, для чего он нужен. PCA (анализ основных компонентов) - это метод преобразования данных, при котором вы фиксируете изменение в данных, относящихся к нескольким переменным, и восстанавливаете эти данные как меньшее количество компонентов, которые фиксируют одинаковое количество (или меньше, в зависимости от того, сколько компонентов вы храните) изменчивости. , Запустив PCA, вы не сможете увидеть, какие функции способствуют преступности, поскольку они будут заменены совершенно новыми компонентами. Если важно определить функции, связанные с преступностью, то PCA - плохая идея.

Пожалуйста, исправьте пункты выше.

EDIT

Я не говорю, что PCA является неправильным , я просто говорю, что вопрос, который вы задали выше («как я применяю PCA и почему моя бомбардировка кода»), на самом деле не правильный вопрос PCA следует использовать, если вы считаете, что у вас много коррелированных переменных, которые необходимо уменьшить до более низкого уровня размерности. Я бы не стал там начинать - посмотрите, какую точность вы можете получить, не делая этого. Теперь вы переформулировали гораздо более широкий вопрос о том, «как сделать прогнозную модель для этих данных, предпочтительно с использованием регрессии?», Которая, вероятно, вместо этого должна перейти к https://datascience.stackexchange.com/, но я дам вам отправная точка того, как я подойду к кодированию этого решения.

Во-первых, PCA, вероятно, не является идеальной отправной точкой, потому что если вы просто посмотрите на данные / столбцы, ваша проблема не в размерности. У вас есть 10 различных преступлений за 5 лет. У вас также есть только 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

Упрощенный ответ на ваш анализ: где бы ни жили белые люди в Чикаго, собственность стоит дорого.

0 голосов
/ 26 апреля 2019

Я взглянул на твои данные. Вот мои 2 цента за несколько шагов предварительной обработки:

  1. Вам нужно изменить его так, чтобы Y было Price_For_Area_Year. например Ваша первая запись превращается в следующее:

enter image description here

  1. 1 горячее кодирование area / area_code
  2. Ввести недостающие значения стандартным методом
  3. позаботиться о мультиколлинеарности, используя pca и т. Д. Независимые переменные имеют высокую корреляцию.

Я думаю, вы должны получить какую-то значимую линейную корреляцию. Если нет, попробуйте преобразовать некоторые переменные в ранги. Расскажите, как это работает.

...