Shanraq.org Shanraq.org
Орташа, медиана, шашырау: орташа қашан өтірік айтады
IT

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

Орташа, медиана, шашырау: орташа қашан өтірік айтады

Python курсының отыз жетінші сабағы және ақша модулінің басы. Он ел, бір жыл: орташа 20.48 %, медиана 13.88 % — әрі орташа он елдің сегізіндегіден жоғары. Бір елді алыңыз: орташа 5.76-ға ығысады, медиана 0.03-ке. `mean`, `median`, `std` және өлшемді нәтижеге дейін таңдайтын ереже.

Не үшін керек

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

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

Бұл сабақ — үш түрлі сұраққа жауап беретін үш өлшем туралы және олардың қайсысын тақырыпқа қоятын ереже туралы.

Бірден тұтас

ortasha.py файлы. Екі нағыз қатар: Қазақстанның жылдар бойынша инфляциясы және он елдің 2022 жылғы инфляциясы, екеуі де — Дүниежүзілік банк деректері.

"""37-сабақ: орташа, медиана, шашырау — және орташа қашан өтірік айтады.

Екі нағыз қатар: Қазақстандағы жылдық инфляция және он елдің 2022 жылғы
инфляциясы. Екеуінің де дереккөзі — Дүниежүзілік банк, FP.CPI.TOTL.ZG көрсеткіші.
"""

import numpy as np
import pandas as pd

# Қазақстан, жылдық инфляция, пайызбен — он бір жыл.
kazakhstan = pd.Series(
    [6.85, 6.68, 14.36, 7.44, 6.16, 5.33, 6.72, 8.04, 15.03, 14.53, 8.69],
    index=[2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024],
    name="инфляция",
)

# Сол көрсеткіш, басқа қима: бір жыл және он ел.
year_2022 = pd.Series(
    {
        "Қазақстан": 15.03, "Ресей": 13.74, "Өзбекстан": 11.45,
        "Қырғызстан": 13.92, "Түркия": 72.31, "Грузия": 11.90,
        "Армения": 8.64, "Әзербайжан": 13.85, "Беларусь": 15.21,
        "Молдова": 28.74,
    },
    name="2022 инфляциясы",
)

print("== Бір елдің он бір жылы")
print("  орташа:", round(kazakhstan.mean(), 2))
print("  медиана:", round(kazakhstan.median(), 2))
print("  шашырау:", round(kazakhstan.std(), 2))
print(f"  {kazakhstan.min()}-тен {kazakhstan.max()}-ке дейін, ауқым {round(kazakhstan.max() - kazakhstan.min(), 2)}")

print()
print("== Бір жыл, он ел")
mean_2022 = year_2022.mean()
median_2022 = year_2022.median()
print("  орташа:", round(mean_2022, 2))
print("  медиана:", round(median_2022, 2))
print("  орташадан төмен:", int((year_2022 < mean_2022).sum()), "/", len(year_2022))
print("  медианадан төмен:", int((year_2022 < median_2022).sum()), "/", len(year_2022))

print()
print("== Оларға бір ел не істейді")
without = year_2022.drop("Түркия")
print("  Түркиямен: орташа", round(mean_2022, 2), "| медиана", round(median_2022, 2))
print("  Түркиясыз: орташа", round(without.mean(), 2), "| медиана", round(without.median(), 2))
# Ығысуды оқырман көріп тұрған сандар бойынша санаймыз, жасырын сандармен емес.
print("  орташа ығысты:", round(round(mean_2022, 2) - round(without.mean(), 2), 2))
print("  медиана ығысты:", round(round(median_2022, 2) - round(without.median(), 2), 2))

print()
print("== Шашырау: бір сұраққа екі жауап")
quarters = year_2022.quantile([0.25, 0.5, 0.75])
print("  std:", round(year_2022.std(), 2))
print("  ширектер:", round(quarters[0.25], 2), "|", round(quarters[0.5], 2), "|", round(quarters[0.75], 2))
print("  ширекаралық ауқым:", round(quarters[0.75] - quarters[0.25], 2))

print()
print("== Бір сөз, екі сан")
print("  pandas .std():", round(kazakhstan.std(), 4), "— n - 1-ге бөледі")
print("  numpy  .std():", round(float(np.std(kazakhstan)), 4), "— n-ге бөледі")
print("  pandas std(ddof=0):", round(kazakhstan.std(ddof=0), 4))

print()
print("== Алты жолдың орнына бір жол")
print(year_2022.describe().round(2).to_string())

Шығысы:

== Бір елдің он бір жылы
  орташа: 9.08
  медиана: 7.44
  шашырау: 3.69
  5.33-тен 15.03-ке дейін, ауқым 9.7

