<jupyter_start><jupyter_text>Содержание1&nbsp;&nbsp;Изучение данных из файла1.1&nbsp;&nbsp;Вывод2&nbsp;&nbsp;Предобработка данных2.1&nbsp;&nbsp;Вывод3&nbsp;&nbsp;Расчёты и добавление результатов в таблицу3.1&nbsp;&nbsp;Вывод4&nbsp;&nbsp;Исследовательский анализ данных5&nbsp;&nbsp;Общий вывод6&nbsp;&nbsp;Чек-лист готовности проекта  Исследование объявлений о продаже квартирВ вашем распоряжении данные сервиса Яндекс.Недвижимость — архив объявлений о продаже квартир в Санкт-Петербурге и соседних населённых пунктах за несколько лет. Нужно научиться определять рыночную стоимость объектов недвижимости. Ваша задача — установить параметры. Это позволит построить автоматизированную систему: она отследит аномалии и мошенническую деятельность. По каждой квартире на продажу доступны два вида данных. Первые вписаны пользователем, вторые получены автоматически на основе картографических данных. Например, расстояние до центра, аэропорта, ближайшего парка и водоёма.   Изучение данных из файла<jupyter_code>import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
 
df = pd.read_csv('data_sets/real_estate_data.csv', sep = '\t')
df.info()
df.head(10)<jupyter_output><class 'pandas.core.frame.DataFrame'>
RangeIndex: 23699 entries, 0 to 23698
Data columns (total 22 columns):
 #   Column                Non-Null Count  Dtype  
---  ------                --------------  -----  
 0   total_images          23699 non-null  int64  
 1   last_price            23699 non-null  float64
 2   total_area            23699 non-null  float64
 3   first_day_exposition  23699 non-null  object 
 4   rooms                 23699 non-null  int64  
 5   ceiling_height        14504 non-null  float64
 6   floors_total          23613 non-null  float64
 7   living_area           21796 non-null  float64
 8   floor                 23699 non-null  int64  
 9   is_apartment          2775 non-null   object 
 10  studio                23699 non-null  bool   
 11  open_plan             23699 non-null  bool   
 12  kitchen_area          21421 non-null  float64
 13  balcony               12180 non-null  float64
 14  locality_name         23650 non-null  object 
 15  airports_nearest   [...]<jupyter_text>Вывод  В данных очень много пропусков, на большинство пропусков подходящей замены будет найти трудно, по этому придется в некоторых местах оставить  Предобработка данных<jupyter_code># Проверка на дубликаты

print(df.duplicated().sum())

# Подсчет всех пропусков по столбцам
manual_columns = []

for i in df.columns:
    print(i, df[i].isna().sum())
    if df[i].isna().sum() > 0:
        manual_columns.append(i)

# Собрали все столбци которые были заданы вручную и обнаружены наны
print(manual_columns)

# Посчитали количество строк в которых большинство пропуски их оказалось 270
df_manual_nan = df
for i in manual_columns:
    if i == 'locality_name' or i== 'floors_total' or i== 'days_exposition':
        continue
    else:
        df_manual_nan = df_manual_nan[df_manual_nan[i].isna()]

print(df_manual_nan)
# Удаляем 270 строк где большинство пропусков
df.drop(labels = df_manual_nan.index ,axis = 0, inplace = True)
df.reset_index(drop = True, inplace = True)
df<jupyter_output>0
total_images 0
last_price 0
total_area 0
first_day_exposition 0
rooms 0
ceiling_height 9195
floors_total 86
living_area 1903
floor 0
is_apartment 20924
studio 0
open_plan 0
kitchen_area 2278
balcony 11519
locality_name 49
airports_nearest 5542
cityCenters_nearest 5519
parks_around3000 5518
parks_nearest 15620
ponds_around3000 5518
ponds_nearest 14589
days_exposition 3181
['ceiling_height', 'floors_total', 'living_area', 'is_apartment', 'kitchen_area', 'balcony', 'locality_name', 'airports_nearest', 'cityCenters_nearest', 'parks_around3000', 'parks_nearest', 'ponds_around3000', 'ponds_nearest', 'days_exposition']
       total_images  last_price  total_area first_day_exposition  rooms  \
