PYTHON LIBRARY/Project 연습 (새로운 개념 정리 추가!)

프로젝트(대중교통) 연습 : 데이터를 분석하여 파이차트 그리기 plt.pie()

신강희 2024. 4. 17. 00:11
728x90

 

# 실행전 기본 라이브러리 및 한글 찍기 import


import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sb

%matplotlib inline

import platform

from matplotlib import font_manager, rc
plt.rcParams['axes.unicode_minus'] = False

if platform.system() == 'Darwin':
    rc('font', family='AppleGothic')
elif platform.system() == 'Windows':
    path = "c:/Windows/Fonts/malgun.ttf"
    font_name = font_manager.FontProperties(fname=path).get_name()
    rc('font', family=font_name)
else:
    print('Unknown system... sorry~~~~')

 

< subwayfee.csv 파일을 통한 지하철 유무임별 이용현황 데이터 분석 >

  • 자료출처 : t-money.co.kr 에서 자료를 제공함. encoding = 'cp949'

df = pd.read_csv('../data/subwayfee.csv', encoding= 'cp949')
df

 

df['지하철역'].nunique()

509

 

실습 0) 유임승차, 유임하차, 무임승차, 무임하차 4가지 별로, 각각 가장 많은 역을 찾아보세요.

# 유임승차

df['유임승차'].max()

3153418

 

df['유임승차'] == df['유임승차'].max()

0      False
1      False
2      False
3      False
4      False
       ...  
593    False
594    False
595    False
596    False
597    False
Name: 유임승차, Length: 598, dtype: bool

 

df.loc[df['유임승차'] == df['유임승차'].max() , ]

 

# 같은 방식으로 4곳 반복

 

df.loc[df['유임하차'] == df['유임하차'].max() , ]

 

df.loc[df['무임승차'] == df['무임승차'].max() , ]

 

df.loc[df['무임하차'] == df['무임하차'].max() , ]

 

실습 1. 무임승차 대비 유임승차 비율이 가장 높은 역은 어디입니까?

# 무임승차 대비 유임승차 비율 이므로, 유임승차 / 무임승차 로 비율을 구할수 있다.# 승차비율이라는 컬럼이 없기때문에 비교를 편하게 하기위해 계산한 값을 새로운 컬럼으로 넣어준다.

 

df['승차비율'] = df['유임승차'] / df['무임승차']
df

 

# 데이터를 검토해보자. (새로운 데이터를 생성하였으면 꼭 검토작업을 거쳐서 적합한 데이터인지 확인해야 한다!!)

# describe() 혹은 sort_values등  통계나 정렬을 이용할수 있다.

# 값에 inf 가 나오는 이유는 나누기에 분모가 되는 무임승차에 0값이 있기 때문에 출력됨 이러면 연산이 되질 않음
df.sort_values('승차비율' , ascending=False)

 

# 그러모르 inf가 빠지게 무임승차에 영이 있는 셀은 빼버리자 (우리는 무임승차, 유임승차 값이 필요한 것이므로)
df2 = df.loc [ df['무임승차'] != 0 , ]

 

# 이제 승차비율이 가장 좋은곳 확인

df2['승차비율'].max()

27.5

 

# 가져오기

df2.loc [ df2['승차비율'] == df2['승차비율'].max() ,  ]

 

실습 2. 전체승차인원(유임+무임)이 만명이상인 역 중, 유임승차 비율이 가장 높은 역은 어디입니까?

# 10000명 이상인 데이터프레임을 만들어야 한다
# 전체승차인원이 없으므로 더하여 컬럼을 만들어야 한다

 

df['전체승차인원'] = df['유임승차'] + df['무임승차']
df

 

# 승차인원이 10000명 이상인 데이터만 변수로 지정
df3 = df.loc[df['전체승차인원'] >= 10000 , ]
df3

 

# 승차비율을 기준으로 내림차순 정렬 시켜서 최상단 데이터를 본다
df3.sort_values('승차비율', ascending=False).head(1)

 

실습 3. 모든 역의 유임승차, 유임하차, 무임 승차, 무임하차, 총 4개를, 파이차트로 나타내세요.

# 전체데이터를 한번 확인

 

# 모든 역이라고 하였으니 각 컬럼별로 598개 역에대한 데이터(행)가 파이 차트로 출력되어야 하는것

# 즉 598개의 파이차트가 그려져야 하는것

# 필요한 컬럼 4개를 변수로 지정

# plt.pie로 차트 그려주기

 

df_pie = df.loc[ 0  , '유임승차' : '무임하차' ]
plt.pie(df_pie, labels= df_pie.index, autopct='%.1f' , startangle=90, wedgeprops={'width' : 0.8})
plt.title(df['지하철역'][0])
plt.show()

# 이제 역정보가 필요
# 컬럼 정보는 데이터 액세스 뒤에 [] 로 가져옴

 

df['지하철역'][2]
# 찾은 역명을 상단 코드에 타이틀로 삽입

'종각'

 

## 이제 다음역 하나씩 볼때는 상단에 인덱스만 수정해 주면 되지만 우리는 500개이상의 데이터를 봐야하기 때문에 반복문을 사용한다

 

# 전체행 0부터 597 까지 범위지정 필요
range(0, 597+1)

range(0, 598)

 

# 혹은 넘파이를 사용하여 np.arange(0, 597+1)
np.arange(0, 597+1)

array([  0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,
        13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,
        26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,
        39,  40,  41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,
        52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,
        65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,
        78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,
        91,  92,  93,  94,  95,  96,  97,  98,  99, 100, 101, 102, 103,
       104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
       117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129,
       130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142,
       143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155,
       156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168,
       169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181,
       182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194,
       195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
       208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220,
       221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
       234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246,
       247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259,
       260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272,
       273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285,
       286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298,
       299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311,
       312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324,
       325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337,
       338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350,
       351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363,
       364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376,
       377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389,
       390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402,
       403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415,
       416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428,
       429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441,
       442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454,
       455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467,
       468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480,
       481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493,
       494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506,
       507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519,
       520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532,
       533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545,
       546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558,
       559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571,
       572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584,
       585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597])

 

# for문의 값이 변하여야 하는 곳에 for index 로 설정한 변수 index를 넣어주고 실행.
for index in range(0, 597+1) : 
    df_pie = df.loc[ index  , '유임승차' : '무임하차' ]
    plt.pie(df_pie, labels= df_pie.index, autopct='%.1f' , startangle=90, wedgeprops={'width' : 0.8})
    plt.title(df['지하철역'][index])
    plt.show()

ㄴ 스크롤이 너무 길어 모두 볼순 없지만 이러면 자동으로 597개의 차트를 그려준다.

 

다음 실습문제로 계속

반응형