== Бір жыл, он ел
  орташа: 20.48
  медиана: 13.88
  орташадан төмен: 8 / 10
  медианадан төмен: 5 / 10

== Оларға бір ел не істейді
  Түркиямен: орташа 20.48 | медиана 13.88
  Түркиясыз: орташа 14.72 | медиана 13.85
  орташа ығысты: 5.76
  медиана ығысты: 0.03

== Шашырау: бір сұраққа екі жауап
  std: 18.97
  ширектер: 12.36 | 13.88 | 15.16
  ширекаралық ауқым: 2.81

== Бір сөз, екі сан
  pandas .std(): 3.6851 — n - 1-ге бөледі
  numpy  .std(): 3.5136 — n-ге бөледі
  pandas std(ddof=0): 3.5136

== Алты жолдың орнына бір жол
count    10.00
mean     20.48
std      18.97
min       8.64
25%      12.36
50%      13.88
75%      15.16
max      72.31

Талдау

Орташа «тең бөлсе әрқайсысына қанша тиер еді» дегенге жауап береді

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

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

Медиана «ал ортасында не болды» дегенге жауап береді

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

Бағдарламада бұл өлшеніп тұр. Он елдің ішінен Түркияны алып тастаңыз:

Түркиямен: орташа 20.48 | медиана 13.88
Түркиясыз: орташа 14.72 | медиана 13.85

Орташа 5.76 пайыздық тармаққа ығысты, медиана — 0.03-ке. Он елдің бірі «орташа» жауапты үштен біріне жуық қайта жазды, ал «ортадағы» жауап оны байқаған жоқ.

Орташа қашан өтірік айтады

Әрқашан емес әрі өзінен-өзі емес: орташа оны әдеттегі мән ретінде ұсынғанда әрі қатар симметриясыз болғанда өтірік айтады. Тексеру бір жол:

орташадан төмен: 8 / 10
медианадан төмен: 5 / 10

Медиана реттелген қатарды екі бөлікке бөледі, бірақ бірдей мәндер болса, одан қатаң түрде төмен жатқан бақылаулар саны дәл жарты болмауы мүмкін. Орташаның астында ондықтың сегізі шықса, демек қатардың жоғары қарай ұзын құйрығы бар, әрі «орташа 20 %» аймақты емес, оның жалғыз шетін сипаттайды.

Дәл сондай қисаю Қазақстанның он бір жылында да көрінеді: орташа 9.08, медиана 7.44 — он бір жылдың үш шыңы орташаны ортадан бір жарым тармақтан астам көтерген.

Шашырау: бір санға қарсы төрт сан

std — орташадан ауытқулар квадраттарының орташа мәнінің квадрат түбірі (ddof түзетуі төменде түсіндіріледі), жай орташа қашықтық емес. Шеткі мән оны орташамен бірге ұлғайтады. Он елде std 18.97-ге тең, ал медиана 13.88 — шашырау ортаның өзінен үлкен.

Ширектер басқаша құрылған. Бірінші ширек — қатардың төрттен бірі одан төмен тұрған мән; үшіншісі — төрттен үші төмен тұрған мән; арасын ширекаралық ауқым деп атайды:

ширектер: 12.36 | 13.88 | 15.16
ширекаралық ауқым: 2.81

Елдердің орталық 50 %-ы ені үш пайыздық тармақтан кем аралыққа сыяды. Ширекаралық ауқым шеткі мәндерге төзімді, ал стандартты ауытқу оларға сезімтал; екеуі де шашырауды сипаттайды, бірақ әртүрлі сұраққа жауап береді.

Ауқым (max - min) басқа нәрсеге керек: ол әдеттегі қашықтықты емес, шектерді атайды. Тақырыпта ол бақылау санымен бірге ғана адал.

Бір сөз, екі сан

Бір қатары бар екі адамның есептеріндегі сандар осы екі жолдан ажырайды:

pandas .std(): 3.6851 — n - 1-ге бөледі
numpy  .std(): 3.5136 — n-ге бөледі

Бұл кітапханалардың ешқайсысындағы қате емес. Қатар — бүкіл бас жиын болса, n-ге бөледі; қатар үлкенірек тұтас туралы пікір айтуға алынған іріктеме болса, n − 1-ге бөледі. pandas әдепкі күйінде сіздің деректеріңізді іріктеме деп санайды, numpy — бас жиын деп.

Үшінші таңбадағы айырма басқа кітапханамен санаған адам оны көрген күнге дейін ғана ұсақ болып көрінеді. Сондықтан есепте шашыраудың қасына онымен немен саналғанын жазады, ал кодта ddof-ты анық қояды.