30               12   2200000.0        32.8  2018-02-19T00:00:00      1   
60                3   2740000.0        35.0  2018-01-01T00:00:00      1   
81                9  10949000.0        68.0  2018-12-27T00:00:00      1   
133              12   3150000.0        31.0  2018-03-23T00:00:00      1   
166[...]<jupyter_text>Вывел количество NAN в каждом столбцеРешил удалить столбци в которых большинство данных не заполнено вручную, так как посчитал что это не правильные обьявления и они только портят данные<jupyter_code>#Проверка на дупликаты
print(len(df['locality_name'].unique()))
print(len(df['locality_name'].str.lower().unique()))

display(df[df['locality_name'].isna()].head(10))
print(df['locality_name'].isna().sum())
df['locality_name'].fillna(value = 'Не указан', inplace = True)
print(df['locality_name'].isna().sum())<jupyter_output>358
358<jupyter_text>Обработал значения столбца locality_name, так как данных не достаточно для точного определение города и нанов в этом столбце не много, то решил просто заменить их на строку Не указан<jupyter_code>#Заметил аномальные значния
print(df['ceiling_height'].unique())


# Посчитал 128 аномальных значений 
print(df.query('ceiling_height <= 2.0 or ceiling_height >= 4.0')['ceiling_height'].count())

# <NAME> на медиану и Медианой заполняю аномальные значения до 2 метров и больше 4 метров
ceiling_height_median = df['ceiling_height'].median()
df['ceiling_height'] = df['ceiling_height'].apply(lambda x: ceiling_height_median if x <= 2.0 or x >= 4.0 else x)
df['ceiling_height'] = df['ceiling_height'].fillna(ceiling_height_median)

# Проверка 
print(df['ceiling_height'].isna().sum())<jupyter_output>[  2.7     nan   3.03   2.5    2.67   2.56   3.05   2.75   2.6    2.9
   2.8    2.55   3.     2.65   3.2    2.61   3.25   3.45   2.77   2.85
   2.64   2.57   4.15   3.5    3.3    2.71   4.     2.47   2.73   2.84
   3.1    2.34   3.4    3.06   2.72   2.54   2.51   2.78   2.76  25.
   2.58   3.7    2.52   5.2    2.87   2.66   2.59   2.     2.45   3.6
   2.92   3.11   3.13   3.8    3.15   3.55   3.16   3.62   3.12   2.53
   2.74   2.96   2.46   5.3    5.     2.79   2.95   4.06   2.94   3.82
   3.54   3.53   2.83   4.7    2.4    3.38   3.01   5.6    3.65   3.9
   3.18   3.35   2.3    3.57   2.48   2.62   2.82   3.98   2.63   3.83
   3.52   3.95   3.75   2.88   3.67   3.87   3.66   3.85   3.86   4.19
   3.24   4.8    4.5    4.2    3.36  32.     3.08   3.68   3.07   3.37
   3.09   8.     3.26   3.34   2.81   3.44   2.97   3.14   4.37   2.68
   3.22   3.27  27.     4.1    2.93   3.46  24.     3.47   3.33   3.63
   3.32  26.     1.2    8.3    2.98   2.86   3.17   4.4    3.28   3.04
   4.45   5[...]<jupyter_text>При обработке данных столбца с высотой потолка определил, что много аномальных значений и их нужно заменить медианным, так как большинство значений высоты потолков не отличаются от медианы на большое числов и также этим значением заменил наны, считаю это оптимальным решением<jupyter_code># Изучения данных столбца количества этажей + подсчет изначально пропущенных значений
print(df['floors_total'].unique())
print(df[df['floors_total'].isna()].head(50))
print(df['floors_total'].isna().sum())

# Обьявление функции для определение одинаковых по 3 параметрам: Название населенного пункта, Растояние до центра, растояние до аэропорта
def determine_house_for_total_floors(x):
    if pd.isnull(x['floors_total']):
        median_total_floors = df[(df['locality_name'] == x['locality_name']) 
                                & (df['cityCenters_nearest'] == x['cityCenters_nearest'])
                                & (df['airports_nearest'] == x['airports_nearest'])]['floors_total'].median()
        if median_total_floors < x['floor']:
            return x['floors_total']
        else:
            return median_total_floors
    else:
        return x['floors_total']

# Применение функции и замена нанов на количество этажей в одинаковых домах
df['floors_total'] = df.apply(func = determine_house_for_total_floors, axis = 1)
print(df['floors_total'].isna().sum())

# Остались пропуски так как может быть нету больше квартир с одинаковыми 3 параметрами что в функци либо для всех квартир в доме не указано количество этажей<jupyter_output>[16. 11.  5. 14. 12. 26. 24. 27.  9.  6. 17. 25.  3. 23. 19. 18.  4. 22.
  8.  2. 10.  7. 13. 15. nan 20. 28. 36. 21. 35. 34. 60.  1. 29. 33. 52.
 37.]
       total_images  last_price  total_area first_day_exposition  rooms  \
