AIM-PIbd-31-Razubaev-S-M/Lab_2/lab2.ipynb
2024-10-12 13:11:01 +04:00

283 KiB
Raw Blame History

Лабораторная 2

Информация об экономике стран

In [132]:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split

df = pd.read_csv(".//static//scv//Economic Data - 9 Countries (1980-2020).csv")
print(df.columns)
Index(['stock index', 'country', 'year', 'index price', 'log_indexprice',
       'inflationrate', 'oil prices', 'exchange_rate', 'gdppercent',
       'percapitaincome', 'unemploymentrate', 'manufacturingoutput',
       'tradebalance', 'USTreasury'],
      dtype='object')

Столбцы на русском: 'stock index' - индекс акций 'country' - страна 'year'- год 'index price' - индекс стоимости 'log_indexprice' - индексная цена журнала 'inflationrate' - ставка инфляции 'oil prices' - цена на нефть 'exchange_rate' - ставка обмена 'gdppercent' - процент ВВП 'percapitaincome' - доход на душу населения 'unemploymentrate' - уровень безработицы 'manufacturingoutput' - объем производства 'tradebalance' - торговый баланс 'USTreasury' - UST казначейство

In [133]:
df.info()
df.head()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 369 entries, 0 to 368
Data columns (total 14 columns):
 #   Column               Non-Null Count  Dtype  
---  ------               --------------  -----  
 0   stock index          369 non-null    object 
 1   country              369 non-null    object 
 2   year                 369 non-null    float64
 3   index price          317 non-null    float64
 4   log_indexprice       369 non-null    float64
 5   inflationrate        326 non-null    float64
 6   oil prices           369 non-null    float64
 7   exchange_rate        367 non-null    float64
 8   gdppercent           350 non-null    float64
 9   percapitaincome      368 non-null    float64
 10  unemploymentrate     348 non-null    float64
 11  manufacturingoutput  278 non-null    float64
 12  tradebalance         365 non-null    float64
 13  USTreasury           369 non-null    float64
dtypes: float64(12), object(2)
memory usage: 40.5+ KB
Out[133]:
stock index country year index price log_indexprice inflationrate oil prices exchange_rate gdppercent percapitaincome unemploymentrate manufacturingoutput tradebalance USTreasury
0 NASDAQ United States of America 1980.0 168.61 2.23 0.14 21.59 1.0 0.09 12575.0 0.07 NaN -13.06 0.11
1 NASDAQ United States of America 1981.0 203.15 2.31 0.10 31.77 1.0 0.12 13976.0 0.08 NaN -12.52 0.14
2 NASDAQ United States of America 1982.0 188.98 2.28 0.06 28.52 1.0 0.04 14434.0 0.10 NaN -19.97 0.13
3 NASDAQ United States of America 1983.0 285.43 2.46 0.03 26.19 1.0 0.09 15544.0 0.10 NaN -51.64 0.11
4 NASDAQ United States of America 1984.0 248.89 2.40 0.04 25.88 1.0 0.11 17121.0 0.08 NaN -102.73 0.12

Объект наблюдения - экономика Атрибуты - содержит набор информации об обучении, такие как: Фондовый рынок, ВВП, страна, год, стоимость топлива, уровень инфлции,уровень безработицы и так далее

In [134]:
plt.figure(figsize=(10, 6))

plt.scatter(df['inflationrate'], df['percapitaincome'], c=df['percapitaincome'], alpha=0.6)

plt.title("Номер 1")
plt.ylabel("Доход на душу населения")
plt.xlabel("Уровень инфляции")
plt.grid(visible='true')

plt.show()
No description has been provided for this image
In [135]:
year_condition = df.groupby('gdppercent')['unemploymentrate'].mean().reset_index()

plt.figure(figsize=(12, 6))

plt.plot(year_condition['gdppercent'], year_condition['unemploymentrate'], marker='.')

plt.title("Диаграмма 2")
plt.xlabel("GDP percent")
plt.ylabel("Unemployent Rate")


plt.show()
No description has been provided for this image

Присутствует связь между атрибутами, уровень инфляции влияет и зависит от многих атрибутов. Для примера на графике приведена связь между инфляцией и доходом на душу населения. На втором графике показана связь уровня ВВП и безработицы Примеры бизнес целей

