I have gotten the assignment to analyze a dataset of 1.000+ houses, build a multiple regression model to predict prices and then select the three houses which are the cheapest compared to the predicted price. Other than selecting specifically three houses, there is also the constraint of a “budget” of 7.000.000 total for purchasing the three houses.
I have gotten so far as to develop the regression model as well as calculate the predicted prices and the risiduals and added them to the original dataset. I am however completely stumped as to how to write a code to select the three houses, given the budget restraint and optimizing for highest combined risidual.
Here is my code so far:
### modules import pandas as pd import statsmodels.api as sm ### Data import df = pd.DataFrame({"Zip Code" : [94127, 94110, 94112, 94114], "Days listed" : [38, 40, 40, 40], "Price" : [633000, 1100000, 440000, 1345000], "Bedrooms" : [0, 3, 0, 0], "Loft" : [1, 0, 1, 1], "Square feet" : [1124, 2396, 625, 3384], "Lotsize" : [2500, 1750, 2495, 2474], "Year" : [1924, 1900, 1923, 1907]}) ### Creating LM y = df["Price"] # dependent variable x = df[["Zip Code", "Days listed", "Bedrooms", "Loft", "Square feet", "Lotsize", "Year"]] x = sm.add_constant(x) # adds a constant lm = sm.OLS(y,x).fit() # fitting the model # predict house prices prices = sm.add_constant(x) ### Summary #print(lm.summary()) ### Adding predicted values and risidual values to df df["predicted"] = pd.DataFrame(lm.predict(prices)) # predicted values df["risidual"] = df["Price"] - df["predicted"] # risidual values
If anyone has an idea, could you explain to me the steps and give a code example? Thank you very much!
Advertisement
Answer
With the clarification that you are looking for the best combination your problem is more complicated ;) I have tried a “brute-force” approach but at least my laptop takes forever with the full dataset. Find below my thoughts:
Obviously we have to calculate the combinations of many houses, therefore my first approach was to reduce the dataset as far as possible.
- If
Price+2*min(Price)>budget
there will be no combination with two houses that is smaller - If
risidual
is negative we will not consider the house during optimization
In pandas this will look as this:
budget=7000000 df=df[df['Price']<(budget-2*df['Price'].min())].copy() df=df[df['risidual']>0].copy()
This reduces the objects from 1395
to 550
.
Unfortunatly, 550 ID
are still many combinations (27578100
) as calculated with itertools
:
import itertools idx=[a for a in itertools.combinations(df.index,3)]
You can evaluate these combinations by
result={comb: df.loc[[*comb], 'risidual'].sum() for comb in idx[10000:] if df.loc[[*comb], 'Price'].sum() < budget}
Note: I have limited the evaluation to the first 10000
values due to the calculation duration.
print("Combination: {}nPrice: {}nCost: {}".format(max(result),df.loc[[*max(result)], 'Price'].sum(),result[max(result)] ))
Maybe it is advisable to calculate the combination of just two object first to further reduce the possible combinations. I think you should have a look at the Knapsack problem
I think you are almost there. Given that df["risidual"]
has the difference between predicted and real price you have to select the subset that fits your limit e.g.
df_budget=df[df['price']<=budget].copy()
using pandas nlargest()
you could retrieve the three biggest differences
df_budget.nlargest(3, 'risidual')
Note: Code was not tested due to missing sample data