181              12  11640000.0       65.20  2018-10-02T00:00:00      2   
232               4   2438033.0       28.10  2016-11-23T00:00:00      1   
448               4   9788348.0       70.80  2015-08-01T00:00:00      2   
660               4   6051191.0       93.60  2017-04-06T00:00:00      3   
1738              5   3600000.0       39.00  2017-04-22T00:00:00      1   
1909              1   9750000.0       66.77  2016-05-13T00:00:00      2   
2364              7   5395770.0       53.00  2017-06-29T00:00:00      2   
2816              4   2325000.0       27.80  2016-09-21T00:00:00      1   
2921             10   6500000.0       54.30  2019-04-23T00:00:00      1   
3000              9   6400000.0       56.70  2018-03-27T00:00:00      2   
3403             10   4[...]<jupyter_text>Для замены нанов в количестве этажей пришлось вычислить похожие дома (одинаковые) по трем параметрам город, растояние до центра, и растояние до аиропорта, использовали эти значения как координаты и заполнили этим, но некторые дома не получилось так сопоставить по этому остались наны<jupyter_code># Изученее данных колонки жилая площадь
print(df['living_area'].unique())

df['living_area'].value_counts().head(50)

df.query('living_area > total_area')

print(df['living_area'].isna().sum())

# Задание функции для нахождения строк с одинаковой площадью и комнат
def determine_house_for_area(x, type_of_area):
    if pd.isnull(x[type_of_area]):
        median_living_area = df[(df['locality_name'] == x['locality_name']) 
                                & (df['total_area'] == x['total_area'])
                                & (df['rooms'] == x['rooms'])][type_of_area].median()

        return median_living_area
    else:
        return x[type_of_area]

def determine_house_for_living_area(x):
    return determine_house_for_area(x, type_of_area = 'living_area')

# Вместо пропусков вставляем медианное значение для похожих строк
df['living_area'] = df.apply(func = determine_house_for_living_area, axis = 1)

print(df['living_area'].isna().sum())

# Удаляем странные данные где жилая площадь меньше 6
df.drop(labels = df.query('living_area < 6').index ,axis = 0, inplace = True)
df.reset_index(drop = True, inplace = True)<jupyter_output>[51.   18.6  34.3  ... 31.65 13.59 42.55]
1633
512<jupyter_text>✔️ Комментарий ревьюера:  Удачное заполнение пропусков Для заполнение пропущенных значений здесь посчитали медианное значение среди квартир с одинаковой площадью и комнатДля тех у кого все равно остались наны оставляем ихУдалил аномальные значения когда жилая плозаль меньше 6<jupyter_code># Изучение данных
print(df['kitchen_area'].isna().sum())
display(df.query('kitchen_area > total_area'))

# Запуск функции для заполнений нанов
def determine_house_for__area(x):
    return determine_house_for_area(x, type_of_area = 'kitchen_area')

df['kitchen_area'] = df.apply(func = determine_house_for__area, axis = 1)
print(df['kitchen_area'].isna().sum())

