Shanraq.org Shanraq.org
Сыртқы және өзінікі: бір шок — әртүрлі баға
IT

Python: деректен өз есебіңізге дейін 43-сабақ (барлығы 56)

Сыртқы және өзінікі: бір шок — әртүрлі баға

Python курсының қырық екінші сабағы. 2022 жылы әлемдік тамақ 14.9 %-ға қымбаттады — бәріне бірдей. Он көршінің инфляциясы 8.6-дан 72.3 %-ға дейін шықты, сегіз есе айырма. Екі әдеттегі себеп — бағам мен ақша — тексеріледі, әрі бір ел жауапты жылжытады, ақшада таңбасын ауыстырады.

Не үшін керек

Баға өскенде түсіндірме бір секундта табылады әрі әрқашан екеудің бірі: «әлем кінәлі» немесе «өзіміз кінәліміз». Екі сөйлем де тексерілетін, әрі тексеру бір кешке тұрады.

2022 жылы әлем бәріне бір болды: әлемдік азық-түлік бағасының индексі 14.9 %-ға өсті — «шамамен» емес, барлық елге бірден бір ғана сан. Инфляция сонда сегіз есе ажырады. Демек, іс бір сыртқы шокпен түсіндірілмейді, әрі елдердің немен ерекшеленгеніне қарау керек.

Қосымша, сабақ әрі қарай керек болатын өлшемді енгізеді: екі бағанның байланысы және оның артында неше бақылау тұрғаны туралы сұрақ.

Бірден тұтас

shok.py файлы. Әлемдік баға — ФАО индексі, 2014–2016 = 100. Инфляция, бағам және ақша массасы — Дүниежүзілік банк, 2022 жыл.

"""42-сабақ: сыртқы және өзінікі — бір шок, әртүрлі баға.

Барлық сан нағыз. Әлемдік азық-түлік бағасы — ФАО индексі, 2014–2016 = 100.
Инфляция, доллар бағамы және ақша массасы — Дүниежүзілік банк, 2022 жыл,
FP.CPI.TOTL.ZG, PA.NUS.FCRF және FM.LBL.BMNY.CN көрсеткіштері.
"""

import pandas as pd

# Әлемдік азық-түлік бағасы: барлық елге бірден бір ғана қатар.
FAO = pd.Series({2019: 94.93, 2020: 98.05, 2021: 125.73, 2022: 144.51, 2023: 124.52})

# Шок жылындағы он көрші: инфляция, долларға шаққандағы бағамның өзгерісі және
# ақша массасының өсімі, бәрі 2022 жылғы пайызбен. Бос орын — бұл бос орын:
# екі елге Дүниежүзілік банк ақша массасын жарияламайды.
KORSHILER = pd.DataFrame(
    [
        ("Армения", 8.64, -13.52, 16.10),
        ("Өзбекстан", 11.45, 4.15, 30.17),
        ("Грузия", 11.90, -9.48, 11.04),
        ("Ресей", 13.74, -7.02, None),
        ("Әзірбайжан", 13.85, 0.00, 23.60),
        ("Қырғызстан", 13.92, -0.62, 30.59),
        ("Қазақстан", 15.03, 8.04, 13.94),
        ("Беларусь", 15.21, 3.44, None),
        ("Молдова", 28.74, 6.88, 5.27),
        ("Түркия", 72.31, 86.98, 60.34),
    ],
    columns=["ел", "инфляция", "бағам", "ақша"],
).set_index("ел")

print("== Бәріне бір шок")
world = FAO.pct_change().mul(100).round(1)
print(pd.DataFrame({"ФАО индексі": FAO, "жылына, %": world}).to_string())
print(f"  2022 жылы әлемдік тамақ {world[2022]} %-ға қымбаттады — он елдің бәріне бірдей")

print()
print("== Он көрші, бір жыл")
print(KORSHILER["инфляция"].sort_values().to_string())
low, high = KORSHILER["инфляция"].min(), KORSHILER["инфляция"].max()
print(f"  {low}-тен {high}-ке дейін — {round(high / low, 1)} есе айырма")
print("  медиана:", round(KORSHILER["инфляция"].median(), 2))

print()
print("== Әдетте аталатын екі түсіндірме")
for column, name in (("бағам", "өз бағамы"), ("ақша", "өз ақша массасы")):
    pair = KORSHILER[["инфляция", column]].dropna()
    print(f"  {name:18} байланыс {KORSHILER['инфляция'].corr(KORSHILER[column]):+.3f}"
          f"   есепке кірген ел: {len(pair)}")