1.Прогнозирование уровня инфляции на основе уровня ВВП.
2.Наблюдение за изменениями уровня безработицы с уровнем ВВП.

Эффект для бизнеса: влияние на инвестиции индекса акций и цен на нефть, исследование влияния фондового индекса на инвестиции, исследования инфляции и покупательской способности. Цели технического проекта

Для первой цели:

Вход: Доход на душу населения Целевой признак: Уровень инфляции.

Для второй цели:

Вход: Уровень безработицы Целевой признак: Уровень ВВП

Проверка на выбросы

In [136]:
null_values = df.isnull().sum()
print("Пропущенные значения по столбцам:")
print(null_values)

stat_summary = df.describe()
print("\nСтатистический обзор данных:")
print(stat_summary)
Пропущенные значения по столбцам:
stock index             0
country                 0
year                    0
index price            52
log_indexprice          0
inflationrate          43
oil prices              0
exchange_rate           2
gdppercent             19
percapitaincome         1
unemploymentrate       21
manufacturingoutput    91
tradebalance            4
USTreasury              0
dtype: int64

Статистический обзор данных:
              year   index price  log_indexprice  inflationrate  oil prices  \
count   369.000000    317.000000      369.000000     326.000000  369.000000   
mean   2000.000000   7898.648297        3.610542       0.041748   39.743171   
std      11.848225   7811.336862        0.482481       0.039579   25.452654   
min    1980.000000    168.610000        2.230000      -0.040000   11.350000   
25%    1990.000000   2407.100000        3.320000       0.020000   19.410000   
50%    2000.000000   5160.100000        3.600000       0.030000   28.520000   
75%    2010.000000  10279.500000        3.980000       0.057500   57.880000   
max    2020.000000  47751.330000        4.680000       0.240000   98.560000   

       exchange_rate  gdppercent  percapitaincome  unemploymentrate  \
count     367.000000  350.000000       368.000000        348.000000   
mean       27.897548    0.037114     20719.964674          0.068908   
std        49.620521    0.037850     17435.037783          0.043207   
min         0.900000   -0.110000        27.000000          0.020000   
25%         1.330000    0.020000      2090.250000          0.040000   
50%         5.440000    0.030000     19969.500000          0.060000   
75%        15.055000    0.060000     36384.000000          0.090000   
max       249.050000    0.150000     65280.000000          0.260000   

       manufacturingoutput  tradebalance  USTreasury  
count           278.000000    365.000000  369.000000  
mean            328.084820    -15.996384    0.059024  
std             622.395923    154.557170    0.033086  
min               0.590000   -770.930000    0.010000  
25%              80.380000    -25.370000    0.030000  
50%             188.160000     -0.140000    0.050000  
75%             271.977500     19.080000    0.080000  
max            3868.460000    366.140000    0.140000  

На основе данных выше можно выделить большое количество столбцов с пропущенными значениями Также проверим данные на выбросы и дубликаты:

In [137]:
for column in df.select_dtypes(include=[np.number]).columns:
    skewness = df[column].skew()
    print(f"\nКоэффициент асимметрии для столбца '{column}': {skewness}")

duplicates = df.duplicated().sum()
print(f"\nКоличество дубликатов: {duplicates}")
Коэффициент асимметрии для столбца 'year': 0.0

Коэффициент асимметрии для столбца 'index price': 1.7605604508668822

Коэффициент асимметрии для столбца 'log_indexprice': -0.23716751168770417

Коэффициент асимметрии для столбца 'inflationrate': 1.5616085380027898

Коэффициент асимметрии для столбца 'oil prices': 0.9915046764713877

Коэффициент асимметрии для столбца 'exchange_rate': 2.1575952097650455

Коэффициент асимметрии для столбца 'gdppercent': -0.038272329611460466

Коэффициент асимметрии для столбца 'percapitaincome': 0.3051430219264069

Коэффициент асимметрии для столбца 'unemploymentrate': 1.8092896369785585

Коэффициент асимметрии для столбца 'manufacturingoutput': 4.195480293406057

Коэффициент асимметрии для столбца 'tradebalance': -2.266183907194849

Коэффициент асимметрии для столбца 'USTreasury': 0.6687596580836408

Количество дубликатов: 0

На основе данных выше можно сказать, что для столбца объем производства присутствует выброс. Удаляем все найденные пустые значения.