# Удаление экстримально маленьких данных
df.drop(labels = df.query('kitchen_area < 3').index ,axis = 0, inplace = True)
df.reset_index(drop = True, inplace = True)<jupyter_output>2006<jupyter_text>Все так жеДля заполнение пропущенных значений здесь посчитали медианное значение среди квартир с одинаковой площадью и комнатДля тех у кого все равно остались наны оставляем ихУдалил аномальные значения когда жилая площадь меньше 3<jupyter_code># Посмотрели колонку про апартаменты, не заметил совпадений решил так и оставить
print(df['is_apartment'].unique())
print(df['is_apartment'].value_counts())
display(df[df['is_apartment'] == False].head(15))
display(df[df['is_apartment'] == True].head(15))
display(df[df['is_apartment'].isna()].head(15))<jupyter_output>[nan False True]
False    2724
True       50
Name: is_apartment, dtype: int64<jupyter_text>Не достаточно данных для того что бы заполнить здесь пропуски, по этому оставим<jupyter_code>print(df['balcony'].unique())
print(df['balcony'].isna().sum())

df['balcony'].fillna(value = 0, inplace = True)
print(df['balcony'].isna().sum())<jupyter_output>[nan  2.  0.  1.  5.  4.  3.]
11237
0<jupyter_text>Предпологаю что люди которые не указали сколько у них балконов скорей всего не имееют балконы<jupyter_code># Просмотр количества пропусков сейчас
for i in df.columns:
    print(i, df[i].isna().sum())
# Поменял типы данных
print(df.dtypes)
df['is_apartment'] = df['is_apartment'].astype('bool')
df['first_day_exposition'] = pd.to_datetime(df['first_day_exposition'], format='%Y-%m-%dT%H:%M:%S')
df.dtypes<jupyter_output>total_images              int64
last_price              float64
total_area              float64
first_day_exposition     object
rooms                     int64
ceiling_height          float64
floors_total            float64
living_area             float64
floor                     int64
is_apartment             object
studio                     bool
open_plan                  bool
kitchen_area            float64
balcony                 float64
locality_name            object
airports_nearest        float64
cityCenters_nearest     float64
parks_around3000        float64
parks_nearest           float64
ponds_around3000        float64
ponds_nearest           float64
days_exposition         float64
dtype: object<jupyter_text>Вывод 1. Так как дубликатов строк я здесь не нашлел, то основная обработка здесь была сделана для пропусков в значениях2. Посмотрел количество пропусков по всем строкам3. Удалил строки у которых большинство значений были NAN4. Провел анализ столбца названия города, не нашел дублирующих значений, NAN не смог заменить так как не хватаем данных для этого5. Изучил столбец высота потолков и заменил на медианное значениее этого параметра, также удалил аномальные данные этого столбца6. Изучил столбец количество этажей, квартиры которые находятся в одном доме имееют одинаковое количество этаже, по этому определил квартиры из одного дома и соопоставил значения в столбце количества этаже, в некоторых строках наны остались, так как не для всех квартир удалось определить один и тот же дом7. Изучил данные столбцов жилая площадь и кухонная площадь, нашел квартиры с одинаковой площадью и количеством комнат, заполнил соответсвующими значениями8. Наны в пропусках количества балконов заменил на отсутствия балконов9. Для остальных столбцов не достаточно количества данных для заполнения пропусков10. Изменил типы данных  Расчёты и добавление результатов в таблицу<jupyter_code>df['square_meter_price'] = df['last_price'] / df['total_area']
df['weekday'] = df['first_day_exposition'].dt.weekday
df['month'] = df['first_day_exposition'].dt.month
df['year'] = df['first_day_exposition'].dt.year

df['month'] = df['month'].astype('datetime64[M]')
display(df['square_meter_price'].head(10))
display(df.head(10))
def determine_floor(x):
    if x['floor'] == 1:
        return 'Первый'
    elif x['floor'] == x['floors_total']:
        return 'Последний'
    else:
        return 'Другой'
    
df['floor_name'] = df.apply(func = determine_floor, axis = 1)
df['floor_name'].value_counts()