describe() — алты жолдың орнына бір жол

Series.describe() санын, орташасын, шашырауын, минимумын, үш ширегін және максимумын басып шығарады. Таныс емес қатармен бірінші осыны істейді: сегіз сан ортаны да, шашырауды да, қисаюды да бірден көрсетеді.

Есепке одан екі-үш сан алады. Деректерге өзіңіз қарау үшін сегізін де оқиды.

Тақырыпқа нені қою керек

Бас емес, кодта жазылып тұруға тиіс ереже:

  1. Сұрақ сома туралы болса — орташа. «Барлығы қанша жиналды және әрқайсысына қанша келеді» дегенге тек сол жауап береді.
  2. Сұрақ әдеттегі мән туралы болса, алдымен үлестірімді, квантильдерді және шеткі мәндерді қараңыз. Орташа мен медиананың жақындығы пайдалы белгі, бірақ оларды өздігінен бірдей етпейді: таңдау сұрақтың мағынасы мен шеткі мәндердің бағасына байланысты.
  3. Кез келген өлшемнің қасында — бақылау саны: он ел бойынша 20 % пен жүз ел бойынша 20 % — әртүрлі тұжырым.
  4. Қатар симметриясыз болса, бір өлшем аз: медиана мен ширектер орташа мен std жасыратынды айтады.

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

Сабақ картасы: орташа, медиана және шашырау

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

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

  1. Қатардан Түркияны алып тастағанда медиана неге дерлік ығыспады, ал орташа 5.76-ға ығысты?
  2. «Орташадан төмен он елдің сегізі» дегені не және бұл қатар туралы нені айтады?
  3. .std() pandas-та және numpy-да бір қатар үшін неге әртүрлі сан береді?

Жаттығу

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

1. Болжаңыз. Бұл бағдарлама не басып шығарады?

import pandas as pd

pay = pd.Series([120000, 130000, 140000, 150000, 900000])
print("орташа:", int(pay.mean()))
print("медиана:", int(pay.median()))
print("орташадан төмен:", int((pay < pay.mean()).sum()), "/", len(pay))

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

# бес чек, біреуі — тоңазытқыш
import pandas as pd

prices = pd.Series([320, 340, 350, 360, 4800])
measure = ...
print("бір қымбат чек ығыстырмаған өлшем:", measure)

3. Түзетіңіз. Бағдарлама бір қатар үшін екі түрлі шашырау басып шығарады да, сандардың бірін қате деп жариялайды.

# «кітапхананың бірі дұрыс санамайды» — жоқ, олар әртүрлі нәрсе санайды
import numpy as np
import pandas as pd

row = pd.Series([6.85, 6.68, 14.36, 7.44, 6.16])
print("pandas:", round(row.std(), 4))
print("numpy: ", round(float(np.std(row)), 4))
print("сәйкес келді:", round(row.std(), 10) == round(float(np.std(row)), 10))

Тапсырма

Міндетті. Үш қатар алыңыз: Қазақстанның он бір жылы, солардың ішіндегі тыныш бес жылы (2017–2021) және он елдің 2022 жылы. Әрқайсысы үшін бақылау санын, орташаны, медиананы, шашырауды, шектерді және ширекаралық ауқымды басып шығарыңыз — әрі тақырыпқа баратын өлшемді. Өлшемді кодтағы ереже таңдайды: орташа медианадан оның оннан бірінен артық ұзаса, тақырыпқа медиана барады. Соңында — үш қатардың describe() кестесі қатар.

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

== Қазақстан, 2014-2024
  бақылау саны: 11
  орташа: 9.08 | медиана: 7.44
  шашырау: 3.69 | 5.33-тен 15.03-ке
  ширекаралық ауқым: 4.82
  тақырыпқа: медиана 7.44 %
  орташадан төмен: 8 / 11

== Қазақстан, 2017-2021
  бақылау саны: 5
  орташа: 6.74 | медиана: 6.72
  шашырау: 1.06 | 5.33-тен 8.04-ке
  ширекаралық ауқым: 1.28
  тақырыпқа: орташа 6.74 %
  орташадан төмен: 3 / 5

== Он ел, 2022
  бақылау саны: 10
  орташа: 20.48 | медиана: 13.88
  шашырау: 18.97 | 8.64-тен 72.31-ке
  ширекаралық ауқым: 2.81
  тақырыпқа: медиана 13.88 %
  орташадан төмен: 8 / 10

== Неге бәріне бір өлшем емес
       11 жыл  5 тыныш  10 ел
