ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • #7
    Python/Jupyter notebook 2023. 1. 16. 21:25

    실습1

    1. Age 항목의 결측치를 파악해 아래 분석을 모두 수행
      1. 결측치를 0으로 대체 (fillna 함수 이용 가능)
      2. 전체 값의 평균으로 대체 (mean 함수 이용 가능)
      3. 중앙값으로 대체 (median 함수 이용 가능)
      4. 각 분석간의 데이터 편차를 확인한다 (통계적 특성)
    2. 나이 정보를 확인한 뒤, 나이 정보를 표준화/정규화 작업을 모두 수행해 보자
      • 시간이 남는 분들이 하시고, 모르는 분들은 설명 들어가면서 같이 합니다
    3. 요금 정보의 outliar를 확인하고, 해당 정보를 어떻게 처리할지 생각해보자
    In [2]:
    import pandas as pd
    
    In [4]:
    df = pd.read_csv('./test.csv')
    
    In [5]:
    df.head()
    
    Out[5]:
    PassengerIdPclassNameSexAgeSibSpParchTicketFareCabinEmbarked01234
    892 3 Kelly, Mr. James male 34.5 0 0 330911 7.8292 NaN Q
    893 3 Wilkes, Mrs. James (Ellen Needs) female 47.0 1 0 363272 7.0000 NaN S
    894 2 Myles, Mr. Thomas Francis male 62.0 0 0 240276 9.6875 NaN Q
    895 3 Wirz, Mr. Albert male 27.0 0 0 315154 8.6625 NaN S
    896 3 Hirvonen, Mrs. Alexander (Helga E Lindqvist) female 22.0 1 1 3101298 12.2875 NaN S

    실습1-1번 문제

    In [6]:
    df_0 = df.fillna(0) # zero-fill
    
    In [7]:
    df.mean()
    
    C:\Users\user\AppData\Local\Temp\ipykernel_26272\3698961737.py:1: FutureWarning: Dropping of nuisance columns in DataFrame reductions (with 'numeric_only=None') is deprecated; in a future version this will raise TypeError.  Select only valid columns before calling the reduction.
      df.mean()
    
    Out[7]:
    PassengerId    1100.500000
    Pclass            2.265550
    Age              30.272590
    SibSp             0.447368
    Parch             0.392344
    Fare             35.627188
    dtype: float64
    In [8]:
    df_mean = df.copy()
    
    for c in ['PassengerId', 'Pclass', 'Age', 'SibSp', 'Parch', 'Fare']: # 숫자가 있는 column은 이 6종류밖에
        df_mean[c].fillna(df_mean[c].mean()) # 평균 값으로 대체
    
    In [10]:
    df_median = df.copy()
    
    for c in ['PassengerId', 'Pclass', 'Age', 'SibSp', 'Parch', 'Fare']:
        df_median[c].fillna(df_median[c].median()) # 중앙값으로 대체
    

    통계 특성을 표시하는 함수들

    1. max(), min(), mean(), median()
    2. describe()
    In [17]:
    for x in ['PassengerId', 'Pclass', 'Age', 'SibSp', 'Parch', 'Fare']:
        a = df_0[x]
        b = df_mean[x]
        c = df_median[x]
        
        print('''zero-fill 결과의 %s column에서의 특성
        max: %.3f
        min: %.3f
        avr.: %.3f
        median: %.3f
        ''' %(x, a.max(), a.min(), a.mean(), a.median()))
        
        print('''mean 결과의 %s column에서의 특성
        max: %.3f
        min: %.3f
        avr.: %.3f
        median: %.3f
        ''' %(x, b.max(), b.min(), b.mean(), b.median()))
        
        print('''median 결과의 %s column에서의 특성
        max: %.3f
        min: %.3f
        avr.: %.3f
        median: %.3f
        ''' %(x, c.max(), c.min(), c.mean(), c.median()))
    
    zero-fill 결과의 PassengerId column에서의 특성
        max: 1309.000
        min: 892.000
        avr.: 1100.500
        median: 1100.500
        
    mean 결과의 PassengerId column에서의 특성
        max: 1309.000
        min: 892.000
        avr.: 1100.500
        median: 1100.500
        
    median 결과의 PassengerId column에서의 특성
        max: 1309.000
        min: 892.000
        avr.: 1100.500
        median: 1100.500
        
    zero-fill 결과의 Pclass column에서의 특성
        max: 3.000
        min: 1.000
        avr.: 2.266
        median: 3.000
        
    mean 결과의 Pclass column에서의 특성
        max: 3.000
        min: 1.000
        avr.: 2.266
        median: 3.000
        
    median 결과의 Pclass column에서의 특성
        max: 3.000
        min: 1.000
        avr.: 2.266
        median: 3.000
        
    zero-fill 결과의 Age column에서의 특성
        max: 76.000
        min: 0.000
        avr.: 24.044
        median: 24.000
        
    mean 결과의 Age column에서의 특성
        max: 76.000
        min: 0.170
        avr.: 30.273
        median: 27.000
        
    median 결과의 Age column에서의 특성
        max: 76.000
        min: 0.170
        avr.: 30.273
        median: 27.000
        
    zero-fill 결과의 SibSp column에서의 특성
        max: 8.000
        min: 0.000
        avr.: 0.447
        median: 0.000
        
    mean 결과의 SibSp column에서의 특성
        max: 8.000
        min: 0.000
        avr.: 0.447
        median: 0.000
        
    median 결과의 SibSp column에서의 특성
        max: 8.000
        min: 0.000
        avr.: 0.447
        median: 0.000
        
    zero-fill 결과의 Parch column에서의 특성
        max: 9.000
        min: 0.000
        avr.: 0.392
        median: 0.000
        
    mean 결과의 Parch column에서의 특성
        max: 9.000
        min: 0.000
        avr.: 0.392
        median: 0.000
        
    median 결과의 Parch column에서의 특성
        max: 9.000
        min: 0.000
        avr.: 0.392
        median: 0.000
        
    zero-fill 결과의 Fare column에서의 특성
        max: 512.329
        min: 0.000
        avr.: 35.542
        median: 14.454
        
    mean 결과의 Fare column에서의 특성
        max: 512.329
        min: 0.000
        avr.: 35.627
        median: 14.454
        
    median 결과의 Fare column에서의 특성
        max: 512.329
        min: 0.000
        avr.: 35.627
        median: 14.454
        
    

    실습1-2번문제

    In [18]:
    df['Age']
    
    Out[18]:
    0      34.5
    1      47.0
    2      62.0
    3      27.0
    4      22.0
           ... 
    413     NaN
    414    39.0
    415    38.5
    416     NaN
    417     NaN
    Name: Age, Length: 418, dtype: float64
    In [19]:
    age_norm = (df['Age'] - df['Age'].mean())/df['Age'].std()
    
    In [24]:
    age_norm.describe()
    
    Out[24]:
    count    3.320000e+02
    mean     6.353686e-18
    std      1.000000e+00
    min     -2.122710e+00
    25%     -6.538646e-01
    50%     -2.307695e-01
    75%      6.154207e-01
    max      3.224507e+00
    Name: Age, dtype: float64
    In [21]:
    age_scaling = (df['Age'] - df['Age'].min())/(df['Age'].max() - df['Age'].min())
    
    In [25]:
    age_scaling.describe()
    
    Out[25]:
    count    332.000000
    mean       0.396975
    std        0.187013
    min        0.000000
    25%        0.274693
    50%        0.353818
    75%        0.512066
    max        1.000000
    Name: Age, dtype: float64

    실습1-3번문제

    In [26]:
    df['Fare'].describe()
    
    Out[26]:
    count    417.000000
    mean      35.627188
    std       55.907576
    min        0.000000
    25%        7.895800
    50%       14.454200
    75%       31.500000
    max      512.329200
    Name: Fare, dtype: float64
    In [27]:
    q1 = df['Fare'].quantile(0.25)
    q2 = df['Fare'].quantile(0.5)
    q3 = df['Fare'].quantile(0.75)
    
    iqr = q3-q1
    
    In [28]:
    iqr
    
    Out[28]:
    23.6042
    In [33]:
    m = df['Fare'] > q3 + (iqr * 1.5)
    
    In [34]:
    fare_iqr = df['Fare'][m]
    
    In [36]:
    fare_iqr.describe()
    
    Out[36]:
    count     55.000000
    mean     149.923260
    std       85.859318
    min       69.550000
    25%       80.529150
    50%      134.500000
    75%      211.500000
    max      512.329200
    Name: Fare, dtype: float64
    In [ ]:
    # normalizing, scaling, std 등 설명: 정의 포함
    
     

    실습

    1. SibSp 값에 따른 Fare 변화를 구한다
      • 단, 아래의 정보를 참조한다
      1. SibSp 값이 1 이상인 경우, 별다른 처리를 하지 않는다
      2. SibSp 값이 0인 경우, Age 값을 고려하여 분석한다
    2. Embarked 값에 따른 Fare 변화를 구한다
      • 단, 아래의 정보를 참조한다
      1. 같은 Embarked 그룹에서 Fare 값이 지나치게 차이가 나는 경우 outliar로 취급하여 삭제한다
      2. 단, 2-A와 같은 경우지만 SibSp가 높은 경우, 인원수를 고려해 처리한다
    In [43]:
    df[['SibSp','Fare']].sort_values('SibSp')
    
    Out[43]:
    SibSpFare0259258257256...21455140360188
    0 7.8292
    0 7.7750
    0 13.0000
    0 8.0500
    0 7.7500
    ... ...
    4 7.7750
    4 29.1250
    5 46.9000
    8 69.5500
    8 69.5500

    418 rows × 2 columns

    In [46]:
    df2 = df[['SibSp','Fare','Age']][df['SibSp'] == 0]
    
    In [48]:
    df2[df2['Age'] < 5]
    
    Out[48]:
    SibSpFareAge201307
    0 14.40 0.33
    0 9.35 0.83
    In [52]:
    float('nan') != float('nan') # NaN 값이 True를 반환하는 유일한 예
    
    Out[52]:
    True
    In [49]:
    df2[df2['Age'] >= 5] # NaN 값은 어떤 조건을 줘도 False를 반환함. 따라서, drop되는 효과가 있음
    
    Out[49]:
    SibSpFareAge02356...403405412414415
    0 7.8292 34.5
    0 9.6875 62.0
    0 8.6625 27.0
    0 9.2250 14.0
    0 7.6292 30.0
    ... ... ...
    0 47.1000 17.0
    0 13.8625 20.0
    0 7.7750 28.0
    0 108.9000 39.0
    0 7.2500 38.5

    212 rows × 3 columns

    In [53]:
    df['Embarked'].unique()
    
    Out[53]:
    array(['Q', 'S', 'C'], dtype=object)
    In [57]:
    df_q = df['Embarked'] == 'Q'
    df_s = df['Embarked'] == 'S'
    df_c = df['Embarked'] == 'C'
    
    In [58]:
    df_q.describe()
    
    Out[58]:
    count       418
    unique        2
    top       False
    freq        372
    Name: Embarked, dtype: object
    In [60]:
    df_q = df[df_q]
    df_s = df[df_s ]
    df_c = df[df_c]
    
    In [63]:
    df_q['Fare'].mean()
    
    Out[63]:
    10.957699999999999
    In [64]:
    df_q['Fare'].median()
    
    Out[64]:
    7.75
    In [62]:
    df_q['Fare'].describe()
    
    Out[62]:
    count    46.000000
    mean     10.957700
    std      12.618385
    min       6.950000
    25%       7.750000
    50%       7.750000
    75%       7.879200
    max      90.000000
    Name: Fare, dtype: float64
    In [66]:
    df_q['Fare'].sort_values()[:-1]
    
    Out[66]:
    291     6.9500
    396     7.2500
    113     7.2833
    6       7.6292
    408     7.7208
    63      7.7250
    399     7.7333
    160     7.7333
    315     7.7333
    282     7.7500
    227     7.7500
    121     7.7500
    206     7.7500
    304     7.7500
    313     7.7500
    410     7.7500
    124     7.7500
    183     7.7500
    107     7.7500
    256     7.7500
    102     7.7500
    88      7.7500
    358     7.7500
    380     7.7500
    79      7.7500
    70      7.7500
    388     7.7500
    47      7.7500
    271     7.7500
    111     7.7792
    106     7.8208
    0       7.8292
    233     7.8792
    216     7.8792
    86      7.8792
    381     7.8792
    66      7.8792
    2       9.6875
    84     10.7083
    193    12.3500
    16     12.3500
    200    15.5000
    273    15.5000
    127    23.2500
    55     29.1250
    Name: Fare, dtype: float64
    In [67]:
    df_s['Fare'].describe()
    
    Out[67]:
    count    269.000000
    mean      28.230436
    std       39.899155
    min        0.000000
    25%        8.050000
    50%       13.775000
    75%       26.550000
    max      263.000000
    Name: Fare, dtype: float64
    In [68]:
    df_s['Fare'].sort_values()
    
    Out[68]:
    372      0.0000
    266      0.0000
    21       3.1708
    232      6.4958
    1        7.0000
             ...   
    156    221.7792
    81     221.7792
    69     263.0000
    53     263.0000
    152         NaN
    Name: Fare, Length: 270, dtype: float64
    In [69]:
    df_s['Fare'].sort_values()[-20:]
    
    Out[69]:
    212     73.5000
    352     73.5000
    96      78.8500
    374     81.8583
    293     81.8583
    287     82.2667
    12      82.2667
    390     93.5000
    308     93.5000
    306    151.5500
    141    151.5500
    217    164.8667
    400    164.8667
    324    211.3375
    114    221.7792
    156    221.7792
    81     221.7792
    69     263.0000
    53     263.0000
    152         NaN
    Name: Fare, dtype: float64
    In [70]:
    df_s['Fare'].sort_values()[2:-1]
    
    Out[70]:
    21       3.1708
    232      6.4958
    1        7.0000
    163      7.0000
    211      7.0500
             ...   
    114    221.7792
    156    221.7792
    81     221.7792
    69     263.0000
    53     263.0000
    Name: Fare, Length: 267, dtype: float64
    In [71]:
    df_c['Fare'].describe()
    
    Out[71]:
    count    102.000000
    mean      66.259765
    std       84.901989
    min        6.437500
    25%       13.859350
    50%       27.720800
    75%       78.472925
    max      512.329200
    Name: Fare, dtype: float64
    In [72]:
    df_c['Fare'].sort_values()
    
    Out[72]:
    133      6.4375
    116      6.4375
    171      7.2250
    17       7.2250
    19       7.2250
             ...   
    59     262.3750
    64     262.3750
    142    262.3750
    375    262.3750
    343    512.3292
    Name: Fare, Length: 102, dtype: float64
    In [73]:
    df_c['Fare'].sort_values()[:10]
    
    Out[73]:
    133    6.4375
    116    6.4375
    171    7.2250
    17     7.2250
    19     7.2250
    136    7.2250
    237    7.2250
    27     7.2250
    274    7.2250
    311    7.2250
    Name: Fare, dtype: float64
    In [74]:
    df_c.sort_values('Fare')
    
    Out[74]:
    PassengerIdPclassNameSexAgeSibSpParchTicketFareCabinEmbarked1331161711719...5964142375343
    1025 3 Thomas, Mr. Charles P male NaN 1 0 2621 6.4375 NaN C
    1008 3 Thomas, Mr. John male NaN 0 0 2681 6.4375 NaN C
    1063 3 Zakarian, Mr. Ortin male 27.0 0 0 2670 7.2250 NaN C
    909 3 Assaf, Mr. Gerios male 21.0 0 0 2692 7.2250 NaN C
    911 3 Assaf Khalil, Mrs. Mariana (Miriam")" female 45.0 0 0 2696 7.2250 NaN C
    ... ... ... ... ... ... ... ... ... ... ...
    951 1 Chaudanson, Miss. Victorine female 36.0 0 0 PC 17608 262.3750 B61 C
    956 1 Ryerson, Master. John Borie male 13.0 2 2 PC 17608 262.3750 B57 B59 B63 B66 C
    1034 1 Ryerson, Mr. Arthur Larned male 61.0 1 3 PC 17608 262.3750 B57 B59 B63 B66 C
    1267 1 Bowen, Miss. Grace Scott female 45.0 0 0 PC 17608 262.3750 NaN C
    1235 1 Cardeza, Mrs. James Warburton Martinez (Charlo... female 58.0 0 1 PC 17755 512.3292 B51 B53 B55 C

    102 rows × 11 columns

    In [75]:
    df.sort_values('Fare')
    
    Out[75]:
    PassengerIdPclassNameSexAgeSibSpParchTicketFareCabinEmbarked26637221133116...595369343152
    1158 1 Chisholm, Mr. Roderick Robert Crispin male NaN 0 0 112051 0.0000 NaN S
    1264 1 Ismay, Mr. Joseph Bruce male 49.0 0 0 112058 0.0000 B52 B54 B56 S
    913 3 Olsen, Master. Artur Karl male 9.0 0 1 C 17368 3.1708 NaN S
    1025 3 Thomas, Mr. Charles P male NaN 1 0 2621 6.4375 NaN C
    1008 3 Thomas, Mr. John male NaN 0 0 2681 6.4375 NaN C
    ... ... ... ... ... ... ... ... ... ... ...
    951 1 Chaudanson, Miss. Victorine female 36.0 0 0 PC 17608 262.3750 B61 C
    945 1 Fortune, Miss. Ethel Flora female 28.0 3 2 19950 263.0000 C23 C25 C27 S
    961 1 Fortune, Mrs. Mark (Mary McDougald) female 60.0 1 4 19950 263.0000 C23 C25 C27 S
    1235 1 Cardeza, Mrs. James Warburton Martinez (Charlo... female 58.0 0 1 PC 17755 512.3292 B51 B53 B55 C
    1044 3 Storey, Mr. Thomas male 60.5 0 0 3701 NaN NaN S

    418 rows × 11 columns

    In [76]:
    df_c['Fare'].sort_values()[:-1]
    
    Out[76]:
    133      6.4375
    116      6.4375
    171      7.2250
    17       7.2250
    19       7.2250
             ...   
    24     262.3750
    59     262.3750
    64     262.3750
    142    262.3750
    375    262.3750
    Name: Fare, Length: 101, dtype: float64
    In [ ]:
     
    
    In [78]:
    df_q.iloc[411] # 숫자 기반 인덱싱과 문자 기반 인덱싱을 혼동했을 때 생기는 대표적 에러
    
    ---------------------------------------------------------------------------
    IndexError                                Traceback (most recent call last)
    ~\AppData\Local\Temp\ipykernel_26272\2252744303.py in <module>
    ----> 1 df_q.iloc[411]
    
    C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexing.py in __getitem__(self, key)
        965 
        966             maybe_callable = com.apply_if_callable(key, self.obj)
    --> 967             return self._getitem_axis(maybe_callable, axis=axis)
        968 
        969     def _is_scalar_access(self, key: tuple):
    
    C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexing.py in _getitem_axis(self, key, axis)
       1521 
       1522             # validate the location
    -> 1523             self._validate_integer(key, axis)
       1524 
       1525             return self.obj._ixs(key, axis=axis)
    
    C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexing.py in _validate_integer(self, key, axis)
       1453         len_axis = len(self.obj._get_axis(axis))
       1454         if key >= len_axis or key < -len_axis:
    -> 1455             raise IndexError("single positional indexer is out-of-bounds")
       1456 
       1457     # -------------------------------------------------------------------
    
    IndexError: single positional indexer is out-of-bounds
    In [79]:
    df_q.loc[411] # 이름 기반 인덱싱
    
    Out[79]:
    PassengerId                                               1303
    Pclass                                                       1
    Name           Minahan, Mrs. William Edward (Lillian E Thorpe)
    Sex                                                     female
    Age                                                       37.0
    SibSp                                                        1
    Parch                                                        0
    Ticket                                                   19928
    Fare                                                      90.0
    Cabin                                                      C78
    Embarked                                                     Q
    Name: 411, dtype: object
    In [80]:
    df_q.shape # 총 46row이므로, iloc[45] 를 넘어가면 에러 발생
    
    Out[80]:
    (46, 11)
    In [82]:
    df_q.index = df_q['Name']
    
    In [83]:
    df_q # 문자 기반의 인덱스가 있다면 해당 혼동이 없을 것
    
    Out[83]:
    PassengerIdPclassNameSexAgeSibSpParchTicketFareCabinEmbarkedNameKelly, Mr. JamesMyles, Mr. Thomas FrancisConnolly, Miss. KateKeane, Mr. DanielShaughnessy, Mr. PatrickRice, Master. AlbertBradley, Miss. Bridget DeliaBurns, Miss. Mary DeliaMulvihill, Miss. Bertha EDoyle, Miss. ElizabethLamb, Mr. John JosephBarry, Miss. JuliaO'Donoghue, Ms. BridgetFoley, Mr. WilliamBuckley, Mr. DanielRyan, Mr. EdwardShine, Miss. Ellen NataliaBuckley, Miss. KatherineKiernan, Mr. JohnKennedy, Mr. JohnMcCoy, Miss. AliciaSmyth, Miss. JuliaLane, Mr. PatrickLingane, Mr. JohnMurphy, Miss. NoraMcGowan, Miss. KatherineMahon, Miss. Bridget DeliaMcNeill, Miss. BridgetLinehan, Mr. MichaelMahon, Mr. JohnFox, Mr. PatrickLennon, Miss. MaryFleming, Miss. HonoraDaly, Miss. Margaret Marcella Maggie""McCarthy, Miss. Catherine Katie""Carr, Miss. JeannieHagardon, Miss. KateO'Keefe, Mr. PatrickO'Connor, Mr. PatrickFoley, Mr. JosephCanavan, Mr. PatrickColbert, Mr. PatrickConlon, Mr. Thomas HenryRiordan, Miss. Johanna Hannah""Naughton, Miss. HannahMinahan, Mrs. William Edward (Lillian E Thorpe)
    892 3 Kelly, Mr. James male 34.5 0 0 330911 7.8292 NaN Q
    894 2 Myles, Mr. Thomas Francis male 62.0 0 0 240276 9.6875 NaN Q
    898 3 Connolly, Miss. Kate female 30.0 0 0 330972 7.6292 NaN Q
    908 2 Keane, Mr. Daniel male 35.0 0 0 233734 12.3500 NaN Q
    939 3 Shaughnessy, Mr. Patrick male NaN 0 0 370374 7.7500 NaN Q
    947 3 Rice, Master. Albert male 10.0 4 1 382652 29.1250 NaN Q
    955 3 Bradley, Miss. Bridget Delia female 22.0 0 0 334914 7.7250 NaN Q
    958 3 Burns, Miss. Mary Delia female 18.0 0 0 330963 7.8792 NaN Q
    962 3 Mulvihill, Miss. Bertha E female 24.0 0 0 382653 7.7500 NaN Q
    971 3 Doyle, Miss. Elizabeth female 24.0 0 0 368702 7.7500 NaN Q
    976 2 Lamb, Mr. John Joseph male NaN 0 0 240261 10.7083 NaN Q
    978 3 Barry, Miss. Julia female 27.0 0 0 330844 7.8792 NaN Q
    980 3 O'Donoghue, Ms. Bridget female NaN 0 0 364856 7.7500 NaN Q
    994 3 Foley, Mr. William male NaN 0 0 365235 7.7500 NaN Q
    998 3 Buckley, Mr. Daniel male 21.0 0 0 330920 7.8208 NaN Q
    999 3 Ryan, Mr. Edward male NaN 0 0 383162 7.7500 NaN Q
    1003 3 Shine, Miss. Ellen Natalia female NaN 0 0 330968 7.7792 NaN Q
    1005 3 Buckley, Miss. Katherine female 18.5 0 0 329944 7.2833 NaN Q
    1013 3 Kiernan, Mr. John male NaN 1 0 367227 7.7500 NaN Q
    1016 3 Kennedy, Mr. John male NaN 0 0 368783 7.7500 NaN Q
    1019 3 McCoy, Miss. Alicia female NaN 2 0 367226 23.2500 NaN Q
    1052 3 Smyth, Miss. Julia female NaN 0 0 335432 7.7333 NaN Q
    1075 3 Lane, Mr. Patrick male NaN 0 0 7935 7.7500 NaN Q
    1085 2 Lingane, Mr. John male 61.0 0 0 235509 12.3500 NaN Q
    1092 3 Murphy, Miss. Nora female NaN 0 0 36568 15.5000 NaN Q
    1098 3 McGowan, Miss. Katherine female 35.0 0 0 9232 7.7500 NaN Q
    1108 3 Mahon, Miss. Bridget Delia female NaN 0 0 330924 7.8792 NaN Q
    1119 3 McNeill, Miss. Bridget female NaN 0 0 370368 7.7500 NaN Q
    1125 3 Linehan, Mr. Michael male NaN 0 0 330971 7.8792 NaN Q
    1148 3 Mahon, Mr. John male NaN 0 0 AQ/4 3130 7.7500 NaN Q
    1163 3 Fox, Mr. Patrick male NaN 0 0 368573 7.7500 NaN Q
    1165 3 Lennon, Miss. Mary female NaN 1 0 370371 15.5000 NaN Q
    1174 3 Fleming, Miss. Honora female NaN 0 0 364859 7.7500 NaN Q
    1183 3 Daly, Miss. Margaret Marcella Maggie"" female 30.0 0 0 382650 6.9500 NaN Q
    1196 3 McCarthy, Miss. Catherine Katie"" female NaN 0 0 383123 7.7500 NaN Q
    1205 3 Carr, Miss. Jeannie female 37.0 0 0 368364 7.7500 NaN Q
    1207 3 Hagardon, Miss. Kate female 17.0 0 0 AQ/3. 30631 7.7333 NaN Q
    1250 3 O'Keefe, Mr. Patrick male NaN 0 0 368402 7.7500 NaN Q
    1272 3 O'Connor, Mr. Patrick male NaN 0 0 366713 7.7500 NaN Q
    1273 3 Foley, Mr. Joseph male 26.0 0 0 330910 7.8792 NaN Q
    1280 3 Canavan, Mr. Patrick male 21.0 0 0 364858 7.7500 NaN Q
    1288 3 Colbert, Mr. Patrick male 24.0 0 0 371109 7.2500 NaN Q
    1291 3 Conlon, Mr. Thomas Henry male 31.0 0 0 21332 7.7333 NaN Q
    1300 3 Riordan, Miss. Johanna Hannah"" female NaN 0 0 334915 7.7208 NaN Q
    1302 3 Naughton, Miss. Hannah female NaN 0 0 365237 7.7500 NaN Q
    1303 1 Minahan, Mrs. William Edward (Lillian E Thorpe) female 37.0 1 0 19928 90.0000 C78 Q
    In [86]:
    1/0
    
    ---------------------------------------------------------------------------
    ZeroDivisionError                         Traceback (most recent call last)
    ~\AppData\Local\Temp\ipykernel_26272\2354412189.py in <module>
    ----> 1 1/0
    
    ZeroDivisionError: division by zero
    In [88]:
    df_s['Fare/SibSp'] = df_s['Fare'] / (df_s['SibSp'] + 1)
    
    C:\Users\user\AppData\Local\Temp\ipykernel_26272\2510244486.py:1: SettingWithCopyWarning: 
    A value is trying to be set on a copy of a slice from a DataFrame.
    Try using .loc[row_indexer,col_indexer] = value instead
    
    See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
      df_s['Fare/SibSp'] = df_s['Fare'] / (df_s['SibSp'] + 1)
    
    In [89]:
    df_s
    
    Out[89]:
    PassengerIdPclassNameSexAgeSibSpParchTicketFareCabinEmbarkedFare/SibSp13457...409412413415416
    893 3 Wilkes, Mrs. James (Ellen Needs) female 47.0 1 0 363272 7.0000 NaN S 3.50000
    895 3 Wirz, Mr. Albert male 27.0 0 0 315154 8.6625 NaN S 8.66250
    896 3 Hirvonen, Mrs. Alexander (Helga E Lindqvist) female 22.0 1 1 3101298 12.2875 NaN S 6.14375
    897 3 Svensson, Mr. Johan Cervin male 14.0 0 0 7538 9.2250 NaN S 9.22500
    899 2 Caldwell, Mr. Albert Francis male 26.0 1 1 248738 29.0000 NaN S 14.50000
    ... ... ... ... ... ... ... ... ... ... ... ...
    1301 3 Peacock, Miss. Treasteall female 3.0 1 1 SOTON/O.Q. 3101315 13.7750 NaN S 6.88750
    1304 3 Henriksson, Miss. Jenny Lovisa female 28.0 0 0 347086 7.7750 NaN S 7.77500
    1305 3 Spector, Mr. Woolf male NaN 0 0 A.5. 3236 8.0500 NaN S 8.05000
    1307 3 Saether, Mr. Simon Sivertsen male 38.5 0 0 SOTON/O.Q. 3101262 7.2500 NaN S 7.25000
    1308 3 Ware, Mr. Frederick male NaN 0 0 359309 8.0500 NaN S 8.05000

    270 rows × 12 columns


    실습

    • 아래 데이터를 전처리한다
    1. 교육기간을 계산할 예정
    2. 지역별 분류를 할 예정
    3. 교육대상 분류를 할 예정
    4. 운영요일에 따른 통계기법을 사용할 예정
    In [136]:
    media[['센터명','강좌명']].apply(lambda x: x[0])
    
    Out[136]:
    센터명    서울시청자미디어센터
    강좌명    상설미디어체험 교육
    dtype: object
    In [137]:
    media
    
    Out[137]:
    센터명강좌명강사명교육시작일자교육종료일자강좌내용교육대상구분교육방법구분운영요일강좌정원수데이터기준일자지역요일_bin01234...9495969798
    서울시청자미디어센터 상설미디어체험 교육 이수현,김민호 2022-11-12 2022-11-26 상설미디어체험(뉴스앵커체험 등) 일반 오프라인 25 2022-11-09 서울 5
    서울시청자미디어센터 찾아가는미디어나눔버스 체험 교육 김도경,이수현 2022-11-21 2022-11-21 찾아가는미디어나눔버스 체험 미성년자 오프라인 25 2022-11-09 서울 3
    서울시청자미디어센터 찾아가는미디어나눔버스 체험 김도경,이수현 2022-11-22 2022-11-22 찾아가는미디어나눔버스 체험 미성년자 오프라인 25 2022-11-09 서울 6
    서울시청자미디어센터 찾아가는미디어나눔버스 체험 김도경,이수현 2022-11-23 2022-11-23 찾아가는미디어나눔버스 체험 미성년자 오프라인 25 2022-11-09 서울 2
    서울시청자미디어센터 찾아가는미디어나눔버스 체험 김도경,이수현 2022-11-25 2022-11-25 찾아가는미디어나눔버스 체험 미성년자 오프라인 25 2022-11-09 서울 0
    ... ... ... ... ... ... ... ... ... ... ... ... ...
    인천시청자미디어센터 찾아가는 미디어나눔버스(TV뉴스체험) 류은애,김은자 2022-11-30 2022-11-30 TV 뉴스 제작 및 영상합성 크로마키 체험 미성년자 오프라인 25 2022-11-09 인천 2
    충북시청자미디어센터 TV체험(뉴스체험) 미정 2022-11-01 2022-11-30 아나운서, 기자, 기상캐스터 등 역할을 나누어 뉴스 제작 과정을 체험해보는 프로그램 일반 오프라인 월,화,수,목,금,토 15 2022-11-09 충북 4
    충북시청자미디어센터 라디오체험(DJ체험) 미정 2022-11-01 2022-11-30 라디오 프로그램을 작가, DJ, 게스트가 되어 라디오 프로그램을 제작해보는 체험 일반 오프라인 월,화,수,목,금,토 15 2022-11-09 충북 4
    충북시청자미디어센터 유아 크로마키 체험 미정 2022-11-01 2022-11-30 유아 대상 크로마키를 통해 다양한 놀이를 해보는 체험 미성년자 오프라인 월,화,수,목,금,토 15 2022-11-09 충북 4
    충북시청자미디어센터 AI 체험 미정 2022-11-01 2022-11-30 인공지능에 대해 이해하고 머신러닝을 여러 방법으로 알아보는 체험 일반 오프라인 월,화,수,목,금,토 15 2022-11-09 충북 4

    98 rows × 13 columns

    In [ ]:
     
    
    In [ ]:
     
    
    In [90]:
    media = pd.read_csv('./시청자미디어재단_체험형미디어교육_20221109.csv', encoding='cp949')
    
    In [91]:
    media.head(2)
    
    Out[91]:
    센터명강좌명강사명교육시작일자교육종료일자강좌내용교육대상구분교육방법구분운영요일강좌정원수데이터기준일자01
    서울시청자미디어센터 상설미디어체험 교육 이수현,김민호 2022-11-12 2022-11-26 상설미디어체험(뉴스앵커체험 등) 일반 오프라인 25 2022-11-09
    서울시청자미디어센터 찾아가는미디어나눔버스 체험 교육 김도경,이수현 2022-11-21 2022-11-21 찾아가는미디어나눔버스 체험 청소년 오프라인 25 2022-11-09
    In [98]:
    media['교육시작일자'] = media['교육시작일자'].apply(lambda x: pd.Timestamp(x))
    media['교육종료일자'] = media['교육종료일자'].apply(lambda x: pd.Timestamp(x))
    
    In [101]:
    m = media['교육시작일자'] > media['교육종료일자']
    
    In [102]:
    media[m]
    
    Out[102]:
    센터명강좌명강사명교육시작일자교육종료일자강좌내용교육대상구분교육방법구분운영요일강좌정원수데이터기준일자5
    서울시청자미디어센터 미디어 체험 교육 김도경,이수현 2022-11-25 2022-11-21 앵커 체험 유아 오프라인 25 2022-11-09
    In [104]:
    media = media[-m]
    
    In [ ]:
    # 연산할 수 없는 자료형(str)에서 연산 가능한 자료형(pdndas.Timestamp)으로 변경
    # 오기재된 내용 (index 5번) 에 해당하는 값 제거
    
    In [140]:
    # 연월일 정보를 따로 저장할 경우
    media = pd.read_csv('./시청자미디어재단_체험형미디어교육_20221109.csv', encoding='cp949')
    
    In [145]:
    media['교육시작일'] = media['교육시작일자'].apply(lambda x: int(x.split('-')[2]))
    
    Out[145]:
    0     12
    1     21
    2     22
    3     23
    4     25
          ..
    94    30
    95     1
    96     1
    97     1
    98     1
    Name: 교육시작일자, Length: 99, dtype: int64
    In [111]:
    media.head(2)
    
    Out[111]:
    센터명강좌명강사명교육시작일자교육종료일자강좌내용교육대상구분교육방법구분운영요일강좌정원수데이터기준일자지역01
    서울시청자미디어센터 상설미디어체험 교육 이수현,김민호 2022-11-12 2022-11-26 상설미디어체험(뉴스앵커체험 등) 일반 오프라인 25 2022-11-09 서울
    서울시청자미디어센터 찾아가는미디어나눔버스 체험 교육 김도경,이수현 2022-11-21 2022-11-21 찾아가는미디어나눔버스 체험 청소년 오프라인 25 2022-11-09 서울
    In [107]:
    media['센터명'].unique()
    
    Out[107]:
    array(['서울시청자미디어센터', '울산시청자미디어센터', '강원시청자미디어센터', '대전시청자미디어센터',
           '광주시청자미디어센터', '부산시청자미디어센터', '인천시청자미디어센터', '충북시청자미디어센터'],
          dtype=object)
    In [109]:
    media['지역'] = [m.replace('시청자미디어센터','') for m in media['센터명']]
    
    C:\Users\user\AppData\Local\Temp\ipykernel_26272\1118649921.py:1: SettingWithCopyWarning: 
    A value is trying to be set on a copy of a slice from a DataFrame.
    Try using .loc[row_indexer,col_indexer] = value instead
    
    See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
      media['지역'] = [m.replace('시청자미디어센터','') for m in media['센터명']]
    
    In [112]:
    media.head(2)
    
    Out[112]:
    센터명강좌명강사명교육시작일자교육종료일자강좌내용교육대상구분교육방법구분운영요일강좌정원수데이터기준일자지역01
    서울시청자미디어센터 상설미디어체험 교육 이수현,김민호 2022-11-12 2022-11-26 상설미디어체험(뉴스앵커체험 등) 일반 오프라인 25 2022-11-09 서울
    서울시청자미디어센터 찾아가는미디어나눔버스 체험 교육 김도경,이수현 2022-11-21 2022-11-21 찾아가는미디어나눔버스 체험 청소년 오프라인 25 2022-11-09 서울
    In [113]:
    media['교육대상구분'].unique()
    
    Out[113]:
    array(['일반', '청소년', '초등학생', '미취학', '중학생', '유아,아동', '초등학생 이상', '중고등학생',
           '노인(65세~)', '모든연령', '고등학생', '지역주민', '고등학생,장애인', '성인', '대학생',
           '성인,장애인', '중학생,장애인', '6~7세'], dtype=object)
    In [114]:
    change = {'일반':'일반', '청소년':'미성년자', '초등학생':'미성년자', 
              '미취학':'미성년자', '중학생':'미성년자', '유아,아동':'미성년자', 
              '초등학생 이상':'일반', '중고등학생':'미성년자', '노인(65세~)':'일반', 
              '모든연령':'일반', '고등학생':'미성년자', '지역주민':'일반', 
              '고등학생,장애인':'일반', '성인':'일반', '대학생':'성인',
           '성인,장애인':'일반', '중학생,장애인':'일반', '6~7세':'미성년자'}
    
    In [115]:
    media.replace({'교육대상구분':change}, inplace=True)
    
    C:\Users\user\AppData\Local\Temp\ipykernel_26272\2327394112.py:1: SettingWithCopyWarning: 
    A value is trying to be set on a copy of a slice from a DataFrame.
    Try using .loc[row_indexer,col_indexer] = value instead
    
    See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
      media.replace({'교육대상구분':change}, inplace=True)
    
    In [116]:
    media
    
    Out[116]:
    센터명강좌명강사명교육시작일자교육종료일자강좌내용교육대상구분교육방법구분운영요일강좌정원수데이터기준일자지역01234...9495969798
    서울시청자미디어센터 상설미디어체험 교육 이수현,김민호 2022-11-12 2022-11-26 상설미디어체험(뉴스앵커체험 등) 일반 오프라인 25 2022-11-09 서울
    서울시청자미디어센터 찾아가는미디어나눔버스 체험 교육 김도경,이수현 2022-11-21 2022-11-21 찾아가는미디어나눔버스 체험 미성년자 오프라인 25 2022-11-09 서울
    서울시청자미디어센터 찾아가는미디어나눔버스 체험 김도경,이수현 2022-11-22 2022-11-22 찾아가는미디어나눔버스 체험 미성년자 오프라인 25 2022-11-09 서울
    서울시청자미디어센터 찾아가는미디어나눔버스 체험 김도경,이수현 2022-11-23 2022-11-23 찾아가는미디어나눔버스 체험 미성년자 오프라인 25 2022-11-09 서울
    서울시청자미디어센터 찾아가는미디어나눔버스 체험 김도경,이수현 2022-11-25 2022-11-25 찾아가는미디어나눔버스 체험 미성년자 오프라인 25 2022-11-09 서울
    ... ... ... ... ... ... ... ... ... ... ... ...
    인천시청자미디어센터 찾아가는 미디어나눔버스(TV뉴스체험) 류은애,김은자 2022-11-30 2022-11-30 TV 뉴스 제작 및 영상합성 크로마키 체험 미성년자 오프라인 25 2022-11-09 인천
    충북시청자미디어센터 TV체험(뉴스체험) 미정 2022-11-01 2022-11-30 아나운서, 기자, 기상캐스터 등 역할을 나누어 뉴스 제작 과정을 체험해보는 프로그램 일반 오프라인 월,화,수,목,금,토 15 2022-11-09 충북
    충북시청자미디어센터 라디오체험(DJ체험) 미정 2022-11-01 2022-11-30 라디오 프로그램을 작가, DJ, 게스트가 되어 라디오 프로그램을 제작해보는 체험 일반 오프라인 월,화,수,목,금,토 15 2022-11-09 충북
    충북시청자미디어센터 유아 크로마키 체험 미정 2022-11-01 2022-11-30 유아 대상 크로마키를 통해 다양한 놀이를 해보는 체험 미성년자 오프라인 월,화,수,목,금,토 15 2022-11-09 충북
    충북시청자미디어센터 AI 체험 미정 2022-11-01 2022-11-30 인공지능에 대해 이해하고 머신러닝을 여러 방법으로 알아보는 체험 일반 오프라인 월,화,수,목,금,토 15 2022-11-09 충북

    98 rows × 12 columns

    In [118]:
    media['운영요일'].unique()
    
    Out[118]:
    array(['토', '월', '화', '수', '금', '목', '월,화,수,목,금,토'], dtype=object)
    In [119]:
    # 월~토, 월화수목금토를 숫자 0~6로 배정: 라벨인코딩 기능을 이용
    from sklearn.preprocessing import LabelEncoder
    
    In [120]:
    encoder = LabelEncoder()
    
    In [121]:
    items = media['운영요일'].unique()
    encoder.fit(items)
    
    Out[121]:
    LabelEncoder()
    In [122]:
    encoder.classes_
    
    Out[122]:
    array(['금', '목', '수', '월', '월,화,수,목,금,토', '토', '화'], dtype=object)
    In [124]:
    labels = encoder.transform(items)
    
    In [125]:
    labels
    
    Out[125]:
    array([5, 3, 6, 2, 0, 1, 4])
    In [126]:
    encoder.inverse_transform([4,5,2,0,1,3])
    
    Out[126]:
    array(['월,화,수,목,금,토', '토', '수', '금', '목', '월'], dtype=object)
    In [130]:
    media['요일_bin'] = media['운영요일'].apply(lambda x: encoder.transform([x])[0])
    
    C:\Users\user\AppData\Local\Temp\ipykernel_26272\1262625182.py:1: SettingWithCopyWarning: 
    A value is trying to be set on a copy of a slice from a DataFrame.
    Try using .loc[row_indexer,col_indexer] = value instead
    
    See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
      media['요일_bin'] = media['운영요일'].apply(lambda x: encoder.transform([x])[0])
    

    메타데이터의 중요성

    • 아래와 같이 메타데이터를 입력해 줘야 아래 셀의 데이터프레임에서 운영요일 column을 지우고, 요일_bin column만 남겨둘 수 있다.
    • 이 데이터는 요일_bin column에 요일 정보가 저장되어 있다
    • 월~토 = 4, 화 = 5...
    In [131]:
    media
    
    Out[131]:
    센터명강좌명강사명교육시작일자교육종료일자강좌내용교육대상구분교육방법구분운영요일강좌정원수데이터기준일자지역요일_bin01234...9495969798
    서울시청자미디어센터 상설미디어체험 교육 이수현,김민호 2022-11-12 2022-11-26 상설미디어체험(뉴스앵커체험 등) 일반 오프라인 25 2022-11-09 서울 5
    서울시청자미디어센터 찾아가는미디어나눔버스 체험 교육 김도경,이수현 2022-11-21 2022-11-21 찾아가는미디어나눔버스 체험 미성년자 오프라인 25 2022-11-09 서울 3
    서울시청자미디어센터 찾아가는미디어나눔버스 체험 김도경,이수현 2022-11-22 2022-11-22 찾아가는미디어나눔버스 체험 미성년자 오프라인 25 2022-11-09 서울 6
    서울시청자미디어센터 찾아가는미디어나눔버스 체험 김도경,이수현 2022-11-23 2022-11-23 찾아가는미디어나눔버스 체험 미성년자 오프라인 25 2022-11-09 서울 2
    서울시청자미디어센터 찾아가는미디어나눔버스 체험 김도경,이수현 2022-11-25 2022-11-25 찾아가는미디어나눔버스 체험 미성년자 오프라인 25 2022-11-09 서울 0
    ... ... ... ... ... ... ... ... ... ... ... ... ...
    인천시청자미디어센터 찾아가는 미디어나눔버스(TV뉴스체험) 류은애,김은자 2022-11-30 2022-11-30 TV 뉴스 제작 및 영상합성 크로마키 체험 미성년자 오프라인 25 2022-11-09 인천 2
    충북시청자미디어센터 TV체험(뉴스체험) 미정 2022-11-01 2022-11-30 아나운서, 기자, 기상캐스터 등 역할을 나누어 뉴스 제작 과정을 체험해보는 프로그램 일반 오프라인 월,화,수,목,금,토 15 2022-11-09 충북 4
    충북시청자미디어센터 라디오체험(DJ체험) 미정 2022-11-01 2022-11-30 라디오 프로그램을 작가, DJ, 게스트가 되어 라디오 프로그램을 제작해보는 체험 일반 오프라인 월,화,수,목,금,토 15 2022-11-09 충북 4
    충북시청자미디어센터 유아 크로마키 체험 미정 2022-11-01 2022-11-30 유아 대상 크로마키를 통해 다양한 놀이를 해보는 체험 미성년자 오프라인 월,화,수,목,금,토 15 2022-11-09 충북 4
    충북시청자미디어센터 AI 체험 미정 2022-11-01 2022-11-30 인공지능에 대해 이해하고 머신러닝을 여러 방법으로 알아보는 체험 일반 오프라인 월,화,수,목,금,토 15 2022-11-09 충북 4

    98 rows × 13 columns

    'Python > Jupyter notebook' 카테고리의 다른 글

    #8-2  (0) 2023.01.16
    #8-1  (0) 2023.01.16
    #6-2  (0) 2023.01.16
    #6-1  (0) 2023.01.16
    #5  (0) 2023.01.16
Designed by Tistory.