df['living_area_ratio'] = round(df['living_area'] / df['total_area'], 4)
df['kitchen_area_ratio'] = round(df['kitchen_area'] / df['total_area'], 4)

df.head()<jupyter_output><empty_output><jupyter_text>Вывод 1. Посчитал и добавил новые столбци, такие как цена за метр квадратный, день, месяц, год выставления на продажу2. Добавил столбец с названием этажа3. Расчитал соотношения жилой площади и кухонной к всей площади каждой квартиры  Исследовательский анализ данных<jupyter_code>plt.xlabel('Total area')
plt.ylabel('Amount')
df['total_area'].hist(bins=50)
plt.show()
df.query('total_area < 15') # Аномально маленьких квартир не обнаружено
df.query('total_area > 400') # Аномально высоких значений 28, это выбросы, но они похожи на правду ценной и кол-вом комнат
plt.xlabel('Total area')
plt.ylabel('Amount')
df['total_area'].hist(bins=50, range = (0, 300))
plt.show()
# Данные напоминают распределение Пуассона 

df['total_area'].describe()<jupyter_output><empty_output><jupyter_text>Анализ и построенние гистограмы для столбца вся площадь<jupyter_code>plt.title('Last price')
df['last_price'].hist(bins = 50) # Строим гистограмму
plt.show()

df.boxplot(column = 'last_price') # Строим бокс плот, видно что очень много выбросов
plt.show()

# Изучаем кике значение считать выбросами
print(df.query('last_price < 20_000_000')['last_price'].count())
print(df.query('last_price > 20_000_000')['last_price'].count())

# Изучаем распределенее на данных, без выбросов
plt.title('Last price')
df['last_price'].hist(bins = 50, range = (0, 20_000_000))
plt.show()

print(df['last_price'].median())<jupyter_output><empty_output><jupyter_text>Изучил столбец цена, заметил большое количество выбросов, построил ящик с усами и гистограмму<jupyter_code>print(df['rooms'].unique())

plt.title('Rooms')
df['rooms'].hist(bins = 20)

plt.show()
display(df.query('rooms == 0'))

# Убираем значения комнат которые равны 0
df['rooms'] = df.apply(func = lambda x: df[(df['total_area'] >= x['total_area']) & (df['total_area'] <= x['total_area'] + 5)]['rooms'].max() 
                       if x['rooms'] == 0 else round(x['rooms']), axis = 1)
display(df.query('rooms == 0'))

# Убираем квартиры где аномальное число комнат по отношению к площаде
df = df.query('not (rooms > 9 and total_area < 300)').reset_index(drop= True)<jupyter_output>[ 3  1  2  4  5  6  0  7 11  8 14 10 15  9 19 16 12]<jupyter_text>Проанализировал столбец число комнат, убрал аномальное значение по отношению к площади, убрал значение комнат 0 и построил гистограмму<jupyter_code>plt.title('Ceiling height')
df['ceiling_height'].hist(bins = 15)

plt.title('Days exposition')
df['days_exposition'].hist(bins=50)
print(df[df['days_exposition'] <= 7]['days_exposition'].count()) # Аномально быстрые
print(df[df['days_exposition'] >= 800]['days_exposition'].count()) # Аномально долго

print('Медиана -', df['days_exposition'].median())
print('Среднее -', round(df['days_exposition'].mean(), 3))<jupyter_output>845
591
Медиана - 97.0
Среднее - 182.172<jupyter_text>1. В среднем продажа квартиры занимает 800 дней2. Аномально быстрые продажи это те что случились за меньше чем 7 дней и их 8453. Аномально долгие продажи это те что случились за больше чем 800 дней и их 591<jupyter_code>df.plot(x='rooms', y='square_meter_price', kind='scatter', alpha=0.3) 
print('Корреляция между ценной за м^2 и числом комнат', df['square_meter_price'].corr(df['rooms']))
plt.show()