In [138]:
def drop_missing_values(dataframe, name):
    before_shape = dataframe.shape 
    cleaned_dataframe = dataframe.dropna()  
    after_shape = cleaned_dataframe.shape 
    print(f"В наборе данных '{name}' было удалено {before_shape[0] - after_shape[0]} строк с пустыми значениями.")
    return cleaned_dataframe

cleaned_df = drop_missing_values(df, "Economic")
В наборе данных 'Economic' было удалено 150 строк с пустыми значениями.

Очистка данных от шумов:

In [139]:
plt.figure(figsize=(10, 6))
plt.scatter(cleaned_df['manufacturingoutput'], cleaned_df['gdppercent'])
plt.xlabel('Объем производства')
plt.ylabel('ВВП')
plt.title('Диаграмма рассеивания перед чисткой')
plt.show()

Q1 = cleaned_df["manufacturingoutput"].quantile(0.25)
Q3 = cleaned_df["manufacturingoutput"].quantile(0.75)

IQR = Q3 - Q1

threshold = 1.5 * IQR
lower_bound = Q1 - threshold
upper_bound = Q3 + threshold

outliers = (cleaned_df["manufacturingoutput"] < lower_bound) | (cleaned_df["manufacturingoutput"] > upper_bound)

# Вывод выбросов
print("Выбросы в датасете:")
print(cleaned_df[outliers])

# Заменяем выбросы на медианные значения
median_score = cleaned_df["manufacturingoutput"].median()
cleaned_df.loc[outliers, "manufacturingoutput"] = median_score

# Визуализация данных после обработки
plt.figure(figsize=(10, 6))
plt.scatter(cleaned_df['manufacturingoutput'], cleaned_df['gdppercent'])
plt.xlabel('Объем производства')
plt.ylabel('ВВП')
plt.title('Диаграмма рассеивания после чистки')
plt.show()
No description has been provided for this image
Выбросы в датасете:
    stock index  country    year  index price  log_indexprice  inflationrate  \
229      SZCOMP    China  2004.0      1467.57            3.17           0.04   
230      SZCOMP    China  2005.0      1144.54            3.06           0.02   
231      SZCOMP    China  2006.0      1687.14            3.23           0.02   
232      SZCOMP    China  2007.0      4329.44            3.64           0.05   
233      SZCOMP    China  2008.0      2912.90            3.46           0.06   
234      SZCOMP    China  2009.0      2737.01            3.44          -0.01   
235      SZCOMP    China  2010.0      2795.88            3.45           0.03   
236      SZCOMP    China  2011.0      2639.19            3.42           0.06   
237      SZCOMP    China  2012.0      2211.11            3.34           0.03   
238      SZCOMP    China  2013.0      2182.52            3.34           0.03   
239      SZCOMP    China  2014.0      2279.75            3.36           0.02   
240      SZCOMP    China  2015.0      3657.40            3.56           0.01   
241      SZCOMP    China  2016.0      2978.14            3.47           0.02   
242      SZCOMP    China  2017.0      3257.35            3.51           0.02   
243      SZCOMP    China  2018.0      2920.18            3.47           0.02   
244      SZCOMP    China  2019.0      2928.94            3.47           0.03   
245      SZCOMP    China  2020.0      3109.78            3.49           0.02   
271      DAX 30  Germany  2005.0      5408.25            3.73           0.02   
272      DAX 30  Germany  2006.0      6596.91            3.82           0.02   
273      DAX 30  Germany  2007.0      8067.31            3.91           0.02   
274      DAX 30  Germany  2008.0      4810.20            3.68           0.03   
276      DAX 30  Germany  2010.0      6914.19            3.84           0.01   
277      DAX 30  Germany  2011.0      5898.35            3.77           0.02   
280      DAX 30  Germany  2014.0      9805.55            3.99           0.01   
281      DAX 30  Germany  2015.0     10743.01            4.03           0.01   
283      DAX 30  Germany  2017.0     12917.64            4.11           0.02   
284      DAX 30  Germany  2018.0     10558.96            4.02           0.02   
285      DAX 30  Germany  2019.0     13249.01            4.12           0.01   
286      DAX 30  Germany  2020.0     13718.78            4.14           0.01   

     oil prices  exchange_rate  gdppercent  percapitaincome  unemploymentrate  \
