
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# Load the dataset
file_path = '/path/to/Housing.csv'
housing_data = pd.read_csv(file_path)

# Check for missing values
missing_values = housing_data.isnull().sum()

# Outlier detection and capping function
def detect_outliers_iqr(data, column):
    Q1 = data[column].quantile(0.25)
    Q3 = data[column].quantile(0.75)
    IQR = Q3 - Q1
    lower_bound = Q1 - 1.5 * IQR
    upper_bound = Q3 + 1.5 * IQR
    outliers = data[(data[column] < lower_bound) | (data[column] > upper_bound)]
    return outliers

def cap_outliers(data, column):
    Q1 = data[column].quantile(0.25)
    Q3 = data[column].quantile(0.75)
    IQR = Q3 - Q1
    lower_bound = Q1 - 1.5 * IQR
    upper_bound = Q3 + 1.5 * IQR
    data[column] = np.where(data[column] < lower_bound, lower_bound, data[column])
    data[column] = np.where(data[column] > upper_bound, upper_bound, data[column])

# Detect and cap outliers
numerical_columns = ['price', 'area', 'bedrooms', 'bathrooms', 'stories', 'parking']
for col in numerical_columns:
    cap_outliers(housing_data, col)

# Save the processed dataset
housing_data.to_csv('/path/to/Processed_Housing.csv', index=False)

# Visualizations
for col in numerical_columns:
    plt.figure(figsize=(8, 5))
    plt.hist(housing_data[col], bins=30, edgecolor='black')
    plt.title(f'Distribution of {col}')
    plt.xlabel(col)
    plt.ylabel('Frequency')
    plt.show()

plt.figure(figsize=(8, 5))
plt.scatter(housing_data['area'], housing_data['price'], alpha=0.6)
plt.title('Area vs Price')
plt.xlabel('Area')
plt.ylabel('Price')
plt.show()

for col in numerical_columns:
    plt.figure(figsize=(8, 5))
    plt.boxplot(housing_data[col], vert=False)
    plt.title(f'Box Plot of {col} after Outlier Handling')
    plt.xlabel(col)
    plt.show()
