-
#7Python/Jupyter notebook 2023. 1. 16. 21:25
실습1
- Age 항목의 결측치를 파악해 아래 분석을 모두 수행
- 결측치를 0으로 대체 (fillna 함수 이용 가능)
- 전체 값의 평균으로 대체 (mean 함수 이용 가능)
- 중앙값으로 대체 (median 함수 이용 가능)
- 각 분석간의 데이터 편차를 확인한다 (통계적 특성)
- 나이 정보를 확인한 뒤, 나이 정보를 표준화/정규화 작업을 모두 수행해 보자
- 시간이 남는 분들이 하시고, 모르는 분들은 설명 들어가면서 같이 합니다
- 요금 정보의 outliar를 확인하고, 해당 정보를 어떻게 처리할지 생각해보자
In [2]:import pandas as pd
In [4]:df = pd.read_csv('./test.csv')
In [5]:df.head()
Out[5]:PassengerIdPclassNameSexAgeSibSpParchTicketFareCabinEmbarked01234892 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()) # 중앙값으로 대체
통계 특성을 표시하는 함수들
- max(), min(), mean(), median()
- 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 등 설명: 정의 포함
실습
- SibSp 값에 따른 Fare 변화를 구한다
- 단, 아래의 정보를 참조한다
- SibSp 값이 1 이상인 경우, 별다른 처리를 하지 않는다
- SibSp 값이 0인 경우, Age 값을 고려하여 분석한다
- Embarked 값에 따른 Fare 변화를 구한다
- 단, 아래의 정보를 참조한다
- 같은 Embarked 그룹에서 Fare 값이 지나치게 차이가 나는 경우 outliar로 취급하여 삭제한다
- 단, 2-A와 같은 경우지만 SibSp가 높은 경우, 인원수를 고려해 처리한다
In [43]:df[['SibSp','Fare']].sort_values('SibSp')
Out[43]:SibSpFare0259258257256...214551403601880 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]:SibSpFareAge2013070 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...4034054124144150 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...59641423753431025 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...5953693431521158 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...409412413415416893 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
실습
- 아래 데이터를 전처리한다
- 교육기간을 계산할 예정
- 지역별 분류를 할 예정
- 교육대상 분류를 할 예정
- 운영요일에 따른 통계기법을 사용할 예정
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
- Age 항목의 결측치를 파악해 아래 분석을 모두 수행