print()
print("== Осы байланыстарға бір ел не істейді")
bez = KORSHILER.drop("Түркия")
print(f"  {'':18} {'он елде':>10} {'Түркиясыз':>12}")
for column in ("бағам", "ақша"):
    a = KORSHILER["инфляция"].corr(KORSHILER[column])
    b = bez["инфляция"].corr(bez[column])
    print(f"  {column:18} {a:>10.3f} {b:>12.3f}")

print()
print("== Екеуі де түсіндірмейтіндер")
miss = KORSHILER.loc[["Молдова", "Қырғызстан"]]
print(miss.to_string())
print("  Молдова: баға +28.7 %, ал бағам +6.9 %, ақша +5.3 %")
print("  Қырғызстан: ақша +30.6 %, ал баға +14 %-дық көршілердей өскен")

Шығысы:

== Бәріне бір шок
      ФАО индексі  жылына, %
2019        94.93        NaN
2020        98.05        3.3
2021       125.73       28.2
2022       144.51       14.9
2023       124.52      -13.8
  2022 жылы әлемдік тамақ 14.9 %-ға қымбаттады — он елдің бәріне бірдей

== Он көрші, бір жыл
ел
Армения        8.64
Өзбекстан     11.45
Грузия        11.90
Ресей         13.74
Әзірбайжан    13.85
Қырғызстан    13.92
Қазақстан     15.03
Беларусь      15.21
Молдова       28.74
Түркия        72.31
  8.64-тен 72.31-ке дейін — 8.4 есе айырма
  медиана: 13.88

== Әдетте аталатын екі түсіндірме
  өз бағамы          байланыс +0.971   есепке кірген ел: 10
  өз ақша массасы    байланыс +0.739   есепке кірген ел: 8

== Осы байланыстарға бір ел не істейді
                        он елде    Түркиясыз
  бағам                   0.971        0.597
  ақша                    0.739       -0.538

== Екеуі де түсіндірмейтіндер
            инфляция  бағам   ақша
ел                                
Молдова        28.74   6.88   5.27
Қырғызстан     13.92  -0.62  30.59
  Молдова: баға +28.7 %, ал бағам +6.9 %, ақша +5.3 %
  Қырғызстан: ақша +30.6 %, ал баға +14 %-дық көршілердей өскен

Талдау

Бір шок шынымен де бір

2021       125.73       28.2
2022       144.51       14.9

ФАО индексі — әлемдік азық-түлік бағасы: бидай, май, қант, сүт, ет. Ол ел туралы емес, әлем туралы, әрі 2022 жылы ол Армения үшін де, Түркия үшін де бірдей.

Сондықтан «баға әлемдік баға салдарынан өсті» деген тұжырымды тексеруге болады. Ортақ сыртқы шок барлық елге әсер етуі мүмкін, бірақ оның күші импорт үлесіне, айырбас бағамына, тұтыну себетіне және бағаның ішкі нарыққа берілуіне байланысты. Инфляция 8.64-тен 72.31-ге дейін ажырады — 8.4 есе. Демек, елдер арасындағы айырманы бір ортақ фактормен ғана түсіндіру жеткіліксіз.

Байланыс: он салыстырудың орнына бір сан

Series.corr Пирсон корреляциясының коэффициентін есептейді. +1 — мінсіз оң сызықтық байланыс, −1 — мінсіз теріс сызықтық байланыс, ал 0 — сызықтық байланыс жоқ дегенді білдіреді; бисызықтық байланыс сақталуы мүмкін. Мұнда екі қатардың уақыт бойынша қозғалысы емес, бір жылдағы елдер арасындағы айырмашылық салыстырылады. Бұл «неше есе» де, «неше пайызға» да емес.

  өз бағамы          байланыс +0.971   есепке кірген ел: 10
  өз ақша массасы    байланыс +0.739   есепке кірген ел: 8

Бірінші сан табиғат заңы сияқты көрінеді. Екіншісі — әлсіз растау сияқты. Ал қасында екеуін де мағыналы ететін нәрсе тұр: артында неше ел бар. Ақша массасында — он емес, сегіз: Ресей мен Беларусьқа Дүниежүзілік банк оны осы жылдарға жарияламайды, әрі pandas сол екі жұпты үнсіз тастап кетті. Бақылау саны байланыстың қасында әрқашан басылады.

Жауапты бір ел шешеді

  бағам                   0.971        0.597
  ақша                    0.739       -0.538