df.plot(x='cityCenters_nearest', y='square_meter_price', kind='scatter', alpha=0.3) 
print('Корреляция между ценной за м^2 и растоянием до центра', df['square_meter_price'].corr(df['cityCenters_nearest']))
plt.show()<jupyter_output>Корреляция между ценной за м^2 и числом комнат 0.06041802202853674<jupyter_text>Получил 2 корелляции, чутка заметно что с увеличением растояния до центра уменьшается цена за квадратный метр<jupyter_code>df[df['floor_name'] == 'Первый']['square_meter_price'].hist(bins = 50)
print('Медианная цена за м^2 в квартирах на первом этажже', round(df[df['floor_name'] == 'Первый']['square_meter_price'].median(), 3))
plt.show()

df[df['floor_name'] == 'Последний']['square_meter_price'].hist(bins = 50)
print('Медианная цена за м^2 в квартирах на последнем этажже',round(df[df['floor_name'] == 'Последний']['square_meter_price'].median(), 3))
plt.show()

df[df['floor_name'] == 'Другой']['square_meter_price'].hist(bins = 50)
print('Медианная цена за м^2 в квартирах на других этажах',round(df[df['floor_name'] == 'Другой']['square_meter_price'].median(), 3))
plt.show()<jupyter_output>Медианная цена за м^2 в квартирах на первом этажже 81519.554<jupyter_text>Построил гистограммы, выяснилось что квартиры на других этажах в среднем стоят дороже<jupyter_code>df.plot(x='weekday', y='square_meter_price', kind='scatter', alpha=0.3) 
plt.show()

plt.plot(df['month'], df['square_meter_price'], 'o', alpha =0.3)
plt.show()

df.plot(x='year', y='square_meter_price', kind='scatter', alpha=0.3) 
plt.show()<jupyter_output><empty_output><jupyter_text>Данные не кореллируют так как они не зависят линейно<jupyter_code>sns.pairplot(df[['last_price', 'square_meter_price', 'total_area', 'rooms', 'cityCenters_nearest']])
df[['last_price', 'square_meter_price', 'total_area', 'rooms', 'cityCenters_nearest']].corr()<jupyter_output><empty_output><jupyter_text>Самая высокая положительная корреляция между ценной за кв метр и полной стоимостью, между всей площадью и числом комнат<jupyter_code>most_popular_cities = df['locality_name'].value_counts().head(10).index

max_mean_value = 0
lowest_mean_value = float('inf') 

for i in most_popular_cities:
    mean_value = df.query('locality_name == @i')['square_meter_price'].mean()

    
    if max_mean_value < mean_value:
        max_mean_value = mean_value 
        city_max = i
        
    if lowest_mean_value > mean_value:
        lowest_mean_value = mean_value
        city_lowest = i    
    
    print(i, round(mean_value, 3))
print()
print('Самая большая цена на квадратный метр', round(max_mean_value, 3), city_max)
print('Самая маленькая цена на квадратный метр', round(lowest_mean_value,3), city_lowest)

current_df = df.query('locality_name == "Санкт-Петербург"')

# Формирование столбца с километрами
current_df.loc[:, 'cityCenters_distance'] = df.loc[:,'cityCenters_nearest'].apply(func = lambda x: x if pd.isna(x) else int(x / 1000))
current_df.reset_index(drop= True, inplace = True)
current_df['cityCenters_distance'].hist(bins=50)
plt.show()

#Построение графика определения центрльной зоны
price_kilometrs = current_df.pivot_table(index = 'cityCenters_distance', values = 'last_price')
plt.plot(price_kilometrs.index, price_kilometrs['last_price']) 

# От до 10 километров это центральная зона<jupyter_output>/opt/conda/lib/python3.7/site-packages/pandas/core/indexing.py:376: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  self.obj[key] = _infer_fill_value(value)
/opt/conda/lib/python3.7/site-packages/pandas/core/indexing.py:494: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  self.obj[item] = s<jupyter_text>Из данных можно заметить что 1. Большинство квартир находятся на растоянии 10-15 км от центра2. То что квартиры которые находятся в промежутке от 0 до 8 км находятса в центре и заметно увеличивается в цене с каждым километром<jupyter_code>central_flats = current_df.query('cityCenters_distance < 10').reset_index(drop= True)
display(central_flats.head())

