Python

[python] ๊ตฌ๊ธ€ ์ฝ”๋žฉ์„ ํ™œ์šฉํ•œ ์ง€์—ญ๋ณ„ ๋‚จ๋…€ ์ธ๊ตฌ์ˆ˜ ๋น„์œจ ๋ฐ์ดํ„ฐ ๋ถ„์„ - Matplotlib ํ™œ์šฉ

hyonie 2024. 5. 12. 15:26

์ด์ „์—๋Š” ์—ฐ๋ น๋ณ„๋กœ 0์„ธ๋ถ€ํ„ฐ 100์„ธ๊นŒ์ง€์˜ ์ธ๊ตฌ ํ˜„ํ™ฉ์„ ์‹œ๊ฐํ™”ํ–ˆ๋˜ ๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ, ์ด๋ฒˆ์—๋Š” ์ง€์—ญ๋ณ„๋กœ ๋‚จ๋…€ ์ธ๊ตฌ์ˆ˜ ๋น„์œจ๊ณผ ์„ธ๋Œ€๋‹น ์ธ๊ตฌ๋ฅผ ๋น„๊ตํ•˜์—ฌ ์‹œ๊ฐํ™”ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐ ์ง€์—ญ์˜ ์„ฑ๋ณ„ ์ธ๊ตฌ ๋ถ„ํฌ์™€ ์„ธ๋Œ€๋‹น ํ‰๊ท  ์ธ๊ตฌ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋ชฉ์ฐจ

     


    ์ž…๋ ฅ๋œ ์ง€์—ญ์˜ ์—ฐ๋ น๋ณ„ ์ธ๊ตฌ ๋ถ„ํฌ ์‹œ๊ฐํ™”

    import csv
    import matplotlib.pyplot as plt
    
    f = open('age.csv', 'r', encoding = 'cp949')
    data = csv.reader(f, delimiter=',')
    header = next(data)
    
    result =[]
    
    dongname = input('์ฐพ๊ณ  ์‹ถ์€ ์ง€์—ญ์˜ ์ด๋ฆ„์„ ์•Œ๋ ค์ฃผ์„ธ์š”. ')
    
    for row in data:
      if dongname in row[0]:
        for i in row[3:]:
          i = int(i.replace(',',''))
          result.append(int(i))
    
    
    print(result)
    plt.style.use('ggplot')
    plt.bar(range(101), result)
    plt.show()
    f.close()

     

    ์ด๋ฒˆ์—๋Š” ํŠน์ • ์ง€์—ญ์ด ์•„๋‹Œ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ ๊ฐ’์„ ๋ฐ›์•„์„œ ์ถœ๋ ฅ ํ•œ๋‹ค. ์‚ฌ์šฉ์ž์—๊ฒŒ "์ฐพ๊ณ  ์‹ถ์€ ์ง€์—ญ์˜ ์ด๋ฆ„์„ ์•Œ๋ ค์ฃผ์„ธ์š”."๋ผ๋Š” ๋ฌธ๊ตฌ๊ฐ€ ์ถœ๋ ฅ๋˜๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ํ‚ค๋ณด๋“œ๋กœ ์ž…๋ ฅํ•œ ๋‚ด์šฉ์€ ๋ณ€์ˆ˜ dongname์— ์ €์žฅ๋œ๋‹ค. ์ดํ›„ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์ง€์—ญ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„์„œ ํ•ด๋‹น ์ง€์—ญ์˜ ์—ฐ๋ น๋ณ„ ์ธ๊ตฌ๋ฅผ ์‹œ๊ฐํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ž…๋ ฅ์„ ๋ฐ›๋Š”๋‹ค.

     

    ๊ทธ ํ›„์—๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ค๋ฉด์„œ ์ž…๋ ฅ๋œ ์ง€์—ญ์— ํ•ด๋‹นํ•˜๋Š” ํ–‰์„ ์ฐพ๊ณ , ํ•ด๋‹น ํ–‰์—์„œ๋Š” ๋‚จ์„ฑ ๋ฐ์ดํ„ฐ๊ฐ€ ๋จผ์ € ๋‚˜์˜ค๊ณ  ์—ฌ์„ฑ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งˆ์ง€๋ง‰์— ์œ„์น˜ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ญ์ˆœ์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ์ฝ์–ด์˜จ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด 0๋ถ€ํ„ฐ 100๊นŒ์ง€์˜ ์ธ๋ฑ์Šค๋ฅผ ๊ฑฐ๊พธ๋กœ ์ฝ์–ด์™€์„œ ๊ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ •์ˆ˜๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋‚จ์„ฑ ๋ฆฌ์ŠคํŠธ์— ์ €์žฅํ•œ๋‹ค.

     

    csv ํŒŒ์ผ ํ–‰๋ ฌ์„ ๋(๋’ค)์—์„œ -1 ํ•œ๋‹ค. ์—ฌ์„ฑ ๋ฐ์ดํ„ฐ๊ฐ€ ๋’ค(๊ฐ€์žฅ์˜ค๋ฅธ์ชฝ)์— ์žˆ๊ธฐ๋•Œ๋ฌธ์— -1๋ถ€ํ„ฐ์ด๋‹ค. 

    ์ด ๋ฐ์ดํ„ฐ๋ฅผ ํƒ€์ž…์บ์ŠคํŒ…ํ•˜๋„๋กํ•œ๋‹ค. ์ˆœ์„œ๋Œ€๋กœ ์ฝ์–ด์„œ male์— ๋„ฃ๋Š”๋‹ค.


    csv ํŒŒ์ผ ๋ถ„์„ํ•˜์—ฌ ์ถœ๋ ฅํ•˜๊ธฐ

     

    ํ–‰์•ˆ๋ถ€ ํ™ˆํŽ˜์ด์ง€ > ์ฃผ๋ฏผ๋“ฑ๋ก์ธ๊ตฌ ํ†ต๊ณ„ > ๋ฐ์ดํƒ€ ์ €์žฅ `gender.csv`

     

     

    step1. ๋‚จ๋…€ ๋ฐ์ดํ„ฐ ์ถœ๋ ฅ

     

    step2. ์—ฌ์„ฑ ๋ฐ์ดํ„ฐ๋Š” 100์„ธ๋ถ€ํ„ฐ -0์„ธ๋กœ reverse() ์—ญ์ˆœํ•ด์•ผํ•จ

    female.reverse()

     

     

     


     

    Bar์˜ ํ˜•ํƒœ๋กœ ์‹œ๊ฐํ™”ํ•˜๊ธฐ

    ์ฝ”๋“œ๋Š” ๋‚จ์„ฑ๊ณผ ์—ฌ์„ฑ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ๊ฐ ๋ฐ” ํ˜•ํƒœ๋กœ ์‹œ๊ฐํ™”ํ•˜๋Š” ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๋จผ์ € range(101)์„ ํ†ตํ•ด x์ถ• ๋ฒ”์œ„๋ฅผ ์„ค์ •ํ•˜๊ณ , female.reverse()๋ฅผ ํ†ตํ•ด ์—ฌ์„ฑ ๋ฐ์ดํ„ฐ๋ฅผ ์—ญ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค. ๊ทธ ํ›„์— plt.bar() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ๊ฐ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ” ํ˜•ํƒœ๋กœ ์‹œ๊ฐํ™”ํ•˜๊ณ , plt.show()๋ฅผ ํ†ตํ•ด ๊ทธ๋ž˜ํ”„๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

    female.reverse()
    plt.bar(range(101), male)
    plt.bar(range(101), female)
    plt.show()
    
    f.close()

     


     

    barh()  ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ ์ˆ˜ํ‰ ๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„

    ๋‚จ์„ฑ ๋ฐ์ดํ„ฐ๋Š” ์Œ์ˆ˜๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ํ•˜๋‚˜์˜ ๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„์— ํ‘œ์‹œํ•˜๊ณ , ์—ฌ์„ฑ ๋ฐ์ดํ„ฐ๋Š” ์–‘์ˆ˜๋กœ ํ‘œ์‹œํ•˜์—ฌ ๋‹ค๋ฅธ ๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„์— ๊ฒน์น˜์ง€ ์•Š๋„๋ก ํ•˜์˜€๋‹ค. ์—ฌ์„ฑ ๋ฐ์ดํ„ฐ๋Š” ์—ญ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ ํ›„์— ํ‘œ์‹œ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ female.reverse()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ญ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์˜€๋‹ค.

     

    ๋งˆ์ง€๋ง‰์œผ๋กœ, plt.barh() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ‰ ๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ๊ฐํ™”ํ•˜๊ณ , ๊ฐ๊ฐ์˜ ๋ง‰๋Œ€์— ๋ผ๋ฒจ์„ ์ง€์ •ํ•˜์—ฌ ์„ฑ๋ณ„์„ ํ‘œ์‹œํ•˜์˜€๋‹ค. ๊ทธ๋ฆฌ๊ณ  plt.legend() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒ”๋ก€๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ์•„๋ž˜ ๊ทธ๋ž˜ํ”„๋ฅผ ๋ณด๋ฉด ๋น„์œจ์„ ํ•œ๋ˆˆ์— ์•Œ์ˆ˜ ์žˆ๋‹ค.

    import csv
    import matplotlib.pyplot as plt
    
    f = open('gender.csv', 'r', encoding = 'cp949')
    data = csv.reader(f, delimiter=',')
    
    header = next(data)
    
    male = [] #๋‚จ์ž ๋ฐ์ดํ„ฐ
    female = [] #์—ฌ์ž ๋ฐ์ดํ„ฐ
    
    dongname = input('์ฐพ๊ณ  ์‹ถ์€ ์ง€์—ญ์˜ ์ด๋ฆ„์„ ์•Œ๋ ค์ฃผ์„ธ์š”. ')
    
    for row in data:
      if dongname in row[0]:
        for i in range(0,101):
          male.append(-int(row[i+3]))
          #print(int(row[i+3]))
          female.append(int(row[-(i+1)]))
          #print(int(row[-(i+1)]))
    
    female.reverse()
    
    plt.title('population distribution by gender')
    plt.barh(range(101), male, label='man')
    plt.barh(range(101), female, label='woman')
    plt.legend()
    
    plt.show()
    
    f.close()

    ์ง€์—ญ์˜ ์„ฑ๋ณ„์— ๋”ฐ๋ฅธ ์ธ๊ตฌ ๋ถ„ํฌ๋ฅผ ์ˆ˜ํ‰ ๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„๋กœ ์‹œ๊ฐํ™”ํ•˜๋Š” ๊ณผ์ •