Түркияны — он жолдың бірін — алып тастаңыз, сонда «табиғат заңы» ишараға айналады, ал ақшамен байланыс таңбасын ауыстырады: оң еді, теріс болды. Яғни тоғыз елде дерек «ақша қай жерде көбейсе, сол жерде баға баяу өсті» дейді, бұл әлем туралы тұжырым ретінде оғаш естіледі — әрі мұндағы дұрыс қорытынды «ақша маңызды емес» емес, «мұндай сұрақ он нүктеде шешілмейді».

Бұл отыз жетінші сабақтағы орташа туралы сол әңгіме: онда бір мән орташаны қайта жазатын, мұнда бір мән байланысты қайта жазады. Айырмасы — байланыс сенімдірек көрінеді: оның өлшем бірлігі жоқ, әрі оны қорытынды деп қабылдау оңай.

Екеуінің де түсіндірмейтіндері

Молдова        28.74   6.88   5.27
Қырғызстан     13.92  -0.62  30.59

Молдова жолы мынаны көрсетеді: ақша массасы 5.3 %-ға, айырбас бағамы 6.9 %-ға өзгергенде инфляция 28.7 % болған. Бұл энергия бағасының соққысы сияқты басқа факторлардың әсерін көрсетуі мүмкін, бірақ себепті осы кестемен анықтауға болмайды. Қырғызстанда кері көрініс бар: ақша массасы 30.6 %-ға өсті, ал инфляция көршілер деңгейіне жақын қалды.

Осындай бір-екі жол — түсіндірменің ең жақсы тексеруі. Себеп дұрыс аталса, ол соларда да жұмыс істеуге тиіс.

«Бағам кінәлі» деуге неге болмайды

+0.971 байланыс бағыттың дәлелі емес. Девальвация импорт бағасын көтереді, бірақ жоғары инфляция да бағамды құлатады, әрі екеуі де кестеде жоқ үшінші себептен шығуы мүмкін. Байланыс тек: «бұл екі баған бірге қозғалды» дейді. Кім кімді қозғағаны одан шықпайды, әрі байланыстың шамасы бұны өзгертпейді.

Тәжірибелік ереже: байланыс — механизмді іздеуге себеп, механизмнің орнын басатын нәрсе емес.

Неше нүкте керек

Тікелей жауап жоқ, бірақ кез келген ережеден адал тексеру бар: байланысты әр елді кезекпен алып тастап санау. Бір қатар жауапты үштен бірге жылжытса, екіншісі таңбасын аударса, нүкте аз — олардың саны он ба, жүз бе, бәрібір. Тапсырмада тұрғаны да сол тексеру.

Сабақ картасы

Сабақ картасы: бір шок, он ел, бір байланыс

Өз сөзіңізбен айтыңыз

Қарамай, дауыстап немесе қағазға жауап беріңіз. Жауаптар — сабақтың соңында.

  1. Бәріне бірдей әлемдік шок сегіз еселік айырманы неге түсіндірмейді?
  2. +0.971 байланыс нені білдіреді және нені білдірмейді?
  3. Байланыстың қасында бақылау санын не үшін басады?

Жаттығу

Тапсырмаға дейінгі үш қысқа қадам: болжау, толықтыру, түзету. Жауаптар — сабақтың соңында, бірақ алдымен өзіңіз жауап беріңіз.

1. Болжаңыз. Бағдарлама не басып шығарады және екінші сан неге бірге жуық?

import pandas as pd

a = pd.Series([1, 2, 3, 4])
b = pd.Series([4, 3, 2, 1])
print("байланыс:", round(a.corr(b), 3))
a_plus = pd.Series([1, 2, 3, 4, 100])
b_plus = pd.Series([4, 3, 2, 1, 100])
print("бір үлкен жұппен:", round(a_plus.corr(b_plus), 3))

2. Бос орынды толтырыңыз. ... орнына байланысқа шын мәнінде неше ел қатысатынын санаңыз.

# инфляция бәрінде бар, ақша массасы — бәрінде емес
import pandas as pd

table = pd.DataFrame(
    {"инфляция": [8.64, 11.45, 13.74, 15.21], "ақша": [16.10, 30.17, None, None]},
    index=["Армения", "Өзбекстан", "Ресей", "Беларусь"],
)
pair = ...
print("есепке кірген ел:", len(pair))

3. Түзетіңіз. Бағдарлама байланысты басып шығарады да, ол төрт ел бойынша саналған деп мәлімдейді.