central_flats['total_area'].hist(bins = 50)
print('Медианное значение площади', central_flats['total_area'].median())
plt.show()

current_df['total_area'].hist(bins = 50)
print('Медианное значение площади во всем городе', current_df['total_area'].median())
plt.show()


central_flats['last_price'].hist(bins = 50)
print('Медианная цена', central_flats['last_price'].median())
plt.show()

current_df['last_price'].hist(bins = 50)
print('Медианная цена во всем городе', current_df['last_price'].median())
plt.show()
central_flats['rooms'].hist(bins = 50)
print('Медианное число комнат', central_flats['rooms'].median())
plt.show()

current_df['rooms'].hist(bins = 50)
print('Во всем городе', current_df['rooms'].median())
plt.show()
central_flats['ceiling_height'].hist(bins = 50)
print('Медианная высота потолков', central_flats['ceiling_height'].median())
plt.show()

current_df['ceiling_height'].hist(bins = 50)
print('Медианная высота потолков во всем городе', current_df['ceiling_height'].median())
plt.show()<jupyter_output>Медианная высота потолков 2.7<jupyter_text>Из этого анализа заметно что квартиры которые находятся в центре отличаются от всех квартир в основном площадью и ценной в большую сторону<jupyter_code>central_flats.plot(x='rooms', y='last_price', kind='scatter', alpha=0.3) 
print('Корреляция между ценной и количеством комнат',central_flats['last_price'].corr(df['rooms']))
plt.show()

current_df.plot(x='rooms', y='last_price', kind='scatter', alpha=0.3) 
print('Корреляция между ценной и количеством комнат во всем городе',current_df['last_price'].corr(df['rooms']))
plt.show()

central_flats.plot(x='floor', y='last_price', kind='scatter', alpha=0.3) 
print('Корреляция между ценной и этажем',central_flats['last_price'].corr(df['floor']))
plt.show()

current_df.plot(x='floor', y='last_price', kind='scatter', alpha=0.3) 
print('Корреляция между ценной и этажем во всем городе',current_df['last_price'].corr(df['floor']))
plt.show()
central_flats.plot(x='cityCenters_nearest', y='last_price', kind='scatter', alpha=0.3) 
print('Корреляция между ценной и растоянием к центру',central_flats['last_price'].corr(df['cityCenters_nearest']))
plt.show()

current_df.plot(x='cityCenters_nearest', y='last_price', kind='scatter', alpha=0.3) 
print('Корреляция между ценной и растоянием к центру во всем городе',current_df['last_price'].corr(df['cityCenters_nearest']))
plt.show()
plt.figure(figsize=(12,4))
plt.plot(central_flats['first_day_exposition'], central_flats['last_price'], 'ro', alpha =0.3)
print('Корреляция между ценной и датой публикации')
plt.show()

plt.figure(figsize=(12,4))
plt.plot(current_df['first_day_exposition'], current_df['last_price'], 'ro', alpha =0.3)
print('Корреляция между ценной и датой публикации во всем городе')
plt.show()

print('Корреляция для центральных квартир')
central_flats[['last_price', 'floor', 'total_area', 'rooms', 'cityCenters_nearest']].corr()
sns.pairplot(central_flats[['last_price', 'floor', 'total_area', 'rooms', 'cityCenters_nearest']]])
print('Корреляция для всех квартир в городе квартир')
current_df[['last_price', 'floor', 'total_area', 'rooms', 'cityCenters_nearest']].corr()<jupyter_output>Корреляция для всех квартир в городе квартир
{'fraction_non_alphanumeric': 0.11777391041162227, 'fraction_numerical': 0.05796004842615012, 'mean_word_length': 4.227012062487641, 'pattern_counts': {'":': 0, '<': 86, '<?xml version=': 0, '>': 85, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 7, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '22', 'dir': 'jupyter-structured-clean-dedup', 'id': '52737', 'license': 'MIT', 'n_tokens_mistral': 11166, 'n_tokens_neox': 11145, 'n_words': 2314, 'path': 'real_estates.ipynb', 'repo_name': 'webBogdan11/real_estate', 'size': '26436'}