Python: деректен өз есебіңізге дейін 34-сабақ (барлығы 56)
Графикпен қалай өтірік айтпау керек: шкала, нөл және белгілер
Python курсының отыз үшінші сабағы. Сол екі сан: нөлден бағана 1.31 есе биік, ось сегізден басталса — 4.86 есе. Сол бір сызық кесіндісі: кең парақта 14°, тар парақта 73°. Пайыз бен пайыздық тармақ, қатардың қай бөлігін алу, әр графикте тұруға тиіс бес нәрсе — және өзін өзі тексеретін график.
Не үшін керек
Өткен сабақ сурет салуды үйретті. Бұл сабақ — салынған нәрсе сандар лайық болғаннан әрқашан дерлік сенімдірек көрінетіні туралы.
Графикпен өтірік айту оңай, әрі ол екіталай әдейі жасалады. Осьті нөлден бастамады, өйткені «айырмашылық солай жақсы көрінеді». Соңғы үш айды алды, өйткені «қалғаны ескірген». «31 %-ға өсті» деп жазды, өйткені солай есептелді. Әр қадам орынды көрінеді, ал бірге олар оқырман деректе жоқ нәрсені түсініп кететін сурет береді.
Сондықтан сабақ талғам туралы емес, есеп туралы: мұндағы әр бұрмалау өлшенген.
Бірден тұтас
chestno.py файлы. Сол сандар, есептелген бұрмалаулар және қатар тұрған екі сурет.
"""33-сабақ: графикпен қалай өтірік айтпау керек.
Сол бір қатар, адал және адал емес салынған. Бұрмалаудың бәрі сөзбен емес,
санмен: бағана шын биіктігінен неше есе биік көрінеді және пропорция ауысқанда
сызық неше градусқа «тіктеу» болады.
"""
import math
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
from pathlib import Path
HERE = Path(__file__).resolve().parent
# Инфляция, жылына %. Дүниежүзілік банктің дерегі.
years = [2021, 2022, 2023, 2024, 2025]
kz = [8.0, 15.0, 14.5, 8.7, 11.4]
print("== бағаналар: ось қайдан басталады")
low, high = 8.7, 11.4
print("шын мәнінде:", high, "қарсы", low, "—", round(high / low, 2), "есе")
for bottom in (0.0, 8.0):
look = (high - bottom) / (low - bottom)
print(f" ось {bottom:>4}-ден: бағана {look:.2f} есе биік көрінеді")
fig, axes = plt.subplots(1, 2, figsize=(9, 3.5))
for ax, bottom, title in ((axes[0], 0.0, "ось нөлден"), (axes[1], 8.0, "ось сегізден")):
ax.bar(["2024", "2025"], [low, high], color=["#7f8c8d", "#b03a2e"])
ax.set_ylim(bottom, 12)
ax.set_title(title)
ax.set_ylabel("инфляция, %")
fig.savefig(HERE / "stolbiki.png", dpi=120, bbox_inches="tight")
plt.close(fig)
print()
print("== сызық: сол сандар басқа бұрышпен")
# Бұрышты адал санаймыз: деректен сурет координатасына, осьтер өлшемі арқылы.
def slope_degrees(width, height, ylow, yhigh):
x_per_inch = (len(years) - 1) / width
y_per_inch = (yhigh - ylow) / height
return math.degrees(math.atan(((kz[-1] - kz[-2]) / y_per_inch) / (1 / x_per_inch)))
for size, ylim in (((8, 3), (0, 16)), ((4, 5), (8, 12))):
angle = slope_degrees(size[0], size[1], ylim[0], ylim[1])
print(f" парақ {size[0]}×{size[1]} дюйм, ось {ylim}: соңғы кесінді {angle:.1f}°")
print()
print("== пайыз бен пайыздық тармақ")
print("болатын", low, "%, болды", high, "% — бұл өсім", round(high - low, 1), "пайыздық тармақ")
print("ал «", round((high - low) / low * 100, 1), "%-ға» — бұл басқа сандар туралы басқа тұжырым")
print()
print("== қатардың қай бөлігін көрсету керек")
print("бүкіл қатар:", kz[0], "→", kz[-1], "| өзгеріс", round(kz[-1] - kz[0], 1), "п.т.")
print("соңғы екі жыл:", kz[-2], "→", kz[-1], "| өзгеріс", round(kz[-1] - kz[-2], 1), "п.т.")
print("екі тұжырым да дұрыс, әрі олардың бірін салудан бұрын таңдайды")
Шығысы:
== бағаналар: ось қайдан басталады
шын мәнінде: 11.4 қарсы 8.7 — 1.31 есе
ось 0.0-ден: бағана 1.31 есе биік көрінеді
ось 8.0-ден: бағана 4.86 есе биік көрінеді
== сызық: сол сандар басқа бұрышпен
парақ 8×3 дюйм, ось (0, 16): соңғы кесінді 14.2°
парақ 4×5 дюйм, ось (8, 12): соңғы кесінді 73.5°
== пайыз бен пайыздық тармақ
болатын 8.7 %, болды 11.4 % — бұл өсім 2.7 пайыздық тармақ
ал « 31.0 %-ға» — бұл басқа сандар туралы басқа тұжырым
== қатардың қай бөлігін көрсету керек
бүкіл қатар: 8.0 → 11.4 | өзгеріс 3.4 п.т.
соңғы екі жыл: 8.7 → 11.4 | өзгеріс 2.7 п.т.
екі тұжырым да дұрыс, әрі олардың бірін салудан бұрын таңдайды
Қасында stolbiki.png пайда болады — сол екі график: сол жағы адал, оң жағы жоқ.
Талдау
Бағананы ұзындықпен өлшейді, сондықтан ол нөлден басталады
Бағана мәнді ұзындықпен кодтайды. Оқырман жоғарғы шеттерін емес, биіктіктерді тұтас салыстырады: «бұл анадан екі есе биік». Осьті нөлден бастамасаңыз, ұзындық санға сәйкес келуін қояды, ал көз мұны білмейді.
Шығыстағы сандар: 8.7 бен 11.4 1.31 есе ерекшеленеді. Нөлден басталатын оське солай көрінеді де. Ось сегізден басталса, оң жақтағы бағана 4.86 есе биік көрінеді. Адал сурет пен адал еместің арасындағы айырма мұнда «біраз» емес, төрт есеге жуық.
Ереже қарапайым әрі ерекшеліксіз: бағаналарда ось нөлден басталады. Сонда айырмашылық көрінбесе — жауап та сол: айырмашылық аз. Оны ірі көрсеткіңіз келсе — бағананы емес, сандардың өзін немесе айырманы көрсетіңіз.
Сызықта басқаша, бірақ тегін емес
Сызық мәнді ұзындықпен емес, нүктенің орнымен кодтайды, сондықтан оған нөл міндетті емес: температураны ешкім нөлден салмайды. Бірақ қиылған ось сызықта да әсерді өзгертеді, әрі оны жасырудың қажеті жоқ: ось нөлден болмаса — солай деп жазыңыз.
Парақ пропорциясы да бір тұжырым
Ең байқалмайтын бұрмалау. Шығыста қатардың сол бір соңғы кесіндісі:
- парақ 8×3 дюйм, ось нөлден 16-ға дейін — көлбеуі 14.2°, қатар тыныш көрінеді;
- парақ 4×5 дюйм, ось 8-ден 12-ге дейін — көлбеуі 73.5°, сол қатар құлдырау болып көрінеді.
Бұл кезде бірде-бір сан өзгерген жоқ. Сондықтан пропорцияны керекті әсерге емес, деректе қарап таңдайды: ұзын қатарға кең парақ, ал оқырман өзара салыстыратын графиктерге бірдей пропорция.
Пайыз бен пайыздық тармақ
Инфляция 8.7 % еді, 11.4 % болды. Дұрыс тіркес екеу, әрі олар әртүрлі:
- 2.7 пайыздық тармаққа өсті — бұл айырма;
- шаманың өзі 31 %-ға өсті — бұл салыстырмалы өзгеріс.
Біріншісін айтқысы келіп «31 %-ға өсті» деп жазу — кәдімгі қате, әрі ол тұжырымды он бір есе қаттырақ етеді. Өзі пайызбен өлшенетіннің бәріне — инфляция, мөлшерлеме, үлес — белгіде «п.т.» немесе «%» саналы түрде тұруға тиіс.
Қатардың қай бөлігін көрсету керек
Бүкіл қатар: 8.0-ден 11.4-ке, өзгеріс 3.4 п.т. Соңғы екі жыл: 8.7-ден 11.4-ке, өзгеріс 2.7 п.т. Екі тұжырым да дұрыс, бірақ әртүрлі әңгіме айтады, ал үшінші нұсқа — 2022–2024 — құлдырауды көрсетеді.
Адал ереже: бөлікті нәтижеге қарағанға дейін таңдайды, әрі сыртқы себеппен — «дерегі сонша», «шарт сонша уақытқа», «жылдан жылға». Терезе қай сурет әдемірек екені көрінгеннен кейін таңдалса, бұл — талдау емес.
Әр графикте не тұруға тиіс
Онсыз суретті жіберуге болмайтын бес нәрсе:
- Тақырып — не көрсетілген.
- Өлшем бірлігі бар Y осінің белгісі — «%», «₸», «дана». Өлшемсіз сан ештеңе білдірмейді.
- X осінің белгісі — көлденеңінен не тұр және бұл қандай кезең.
- Дереккөз және дерек алынған күн — тікелей суретте: оны тұрған бетінсіз де жіберіп жібереді.
- Бақылау саны —
N = 5. Үш нүктелі және үш жүз нүктелі график бірдей көрінеді, ал құны әртүрлі.
Алтыншысы — жағдайға қарай: ось нөлден болмаса, қатар тегістелген болса, деректің бір бөлігі алынып тасталса, мұны қасына жазады. Тегістелген қатарды, уақыт туралы сабақ көрсеткендей, нағызымен бірге көрсеткен жөн.
Сабақ картасы
Өз сөзіңізбен айтыңыз
Қарамай, дауыстап немесе қағазға жауап беріңіз. Жауаптар — сабақтың соңында.
- Бағаналарда ось неге міндетті түрде нөлден басталады, ал сызықта — жоқ?
- «2.7 пайыздық тармаққа өсті» «31 %-ға өсті» дегеннен несімен өзгеше?
- Бірде-бір санды өзгертпей, тек парақ пропорциясын ауыстырсақ, графикте не өзгереді?
Жаттығу
Тапсырмаға дейінгі үш қысқа қадам: болжау, толықтыру, түзету. Жауаптар — сабақтың соңында, бірақ алдымен өзіңіз жауап беріңіз.
1. Болжаңыз. Бұл бағдарлама не басып шығарады?
low, high = 8.7, 11.4
for bottom in (0.0, 7.0, 8.5):
look = (high - bottom) / (low - bottom)
print(f"ось {bottom}-ден: {look:.2f} есе биік (шын мәнінде {high / low:.2f})")
2. Бос орынды толтырыңыз. ... орнына бағаналар адал болатындай шектерді қойыңыз.
# бағананы ұзындықпен өлшейді
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(4, 3))
ax.bar(["2024", "2025"], [8.7, 11.4], color="#b03a2e")
ax.set_ylim(...)
ax.set_ylabel("инфляция, %")
print("остің табаны:", ax.get_ylim()[0], "| белгі:", ax.get_ylabel())
plt.close(fig)
3. Түзетіңіз. Бағдарлама салыстырмалы өзгерісті есептейді де, оны пайыздық тармақ деп атайды.
# 2.7 бен 31 — әртүрлі сан әрі әртүрлі тұжырым
low, high = 8.7, 11.4
change = (high - low) / low * 100
print(f"инфляция {change:.1f} пайыздық тармаққа өсті")
Тапсырма
Міндетті. Бес жылдық инфляцияның адал графигін салыңыз — бағанамен, нөлден, тақырыбымен, екі осьтің белгісімен, тақырыптағы бақылау санымен және тікелей суреттегі дереккөзбен. Файлға сақтаңыз. Содан кейін дайын осьтерден әр ереже орындалды ма деп сұрап, тексеруді басып шығарыңыз: ось нөлден бастала ма, белгіде өлшем бірлігі бар ма, дерек көлемі аталған ба, дереккөз тұр ма. Соңында — бұл график не дейді: бес жылдағы өзгеріс, ең жоғары мен ең төмені жылдарымен.
Күтілетін шығыс:
графикті тексеру:
Y осі нөлден: True
Y осінің белгісі: 'инфляция, жылына %'
белгіде өлшем бірлігі бар: True
тақырып: 'Қазақстандағы инфляция, 2021—2025 (N = 5)'
нүкте саны аталған: True
дереккөз суретте: True
бағана саны: 5 | файл: True
бұл график не дейді:
бес жылда: 8.0 → 11.4 | өзгеріс 3.4 п.т.
ең жоғары: 15.0 — 2022 | ең төмен: 8.0 — 2021
Дайын болғаны: шығыс жол-жолымен сәйкес келеді; тексеру жоғарыда жазғаныңызды қайталамай, нысанның өзінен сұрайды (ax.get_ylim(), ax.get_ylabel(), fig.texts); дереккөз тақырыпқа емес, fig.text арқылы қосылған; файл бүкіл суреттен кейін сақталған.
Өз деректеріңізде. Кез келген өз графигіңізді алыңыз — тіпті өткен сабақтан — және тізімнің бес тармағынан өтіңіз. Жетіспегенін қосыңыз. Содан кейін сол қатарды екінші рет, әдейі адал емес салыңыз: осьті қиып, парақты созыңыз. Екі суретті қатар қойып, бір ақиқат қалай екі түрлі хабарға айналатынын қараңыз.
Қалауыңыз бойынша.
- Өзіңіздің қиылған осіңіз үшін бұрмалау коэффициентін бірінші жаттығудағы формуламен есептеңіз.
- Бір қатарды басқа қатармен бірге екі Y осінде салып, солай кез келген нәрсенің арасында дерлік «байланыс көрсетуге» болатынына көз жеткізіңіз.
- Бағаналарды әліпби орнына шамасы бойынша сұрыптап, өз тапсырмаңыз үшін қай рет адалырақ екенін шешіңіз.
Жобада бұл қайда тұрады
Қадам жоқ: жиынтық бір сурет салады, әрі осы сабақтың ережелері оған әлдеқашан кіріп қойған — ол сызық болғандықтан нөлден басталатын ось керек емес, ал белгілер мен аңыз өткен қадамнан бері тұр.
Бірақ сабақ бір қарызды жабады. Жиынтықтың суретінде дереккөз бен күн жоқ еді, әрі оны есептен бөлек жіберуге болмайтын: алушы сандардың қайдан келгенін білмейтін. Есеп бетке айналатын келесі қадамда дереккөз суретте де, кестенің астында да пайда болады — деректің өзі алынған сол жерден алынған бір жолмен.
Жауаптар
Жауаптарды көрсету
Сұрақтарға
- Өйткені бағана мәнді ұзындықпен кодтайды, әрі көз ұзындықтарды тұтас салыстырады. Осьті қиды — ұзындық санға сәйкес келуін қойды: 1.31 есе 4.86-ға айналады. Сызық мәнді ұзындықпен емес, нүктенің орнымен кодтайды, сондықтан оған нөл міндетті емес — бірақ қиылған осьті бәрібір белгілейді.
- Біріншісі — пайызбен өлшенген екі шаманың айырмасы: 11.4 − 8.7. Екіншісі — салыстырмалы өзгеріс: шаманың өзі неше пайызға өскені. Инфляция үшін бұл 2.7 және 31.0 — он бір есе айырма, әрі оларды шатастыру тұжырымды дерек рұқсат еткеннен қаттырақ етеді.
- Сызықтардың көлбеуі, онымен бірге әсер де. Сол бір кесінді — нөлден басталатын осі бар кең парақта 14.2°, қиылған осі бар тар парақта 73.5°. Бірде-бір сан өзгерген жоқ, ал «тыныш қатар» «құлдырауға» айналды.
Жаттығуға
- Ось қаншалық жоғарыдан басталса, асыра көрсету соншалық күшті: нөлден — нағыз 1.31 есе, 8.5-тен — он төрт жарым есе.
ось 0.0-ден: 1.31 есе биік (шын мәнінде 1.31)
ось 7.0-ден: 2.59 есе биік (шын мәнінде 1.31)
ось 8.5-ден: 14.50 есе биік (шын мәнінде 1.31)
ax.set_ylim(0, 16). Төменде нөл міндетті, ал жоғарғы шекті ең биік бағана шетке тірелмейтіндей таңдайды.
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(4, 3))
ax.bar(["2024", "2025"], [8.7, 11.4], color="#b03a2e")
ax.set_ylim(0, 16)
ax.set_ylabel("инфляция, %")
print("остің табаны:", ax.get_ylim()[0], "| белгі:", ax.get_ylabel())
plt.close(fig)
остің табаны: 0.0 | белгі: инфляция, %
- Пайыздық тармақ — бұл айырма:
high - low. Салыстырмалы өзгерісті бөлек санап, өз атымен атайды.
low, high = 8.7, 11.4
points = high - low
percent = (high - low) / low * 100
print(f"инфляция {points:.1f} пайыздық тармаққа өсті")
print(f"яғни инфляцияның өз шамасы {percent:.1f} %-ға өсті")
инфляция 2.7 пайыздық тармаққа өсті
яғни инфляцияның өз шамасы 31.0 %-ға өсті
Тапсырмаға
Тексеру бағдарламашыдан емес, графиктің өзінен сұрайды. Бұл маңызды: белгіні бір жерде қойып, екінші жерде ұмытып кетуге болады, ал ax.get_ylabel() шын салынғаны үшін жауап береді. Мұндай тексеруді есеп кодында мәңгі қалдыруға болады — ол төрт жол тұрады да, ұмытылған белгіні оқырманнан бұрын ұстайды.
Дереккөз тақырыпқа емес, fig.text арқылы қойылады: тақырып «не көрсетілген» деген сұраққа, ал дереккөз «сандар қайдан» дегенге жауап береді, әрі бұл екі түрлі сұрақ. Парақта ол төменгі сол жақта, ұсақ әрі сұр болып тұрады.
Дереккөздер
- Графикпен қалай жаңылыстырады — типтік бұрмалаулардың жинағы, мысалдарымен.
- matplotlib-тегі осьтер мен шектер —
set_ylimжәне оның суретке не істейтіні. - Тұтыну бағасының инфляциясы, Дүниежүзілік банк — осы сабақтағы сандардың дереккөзі.
Пікірлер (0)
Пікір қалдыру үшін кіріңіз →
Әзірге пікір жоқ. Бірінші болыңыз.