# екі елде ақша массасы жоқ, әрі pandas сол жұптарды үнсіз тастап кетеді
import pandas as pd

table = pd.DataFrame(
    {"инфляция": [8.64, 11.45, 13.74, 15.21], "ақша": [16.10, 30.17, None, None]},
    index=["Армения", "Өзбекстан", "Ресей", "Беларусь"],
)
print("байланыс:", round(table["инфляция"].corr(table["ақша"]), 3), "—", len(table), "ел бойынша")

Тапсырма

Міндетті. Он көршінің кестесі бойынша инфляцияның бағаммен және ақша массасымен байланысын санаңыз, қасында ел санын басыңыз. Сосын әр елді кезекпен алып тастап, екі байланысты да қайта санаңыз әрі кестені басып шығарыңыз: елсіз байланыс және толықтан жылжуы. Жылжу шамасы бойынша сұрыптаңыз. Соңында жауапты бәрінен қатты жылжытатын елді және бөлек — байланыстың таңбасын ауыстыратындарды атаңыз.

Күтілетін шығыс:

== Байланыс және артында неше ел тұр
  бағам    +0.971  10 ел бойынша
  ақша     +0.739  8 ел бойынша

== Әр елді кезекпен алып тастасақ
            бағам   ақша  бағам, жылжу  ақша, жылжу
Түркия      0.597 -0.538        -0.374       -1.277
Молдова     0.985  0.891         0.014        0.152
Өзбекстан   0.978  0.793         0.007        0.054
Қазақстан   0.977  0.735         0.006       -0.004
Грузия      0.972  0.728         0.001       -0.011
Ресей       0.972  0.739         0.001        0.000
Беларусь    0.972  0.739         0.001        0.000
Армения     0.971  0.728         0.000       -0.011
Әзірбайжан  0.971  0.747         0.000        0.008
Қырғызстан  0.971  0.782         0.000        0.043

== Жауапты кім шешеді
  бағам    «Түркия» елісіз байланыс +0.971 дегеннен +0.597 дегенге барады
  ақша     «Түркия» елісіз байланыс +0.739 дегеннен -0.538 дегенге барады

== Тексеру
  бағам    таңбаны өзгертетін елдер: ешқайсысы
  ақша     таңбаны өзгертетін елдер: Түркия

Дайын болғаны: шығыс жол-жолымен сәйкес келеді; ел саны әр байланыстың қасында басылады, төменде бір рет емес; «жауапты кім шешеді» көзбен емес, жылжу шамасымен табылады; таңбаның ауысуы көзбен емес, таңбаларды салыстырумен тексеріледі; сұрыптау тұрақты — жылжу бірнеше елде бірдей, ал кәдімгі сұрыптау оларды әр машинада әртүрлі қояды.

Өз деректеріңізде. Байланысты деп ойлайтын кез келген екі бағанды алыңыз: шығыс пен ауа райы, келушілер мен апта күні, сатылым мен бағам. Байланысты санаңыз, оны әр нүктені кезекпен алып тастап санаңыз — әрі жауап өзгеру үшін неше нүктені алу керегін қараңыз. Оған қаншалық сүйене алатыныңыздың өлшемі — осы.

Қалауыңыз бойынша.

  • Инфляцияның бағаммен байланысын логарифмде санап (numpy.log1p), оны Түркияның қаншалық аз жылжытатынын қараңыз.
  • Орташа мәндері бар он бірінші елді қосып, байланыстың дерлік өзгермегеніне көз жеткізіңіз: тұрақтылық алып тастаумен ғана емес, қосумен де тексеріледі.
  • Әдепкі corr() (Пирсон) мен corr(method="spearman") нәтижесін салыстырыңыз — екіншісі ранг бойынша санайды, әрі оны шеткі мән азырақ жылжытады.

Жобада бұл қайда тұрады

Жиырма бірінші қадам, әрі ол жиынтықтың не істемейтіні туралы.

Жиынтықта үш ел бар. «Баға мен ақша бірге қозғалды ма» деген сұрақ үш елде әрқашан сан береді — әрі ол сан ештеңеге тұрмайды, мұны сабақ он елде жаңа ғана көрсетті. Сондықтан esep.baylanys табалдырық алады: екі саны да бар елдерді санайды, табалдырықпен салыстырады да, не байланысты ел санымен бірге, не бас тартуды және немен жетпегенін қайтарады.