229       43.15           8.28        0.10           1509.0              0.04   
230       59.41           8.19        0.11           1753.0              0.04   
231       61.96           7.97        0.13           2099.0              0.04   
232       91.69           7.61        0.14           2694.0              0.04   
233       41.12           6.95        0.10           3468.0              0.04   
234       74.47           6.83        0.09           3832.0              0.04   
235       89.15           6.77        0.11           4550.0              0.04   
236       98.56           6.46        0.10           5618.0              0.04   
237       87.86           6.31        0.08           6317.0              0.04   
238       97.63           6.15        0.08           7051.0              0.05   
239       59.29           6.16        0.07           7679.0              0.05   
240       37.19           6.28        0.07           8067.0              0.05   
241       51.97           6.64        0.07           8148.0              0.05   
242       57.88           6.76        0.07           8879.0              0.04   
243       49.52           6.61        0.07           9977.0              0.04   
244       59.88           6.91        0.06          10217.0              0.05   
245       47.02           6.90        0.02          10500.0              0.05   
271       59.41           1.24        0.01          34520.0              0.12   
272       61.96           1.26        0.04          36354.0              0.11   
273       91.69           1.37        0.03          41640.0              0.09   
274       41.12           1.47        0.01          45613.0              0.08   
276       89.15           1.33        0.04          41572.0              0.08   
277       98.56           1.39        0.04          46706.0              0.07   
280       59.29           1.33        0.02          48024.0              0.07   
281       37.19           1.11        0.01          41103.0              0.06   
283       57.88           1.13        0.03          44553.0              0.06   
284       49.52           1.18        0.01          47811.0              0.05   
285       59.88           1.12        0.01          46468.0              0.05   
286       47.02           1.14       -0.05          45724.0              0.06   

     manufacturingoutput  tradebalance  USTreasury  
229               625.22         51.17        0.04  
230               733.66        124.63        0.04  
231               893.13        208.92        0.05  
232              1149.72        308.04        0.05  
233              1475.66        348.83        0.04  
234              1611.95        220.13        0.03  
235              1924.32        222.40        0.03  
236              2421.37        180.89        0.03  
237              2690.09        231.87        0.02  
238              2935.34        234.87        0.02  
239              3184.24        221.55        0.03  
240              3202.50        358.84        0.02  
241              3153.12        255.48        0.02  
242              3460.33        215.70        0.02  
243              3868.46        106.71        0.03  
244              3823.41        164.99        0.02  
245              3853.81        366.14        0.01  
271               571.36        148.05        0.04  
272               618.70        162.20        0.05  
273               714.38        231.95        0.05  
274               750.91        227.47        0.04  
276               669.57        178.90        0.03  
277               758.60        184.02        0.03  
280               786.55        257.40        0.03  
281               683.20        255.02        0.02  
283               752.02        257.66        0.02  
284               795.96        243.72        0.03  
285               737.94        223.82        0.02  
286               678.29        221.53        0.01  
No description has been provided for this image

Разбиение набора данных на обучающую, контрольную и тестовую выборки

In [140]:
from sklearn.model_selection import train_test_split

train_df, test_df = train_test_split(cleaned_df, test_size=0.2, random_state=42)

train_df, val_df = train_test_split(train_df, test_size=0.25, random_state=42)

print("Размер обучающей выборки:", len(train_df))
print("Размер контрольной выборки:", len(val_df))
print("Размер тестовой выборки:", len(test_df))
Размер обучающей выборки: 131
Размер контрольной выборки: 44
Размер тестовой выборки: 44

Видим недостаток баланса

In [143]:
def check_balance(df, name):
    counts = df['gdppercent'].value_counts()
    print(f"Распределение ВВП в {name}:")
    print(counts)
    print()

check_balance(train_df, "обучающей выборке")
check_balance(val_df, "контрольной выборке")
check_balance(test_df, "тестовой выборке")
Распределение ВВП в обучающей выборке:
gdppercent
 0.02    30
 0.04    25
 0.03    21
 0.01    13
 0.07     8
 0.08     8
 0.05     7
-0.01     5
 0.11     2
 0.09     2
-0.02     2
 0.10     2
-0.03     1
 0.14     1
-0.10     1
 0.06     1
-0.05     1
-0.04     1
Name: count, dtype: int64