count   11.00     5.00  10.00
mean     9.08     6.74  20.48
std      3.69     1.06  18.97
min      5.33     5.33   8.64
25%      6.70     6.16  12.36
50%      7.44     6.72  13.88
75%     11.52     7.44  15.16
max     15.03     8.04  72.31

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

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

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

  • Өз қатарыңызда std-ты ddof=0 және ddof=1 арқылы санап, айырма қай бақылау санынан бастап байқалмайтын болатынын қараңыз.
  • Өз қатарыңыз бойынша quantile([0.1, 0.5, 0.9]) құрып, «ондықтың сегізі» жолағын minmax шектерімен салыстырыңыз.
  • Отызыншы сабақтағы жетіспейтін мәндері бар қатарды алып, mean() қатардың ұзындығы бойынша емес, бос емес мәндер бойынша санайтынына көз жеткізіңіз.

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

Он жетінші қадам, әрі онымен бесінші модуль басталады: жиынтық тек соңғы жылды көрсетуді қояды.

sholu/esep.py ішінде ozara пайда болады — әр ел бойынша бақылау санын, орташаны, медиананы, шашырауды және ширекаралық ауқымды санайды, қасына тапсырмадағы сол ережемен таңдалған өлшемді қояды. Есеп бетіне екінші блок қосылады — «барлық жылдар бойынша», соңғы жыл кестесінің астында.

Ереже жиынтықтың нағыз деректерінде не деді:

Қазақстан  5 жыл  орташа 11.54  медиана 11.39  шашырау 3.22  → орташа
RUS        5 жыл  орташа 8.69   медиана 8.43   шашырау 3.06  → орташа
Өзбекстан  5 жыл  орташа 10.14  медиана 9.96   шашырау 1.04  → орташа

Үш елге де ол орташаны таңдады: олардың бес жылдық қатарлары жеткілікті симметриялы, медиана орташадан бір-екі пайызға ғана ажырайды. Кодқа жазылған ереженің пайдасы да осында — ол дерек талап етпеген жерде «сақ» медиананы тықпаламайды, ал қатарда Түркиядағыдай шың пайда болған күні керісінше айтады.

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

Жауаптар

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

Сұрақтарға

  1. Өйткені медиананы мәннің шамасы емес, орны анықтайды. Түркия қалай болғанда да ортадан жоғары тұр, ал ол жерде нақты қай сан — 28 бе, 72 ме — ортаға бәрібір. Ал орташа барлық мәндерді қосады, сондықтан бір үлкен сан оны өзі неғұрлым үлкен болса, соғұрлым қатты жоғары тартады.
  2. Қатардың симметриясыз екенін: оның жоғары қарай ұзын құйрығы бар. Медиананың астында әрқашан жартысы — бұл оның анықтамасы; орташаның астында ондықтың сегізі шықса, демек орташа құйрық жаққа кетіп қалған әрі енді әдеттегі мән емес.
  3. Өйткені олар әртүрлі санға бөледі: pandas әдепкі күйінде қатарды іріктеме деп санап, n − 1-ге бөледі, numpy оны бүкіл бас жиын деп санап, n-ге бөледі. Екеуінің ешқайсысы қате емес; қате — есепте нақты не саналғанын айтпау және ddof-ты әдепкі күйінде қалдыру.

Жаттығуға

  1. Тоғыз жүз мыңдық бір жалақы орташаны бестің төртеуіндегіден жоғары сүйреп кеткен.
орташа: 288000
медиана: 140000
орташадан төмен: 4 / 5
  1. prices.median(). Медиана шамаға емес, орынға қарайды: тоңазытқыш бағасы қандай болса да ортаның оң жағында қала береді.
import pandas as pd

prices = pd.Series([320, 340, 350, 360, 4800])
measure = prices.median()
print("бір қымбат чек ығыстырмаған өлшем:", measure)
бір қымбат чек ығыстырмаған өлшем: 350.0
  1. Мәселе қатеде емес, ddof-та: екі кітапханаға бірдей бөлгіш қойыңыз.
import numpy as np
import pandas as pd

row = pd.Series([6.85, 6.68, 14.36, 7.44, 6.16])
print("pandas:", round(row.std(ddof=0), 4))
print("numpy: ", round(float(np.std(row)), 4))
print("сәйкес келді:", round(row.std(ddof=0), 10) == round(float(np.std(row)), 10))
pandas: 3.0584
numpy:  3.0584
сәйкес келді: True

Тапсырмаға

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

describe() кестесіндегі ширектер орташада да, шашырауда да көрінбейтінді көрсетеді: он елдің жартысы 12.36 мен 15.16 арасына сыйған, ал 18.97-лік std қалған тоғызға дейінгі емес, бір мәнге дейінгі қашықтықты сипаттайды.

Дереккөздер

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

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

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

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

Пікірлер (0)

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