Тірі деректе бас тарту шығады, әрі ол екі есе орынды: аз: 2 ел, 8 керек — Ресейге Дүниежүзілік банк ақша массасын жарияламайды, сондықтан үш елден екеуі қалады. Бас тарту бетте бөлек жолмен басылады: дерек жетпегенде жоғалып кететін жол оқырманға сол жолдың міндетті емес екенін үйретеді.

Табалдырық — esep.py ішіндегі өлшенбей, таңдалған жалғыз сан: сегіз — өңірлік жиынтық жететіндей аз, әрі таңбаны бір ел шешпейтіндей көп.

Жауаптар

Жауаптарды көрсету

Сұрақтарға

  1. Өйткені шок бәріне бірдей, ал нәтиже 8.4 есе ажырады. Бірдей себеп әртүрлі нәтижені түсіндіре алмайды — демек, тағы бірдеңе жұмыс істейді, әрі сол «бірдеңе» әр елде өзінікі.
  2. Екі бағанның бірге қозғалғанын: бағамы қатты құлаған жерде баға да қатты өскен. Ол бағам себеп дегенді білдірмейді, «сонша пайызға» дегенді білдірмейді әрі кестеде жоқ елге көшірілмейді.
  3. Өйткені pandas бос орны бар жұптарды үнсіз тастап кетеді: сол +0.739 он ел бойынша емес, сегіз ел бойынша саналған. Бақылау санысыз байланыс — тұжырымның жартысы, әрі әдетте әдемірек жартысы.

Жаттығуға

  1. Төрт нүкте идеал кемімелі түзуде жатыр, сондықтан байланыс дәл −1. Екі үлкен саннан тұратын бір жұп жалпы жоғары қозғалыс қосады, әрі сол төртеу дерлік идеал түзуге айналады, тек өспелі болып.
байланыс: -1.0
бір үлкен жұппен: 0.999
  1. table[["инфляция", "ақша"]].dropna(). Жолды емес, жұпты санау керек: ақша массасы жоқ ел байланысқа кірмейді.
# инфляция бәрінде бар, ақша массасы — бәрінде емес
import pandas as pd

table = pd.DataFrame(
    {"инфляция": [8.64, 11.45, 13.74, 15.21], "ақша": [16.10, 30.17, None, None]},
    index=["Армения", "Өзбекстан", "Ресей", "Беларусь"],
)
pair = table[["инфляция", "ақша"]].dropna()
print("есепке кірген ел:", len(pair))
есепке кірген ел: 2
  1. Байланыстың өзін pandas дұрыс санайды — екі жұп бойынша. Өтірік оның айналасындағы сөйлем болатын: «төрт ел бойынша».
# сол кесте: байланыс ол саналған ел санымен бірге басылады
import pandas as pd

table = pd.DataFrame(
    {"инфляция": [8.64, 11.45, 13.74, 15.21], "ақша": [16.10, 30.17, None, None]},
    index=["Армения", "Өзбекстан", "Ресей", "Беларусь"],
)
pair = table[["инфляция", "ақша"]].dropna()
print("байланыс:", round(pair["инфляция"].corr(pair["ақша"]), 3), "—", len(pair), "ел бойынша")
байланыс: 1.0 — 2 ел бойынша

Әрі осы жаттығу жазылған басты себеп: екі нүкте бойынша байланыс әрқашан бірге тең. Екі нүкте арқылы дәл бір түзу өтеді, сондықтан мұндағы бірлік — нәтиже емес, ескерту.

Тапсырмаға

Жылжулар баспалдаққа тізіледі: Түркия бағаммен байланысты 0.374-ке, ақшамен 1.277-ге жылжытады, одан кейінгі Молдова — 0.014 пен 0.152-ге. Реті жүз есе. Бір бақылау қалғандарынан сонша қол үзгенде, жауап деректікі емес, соның өзінікі болады.

Таңбаны тексеру шамасынан маңыздырақ. Бір жолды алып тастағанда оңнан теріске айналатын байланыс «әлсіз» емес — ол бұл деректе анықталмаған, әрі одан шығатын жалғыз адал қорытынды: ел көбірек керек немесе сұрақ басқа болуы керек.

Дереккөздер

Мәтінде қате не теру қатесі кездессе, бізге айтыңыз

Тапсырманы тексеру

Алдымен VS Code-та шешіп, іске қосыңыз — редактор қатені сол жерде көрсетеді. Дайын шешімді осында қойыңыз. Тексеретін — модель: ол қатені атап көрсетеді, бірақ дайын жауапты бермейді.

Тексеру үшін кіру керек. Кіру

Пікірлер (0)

Әзірге пікір жоқ. Бірінші болыңыз.