Распределение ВВП в контрольной выборке:
gdppercent
 0.02    9
 0.03    7
 0.01    6
 0.07    4
 0.04    4
 0.05    4
 0.08    3
 0.06    3
-0.01    2
 0.10    1
-0.08    1
Name: count, dtype: int64

Распределение ВВП в тестовой выборке:
gdppercent
 0.02    12
 0.03     8
 0.01     7
 0.05     5
 0.04     3
 0.08     3
-0.01     2
-0.05     1
 0.06     1
 0.13     1
 0.07     1
Name: count, dtype: int64

также используем oversampling и undersampling

In [142]:
from imblearn.over_sampling import RandomOverSampler
from imblearn.under_sampling import RandomUnderSampler

def binning(target, bins):
    return pd.cut(target, bins=bins, labels=False)

train_df['gdppercent_binned'] = binning(train_df['gdppercent'], bins=3)
val_df['gdppercent_binned'] = binning(val_df['gdppercent'], bins=3)
test_df['gdppercent_binned'] = binning(test_df['gdppercent'], bins=3)

def oversample(df, target_column):
    X = df.drop(target_column, axis=1)
    y = df[target_column]
    
    oversampler = RandomOverSampler(random_state=42)
    x_resampled, y_resampled = oversampler.fit_resample(X, y) # type: ignore
    
    resampled_df = pd.concat([x_resampled, y_resampled], axis=1) 
    return resampled_df

def undersample(df, target_column):
    X = df.drop(target_column, axis=1)
    y = df[target_column]
    
    undersampler = RandomUnderSampler(random_state=42)
    x_resampled, y_resampled = undersampler.fit_resample(X, y) # type: ignore
    
    resampled_df = pd.concat([x_resampled, y_resampled], axis=1)
    return resampled_df

train_df_oversampled = oversample(train_df, 'gdppercent_binned')
val_df_oversampled = oversample(val_df, 'gdppercent_binned')
test_df_oversampled = oversample(test_df, 'gdppercent_binned')

train_df_undersampled = undersample(train_df, 'gdppercent_binned')
val_df_undersampled = undersample(val_df, 'gdppercent_binned')
test_df_undersampled = undersample(test_df, 'gdppercent_binned')

print("Оверсэмплинг:")
check_balance(train_df_oversampled, "обучающей выборке")
check_balance(val_df_oversampled, "контрольной выборке")
check_balance(test_df_oversampled, "тестовой выборке")

print("Андерсэмплинг:")
check_balance(train_df_undersampled, "обучающей выборке")
check_balance(val_df_undersampled, "контрольной выборке")
check_balance(test_df_undersampled, "тестовой выборке")
Оверсэмплинг:
Распределение Дохода на душу населения в обучающей выборке:
gdppercent
 0.08    37
 0.07    33
-0.04    31
 0.02    30
-0.10    27
 0.04    25
-0.05    25
-0.03    21
 0.03    21
 0.01    13
 0.11    11
 0.09    11
 0.10     7
 0.05     7
-0.01     5
 0.14     5
-0.02     2
 0.06     1
Name: count, dtype: int64

Распределение Дохода на душу населения в контрольной выборке:
gdppercent
-0.08    24
 0.02     9
 0.07     7
 0.03     7
 0.01     6
 0.05     5
 0.04     4
 0.06     4
 0.08     3
-0.01     2
 0.10     1
Name: count, dtype: int64

Распределение Дохода на душу населения в тестовой выборке:
gdppercent
 0.08    26
-0.01    22
-0.05    14
 0.02    12
 0.03     8
 0.01     7
 0.05     5
 0.07     5
 0.13     5
 0.04     3
 0.06     1
Name: count, dtype: int64

Андерсэмплинг:
Распределение Дохода на душу населения в обучающей выборке:
gdppercent
 0.01    2
 0.08    2
-0.10    1
-0.03    1
-0.05    1
-0.04    1
 0.03    1
 0.02    1
 0.14    1
 0.07    1
Name: count, dtype: int64

Распределение Дохода на душу населения в контрольной выборке:
gdppercent
-0.08    1
 0.02    1
 0.08    1
Name: count, dtype: int64

Распределение Дохода на душу населения в тестовой выборке:
gdppercent
-0.01    2
 0.08    2
-0.05    1
 0.02    1
 0.04    1
 0.05    1
 0.07    1
Name: count, dtype: int64