├── README.md ├── b21_Jupyter.ipynb ├── b22_Python.ipynb ├── b23_Pandas_Groupby.ipynb ├── b24_numpy.ipynb ├── b25_Function.ipynb ├── b31_FileFolder.ipynb ├── b32_Graphs.ipynb ├── b41_Preprocessing.ipynb ├── b42_Preprocessing_Example.ipynb ├── b51_ML_Intro.ipynb ├── b52_Regression.ipynb ├── b53_Classification.ipynb ├── b54_LogisticRegression.ipynb ├── b55_DT_RF_Boost.ipynb ├── b56_DT_RF_Boost_Reg.ipynb ├── b61_FeatureEngineering.ipynb ├── b62_Clustering.ipynb └── b63_Add_features.ipynb /README.md: -------------------------------------------------------------------------------- 1 | # python-machine-learning 2 | 3 | ## 노트북 예제를 구글 colab에서 바로 실행하는 방법 4 | 5 | - 크롬 브라우저 사용 권장 6 | - 구글 계정에 가입 (gmail 계정이 있으면 됨, 없는 경우 아래 링크에서 새로 생성) 7 | - [https://support.google.com/accounts/answer/27441?hl=ko](https://support.google.com/accounts/answer/27441?hl=ko) 8 | - 깃허브 무료 계정 가입 [github.com](http://github.com/) 9 | - 구글 코랩[colab.research.google.com](http://colab.research.google.com/)에 접속 10 | - 파일 - 노트 열기(Ctrl-O)를 선택하고 Github에서 불러오기를 선택한 후 Github URL 주소 창에 data-labs/python-machine-learning를 입력하면 예제 노트북 파일을 하나씩 불러와 실행할 수 있다 11 | 12 | ## 교재 13 | - [파이썬으로 배우는 머신러닝/김화종/홍릉과학출판사](https://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9791156000440&orderClick=LAG&Kc=) 14 | 15 | -------------------------------------------------------------------------------- /b22_Python.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "colab_type": "text", 7 | "id": "X3dBIDyofMpX" 8 | }, 9 | "source": [ 10 | "# 파이선 기본 문법\n", 11 | "\n", 12 | "- 기본 변수 (단일 데이터 저장)\n", 13 | " - 정수(int), 부동소수(float), 문자열(strings), 불리언(bool) \n", 14 | "- 데이터 묶음 (복수 데이터 저장)\n", 15 | " - 리스트(list), 튜풀(tuple), 사전(dictionary) \n", 16 | "- 프로그램 흐름\n", 17 | " - if, else, for, while, continue, break" 18 | ] 19 | }, 20 | { 21 | "cell_type": "markdown", 22 | "metadata": {}, 23 | "source": [ 24 | "# 기본 변수\n", 25 | "## 숫자\n", 26 | "- 한개의 숫자를 담는 변수\n", 27 | "- 정수(int), 부동소수(float)\n", 28 | "- 변수에 값을 배정(assign)할 때 \"=\"를 사용한다" 29 | ] 30 | }, 31 | { 32 | "cell_type": "code", 33 | "execution_count": 1, 34 | "metadata": {}, 35 | "outputs": [ 36 | { 37 | "name": "stdout", 38 | "output_type": "stream", 39 | "text": [ 40 | "3 0.5 김연아 True\n" 41 | ] 42 | } 43 | ], 44 | "source": [ 45 | "## 파이썬의 기본 변수 4가지\n", 46 | "\n", 47 | "a = 3\n", 48 | "b = 0.5\n", 49 | "x = \"김연아\"\n", 50 | "y = True\n", 51 | "print(a,b,x,y)" 52 | ] 53 | }, 54 | { 55 | "cell_type": "code", 56 | "execution_count": 2, 57 | "metadata": {}, 58 | "outputs": [ 59 | { 60 | "data": { 61 | "text/plain": [ 62 | "3" 63 | ] 64 | }, 65 | "execution_count": 2, 66 | "metadata": {}, 67 | "output_type": "execute_result" 68 | } 69 | ], 70 | "source": [ 71 | "## 문자열의 길이 보기 (length)\n", 72 | "\n", 73 | "len(x) # 3" 74 | ] 75 | }, 76 | { 77 | "cell_type": "code", 78 | "execution_count": 3, 79 | "metadata": { 80 | "colab": {}, 81 | "colab_type": "code", 82 | "id": "QosL1F6CfMpY", 83 | "outputId": "265957ec-434a-4637-f4cf-56336667a62e" 84 | }, 85 | "outputs": [ 86 | { 87 | "name": "stdout", 88 | "output_type": "stream", 89 | "text": [ 90 | "3.5\n", 91 | "2.5\n", 92 | "1.5\n", 93 | "6.0\n", 94 | "4.5\n" 95 | ] 96 | } 97 | ], 98 | "source": [ 99 | "## 정수, 소수, 불리언의 4칙 연산\n", 100 | "\n", 101 | "print(a+b)\n", 102 | "print(a-b)\n", 103 | "print(a*b)\n", 104 | "print(a/b)\n", 105 | "print(a+b+y)" 106 | ] 107 | }, 108 | { 109 | "cell_type": "code", 110 | "execution_count": 4, 111 | "metadata": {}, 112 | "outputs": [ 113 | { 114 | "data": { 115 | "text/plain": [ 116 | "(int, float, str, bool)" 117 | ] 118 | }, 119 | "execution_count": 4, 120 | "metadata": {}, 121 | "output_type": "execute_result" 122 | } 123 | ], 124 | "source": [ 125 | "## 변수의 타입 확인하기\n", 126 | "\n", 127 | "type(a), type(b), type(x), type(y) " 128 | ] 129 | }, 130 | { 131 | "cell_type": "code", 132 | "execution_count": 5, 133 | "metadata": {}, 134 | "outputs": [ 135 | { 136 | "name": "stdout", 137 | "output_type": "stream", 138 | "text": [ 139 | "2\n", 140 | "1\n", 141 | "343\n" 142 | ] 143 | } 144 | ], 145 | "source": [ 146 | "## 나눗셈 몫과 나머지, 승수\n", 147 | "\n", 148 | "a = 7\n", 149 | "b = 3\n", 150 | "\n", 151 | "print(a//b) # 2, 몫 구하기\n", 152 | "print(a%b) # 1, 나머지 \n", 153 | "print(a**b) # 232, 승수" 154 | ] 155 | }, 156 | { 157 | "cell_type": "markdown", 158 | "metadata": {}, 159 | "source": [ 160 | "## 문자열" 161 | ] 162 | }, 163 | { 164 | "cell_type": "code", 165 | "execution_count": 6, 166 | "metadata": { 167 | "scrolled": true 168 | }, 169 | "outputs": [ 170 | { 171 | "name": "stdout", 172 | "output_type": "stream", 173 | "text": [ 174 | "오늘 날씨는 좋으네요~ \n" 175 | ] 176 | } 177 | ], 178 | "source": [ 179 | "## 문자열 붙이기\n", 180 | "\n", 181 | "x = \"오늘 날씨는 \"\n", 182 | "y = \"좋으네요~ \"\n", 183 | "z = x + y\n", 184 | "print(z)" 185 | ] 186 | }, 187 | { 188 | "cell_type": "code", 189 | "execution_count": 7, 190 | "metadata": {}, 191 | "outputs": [ 192 | { 193 | "data": { 194 | "text/plain": [ 195 | "'오늘 날씨는 좋으네요~ 좋으네요~ 좋으네요~ '" 196 | ] 197 | }, 198 | "execution_count": 7, 199 | "metadata": {}, 200 | "output_type": "execute_result" 201 | } 202 | ], 203 | "source": [ 204 | "## 문자열 반복하기\n", 205 | "\n", 206 | "x + 3*y" 207 | ] 208 | }, 209 | { 210 | "cell_type": "code", 211 | "execution_count": 8, 212 | "metadata": {}, 213 | "outputs": [ 214 | { 215 | "name": "stdout", 216 | "output_type": "stream", 217 | "text": [ 218 | "7\n", 219 | "오늘 날씨는 \n", 220 | "늘\n", 221 | "오늘 \n", 222 | "날씨는\n", 223 | "씨\n", 224 | "씨는 \n" 225 | ] 226 | } 227 | ], 228 | "source": [ 229 | "## 문자열 일부 보기 (슬라이싱)\n", 230 | "\n", 231 | "x = \"오늘 날씨는 \"\n", 232 | "print(len(x)) # 문자열 전체 글자수\n", 233 | "print(x) # 전체 보기\n", 234 | "print(x[1]) # 두 번째(1) 글자\n", 235 | "print(x[:3]) # 네 번재(3) 미만까지\n", 236 | "print(x[3:6]) # 네 번째(3) 이상 ~ 7번째(6) 미만\n", 237 | "print(x[-3]) # 뒤에서 세 번째(3) 글자\n", 238 | "print(x[-3:]) # 뒤에서 세 번째(3) 이후 " 239 | ] 240 | }, 241 | { 242 | "cell_type": "markdown", 243 | "metadata": {}, 244 | "source": [ 245 | "### 문자열 조작, split과 join\n", 246 | "- 문자열을 공백, \"/\", \",\" 등을 기준으로 나누거나 합친다\n", 247 | "- 나누어진 항목은 리스트(list)에 저장된다 (리스트는 여러 데이터를 묶은 것)" 248 | ] 249 | }, 250 | { 251 | "cell_type": "code", 252 | "execution_count": 9, 253 | "metadata": {}, 254 | "outputs": [ 255 | { 256 | "name": "stdout", 257 | "output_type": "stream", 258 | "text": [ 259 | "['김연아', '손흥민', '이선희', '유재석']\n", 260 | "['김연아', '손흥민', '이선희', '유재석']\n" 261 | ] 262 | } 263 | ], 264 | "source": [ 265 | "## 문자열을 ','나 공백(스페이스) 등으로 나누기\n", 266 | "\n", 267 | "name1 = '김연아,손흥민,이선희,유재석'\n", 268 | "\n", 269 | "# ','로 나누기\n", 270 | "z = name1.split(',')\n", 271 | "print(z)\n", 272 | "\n", 273 | "# 스페이스로 나누기 (디폴트)\n", 274 | "name2 = '김연아 손흥민 이선희 유재석'\n", 275 | "print(name2.split()) # 디폴트로 공백을 기준으로 나눈다" 276 | ] 277 | }, 278 | { 279 | "cell_type": "code", 280 | "execution_count": 10, 281 | "metadata": {}, 282 | "outputs": [ 283 | { 284 | "data": { 285 | "text/plain": [ 286 | "'김연아;손흥민;이선희;유재석'" 287 | ] 288 | }, 289 | "execution_count": 10, 290 | "metadata": {}, 291 | "output_type": "execute_result" 292 | } 293 | ], 294 | "source": [ 295 | "## 단어 합치기\n", 296 | "\n", 297 | "';'.join(z)" 298 | ] 299 | }, 300 | { 301 | "cell_type": "code", 302 | "execution_count": 11, 303 | "metadata": {}, 304 | "outputs": [ 305 | { 306 | "name": "stdout", 307 | "output_type": "stream", 308 | "text": [ 309 | "['12', '31', '2023']\n", 310 | "31\n", 311 | "2023-12-31\n" 312 | ] 313 | } 314 | ], 315 | "source": [ 316 | "## 날짜를 \"/\"를 기준으로 나누고 순서를 바꾸어서 합치기\n", 317 | "\n", 318 | "date = '12/31/2023'\n", 319 | "z = date.split('/')\n", 320 | "print(z)\n", 321 | "print(z[1])\n", 322 | "new_date = \"-\".join((z[2], z[0], z[1]))\n", 323 | "print(new_date)" 324 | ] 325 | }, 326 | { 327 | "cell_type": "code", 328 | "execution_count": 12, 329 | "metadata": {}, 330 | "outputs": [ 331 | { 332 | "name": "stdout", 333 | "output_type": "stream", 334 | "text": [ 335 | "오늘 기온은 \n" 336 | ] 337 | } 338 | ], 339 | "source": [ 340 | "# 문자열 교체 (replace)\n", 341 | "\n", 342 | "x = \"오늘 날씨는 \"\n", 343 | "print(x.replace(\"날씨는\", \"기온은\"))" 344 | ] 345 | }, 346 | { 347 | "cell_type": "markdown", 348 | "metadata": {}, 349 | "source": [ 350 | "### 문자열에 포맷( format) 사용하기\n", 351 | "- 문자열을 화면에 출력하는 방법(포맷)을 지정할 수 있다\n", 352 | "- 세가지 방법이 있다.\n", 353 | " - \"%\" 사용\n", 354 | " - format() 사용\n", 355 | " - f\"...\" 사용" 356 | ] 357 | }, 358 | { 359 | "cell_type": "markdown", 360 | "metadata": {}, 361 | "source": [ 362 | "- %를 사용하는 방법" 363 | ] 364 | }, 365 | { 366 | "cell_type": "code", 367 | "execution_count": 13, 368 | "metadata": {}, 369 | "outputs": [ 370 | { 371 | "name": "stdout", 372 | "output_type": "stream", 373 | "text": [ 374 | "틀린 갯수가 5개 이하이면 90.5 점입니다.\n", 375 | "틀린 갯수가 5개 이하이면 90.500000 점입니다.\n", 376 | "틀린 갯수가 5개 이하이면 90.5 점입니다.\n" 377 | ] 378 | } 379 | ], 380 | "source": [ 381 | "## 문자열 내에 변수를 같이 출력하는 방법 (format)\n", 382 | "\n", 383 | "x = 5\n", 384 | "y = 90.5\n", 385 | "\n", 386 | "print(f\"틀린 갯수가 {x}개 이하이면 {y} 점입니다.\")\n", 387 | "print(\"틀린 갯수가 %d개 이하이면 %f 점입니다.\" %(x,y))\n", 388 | "print(\"틀린 갯수가 {0}개 이하이면 {1} 점입니다.\".format(x,y))" 389 | ] 390 | }, 391 | { 392 | "cell_type": "markdown", 393 | "metadata": {}, 394 | "source": [ 395 | "## 불리언\n", 396 | "- 참과 거짓을 True, False로 표현\n", 397 | "- 대소문자를 구분함" 398 | ] 399 | }, 400 | { 401 | "cell_type": "markdown", 402 | "metadata": {}, 403 | "source": [ 404 | "- \">\", \"<\", \"==\", \">=\",\"<=\" 등의 비교연산을 사용하여 불리언 값을 얻을 수 있다" 405 | ] 406 | }, 407 | { 408 | "cell_type": "code", 409 | "execution_count": 14, 410 | "metadata": {}, 411 | "outputs": [ 412 | { 413 | "name": "stdout", 414 | "output_type": "stream", 415 | "text": [ 416 | "False\n", 417 | "True\n" 418 | ] 419 | } 420 | ], 421 | "source": [ 422 | "## 비교 연산의 결과는 논리형 값이다\n", 423 | "\n", 424 | "x = 5\n", 425 | "z = x < 1\n", 426 | "print(z)\n", 427 | "print(x > 0)" 428 | ] 429 | }, 430 | { 431 | "cell_type": "code", 432 | "execution_count": 15, 433 | "metadata": {}, 434 | "outputs": [ 435 | { 436 | "name": "stdout", 437 | "output_type": "stream", 438 | "text": [ 439 | "False\n", 440 | "True\n" 441 | ] 442 | } 443 | ], 444 | "source": [ 445 | "## 논리형 연산 결과는 논리형 값이다\n", 446 | "\n", 447 | "a = True\n", 448 | "b = False\n", 449 | "print(a & b)# False\n", 450 | "print(a | b)# True" 451 | ] 452 | }, 453 | { 454 | "cell_type": "markdown", 455 | "metadata": {}, 456 | "source": [ 457 | "### 불리언의 연산\n", 458 | "- 불리언 변수가 연산에 사용되면 True는 1로, False는 0으로 취급된다" 459 | ] 460 | }, 461 | { 462 | "cell_type": "markdown", 463 | "metadata": { 464 | "colab_type": "text", 465 | "id": "SR1EuTvjfMp7" 466 | }, 467 | "source": [ 468 | "# 데이터 묶음\n", 469 | " - 숫자, 문자, 불리언 등 단변수들을 여러개 묶어 처리하는 방법\n", 470 | " - 리스트(list), 튜플(tuple), 사전(dictionary)" 471 | ] 472 | }, 473 | { 474 | "cell_type": "markdown", 475 | "metadata": { 476 | "colab_type": "text", 477 | "id": "SR1EuTvjfMp7" 478 | }, 479 | "source": [ 480 | "## 리스트\n", 481 | " - 파이썬에서 가장 널리 사용되는 데이터 조작용 \"통\"\n", 482 | " - 리스트를 구성하는 각 항목의 데이터 타입은 서로 달라도 된다" 483 | ] 484 | }, 485 | { 486 | "cell_type": "markdown", 487 | "metadata": {}, 488 | "source": [ 489 | "### 리스트 생성\n", 490 | " - 리스트를 만들려면 대괄호 \"[ ]\" 를 사용하고 각 항목을 ','로 구분한다\n", 491 | " - list() 함수로도 만들 수 있다" 492 | ] 493 | }, 494 | { 495 | "cell_type": "markdown", 496 | "metadata": {}, 497 | "source": [ 498 | "### 슬라이싱\n", 499 | "- 리스트 내의 어떤 범위의 항목을 얻는다" 500 | ] 501 | }, 502 | { 503 | "cell_type": "code", 504 | "execution_count": 16, 505 | "metadata": { 506 | "colab": {}, 507 | "colab_type": "code", 508 | "id": "PZNFeB9hfMqN", 509 | "outputId": "3c15b21b-5c03-4a17-83f7-d3c805cac456", 510 | "scrolled": true 511 | }, 512 | "outputs": [ 513 | { 514 | "name": "stdout", 515 | "output_type": "stream", 516 | "text": [ 517 | "7\n", 518 | "[1, 2, 3, 30, 90, [100, 200], '김연아']\n", 519 | "2\n", 520 | "[1, 2, 3]\n", 521 | "[30, 90, [100, 200]]\n", 522 | "90\n", 523 | "[90, [100, 200], '김연아']\n" 524 | ] 525 | } 526 | ], 527 | "source": [ 528 | "## 리스트 생성과 일부 항목 얻기\n", 529 | "\n", 530 | "a = 3\n", 531 | "b = 90\n", 532 | "small_list = [100,200]\n", 533 | "x = [1,2,a,a*10,b,small_list,'김연아']\n", 534 | "\n", 535 | "print(len(x)) # 리스트의 항목 수\n", 536 | "print(x) # 전체 항목 보기\n", 537 | "print(x[1]) # 두 번째(1) 항목\n", 538 | "print(x[:3]) # 네 번재(3) 미만까지\n", 539 | "print(x[3:6]) # 네 번째(3) 이상 ~ 7번째(6) 미만\n", 540 | "print(x[-3]) # 뒤에서 세 번째(3) 항목\n", 541 | "print(x[-3:]) # 뒤에서 세 번째(3) 이후 " 542 | ] 543 | }, 544 | { 545 | "cell_type": "markdown", 546 | "metadata": {}, 547 | "source": [ 548 | "### 항목 추가 : append()" 549 | ] 550 | }, 551 | { 552 | "cell_type": "code", 553 | "execution_count": 17, 554 | "metadata": { 555 | "colab": {}, 556 | "colab_type": "code", 557 | "id": "XpSrOjU2fMqe", 558 | "outputId": "682d1a04-f04c-4f7f-a8ee-a3e44f7765c3" 559 | }, 560 | "outputs": [ 561 | { 562 | "name": "stdout", 563 | "output_type": "stream", 564 | "text": [ 565 | "[1, 2, 3, 30, 90, [100, 200], '김연아']\n" 566 | ] 567 | }, 568 | { 569 | "data": { 570 | "text/plain": [ 571 | "[1, 2, 3, 30, 90, [100, 200], '김연아', '손흥민', '손흥민']" 572 | ] 573 | }, 574 | "execution_count": 17, 575 | "metadata": {}, 576 | "output_type": "execute_result" 577 | } 578 | ], 579 | "source": [ 580 | "## 리스트 맨 뒤에 항목 추가하기\n", 581 | "\n", 582 | "print(x)\n", 583 | "x.append('손흥민') # 맨 뒤에 추가된다\n", 584 | "x.append('손흥민') # 맨 뒤에 추가된다\n", 585 | "x" 586 | ] 587 | }, 588 | { 589 | "cell_type": "code", 590 | "execution_count": 18, 591 | "metadata": {}, 592 | "outputs": [ 593 | { 594 | "data": { 595 | "text/plain": [ 596 | "True" 597 | ] 598 | }, 599 | "execution_count": 18, 600 | "metadata": {}, 601 | "output_type": "execute_result" 602 | } 603 | ], 604 | "source": [ 605 | "'김연아' in x" 606 | ] 607 | }, 608 | { 609 | "cell_type": "code", 610 | "execution_count": 19, 611 | "metadata": {}, 612 | "outputs": [ 613 | { 614 | "name": "stdout", 615 | "output_type": "stream", 616 | "text": [ 617 | "True\n", 618 | "False\n", 619 | "True\n" 620 | ] 621 | } 622 | ], 623 | "source": [ 624 | "## 리스트에 포함된 항목 확인하기\n", 625 | "\n", 626 | "x = [30,40,'김연아']\n", 627 | "print(30 in x)\n", 628 | "print(100 in x)\n", 629 | "print('김연아' in x)" 630 | ] 631 | }, 632 | { 633 | "cell_type": "markdown", 634 | "metadata": {}, 635 | "source": [ 636 | "### 리스트 복제\n", 637 | "- 리스트 전체를 반복 복제 하려면 \"*\"를 사용한다" 638 | ] 639 | }, 640 | { 641 | "cell_type": "code", 642 | "execution_count": 20, 643 | "metadata": {}, 644 | "outputs": [ 645 | { 646 | "data": { 647 | "text/plain": [ 648 | "[0, 0, 0, 0, 0, 1, 1, 1, 1, 1]" 649 | ] 650 | }, 651 | "execution_count": 20, 652 | "metadata": {}, 653 | "output_type": "execute_result" 654 | } 655 | ], 656 | "source": [ 657 | "## 리스트 복제 및 더하기\n", 658 | "\n", 659 | "a = [0] # 항목이 0 하나인 리스트\n", 660 | "b = [1] # 항목이 1 하나인 리스트\n", 661 | "z = a*5 + b*5\n", 662 | "z" 663 | ] 664 | }, 665 | { 666 | "cell_type": "markdown", 667 | "metadata": {}, 668 | "source": [ 669 | "### 리스트 정렬, sorted\n", 670 | "- 숫자 또는 알파벳순으로 정렬한다" 671 | ] 672 | }, 673 | { 674 | "cell_type": "code", 675 | "execution_count": 21, 676 | "metadata": {}, 677 | "outputs": [ 678 | { 679 | "name": "stdout", 680 | "output_type": "stream", 681 | "text": [ 682 | "[1, 2, 3, 4, 5]\n", 683 | "[5, 4, 3, 2, 1]\n", 684 | "['김연아', '박세리', '이선희']\n" 685 | ] 686 | } 687 | ], 688 | "source": [ 689 | "## 리스트 순서 정렬하기\n", 690 | "\n", 691 | "x = [2,1,3,5,4]\n", 692 | "y = sorted(x)\n", 693 | "z = sorted(x, reverse=True)\n", 694 | "print(y)\n", 695 | "print(z)\n", 696 | "\n", 697 | "x = ['이선희', '김연아', '박세리']\n", 698 | "y = sorted(x)\n", 699 | "print(y)" 700 | ] 701 | }, 702 | { 703 | "cell_type": "markdown", 704 | "metadata": { 705 | "colab_type": "text", 706 | "id": "v_cZd_gQfMqh" 707 | }, 708 | "source": [ 709 | "## 튜플 (tuple)\n", 710 | "- 튜플도 리스트처럼 여러 항목을 담을 수 있는 변수\n", 711 | "- 리스트와 달리 튜플의 내용은 '상수'로 취급되어 값을 바꿀 수 없다\n", 712 | "- 읽기 전용 리스트인 셈이며, 처리 속도가 빠르다\n", 713 | "- 튜플로 슬라이싱이 가능하다\n", 714 | "- 튜플을 만들려면 소괄호( )를 사용하여 만들거나 ( ) 없이 \",\" 로 구분하여 나열한다" 715 | ] 716 | }, 717 | { 718 | "cell_type": "code", 719 | "execution_count": 22, 720 | "metadata": { 721 | "colab": {}, 722 | "colab_type": "code", 723 | "id": "FWh2t30OfMqi", 724 | "outputId": "07768f3c-c5fc-4107-f609-9ce2d3d29036" 725 | }, 726 | "outputs": [ 727 | { 728 | "name": "stdout", 729 | "output_type": "stream", 730 | "text": [ 731 | "(1, 2, 3, 1, 2, 3, 90, 'good')\n", 732 | "90\n", 733 | "True\n", 734 | "False\n" 735 | ] 736 | } 737 | ], 738 | "source": [ 739 | "## 튜플 만들기, 복제, 합치기\n", 740 | "\n", 741 | "tuple_a = (1, 2, 3)\n", 742 | "tuple_b = 90,\"good\"\n", 743 | "z = tuple_a*2 + tuple_b\n", 744 | "print(z)\n", 745 | "print(z[-2])\n", 746 | "print(3 in z)\n", 747 | "print(4 in z)" 748 | ] 749 | }, 750 | { 751 | "cell_type": "markdown", 752 | "metadata": { 753 | "colab_type": "text", 754 | "id": "yynomsnffMqr" 755 | }, 756 | "source": [ 757 | "## 사전 (Dictionaries)\n", 758 | "- 키-값 조합 형태의 데이터 묶음\n", 759 | "- 간단한 데이터베이스처럼 사용된다\n", 760 | "- 항목을 찾을 때 키를 사용한다\n", 761 | "- 딕셔너리에서 저장된 순서는 의미가 없다\n", 762 | "- 딕셔너리는 중괄호 { } 로 만들거나 dict()로 만든다" 763 | ] 764 | }, 765 | { 766 | "cell_type": "code", 767 | "execution_count": 23, 768 | "metadata": { 769 | "colab": {}, 770 | "colab_type": "code", 771 | "id": "M9BYH2N3fMqs", 772 | "outputId": "49be4e1c-dfc0-47e6-8df5-c04ccd187213" 773 | }, 774 | "outputs": [ 775 | { 776 | "name": "stdout", 777 | "output_type": "stream", 778 | "text": [ 779 | "3\n", 780 | "{'grade': 3, 'age': 28, 'name': 'kim', 'address': 'Seoul'}\n" 781 | ] 782 | } 783 | ], 784 | "source": [ 785 | "## 딕셔너리 생성, 값변경, 항목 추가하기\n", 786 | "\n", 787 | "student = {'grade': 3,'age': 21,'name': \"kim\" }\n", 788 | "print(student['grade'])\n", 789 | "student['age'] = 28\n", 790 | "student['address'] = 'Seoul'\n", 791 | "print(student)" 792 | ] 793 | }, 794 | { 795 | "cell_type": "code", 796 | "execution_count": 24, 797 | "metadata": { 798 | "colab": {}, 799 | "colab_type": "code", 800 | "id": "knKE289jfMqv", 801 | "outputId": "f67dbaee-fcff-4724-f600-85ee933b3067", 802 | "scrolled": true 803 | }, 804 | "outputs": [ 805 | { 806 | "name": "stdout", 807 | "output_type": "stream", 808 | "text": [ 809 | "dict_keys(['grade', 'age', 'name', 'address'])\n", 810 | "dict_values([3, 28, 'kim', 'Seoul'])\n", 811 | "dict_items([('grade', 3), ('age', 28), ('name', 'kim'), ('address', 'Seoul')])\n" 812 | ] 813 | } 814 | ], 815 | "source": [ 816 | "## 딕셔너리의 키, 값, 항목 전체 출력하기\n", 817 | "\n", 818 | "print(student.keys())\n", 819 | "print(student.values())\n", 820 | "print(student.items()) " 821 | ] 822 | }, 823 | { 824 | "cell_type": "code", 825 | "execution_count": 25, 826 | "metadata": {}, 827 | "outputs": [ 828 | { 829 | "name": "stdout", 830 | "output_type": "stream", 831 | "text": [ 832 | "True\n", 833 | "False\n" 834 | ] 835 | } 836 | ], 837 | "source": [ 838 | "## 딕셔너리에 특정 키가 존재하는지 확인하기\n", 839 | "\n", 840 | "print(\"age\" in student)\n", 841 | "print(\"sex\" in student)" 842 | ] 843 | }, 844 | { 845 | "cell_type": "markdown", 846 | "metadata": {}, 847 | "source": [ 848 | "- 참고" 849 | ] 850 | }, 851 | { 852 | "cell_type": "code", 853 | "execution_count": 26, 854 | "metadata": {}, 855 | "outputs": [ 856 | { 857 | "data": { 858 | "text/plain": [ 859 | "{'key1': 10, 'key2': 8, 'key3': 12, 'key4': 9}" 860 | ] 861 | }, 862 | "execution_count": 26, 863 | "metadata": {}, 864 | "output_type": "execute_result" 865 | } 866 | ], 867 | "source": [ 868 | "d = {}\n", 869 | "d[\"key1\"] = 10\n", 870 | "d[\"key2\"] = 8\n", 871 | "d[\"key3\"] = 12\n", 872 | "d[\"key4\"] = 9\n", 873 | "d" 874 | ] 875 | }, 876 | { 877 | "cell_type": "code", 878 | "execution_count": 27, 879 | "metadata": {}, 880 | "outputs": [ 881 | { 882 | "name": "stdout", 883 | "output_type": "stream", 884 | "text": [ 885 | "range(0, 10)\n", 886 | "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", 887 | "range(2, 20, 3)\n", 888 | "[2, 5, 8, 11, 14, 17]\n" 889 | ] 890 | } 891 | ], 892 | "source": [ 893 | "## 특수 변수 range와 내용 보기\n", 894 | "\n", 895 | "x = range(10)\n", 896 | "print(x)\n", 897 | "list_x = list(x)\n", 898 | "print(list_x)\n", 899 | "\n", 900 | "y = range(2,20,3)\n", 901 | "print(y)\n", 902 | "print(list(y))" 903 | ] 904 | }, 905 | { 906 | "cell_type": "markdown", 907 | "metadata": {}, 908 | "source": [ 909 | "\n", 910 | "\n", 911 | "# 프로그램 흐름" 912 | ] 913 | }, 914 | { 915 | "cell_type": "markdown", 916 | "metadata": {}, 917 | "source": [ 918 | "## if\n", 919 | "- if 문 다음이 True이면 \":\" 이후 블록을 실행한다\n", 920 | "- 블록은 들여쓰기가 같은 영역으로 구분한다\n", 921 | "- else: 문을 사용할 수도 있다.\n", 922 | "- if 뒤에는 불리언이 필요하다" 923 | ] 924 | }, 925 | { 926 | "cell_type": "code", 927 | "execution_count": 28, 928 | "metadata": {}, 929 | "outputs": [ 930 | { 931 | "name": "stdout", 932 | "output_type": "stream", 933 | "text": [ 934 | "축하합니다~ 합격입니다\n", 935 | "다음주부터 출근하시면 됩니다.\n" 936 | ] 937 | } 938 | ], 939 | "source": [ 940 | "## 기본적인 if, elif, else 사용법\n", 941 | "\n", 942 | "x = 90\n", 943 | "\n", 944 | "if x > 80:\n", 945 | " print(\"축하합니다~ 합격입니다\")\n", 946 | " print(\"다음주부터 출근하시면 됩니다.\")\n", 947 | "elif x > 60:\n", 948 | " print(\"2차 면접시험 대상자 입니다.\")\n", 949 | " print(\"시험 날짜를 알려드리겠습니다.\")\n", 950 | "else:\n", 951 | " print(\"불합격입니다.\")" 952 | ] 953 | }, 954 | { 955 | "cell_type": "code", 956 | "execution_count": 29, 957 | "metadata": {}, 958 | "outputs": [ 959 | { 960 | "name": "stdout", 961 | "output_type": "stream", 962 | "text": [ 963 | "----------------------\n", 964 | "불합격입니다.\n", 965 | "----------------------\n", 966 | "2차 면접시험 대상자 입니다.\n", 967 | "시험 날짜를 알려드리겠습니다.\n", 968 | "----------------------\n", 969 | "축하합니다~ 합격입니다\n", 970 | "다음주부터 출근하시면 됩니다.\n" 971 | ] 972 | } 973 | ], 974 | "source": [ 975 | "## for 문을 사용하여 채점 결과를 알려주는 코드\n", 976 | "\n", 977 | "score = [50, 70, 90]\n", 978 | "for x in score:\n", 979 | " print('----------------------')\n", 980 | " if x > 80:\n", 981 | " print(\"축하합니다~ 합격입니다\")\n", 982 | " print(\"다음주부터 출근하시면 됩니다.\")\n", 983 | " elif x > 60:\n", 984 | " print(\"2차 면접시험 대상자 입니다.\")\n", 985 | " print(\"시험 날짜를 알려드리겠습니다.\")\n", 986 | " else:\n", 987 | " print(\"불합격입니다.\")" 988 | ] 989 | }, 990 | { 991 | "cell_type": "code", 992 | "execution_count": 30, 993 | "metadata": {}, 994 | "outputs": [ 995 | { 996 | "name": "stdout", 997 | "output_type": "stream", 998 | "text": [ 999 | "----------------------\n", 1000 | "1 번째 응시자님:\n", 1001 | "불합격입니다.\n", 1002 | "----------------------\n", 1003 | "2 번째 응시자님:\n", 1004 | "2차 면접시험 대상자 입니다.\n", 1005 | "시험 날짜를 알려드리겠습니다.\n", 1006 | "----------------------\n", 1007 | "3 번째 응시자님:\n", 1008 | "축하합니다~ 합격입니다\n", 1009 | "다음주부터 출근하시면 됩니다.\n" 1010 | ] 1011 | } 1012 | ], 1013 | "source": [ 1014 | "## 리스트의 인덱스를 얻는 enumerate() 사용예\n", 1015 | "\n", 1016 | "score = [50, 70, 90]\n", 1017 | "\n", 1018 | "for i, x in enumerate([50, 70, 90]):\n", 1019 | " print('----------------------')\n", 1020 | " print(i+1, \"번째 응시자님:\")\n", 1021 | " if x > 80:\n", 1022 | " print(\"축하합니다~ 합격입니다\")\n", 1023 | " print(\"다음주부터 출근하시면 됩니다.\")\n", 1024 | " elif x > 60:\n", 1025 | " print(\"2차 면접시험 대상자 입니다.\")\n", 1026 | " print(\"시험 날짜를 알려드리겠습니다.\")\n", 1027 | " else:\n", 1028 | " print(\"불합격입니다.\")" 1029 | ] 1030 | }, 1031 | { 1032 | "cell_type": "code", 1033 | "execution_count": 31, 1034 | "metadata": {}, 1035 | "outputs": [ 1036 | { 1037 | "name": "stdout", 1038 | "output_type": "stream", 1039 | "text": [ 1040 | "[(0, 'kim'), (1, 'park'), (2, 'lee')]\n", 1041 | "1 번째 사람 이름은 kim입니다\n", 1042 | "2 번째 사람 이름은 park입니다\n", 1043 | "3 번째 사람 이름은 lee입니다\n" 1044 | ] 1045 | } 1046 | ], 1047 | "source": [ 1048 | "## enumerate 사용 예\n", 1049 | "\n", 1050 | "names = [\"kim\", \"park\", \"lee\"]\n", 1051 | "print(list(enumerate(names)))\n", 1052 | "\n", 1053 | "for i, name in enumerate(names):\n", 1054 | " print(f\"{i+1} 번째 사람 이름은 {name}입니다\")" 1055 | ] 1056 | }, 1057 | { 1058 | "cell_type": "markdown", 1059 | "metadata": {}, 1060 | "source": [ 1061 | "### in 사용하여 불리언 얻기" 1062 | ] 1063 | }, 1064 | { 1065 | "cell_type": "markdown", 1066 | "metadata": {}, 1067 | "source": [ 1068 | "## for\n", 1069 | "- 특정 조건이 만족되는 동안 \":\" 이후의 블록을 수행\n", 1070 | "- 수행할 블록은 들여쓰기로 구분한다" 1071 | ] 1072 | }, 1073 | { 1074 | "cell_type": "code", 1075 | "execution_count": 32, 1076 | "metadata": {}, 1077 | "outputs": [ 1078 | { 1079 | "name": "stdout", 1080 | "output_type": "stream", 1081 | "text": [ 1082 | "10\n", 1083 | "20\n", 1084 | "30\n", 1085 | "40\n", 1086 | "50\n" 1087 | ] 1088 | } 1089 | ], 1090 | "source": [ 1091 | "## 1~5 사이의 정수에 10을 곱하기\n", 1092 | "\n", 1093 | "for i in range(1,6):\n", 1094 | " print(i*10)" 1095 | ] 1096 | }, 1097 | { 1098 | "cell_type": "markdown", 1099 | "metadata": {}, 1100 | "source": [ 1101 | "### 리스트 내에서 for 사용하기" 1102 | ] 1103 | }, 1104 | { 1105 | "cell_type": "code", 1106 | "execution_count": 33, 1107 | "metadata": {}, 1108 | "outputs": [ 1109 | { 1110 | "name": "stdout", 1111 | "output_type": "stream", 1112 | "text": [ 1113 | "[10, 20, 30, 40, 50]\n" 1114 | ] 1115 | } 1116 | ], 1117 | "source": [ 1118 | "## 리스트 선언문 내에서 for를 사용하는 방법\n", 1119 | "\n", 1120 | "z = [i*10 for i in range(1,6)]\n", 1121 | "print(z)" 1122 | ] 1123 | }, 1124 | { 1125 | "cell_type": "code", 1126 | "execution_count": 34, 1127 | "metadata": {}, 1128 | "outputs": [ 1129 | { 1130 | "name": "stdout", 1131 | "output_type": "stream", 1132 | "text": [ 1133 | "True\n", 1134 | "True\n" 1135 | ] 1136 | } 1137 | ], 1138 | "source": [ 1139 | "## 문자열에 문자열 포함 확인하기\n", 1140 | "\n", 1141 | "s = 'I am happy'\n", 1142 | "print('happy' in s)\n", 1143 | "print('hap' in s)" 1144 | ] 1145 | }, 1146 | { 1147 | "cell_type": "code", 1148 | "execution_count": 35, 1149 | "metadata": {}, 1150 | "outputs": [ 1151 | { 1152 | "name": "stdout", 1153 | "output_type": "stream", 1154 | "text": [ 1155 | "['cat001', 'cat002']\n" 1156 | ] 1157 | } 1158 | ], 1159 | "source": [ 1160 | "## 특정 문자열이 포함된 항목을 찾아서 리스트를 만들기\n", 1161 | "\n", 1162 | "files = ['cat001', 'cat002', 'dog003', 'dog004']\n", 1163 | "match = 'cat'\n", 1164 | "new_list = [s for s in files if match in s]\n", 1165 | "print(new_list)" 1166 | ] 1167 | }, 1168 | { 1169 | "cell_type": "markdown", 1170 | "metadata": {}, 1171 | "source": [ 1172 | "### 구구단을 딕셔너리 구조의 데이터베이스로\n", 1173 | "- 결과를 딕셔너리로 만들고 입력을 주면 출력을 리턴하는 간단한 데이터베이스로 만들어보시오\n", 1174 | "- result[(7,9)] ==> 결과 63\n", 1175 | "- 힌트: 빈 딕션너리를 만들고 키 값으로 (2,1), (2,2),..등을 사용한다" 1176 | ] 1177 | }, 1178 | { 1179 | "cell_type": "code", 1180 | "execution_count": 36, 1181 | "metadata": {}, 1182 | "outputs": [ 1183 | { 1184 | "data": { 1185 | "text/plain": [ 1186 | "63" 1187 | ] 1188 | }, 1189 | "execution_count": 36, 1190 | "metadata": {}, 1191 | "output_type": "execute_result" 1192 | } 1193 | ], 1194 | "source": [ 1195 | "## 구구단을 딕셔너리로 만들고 사용하기\n", 1196 | "\n", 1197 | "result = {}\n", 1198 | "for i in range(2,10):\n", 1199 | " for j in range(1,10):\n", 1200 | " result[(i, j)] = i*j\n", 1201 | " \n", 1202 | "# 구구단 사용하기\n", 1203 | "result[(7,9)] # 63" 1204 | ] 1205 | } 1206 | ], 1207 | "metadata": { 1208 | "colab": { 1209 | "collapsed_sections": [ 1210 | "v_cZd_gQfMqh", 1211 | "yynomsnffMqr", 1212 | "zd5EnJeQfMrE" 1213 | ], 1214 | "name": "g_01_파이선기초.ipynb", 1215 | "provenance": [] 1216 | }, 1217 | "kernelspec": { 1218 | "display_name": "Python 3", 1219 | "language": "python", 1220 | "name": "python3" 1221 | }, 1222 | "language_info": { 1223 | "codemirror_mode": { 1224 | "name": "ipython", 1225 | "version": 3 1226 | }, 1227 | "file_extension": ".py", 1228 | "mimetype": "text/x-python", 1229 | "name": "python", 1230 | "nbconvert_exporter": "python", 1231 | "pygments_lexer": "ipython3", 1232 | "version": "3.8.8" 1233 | }, 1234 | "toc": { 1235 | "base_numbering": 1, 1236 | "nav_menu": {}, 1237 | "number_sections": false, 1238 | "sideBar": true, 1239 | "skip_h1_title": false, 1240 | "title_cell": "Table of Contents", 1241 | "title_sidebar": "Contents", 1242 | "toc_cell": false, 1243 | "toc_position": { 1244 | "height": "calc(100% - 180px)", 1245 | "left": "10px", 1246 | "top": "150px", 1247 | "width": "182px" 1248 | }, 1249 | "toc_section_display": true, 1250 | "toc_window_display": true 1251 | } 1252 | }, 1253 | "nbformat": 4, 1254 | "nbformat_minor": 1 1255 | } 1256 | -------------------------------------------------------------------------------- /b24_numpy.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "colab_type": "text", 7 | "collapsed": true, 8 | "id": "LbOwvOJ58Gz3" 9 | }, 10 | "source": [ 11 | "# numpy\n", 12 | "- 데이터프레임은 테이블 구조의 데이터를 편리하게 조작하기 위해서 사용한다\n", 13 | "- 숫자만으로 구성된 데이터를 대상으로 \"연산\"을 하기 위해서는 배열 (array) 형태여야 한다\n", 14 | "- 이를 위해 넘파이 라이브러리를 사용한다\n", 15 | " - 다 차원 배열 ndarray(n-dimensional array)를 다룬다" 16 | ] 17 | }, 18 | { 19 | "cell_type": "markdown", 20 | "metadata": {}, 21 | "source": [ 22 | "## 리스트/데이터프레임과 배열의 차이\n", 23 | "- 리스트는 데이터를 \"목록\"으로 만들거나 조작하는 용도 (추가, 삭제, 변형 등)\n", 24 | "- 데이터프레임은 2차원 테이블 구조의 데이터를 만들고, 조작하는 용도\n", 25 | "- 배열은 연산을 위해, 숫자만으로 구성된, 수학의 매트릭스와 같은 용도" 26 | ] 27 | }, 28 | { 29 | "cell_type": "markdown", 30 | "metadata": {}, 31 | "source": [ 32 | "# 한글 설치" 33 | ] 34 | }, 35 | { 36 | "cell_type": "markdown", 37 | "metadata": {}, 38 | "source": [ 39 | "## 코랩에 한글 폰트 설치\n", 40 | "- (주의!) 아래 셀을 실행 후에, 런타임 - 런타임 다시 시작을 수행해야 한다\n", 41 | " - 코랩은 리눅스 머신이면 한글이 미리 설치되어 있지 않다\n", 42 | " - 한글이 이미 설치된 PC에서는 아래 셀을 실행할 필요없다" 43 | ] 44 | }, 45 | { 46 | "cell_type": "code", 47 | "execution_count": 1, 48 | "metadata": {}, 49 | "outputs": [], 50 | "source": [ 51 | "# # colab을 사용하는 경우만 이 셀을 실행하며, 실행 후 런타임 - 런타임 다시 시작 을 수행해야 한다\n", 52 | "# # 한글이 설치된 PC에서는 이 셀을 실행할 필요 없음\n", 53 | "# import matplotlib.pyplot as plt\n", 54 | "# import matplotlib.font_manager as fm\n", 55 | " \n", 56 | "# !apt -qq -y install fonts-nanum\n", 57 | "# fm._rebuild() \n", 58 | "# plt.rc('font', family='NanumBarunGothic') " 59 | ] 60 | }, 61 | { 62 | "cell_type": "markdown", 63 | "metadata": {}, 64 | "source": [ 65 | "## 한글 사용 설정\n", 66 | "- 그림에 한글이 보이게 하기 위해서 한글 사용을 설정한다.\n", 67 | "- 운영체제마다 명령이 다르다" 68 | ] 69 | }, 70 | { 71 | "cell_type": "code", 72 | "execution_count": 2, 73 | "metadata": {}, 74 | "outputs": [], 75 | "source": [ 76 | "# import platform, matplotlib\n", 77 | "# from matplotlib import rc\n", 78 | "\n", 79 | "# # '-' 기호 제대로 보이기\n", 80 | "# matplotlib.rcParams['axes.unicode_minus'] = False\n", 81 | "\n", 82 | "# # 윈도우\n", 83 | "# if platform.system() == 'Windows':\n", 84 | "# rc('font', family=\"Malgun Gothic\")\n", 85 | "# # 맥\n", 86 | "# elif platform.system() == 'Darwin':\n", 87 | "# rc('font', family='AppleGothic')\n", 88 | "# # 리눅스\n", 89 | "# elif platform.system() == 'Linux':\n", 90 | "# rc('font', family='NanumBarunGothic')" 91 | ] 92 | }, 93 | { 94 | "cell_type": "markdown", 95 | "metadata": {}, 96 | "source": [ 97 | "### 한글이 그래프에 보이는지 확인\n", 98 | "- 아래 코드를 실행하고 x, y 축 이름에 한글이 보이는지 확인한다\n", 99 | "- 아래는 matplotlib 패키지의 pyplot 모듈이 제공하는 scatter() 함수를 이용했다\n", 100 | "- 5명 학생의 임의의 점수를 산포도로 그리는 예" 101 | ] 102 | }, 103 | { 104 | "cell_type": "code", 105 | "execution_count": 3, 106 | "metadata": {}, 107 | "outputs": [], 108 | "source": [ 109 | "# import matplotlib.pyplot as plt\n", 110 | "# # 맥 컴퓨터를 사용하는 경우 레티나(고화질)로 출력하는 옵션\n", 111 | "# %config InlineBackend.figure_format = 'retina'\n", 112 | "\n", 113 | "# plt.scatter([1,2,3,4,5], [70,60,50,90,30])\n", 114 | "# plt.xlabel('학생')\n", 115 | "# plt.ylabel('점수')" 116 | ] 117 | }, 118 | { 119 | "cell_type": "markdown", 120 | "metadata": {}, 121 | "source": [ 122 | "## import\n" 123 | ] 124 | }, 125 | { 126 | "cell_type": "code", 127 | "execution_count": 4, 128 | "metadata": {}, 129 | "outputs": [], 130 | "source": [ 131 | "import pandas as pd" 132 | ] 133 | }, 134 | { 135 | "cell_type": "markdown", 136 | "metadata": {}, 137 | "source": [ 138 | "# 리스트와 어레이" 139 | ] 140 | }, 141 | { 142 | "cell_type": "markdown", 143 | "metadata": {}, 144 | "source": [ 145 | "## 리스트 조작" 146 | ] 147 | }, 148 | { 149 | "cell_type": "code", 150 | "execution_count": 5, 151 | "metadata": { 152 | "colab": {}, 153 | "colab_type": "code", 154 | "id": "tJFSKtuq8Gz_", 155 | "outputId": "122560e0-52d6-497f-dc54-77624320f483" 156 | }, 157 | "outputs": [ 158 | { 159 | "name": "stdout", 160 | "output_type": "stream", 161 | "text": [ 162 | "[1, 2, 5, 10, 1, 2, 5, 10, 1, 2, 5, 10]\n", 163 | "[ 3 6 15 30]\n" 164 | ] 165 | } 166 | ], 167 | "source": [ 168 | "## 리스트의 복제(*)와 어레이의 곱셈 비교\n", 169 | "\n", 170 | "import numpy as np\n", 171 | "\n", 172 | "x = [1, 2, 5,10] # 리스트 생성\n", 173 | "print(x*3)\n", 174 | "\n", 175 | "y = np.array(x) # 리스트를 어레이로 변환\n", 176 | "print(y*3)" 177 | ] 178 | }, 179 | { 180 | "cell_type": "code", 181 | "execution_count": 6, 182 | "metadata": {}, 183 | "outputs": [ 184 | { 185 | "name": "stdout", 186 | "output_type": "stream", 187 | "text": [ 188 | "[1, 2, 5, 10]\n", 189 | "\n", 190 | "\n" 191 | ] 192 | } 193 | ], 194 | "source": [ 195 | "## 어레이를 리스트로 바꾸고 타입 확인하기\n", 196 | "\n", 197 | "z = list(y) # 어레이를 리스트로 타입을 바꾼다\n", 198 | "print(z) # [1, 2, 5, 10]\n", 199 | "print(type(y)) # class 'numpy.ndarray'>\n", 200 | "print(type(z)) # " 201 | ] 202 | }, 203 | { 204 | "cell_type": "code", 205 | "execution_count": 7, 206 | "metadata": {}, 207 | "outputs": [ 208 | { 209 | "name": "stdout", 210 | "output_type": "stream", 211 | "text": [ 212 | "[ 11 12 103 104]\n", 213 | "[ -9 -8 -97 -96]\n", 214 | "[ 10 20 300 400]\n", 215 | "[0.1 0.2 0.03 0.04]\n" 216 | ] 217 | } 218 | ], 219 | "source": [ 220 | "## 어레이의 연산은 각 항목별로 수행된다\n", 221 | "\n", 222 | "y1 = np.array([1, 2, 3, 4])\n", 223 | "y2 = np.array([10, 10, 100, 100])\n", 224 | "\n", 225 | "print(y1 + y2) # [ 11 12 103 104]\n", 226 | "print(y1 - y2) # [ -9 -8 -97 -96]\n", 227 | "print(y1 * y2) # [ 10 20 300 400]\n", 228 | "print(y1 / y2) # [0.1 0.2 0.03 0.04]" 229 | ] 230 | }, 231 | { 232 | "cell_type": "code", 233 | "execution_count": 8, 234 | "metadata": {}, 235 | "outputs": [ 236 | { 237 | "name": "stdout", 238 | "output_type": "stream", 239 | "text": [ 240 | "[1001 1002 1003 1004]\n", 241 | "[-999 -998 -997 -996]\n", 242 | "[1000 2000 3000 4000]\n", 243 | "[0.001 0.002 0.003 0.004]\n" 244 | ] 245 | } 246 | ], 247 | "source": [ 248 | "## 어레이에 단변수의 연산을 수행하기\n", 249 | "\n", 250 | "y1 = np.array([1, 2, 3, 4])\n", 251 | "a = 1000\n", 252 | "\n", 253 | "print(y1 + a) # [1001 1002 1003 1004]\n", 254 | "print(y1 - a) # [-999 -998 -997 -996]\n", 255 | "print(y1 * a) # [1000 2000 3000 4000]\n", 256 | "print(y1 / a) # [0.001 0.002 0.003 0.004]" 257 | ] 258 | }, 259 | { 260 | "cell_type": "code", 261 | "execution_count": 9, 262 | "metadata": {}, 263 | "outputs": [ 264 | { 265 | "data": { 266 | "text/plain": [ 267 | "[1, 2, 3, 4, 10, 10, 100, 100]" 268 | ] 269 | }, 270 | "execution_count": 9, 271 | "metadata": {}, 272 | "output_type": "execute_result" 273 | } 274 | ], 275 | "source": [ 276 | "## 리스트에 대한 + 수행은 두 리스트를 합친다\n", 277 | "\n", 278 | "y1 = np.array([1, 2, 3, 4])\n", 279 | "y2 = np.array([10, 10, 100, 100])\n", 280 | "\n", 281 | "list(y1)+list(y2) # [1, 2, 3, 4, 10, 10, 100, 100]" 282 | ] 283 | }, 284 | { 285 | "cell_type": "markdown", 286 | "metadata": {}, 287 | "source": [ 288 | "## arange\n", 289 | "- range 타입의 \"범위\" 데이터를 생성한 후 이를 배열로 만든다" 290 | ] 291 | }, 292 | { 293 | "cell_type": "code", 294 | "execution_count": 10, 295 | "metadata": { 296 | "colab": {}, 297 | "colab_type": "code", 298 | "id": "fl4emopM8G0n", 299 | "outputId": "c95b26c9-a733-40a7-9601-0ffb41e160c8" 300 | }, 301 | "outputs": [ 302 | { 303 | "name": "stdout", 304 | "output_type": "stream", 305 | "text": [ 306 | "[0 1 2 3 4 5]\n", 307 | "[1 2 3 4 5 6]\n", 308 | "[ 1 4 7 10 13 16 19]\n", 309 | "[1.1 1.6 2.1 2.6 3.1 3.6]\n" 310 | ] 311 | } 312 | ], 313 | "source": [ 314 | "# 일정한 간격의 수로 구성된 어레이를 얻는다\n", 315 | "\n", 316 | "print(np.arange(6)) # [0 1 2 3 4 5]\n", 317 | "print(np.arange(1,7)) # [1 2 3 4 5 6]\n", 318 | "print(np.arange(1,20,3)) # [ 1 4 7 10 13 16 19]\n", 319 | "print(np.arange(1.1,4,0.5))# [1.1 1.6 2.1 2.6 3.1 3.6]" 320 | ] 321 | }, 322 | { 323 | "cell_type": "markdown", 324 | "metadata": {}, 325 | "source": [ 326 | "## 데이터프레임과 어레이\n", 327 | "- 기본적으로 행단로 추출하며 마치 행 번호를 인덱스인 것처럼 사용" 328 | ] 329 | }, 330 | { 331 | "cell_type": "code", 332 | "execution_count": 11, 333 | "metadata": {}, 334 | "outputs": [ 335 | { 336 | "data": { 337 | "text/html": [ 338 | "
\n", 339 | "\n", 352 | "\n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | " \n", 365 | " \n", 366 | " \n", 367 | " \n", 368 | " \n", 369 | " \n", 370 | " \n", 371 | " \n", 372 | " \n", 373 | " \n", 374 | " \n", 375 | " \n", 376 | " \n", 377 | " \n", 378 | " \n", 379 | " \n", 380 | " \n", 381 | " \n", 382 | " \n", 383 | " \n", 384 | " \n", 385 | " \n", 386 | " \n", 387 | " \n", 388 | " \n", 389 | " \n", 390 | " \n", 391 | " \n", 392 | " \n", 393 | " \n", 394 | " \n", 395 | " \n", 396 | " \n", 397 | " \n", 398 | " \n", 399 | "
populationtempcars
city
서울99013300
부산35016120
대구2501480
대전1541390
광주1501570
\n", 400 | "
" 401 | ], 402 | "text/plain": [ 403 | " population temp cars\n", 404 | "city \n", 405 | "서울 990 13 300\n", 406 | "부산 350 16 120\n", 407 | "대구 250 14 80\n", 408 | "대전 154 13 90\n", 409 | "광주 150 15 70" 410 | ] 411 | }, 412 | "execution_count": 11, 413 | "metadata": {}, 414 | "output_type": "execute_result" 415 | } 416 | ], 417 | "source": [ 418 | "## 임의의 도시정보 데이터프레임을 만드는 예\n", 419 | "\n", 420 | "import pandas as pd\n", 421 | "\n", 422 | "x = {'city': ['서울', '부산', '대구', '대전', '광주'],\n", 423 | " 'population': [990, 350, 250, 154, 150],\n", 424 | " 'temp': [13, 16, 14, 13, 15],\n", 425 | " 'cars': [300, 120, 80, 90, 70]}\n", 426 | "\n", 427 | "df = pd.DataFrame(x)\n", 428 | "df.set_index(\"city\", inplace=True)\n", 429 | "df" 430 | ] 431 | }, 432 | { 433 | "cell_type": "code", 434 | "execution_count": 12, 435 | "metadata": {}, 436 | "outputs": [ 437 | { 438 | "name": "stdout", 439 | "output_type": "stream", 440 | "text": [ 441 | "(5, 3)\n" 442 | ] 443 | }, 444 | { 445 | "data": { 446 | "text/plain": [ 447 | "array([[990, 13, 300],\n", 448 | " [350, 16, 120],\n", 449 | " [250, 14, 80],\n", 450 | " [154, 13, 90],\n", 451 | " [150, 15, 70]])" 452 | ] 453 | }, 454 | "execution_count": 12, 455 | "metadata": {}, 456 | "output_type": "execute_result" 457 | } 458 | ], 459 | "source": [ 460 | "## 데이터프레임을 어레이로 바꾸는 방법\n", 461 | "\n", 462 | "z = df.values\n", 463 | "print(z.shape)\n", 464 | "z" 465 | ] 466 | }, 467 | { 468 | "cell_type": "code", 469 | "execution_count": 13, 470 | "metadata": {}, 471 | "outputs": [ 472 | { 473 | "data": { 474 | "text/plain": [ 475 | "['서울', '부산', '대구', '대전', '광주']" 476 | ] 477 | }, 478 | "execution_count": 13, 479 | "metadata": {}, 480 | "output_type": "execute_result" 481 | } 482 | ], 483 | "source": [ 484 | "list(df.columns) # 결과: ['population', 'temp', 'cars']\n", 485 | "list(df.index) # 결과: ['서울', '부산', '대구', '대전', '광주']" 486 | ] 487 | }, 488 | { 489 | "cell_type": "code", 490 | "execution_count": 14, 491 | "metadata": {}, 492 | "outputs": [ 493 | { 494 | "data": { 495 | "text/html": [ 496 | "
\n", 497 | "\n", 510 | "\n", 511 | " \n", 512 | " \n", 513 | " \n", 514 | " \n", 515 | " \n", 516 | " \n", 517 | " \n", 518 | " \n", 519 | " \n", 520 | " \n", 521 | " \n", 522 | " \n", 523 | " \n", 524 | " \n", 525 | " \n", 526 | " \n", 527 | " \n", 528 | " \n", 529 | " \n", 530 | " \n", 531 | " \n", 532 | " \n", 533 | " \n", 534 | " \n", 535 | " \n", 536 | " \n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | "
012
099013300
135016120
22501480
31541390
41501570
\n", 552 | "
" 553 | ], 554 | "text/plain": [ 555 | " 0 1 2\n", 556 | "0 990 13 300\n", 557 | "1 350 16 120\n", 558 | "2 250 14 80\n", 559 | "3 154 13 90\n", 560 | "4 150 15 70" 561 | ] 562 | }, 563 | "execution_count": 14, 564 | "metadata": {}, 565 | "output_type": "execute_result" 566 | } 567 | ], 568 | "source": [ 569 | "## 어레이는 바로 데이터프레임으로 바꿀 수 있다.\n", 570 | "\n", 571 | "df2 = pd.DataFrame(z)\n", 572 | "df2" 573 | ] 574 | }, 575 | { 576 | "cell_type": "code", 577 | "execution_count": 15, 578 | "metadata": {}, 579 | "outputs": [ 580 | { 581 | "data": { 582 | "text/html": [ 583 | "
\n", 584 | "\n", 597 | "\n", 598 | " \n", 599 | " \n", 600 | " \n", 601 | " \n", 602 | " \n", 603 | " \n", 604 | " \n", 605 | " \n", 606 | " \n", 607 | " \n", 608 | " \n", 609 | " \n", 610 | " \n", 611 | " \n", 612 | " \n", 613 | " \n", 614 | " \n", 615 | " \n", 616 | " \n", 617 | " \n", 618 | " \n", 619 | " \n", 620 | " \n", 621 | " \n", 622 | " \n", 623 | " \n", 624 | " \n", 625 | " \n", 626 | " \n", 627 | " \n", 628 | " \n", 629 | " \n", 630 | " \n", 631 | " \n", 632 | " \n", 633 | " \n", 634 | " \n", 635 | " \n", 636 | " \n", 637 | " \n", 638 | " \n", 639 | " \n", 640 | " \n", 641 | " \n", 642 | " \n", 643 | " \n", 644 | "
populationtempcars
city
서울99013300
부산35016120
대구2501480
대전1541390
광주1501570
\n", 645 | "
" 646 | ], 647 | "text/plain": [ 648 | " population temp cars\n", 649 | "city \n", 650 | "서울 990 13 300\n", 651 | "부산 350 16 120\n", 652 | "대구 250 14 80\n", 653 | "대전 154 13 90\n", 654 | "광주 150 15 70" 655 | ] 656 | }, 657 | "execution_count": 15, 658 | "metadata": {}, 659 | "output_type": "execute_result" 660 | } 661 | ], 662 | "source": [ 663 | "## 데이터프레임을 만들면서 인덱스와 컬럼명을 지정\n", 664 | "\n", 665 | "df2 = pd.DataFrame(z, index=df.index, columns=df.columns)\n", 666 | "df2" 667 | ] 668 | }, 669 | { 670 | "cell_type": "code", 671 | "execution_count": 16, 672 | "metadata": {}, 673 | "outputs": [ 674 | { 675 | "data": { 676 | "text/plain": [ 677 | "array([[990, 13, 300],\n", 678 | " [350, 16, 120],\n", 679 | " [250, 14, 80]])" 680 | ] 681 | }, 682 | "execution_count": 16, 683 | "metadata": {}, 684 | "output_type": "execute_result" 685 | } 686 | ], 687 | "source": [ 688 | "## 어레이의 0~3 사이의 행을 얻기\n", 689 | "\n", 690 | "z[:3]" 691 | ] 692 | }, 693 | { 694 | "cell_type": "code", 695 | "execution_count": 17, 696 | "metadata": {}, 697 | "outputs": [ 698 | { 699 | "data": { 700 | "text/plain": [ 701 | "array([[990, 300],\n", 702 | " [350, 120],\n", 703 | " [250, 80],\n", 704 | " [154, 90],\n", 705 | " [150, 70]])" 706 | ] 707 | }, 708 | "execution_count": 17, 709 | "metadata": {}, 710 | "output_type": "execute_result" 711 | } 712 | ], 713 | "source": [ 714 | "## 모든 행에 대해서, 컬럼 0과 2만 얻기\n", 715 | "\n", 716 | "z[:,[0,2]]" 717 | ] 718 | }, 719 | { 720 | "cell_type": "code", 721 | "execution_count": 18, 722 | "metadata": {}, 723 | "outputs": [ 724 | { 725 | "data": { 726 | "text/plain": [ 727 | "(array([[ 0, 1, 2],\n", 728 | " [ 3, 4, 5],\n", 729 | " [ 6, 7, 8],\n", 730 | " [ 9, 10, 11]]),\n", 731 | " array([[100, 101, 102],\n", 732 | " [103, 104, 105],\n", 733 | " [106, 107, 108],\n", 734 | " [109, 110, 111]]))" 735 | ] 736 | }, 737 | "execution_count": 18, 738 | "metadata": {}, 739 | "output_type": "execute_result" 740 | } 741 | ], 742 | "source": [ 743 | "## 임의의 어레이 두개 생성\n", 744 | "\n", 745 | "x1 = np.arange(0,12).reshape(4,3)\n", 746 | "x2 = np.arange(100,112).reshape(4,3)\n", 747 | "\n", 748 | "x1, x2" 749 | ] 750 | }, 751 | { 752 | "cell_type": "code", 753 | "execution_count": 19, 754 | "metadata": {}, 755 | "outputs": [ 756 | { 757 | "data": { 758 | "text/plain": [ 759 | "array([[ 0, 1, 2],\n", 760 | " [ 3, 4, 5],\n", 761 | " [ 6, 7, 8],\n", 762 | " [ 9, 10, 11],\n", 763 | " [100, 101, 102],\n", 764 | " [103, 104, 105],\n", 765 | " [106, 107, 108],\n", 766 | " [109, 110, 111]])" 767 | ] 768 | }, 769 | "execution_count": 19, 770 | "metadata": {}, 771 | "output_type": "execute_result" 772 | } 773 | ], 774 | "source": [ 775 | "## 디폴트는 행 방향 (세로 방향)으로 붙인다\n", 776 | "\n", 777 | "x3 = np.concatenate((x1, x2))\n", 778 | "x3\n" 779 | ] 780 | }, 781 | { 782 | "cell_type": "code", 783 | "execution_count": 20, 784 | "metadata": {}, 785 | "outputs": [ 786 | { 787 | "data": { 788 | "text/plain": [ 789 | "array([[ 0, 1, 2, 100, 101, 102],\n", 790 | " [ 3, 4, 5, 103, 104, 105],\n", 791 | " [ 6, 7, 8, 106, 107, 108],\n", 792 | " [ 9, 10, 11, 109, 110, 111]])" 793 | ] 794 | }, 795 | "execution_count": 20, 796 | "metadata": {}, 797 | "output_type": "execute_result" 798 | } 799 | ], 800 | "source": [ 801 | "## 컬럼 방향으로 붙이기 (axis=1)\n", 802 | "\n", 803 | "x3 = np.concatenate((x1, x2), axis=1)\n", 804 | "x3" 805 | ] 806 | }, 807 | { 808 | "cell_type": "code", 809 | "execution_count": 21, 810 | "metadata": {}, 811 | "outputs": [ 812 | { 813 | "name": "stdout", 814 | "output_type": "stream", 815 | "text": [ 816 | "[[ 0 1 2 3 4 5 6 7]\n", 817 | " [ 8 9 10 11 12 13 14 15]\n", 818 | " [16 17 18 19 20 21 22 23]\n", 819 | " [24 25 26 27 28 29 30 31]\n", 820 | " [32 33 34 35 36 37 38 39]\n", 821 | " [40 41 42 43 44 45 46 47]]\n", 822 | "0,1,2,3,4,5,6,7\n", 823 | "8,9,10,11,12,13,14,15\n", 824 | "16,17,18,19,20,21,22,23\n", 825 | "24,25,26,27,28,29,30,31\n", 826 | "32,33,34,35,36,37,38,39\n", 827 | "40,41,42,43,44,45,46,47\n", 828 | "\n" 829 | ] 830 | } 831 | ], 832 | "source": [ 833 | "## 어레이를 csv 파일로 저장한 후 파일 읽기\n", 834 | "\n", 835 | "x = np.arange(48).reshape(6,8)\n", 836 | "print(x)\n", 837 | "np.savetxt('big.csv', x, fmt='%d', delimiter=',')\n", 838 | "\n", 839 | "with open('big.csv') as f: \n", 840 | " print(f.read())" 841 | ] 842 | }, 843 | { 844 | "cell_type": "code", 845 | "execution_count": 22, 846 | "metadata": {}, 847 | "outputs": [ 848 | { 849 | "data": { 850 | "text/plain": [ 851 | "array([[ 0., 1., 2., 3., 4., 5., 6., 7.],\n", 852 | " [ 8., 9., 10., 11., 12., 13., 14., 15.],\n", 853 | " [16., 17., 18., 19., 20., 21., 22., 23.],\n", 854 | " [24., 25., 26., 27., 28., 29., 30., 31.],\n", 855 | " [32., 33., 34., 35., 36., 37., 38., 39.],\n", 856 | " [40., 41., 42., 43., 44., 45., 46., 47.]])" 857 | ] 858 | }, 859 | "execution_count": 22, 860 | "metadata": {}, 861 | "output_type": "execute_result" 862 | } 863 | ], 864 | "source": [ 865 | "## csv 파일의 내용을 어레이로 바로 읽기\n", 866 | "\n", 867 | "y = np.loadtxt('big.csv', delimiter=',')\n", 868 | "y" 869 | ] 870 | } 871 | ], 872 | "metadata": { 873 | "colab": { 874 | "collapsed_sections": [], 875 | "name": "g_02_numpy.ipynb", 876 | "provenance": [] 877 | }, 878 | "kernelspec": { 879 | "display_name": "Python 3", 880 | "language": "python", 881 | "name": "python3" 882 | }, 883 | "language_info": { 884 | "codemirror_mode": { 885 | "name": "ipython", 886 | "version": 3 887 | }, 888 | "file_extension": ".py", 889 | "mimetype": "text/x-python", 890 | "name": "python", 891 | "nbconvert_exporter": "python", 892 | "pygments_lexer": "ipython3", 893 | "version": "3.8.8" 894 | }, 895 | "toc": { 896 | "base_numbering": 1, 897 | "nav_menu": {}, 898 | "number_sections": false, 899 | "sideBar": true, 900 | "skip_h1_title": false, 901 | "title_cell": "Table of Contents", 902 | "title_sidebar": "Contents", 903 | "toc_cell": false, 904 | "toc_position": { 905 | "height": "calc(100% - 180px)", 906 | "left": "10px", 907 | "top": "150px", 908 | "width": "184.312px" 909 | }, 910 | "toc_section_display": true, 911 | "toc_window_display": true 912 | } 913 | }, 914 | "nbformat": 4, 915 | "nbformat_minor": 1 916 | } 917 | -------------------------------------------------------------------------------- /b25_Function.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 함수 사용\n", 8 | "\n", 9 | "- 데이터에 적용되는 다양한 함수 사용법을 다룬다\n", 10 | "- def, lambda, map, apply" 11 | ] 12 | }, 13 | { 14 | "cell_type": "markdown", 15 | "metadata": {}, 16 | "source": [ 17 | "## import" 18 | ] 19 | }, 20 | { 21 | "cell_type": "code", 22 | "execution_count": 1, 23 | "metadata": {}, 24 | "outputs": [], 25 | "source": [ 26 | "import pandas as pd\n", 27 | "import numpy as np" 28 | ] 29 | }, 30 | { 31 | "cell_type": "markdown", 32 | "metadata": {}, 33 | "source": [ 34 | "# def \n", 35 | "- 반복 사용되는 작업은 함수로 만들어 두면 편리하게 다시 사용할 수 있다\n", 36 | "- 함수를 정의할 때 def를 사용한다\n", 37 | "- 함수를 호출할 때 인자를 넘겨줄 수 있다\n", 38 | "- 함수 실행 결과로 어떤 값을 받으려면 return 문을 사용한다" 39 | ] 40 | }, 41 | { 42 | "cell_type": "markdown", 43 | "metadata": {}, 44 | "source": [ 45 | "## 리턴 값 정의\n", 46 | "- return을 사용하며, 임의의 형태의 묶음 데이터도 리턴할 수 있다" 47 | ] 48 | }, 49 | { 50 | "cell_type": "markdown", 51 | "metadata": {}, 52 | "source": [ 53 | "## 인자" 54 | ] 55 | }, 56 | { 57 | "cell_type": "code", 58 | "execution_count": 2, 59 | "metadata": {}, 60 | "outputs": [ 61 | { 62 | "data": { 63 | "text/plain": [ 64 | "10" 65 | ] 66 | }, 67 | "execution_count": 2, 68 | "metadata": {}, 69 | "output_type": "execute_result" 70 | } 71 | ], 72 | "source": [ 73 | "## 인자로 받은 값의 두 배를 리턴하는 함수 정의\n", 74 | "\n", 75 | "def double(x):\n", 76 | " return x*2\n", 77 | "\n", 78 | "double(5)" 79 | ] 80 | }, 81 | { 82 | "cell_type": "code", 83 | "execution_count": 3, 84 | "metadata": {}, 85 | "outputs": [ 86 | { 87 | "data": { 88 | "text/plain": [ 89 | "(123, 6)" 90 | ] 91 | }, 92 | "execution_count": 3, 93 | "metadata": {}, 94 | "output_type": "execute_result" 95 | } 96 | ], 97 | "source": [ 98 | "## 인자와 리턴값이 둘 이상인 함수 정의\n", 99 | "\n", 100 | "def f_1(a,b,c): \n", 101 | " return a*100 + b*10 + c, a+b+c\n", 102 | "\n", 103 | "x, y = f_1(1, 2, 3)\n", 104 | "x, y" 105 | ] 106 | }, 107 | { 108 | "cell_type": "markdown", 109 | "metadata": {}, 110 | "source": [ 111 | "### 디폴트 값이 일부만 지정된 경우\n", 112 | "- 주의: 디폴트 값이 없는 인자는 앞에 배치해야 한다\n", 113 | "- 디폴트 값이 없는 인자는 필수 입력 인자임" 114 | ] 115 | }, 116 | { 117 | "cell_type": "code", 118 | "execution_count": 4, 119 | "metadata": {}, 120 | "outputs": [ 121 | { 122 | "name": "stdout", 123 | "output_type": "stream", 124 | "text": [ 125 | "123\n", 126 | "583\n", 127 | "369\n", 128 | "924\n" 129 | ] 130 | } 131 | ], 132 | "source": [ 133 | "## 일부 인자에 디폴트 값을 지정하는 함수 정의\n", 134 | "\n", 135 | "def f_2(a,b=2,c=3): \n", 136 | " return a*100 + b*10 + c\n", 137 | "\n", 138 | "print(f_2(1)) # 123, 반드시 하나 이상의 인자가 필요하며 a로 사용된다\n", 139 | "print(f_2(5,8)) # 383, 앞에서부터 차례로 a,b로 사용된다\n", 140 | "print(f_2(3,6,9)) # 369, 앞에서부터 차례로 a,b,c로 사용된다\n", 141 | "print(f_2(c=4,a=9))# 924, 순서에 관계없이 인자를 지정할 수 있다\n", 142 | " # 인자 a는 필수로 지정해야 한다" 143 | ] 144 | }, 145 | { 146 | "cell_type": "markdown", 147 | "metadata": {}, 148 | "source": [ 149 | "# 편리한 함수 사용법\n", 150 | "\n", 151 | "- lambda, map, apply" 152 | ] 153 | }, 154 | { 155 | "cell_type": "markdown", 156 | "metadata": {}, 157 | "source": [ 158 | "## lambda, 익명 함수 정의\n", 159 | "- def, return을 사용하지 않고 간단히 함수를 정의할 수 있다" 160 | ] 161 | }, 162 | { 163 | "cell_type": "code", 164 | "execution_count": 5, 165 | "metadata": {}, 166 | "outputs": [ 167 | { 168 | "data": { 169 | "text/plain": [ 170 | "40" 171 | ] 172 | }, 173 | "execution_count": 5, 174 | "metadata": {}, 175 | "output_type": "execute_result" 176 | } 177 | ], 178 | "source": [ 179 | "## def, return을 사용하지 않는 간단한 함수 정의법\n", 180 | "\n", 181 | "my_f = lambda x: x*10\n", 182 | "\n", 183 | "my_f(4)" 184 | ] 185 | }, 186 | { 187 | "cell_type": "markdown", 188 | "metadata": {}, 189 | "source": [ 190 | "## map, 리스트에 함수 적용하기\n", 191 | "\n", 192 | "- map의 첫번째 인자에는 함수를, 두번째 인자에는 데이터를 넣는다\n", 193 | "- 리스트 외에도 튜플, 배열에 대해서도 사용할 수 있다\n", 194 | "- 별도로 함수를 정의하지 않고 lambda를 사용하여 함수 내용만 정의할 수 있다" 195 | ] 196 | }, 197 | { 198 | "cell_type": "code", 199 | "execution_count": 6, 200 | "metadata": {}, 201 | "outputs": [ 202 | { 203 | "data": { 204 | "text/plain": [ 205 | "[10, 20, 30, 40]" 206 | ] 207 | }, 208 | "execution_count": 6, 209 | "metadata": {}, 210 | "output_type": "execute_result" 211 | } 212 | ], 213 | "source": [ 214 | "## 이미 정의된 함수명 my_f를 map()에 사용하는 예\n", 215 | "\n", 216 | "data = [1,2,3,4]\n", 217 | "y = list(map(my_f, data))\n", 218 | "y" 219 | ] 220 | }, 221 | { 222 | "cell_type": "code", 223 | "execution_count": 7, 224 | "metadata": {}, 225 | "outputs": [ 226 | { 227 | "data": { 228 | "text/plain": [ 229 | "[10, 20, 30, 40]" 230 | ] 231 | }, 232 | "execution_count": 7, 233 | "metadata": {}, 234 | "output_type": "execute_result" 235 | } 236 | ], 237 | "source": [ 238 | "# lambda를 사용하는 방법 (익명 함수)\n", 239 | "list(map(lambda i: i*10, data))" 240 | ] 241 | }, 242 | { 243 | "cell_type": "markdown", 244 | "metadata": {}, 245 | "source": [ 246 | "## apply, 시리즈나 데이터프레임에 함수 적용\n", 247 | "\n", 248 | "- apply는 리스트, 튜플, 배열에는 사용할 수 없다" 249 | ] 250 | }, 251 | { 252 | "cell_type": "code", 253 | "execution_count": 8, 254 | "metadata": { 255 | "scrolled": true 256 | }, 257 | "outputs": [ 258 | { 259 | "data": { 260 | "text/html": [ 261 | "
\n", 262 | "\n", 275 | "\n", 276 | " \n", 277 | " \n", 278 | " \n", 279 | " \n", 280 | " \n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | " \n", 289 | " \n", 290 | " \n", 291 | " \n", 292 | " \n", 293 | " \n", 294 | " \n", 295 | " \n", 296 | " \n", 297 | " \n", 298 | " \n", 299 | " \n", 300 | " \n", 301 | " \n", 302 | " \n", 303 | " \n", 304 | " \n", 305 | " \n", 306 | " \n", 307 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | "
citypopulationtempcars
0서울99013300
1부산35016120
2대구2501480
3대전1541390
4광주1501570
\n", 323 | "
" 324 | ], 325 | "text/plain": [ 326 | " city population temp cars\n", 327 | "0 서울 990 13 300\n", 328 | "1 부산 350 16 120\n", 329 | "2 대구 250 14 80\n", 330 | "3 대전 154 13 90\n", 331 | "4 광주 150 15 70" 332 | ] 333 | }, 334 | "execution_count": 8, 335 | "metadata": {}, 336 | "output_type": "execute_result" 337 | } 338 | ], 339 | "source": [ 340 | "## 데이터프레임 생성\n", 341 | "\n", 342 | "x = {'city': ['서울', '부산', '대구', '대전', '광주'],\n", 343 | " 'population': [990, 350, 250, 154, 150],\n", 344 | " 'temp': [13, 16, 14, 13, 15],\n", 345 | " 'cars': [300, 120, 80, 90, 70]}\n", 346 | "\n", 347 | "df = pd.DataFrame(x)\n", 348 | "df" 349 | ] 350 | }, 351 | { 352 | "cell_type": "code", 353 | "execution_count": 9, 354 | "metadata": {}, 355 | "outputs": [ 356 | { 357 | "data": { 358 | "text/plain": [ 359 | "population 378.8\n", 360 | "temp 14.2\n", 361 | "dtype: float64" 362 | ] 363 | }, 364 | "execution_count": 9, 365 | "metadata": {}, 366 | "output_type": "execute_result" 367 | } 368 | ], 369 | "source": [ 370 | "## 데이터프레임(시리즈)의 평균값 구하기\n", 371 | "\n", 372 | "df[[\"population\",\"temp\"]].apply(lambda x: x.mean())" 373 | ] 374 | } 375 | ], 376 | "metadata": { 377 | "kernelspec": { 378 | "display_name": "Python 3", 379 | "language": "python", 380 | "name": "python3" 381 | }, 382 | "language_info": { 383 | "codemirror_mode": { 384 | "name": "ipython", 385 | "version": 3 386 | }, 387 | "file_extension": ".py", 388 | "mimetype": "text/x-python", 389 | "name": "python", 390 | "nbconvert_exporter": "python", 391 | "pygments_lexer": "ipython3", 392 | "version": "3.8.8" 393 | }, 394 | "toc": { 395 | "base_numbering": 1, 396 | "nav_menu": {}, 397 | "number_sections": false, 398 | "sideBar": true, 399 | "skip_h1_title": false, 400 | "title_cell": "Table of Contents", 401 | "title_sidebar": "Contents", 402 | "toc_cell": false, 403 | "toc_position": { 404 | "height": "calc(100% - 180px)", 405 | "left": "10px", 406 | "top": "150px", 407 | "width": "209.65px" 408 | }, 409 | "toc_section_display": true, 410 | "toc_window_display": true 411 | } 412 | }, 413 | "nbformat": 4, 414 | "nbformat_minor": 4 415 | } 416 | -------------------------------------------------------------------------------- /b31_FileFolder.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "id": "347d5735", 6 | "metadata": {}, 7 | "source": [ 8 | "# 파일 다루기\n", 9 | "- 파일 열기 open(), with로 열기\n", 10 | "- csv, xlsx 파일 다루기\n", 11 | "- zip 파일 다루기\n", 12 | "- 폴더 내 파일 목록 다루기 (glob, listdir)\n", 13 | "- 폴더/파일 생성과 삭제" 14 | ] 15 | }, 16 | { 17 | "cell_type": "markdown", 18 | "id": "85c21065", 19 | "metadata": {}, 20 | "source": [ 21 | "## import" 22 | ] 23 | }, 24 | { 25 | "cell_type": "code", 26 | "execution_count": 1, 27 | "id": "9d63ff86", 28 | "metadata": {}, 29 | "outputs": [], 30 | "source": [ 31 | "import pandas as pd\n", 32 | "import numpy as np\n", 33 | "from numpy.random import rand\n", 34 | "import csv\n", 35 | "import os\n", 36 | "from glob import glob" 37 | ] 38 | }, 39 | { 40 | "cell_type": "markdown", 41 | "id": "a4a76086", 42 | "metadata": {}, 43 | "source": [ 44 | "## 데이터 생성과 저장하기\n", 45 | "- 숫자 데이터를 생성하고 csv 파일로 저장하기" 46 | ] 47 | }, 48 | { 49 | "cell_type": "code", 50 | "execution_count": 2, 51 | "id": "ebdcfb7d", 52 | "metadata": { 53 | "scrolled": true 54 | }, 55 | "outputs": [ 56 | { 57 | "name": "stdout", 58 | "output_type": "stream", 59 | "text": [ 60 | "\n", 61 | "\n", 62 | "0.53989\n", 63 | "0.34714\n", 64 | "0.23513\n", 65 | "0.53495\n", 66 | "0.64902\n", 67 | "0.01903\n", 68 | "0.17658\n", 69 | "0.57512\n", 70 | "0.74809\n", 71 | "0.91136\n", 72 | "\n" 73 | ] 74 | } 75 | ], 76 | "source": [ 77 | "## 0~1 사이의 랜덤 넘버 10개를 만들고 csv 파일에 저장하고 확인하기\n", 78 | "\n", 79 | "import numpy as np\n", 80 | "x1 = np.random.rand(10)\n", 81 | "print(type(x1)) # ndarray 타입\n", 82 | "\n", 83 | "np.savetxt(\"test_1.csv\", x1, delimiter=\",\", fmt = '%.5f')\n", 84 | "\n", 85 | "with open('test_1.csv') as f: \n", 86 | " contents = f.read()\n", 87 | " print(type(contents)) # str 타입\n", 88 | " print(contents)" 89 | ] 90 | }, 91 | { 92 | "cell_type": "markdown", 93 | "id": "b97fb30e", 94 | "metadata": {}, 95 | "source": [ 96 | "- !cat, !type 등 명령어로 직접 보기" 97 | ] 98 | }, 99 | { 100 | "cell_type": "code", 101 | "execution_count": 3, 102 | "id": "2e5f8a10", 103 | "metadata": {}, 104 | "outputs": [ 105 | { 106 | "name": "stdout", 107 | "output_type": "stream", 108 | "text": [ 109 | "0.53989\r\n", 110 | "0.34714\r\n", 111 | "0.23513\r\n", 112 | "0.53495\r\n", 113 | "0.64902\r\n", 114 | "0.01903\r\n", 115 | "0.17658\r\n", 116 | "0.57512\r\n", 117 | "0.74809\r\n", 118 | "0.91136\r\n" 119 | ] 120 | } 121 | ], 122 | "source": [ 123 | "!cat test_1.csv # 맥이나 리눅스에서\n", 124 | "#!type test_1.csv # 윈도우에서 " 125 | ] 126 | }, 127 | { 128 | "cell_type": "code", 129 | "execution_count": 4, 130 | "id": "f84fa45b", 131 | "metadata": {}, 132 | "outputs": [ 133 | { 134 | "name": "stdout", 135 | "output_type": "stream", 136 | "text": [ 137 | "\n", 138 | "[53.989 34.714 23.513 53.495 64.902 1.903 17.658 57.512 74.809 91.136]\n" 139 | ] 140 | } 141 | ], 142 | "source": [ 143 | "## csv 파일을 어레이로 읽어서 100을 곱한 값 보기\n", 144 | "\n", 145 | "x = np.loadtxt('test_1.csv', delimiter=',')\n", 146 | "print(type(x)) # ndarray 타입\n", 147 | "print(x*100)" 148 | ] 149 | }, 150 | { 151 | "cell_type": "markdown", 152 | "id": "dfa5787a", 153 | "metadata": {}, 154 | "source": [ 155 | "### 2차원 구조 데이터" 156 | ] 157 | }, 158 | { 159 | "cell_type": "code", 160 | "execution_count": 5, 161 | "id": "80eaf897", 162 | "metadata": {}, 163 | "outputs": [ 164 | { 165 | "name": "stdout", 166 | "output_type": "stream", 167 | "text": [ 168 | "\n", 169 | "0,1,2,3,4,5\n", 170 | "6,7,8,9,10,11\n", 171 | "12,13,14,15,16,17\n", 172 | "18,19,20,21,22,23\n", 173 | "24,25,26,27,28,29\n", 174 | "\n" 175 | ] 176 | } 177 | ], 178 | "source": [ 179 | "## 0~30 로 구성된 (5,6) 구조의 어레이를 csv 파일에 저장하기\n", 180 | "\n", 181 | "x2 = np.arange(30).reshape(5,6)\n", 182 | "\n", 183 | "np.savetxt(\"test_2.csv\", x2, delimiter=\",\", fmt = '%d')\n", 184 | "\n", 185 | "with open('test_2.csv') as f: \n", 186 | " contents = f.read()\n", 187 | " print(type(contents)) # str 타입\n", 188 | " print(contents)" 189 | ] 190 | }, 191 | { 192 | "cell_type": "code", 193 | "execution_count": 6, 194 | "id": "3d6c326b", 195 | "metadata": {}, 196 | "outputs": [ 197 | { 198 | "name": "stdout", 199 | "output_type": "stream", 200 | "text": [ 201 | "\n", 202 | "[[ 0. 1. 2. 3. 4. 5.]\n", 203 | " [ 6. 7. 8. 9. 10. 11.]\n", 204 | " [12. 13. 14. 15. 16. 17.]\n", 205 | " [18. 19. 20. 21. 22. 23.]\n", 206 | " [24. 25. 26. 27. 28. 29.]]\n" 207 | ] 208 | } 209 | ], 210 | "source": [ 211 | "## 2차원 csv 파일을 어레이로 읽는 예\n", 212 | "\n", 213 | "x = np.loadtxt('test_2.csv', delimiter=',')\n", 214 | "print(type(x))\n", 215 | "print(x)" 216 | ] 217 | }, 218 | { 219 | "cell_type": "code", 220 | "execution_count": 7, 221 | "id": "d671f7d5", 222 | "metadata": {}, 223 | "outputs": [ 224 | { 225 | "name": "stdout", 226 | "output_type": "stream", 227 | "text": [ 228 | "---- 3개의 행만 읽는다 ----\n", 229 | "[[ 0. 1. 2. 3. 4. 5.]\n", 230 | " [ 6. 7. 8. 9. 10. 11.]\n", 231 | " [12. 13. 14. 15. 16. 17.]]\n", 232 | "\n", 233 | "---- 처음 2개의 행은 읽지 않는다 ----\n", 234 | "[[12. 13. 14. 15. 16. 17.]\n", 235 | " [18. 19. 20. 21. 22. 23.]\n", 236 | " [24. 25. 26. 27. 28. 29.]]\n", 237 | "\n", 238 | "---- 컬럼을 (0,2,4)만 읽는다 ----\n", 239 | "[[ 0. 2. 4.]\n", 240 | " [ 6. 8. 10.]\n", 241 | " [12. 14. 16.]\n", 242 | " [18. 20. 22.]\n", 243 | " [24. 26. 28.]]\n" 244 | ] 245 | } 246 | ], 247 | "source": [ 248 | "## loadtxt()가 제공하는 읽는 옵션\n", 249 | "\n", 250 | "print('---- 3개의 행만 읽는다 ----')\n", 251 | "x = np.loadtxt('test_2.csv', delimiter=',', max_rows=3)\n", 252 | "print(x)\n", 253 | "\n", 254 | "print('\\n---- 처음 2개의 행은 읽지 않는다 ----')\n", 255 | "x = np.loadtxt('test_2.csv', delimiter=',', skiprows=2)\n", 256 | "print(x)\n", 257 | "\n", 258 | "print('\\n---- 컬럼을 (0,2,4)만 읽는다 ----')\n", 259 | "x = np.loadtxt('test_2.csv', delimiter=',', usecols=(0,2,4))\n", 260 | "print(x)" 261 | ] 262 | }, 263 | { 264 | "cell_type": "code", 265 | "execution_count": 8, 266 | "id": "7a3bbb48", 267 | "metadata": {}, 268 | "outputs": [ 269 | { 270 | "name": "stdout", 271 | "output_type": "stream", 272 | "text": [ 273 | "0,1,2,3,4,5\r\n", 274 | "6,7,8,9,10,11\r\n", 275 | "12,13,14,15,16,17\r\n", 276 | "18,19,20,21,22,23\r\n", 277 | "24,25,26,27,28,29\r\n" 278 | ] 279 | } 280 | ], 281 | "source": [ 282 | "!cat test_2.csv" 283 | ] 284 | }, 285 | { 286 | "cell_type": "markdown", 287 | "id": "278aa0e5", 288 | "metadata": {}, 289 | "source": [ 290 | "## 데이터프레임으로 읽기" 291 | ] 292 | }, 293 | { 294 | "cell_type": "code", 295 | "execution_count": 9, 296 | "id": "d56fac13", 297 | "metadata": {}, 298 | "outputs": [ 299 | { 300 | "data": { 301 | "text/html": [ 302 | "
\n", 303 | "\n", 316 | "\n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | " \n", 365 | " \n", 366 | " \n", 367 | " \n", 368 | " \n", 369 | " \n", 370 | " \n", 371 | " \n", 372 | " \n", 373 | " \n", 374 | " \n", 375 | "
012345
0012345
167891011
2121314151617
3181920212223
4242526272829
\n", 376 | "
" 377 | ], 378 | "text/plain": [ 379 | " 0 1 2 3 4 5\n", 380 | "0 0 1 2 3 4 5\n", 381 | "1 6 7 8 9 10 11\n", 382 | "2 12 13 14 15 16 17\n", 383 | "3 18 19 20 21 22 23\n", 384 | "4 24 25 26 27 28 29" 385 | ] 386 | }, 387 | "execution_count": 9, 388 | "metadata": {}, 389 | "output_type": "execute_result" 390 | } 391 | ], 392 | "source": [ 393 | "## 2차원 어레이를 데이터프레임으로 읽기\n", 394 | "\n", 395 | "df = pd.read_csv('test_2.csv', header=None) \n", 396 | "df" 397 | ] 398 | }, 399 | { 400 | "cell_type": "code", 401 | "execution_count": 10, 402 | "id": "2ff243a0", 403 | "metadata": {}, 404 | "outputs": [ 405 | { 406 | "data": { 407 | "text/plain": [ 408 | "array([[ 0, 1, 2, 3, 4, 5],\n", 409 | " [ 6, 7, 8, 9, 10, 11],\n", 410 | " [12, 13, 14, 15, 16, 17],\n", 411 | " [18, 19, 20, 21, 22, 23],\n", 412 | " [24, 25, 26, 27, 28, 29]])" 413 | ] 414 | }, 415 | "execution_count": 10, 416 | "metadata": {}, 417 | "output_type": "execute_result" 418 | } 419 | ], 420 | "source": [ 421 | "# 어레이로 변환하기\n", 422 | "df.values" 423 | ] 424 | }, 425 | { 426 | "cell_type": "markdown", 427 | "id": "997ff8ee", 428 | "metadata": {}, 429 | "source": [ 430 | "### read_csv 옵션\n", 431 | "\n", 432 | "- nrows=1000 # 상위 1000줄만 읽기\n", 433 | "- skiprows = 3 # 처음 3행 건너뛰기\n", 434 | "- skipfooter = 1000 # 맨 뒤의 1000행은 읽지 않기\n", 435 | "- usecols= (0,2,4) # 해당 컬럼만 읽기" 436 | ] 437 | }, 438 | { 439 | "cell_type": "code", 440 | "execution_count": 11, 441 | "id": "b631959e", 442 | "metadata": {}, 443 | "outputs": [ 444 | { 445 | "data": { 446 | "text/html": [ 447 | "
\n", 448 | "\n", 461 | "\n", 462 | " \n", 463 | " \n", 464 | " \n", 465 | " \n", 466 | " \n", 467 | " \n", 468 | " \n", 469 | " \n", 470 | " \n", 471 | " \n", 472 | " \n", 473 | " \n", 474 | " \n", 475 | " \n", 476 | " \n", 477 | " \n", 478 | " \n", 479 | " \n", 480 | " \n", 481 | " \n", 482 | " \n", 483 | " \n", 484 | " \n", 485 | " \n", 486 | " \n", 487 | " \n", 488 | " \n", 489 | " \n", 490 | " \n", 491 | " \n", 492 | " \n", 493 | " \n", 494 | " \n", 495 | " \n", 496 | " \n", 497 | " \n", 498 | " \n", 499 | " \n", 500 | " \n", 501 | " \n", 502 | "
012345
0012345
167891011
2121314151617
\n", 503 | "
" 504 | ], 505 | "text/plain": [ 506 | " 0 1 2 3 4 5\n", 507 | "0 0 1 2 3 4 5\n", 508 | "1 6 7 8 9 10 11\n", 509 | "2 12 13 14 15 16 17" 510 | ] 511 | }, 512 | "execution_count": 11, 513 | "metadata": {}, 514 | "output_type": "execute_result" 515 | } 516 | ], 517 | "source": [ 518 | "# 일부 행만 읽기 nrows 사용 (3줄 읽기)\n", 519 | "\n", 520 | "df2 = pd.read_csv('test_2.csv', nrows=3, header=None)\n", 521 | "df2" 522 | ] 523 | }, 524 | { 525 | "cell_type": "code", 526 | "execution_count": 12, 527 | "id": "0eee13b3", 528 | "metadata": {}, 529 | "outputs": [ 530 | { 531 | "data": { 532 | "text/html": [ 533 | "
\n", 534 | "\n", 547 | "\n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | " \n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | " \n", 564 | " \n", 565 | " \n", 566 | " \n", 567 | " \n", 568 | " \n", 569 | " \n", 570 | " \n", 571 | " \n", 572 | " \n", 573 | " \n", 574 | " \n", 575 | " \n", 576 | " \n", 577 | " \n", 578 | " \n", 579 | "
012345
0181920212223
1242526272829
\n", 580 | "
" 581 | ], 582 | "text/plain": [ 583 | " 0 1 2 3 4 5\n", 584 | "0 18 19 20 21 22 23\n", 585 | "1 24 25 26 27 28 29" 586 | ] 587 | }, 588 | "execution_count": 12, 589 | "metadata": {}, 590 | "output_type": "execute_result" 591 | } 592 | ], 593 | "source": [ 594 | "df2 = pd.read_csv('test_2.csv', skiprows=3, header=None)\n", 595 | "df2" 596 | ] 597 | }, 598 | { 599 | "cell_type": "markdown", 600 | "id": "2876daa7", 601 | "metadata": {}, 602 | "source": [ 603 | "### 액셀 한글 인코딩\n", 604 | "- 문자의 인코딩은 기본적으로 utf-8 을 사용한다\n", 605 | "- 그러나 한글의 경우 다른 인코딩으로 저장되는 경우가 있다\n", 606 | " - MS 액셀에서 csv로 저장할 때 한글이 cpc949로 인코딩된다. 이때는 아래 옵션이 필요하다\n", 607 | " - encoding = 'cpc949'\n", 608 | " - encoding = 'euc-kr'을 선택해야 하는 경우도 있다" 609 | ] 610 | }, 611 | { 612 | "cell_type": "markdown", 613 | "id": "c83b64f1", 614 | "metadata": {}, 615 | "source": [ 616 | "## zip 파일 \n", 617 | "### zip 파일 만들기\n", 618 | "- output.csv 을 output.zip로 압축하는 경우" 619 | ] 620 | }, 621 | { 622 | "cell_type": "code", 623 | "execution_count": 13, 624 | "id": "e5e1bb94", 625 | "metadata": {}, 626 | "outputs": [ 627 | { 628 | "name": "stdout", 629 | "output_type": "stream", 630 | "text": [ 631 | "0,1,2,3,4,5\r\n", 632 | "6,7,8,9,10,11\r\n", 633 | "12,13,14,15,16,17\r\n", 634 | "18,19,20,21,22,23\r\n", 635 | "24,25,26,27,28,29\r\n" 636 | ] 637 | } 638 | ], 639 | "source": [ 640 | "!cat test_2.csv" 641 | ] 642 | }, 643 | { 644 | "cell_type": "code", 645 | "execution_count": 14, 646 | "id": "8be295cc", 647 | "metadata": {}, 648 | "outputs": [ 649 | { 650 | "name": "stdout", 651 | "output_type": "stream", 652 | "text": [ 653 | "0.53989\r\n", 654 | "0.34714\r\n", 655 | "0.23513\r\n", 656 | "0.53495\r\n", 657 | "0.64902\r\n", 658 | "0.01903\r\n", 659 | "0.17658\r\n", 660 | "0.57512\r\n", 661 | "0.74809\r\n", 662 | "0.91136\r\n" 663 | ] 664 | } 665 | ], 666 | "source": [ 667 | "!cat test_1.csv" 668 | ] 669 | }, 670 | { 671 | "cell_type": "code", 672 | "execution_count": 15, 673 | "id": "2417f76f", 674 | "metadata": {}, 675 | "outputs": [ 676 | { 677 | "name": "stdout", 678 | "output_type": "stream", 679 | "text": [ 680 | "['test_1.csv', 'test_2.csv']\n" 681 | ] 682 | } 683 | ], 684 | "source": [ 685 | "## zip 파일로 압축하기\n", 686 | "\n", 687 | "import zipfile\n", 688 | "with zipfile.ZipFile('output.zip', 'w') as z:\n", 689 | " z.write('test_1.csv')\n", 690 | " z.write('test_2.csv')\n", 691 | "\n", 692 | "# zip에 포함된 파일명 보기와 압출 풀기\n", 693 | "\n", 694 | "with zipfile.ZipFile(\"output.zip\", 'r') as z: \n", 695 | " print(z.namelist()) \n", 696 | " z.extractall() " 697 | ] 698 | }, 699 | { 700 | "cell_type": "markdown", 701 | "id": "eefb97fe", 702 | "metadata": {}, 703 | "source": [ 704 | "- (참고) read_csv에서 zip 파일을 바로 읽을 수 있다 (압축을 풀 필요 없다)" 705 | ] 706 | }, 707 | { 708 | "cell_type": "code", 709 | "execution_count": 16, 710 | "id": "505c0b01", 711 | "metadata": {}, 712 | "outputs": [], 713 | "source": [ 714 | "# pd.read_csv('output.zip', header=None) " 715 | ] 716 | }, 717 | { 718 | "cell_type": "markdown", 719 | "id": "68034c94", 720 | "metadata": {}, 721 | "source": [ 722 | "# 폴더 작업" 723 | ] 724 | }, 725 | { 726 | "cell_type": "markdown", 727 | "id": "b00287b6", 728 | "metadata": {}, 729 | "source": [ 730 | "## 현재 폴더 위치 보기\n", 731 | "- cwd (current working directory)" 732 | ] 733 | }, 734 | { 735 | "cell_type": "code", 736 | "execution_count": 17, 737 | "id": "46cecf30", 738 | "metadata": { 739 | "colab": {}, 740 | "colab_type": "code", 741 | "id": "0Ew5j9rRYyGP", 742 | "outputId": "f51b2dba-fb1f-4e2d-c524-cff8c969d783" 743 | }, 744 | "outputs": [ 745 | { 746 | "name": "stdout", 747 | "output_type": "stream", 748 | "text": [ 749 | "/Users/hwa-kim/Dropbox/lab/book12\n" 750 | ] 751 | } 752 | ], 753 | "source": [ 754 | "## 현재 작업중인 폴더 경로 보기\n", 755 | "\n", 756 | "import os\n", 757 | "cwd = os.getcwd()\n", 758 | "print(cwd)" 759 | ] 760 | }, 761 | { 762 | "cell_type": "code", 763 | "execution_count": 18, 764 | "id": "327f211f", 765 | "metadata": {}, 766 | "outputs": [], 767 | "source": [ 768 | "## 특정 폴더가 없으면 새로 만들기\n", 769 | "\n", 770 | "if not os.path.exists(\"./data_tmp\"):\n", 771 | " os.mkdir(\"./data_tmp\")" 772 | ] 773 | }, 774 | { 775 | "cell_type": "markdown", 776 | "id": "a8535d48", 777 | "metadata": {}, 778 | "source": [ 779 | "## 폴더의 파일 목록 얻기\n", 780 | "- glob() 사용: 파일 타입을 지정할 수 있다\n", 781 | "- listdir() 사용: 경로를 줄 수 있다" 782 | ] 783 | }, 784 | { 785 | "cell_type": "markdown", 786 | "id": "d469c296", 787 | "metadata": {}, 788 | "source": [ 789 | "### glob()를 사용" 790 | ] 791 | }, 792 | { 793 | "cell_type": "code", 794 | "execution_count": 19, 795 | "id": "455c954d", 796 | "metadata": {}, 797 | "outputs": [ 798 | { 799 | "data": { 800 | "text/plain": [ 801 | "['b21_Jupyter.ipynb',\n", 802 | " 'b22_Python.ipynb',\n", 803 | " 'b23_Pandas_Groupby.ipynb',\n", 804 | " 'b24_numpy.ipynb',\n", 805 | " 'b25_Function.ipynb']" 806 | ] 807 | }, 808 | "execution_count": 19, 809 | "metadata": {}, 810 | "output_type": "execute_result" 811 | } 812 | ], 813 | "source": [ 814 | "## 현재 폴더의 파일 목록 얻기\n", 815 | "\n", 816 | "from glob import glob\n", 817 | "f_list = glob('b2*')\n", 818 | "sorted(f_list)" 819 | ] 820 | }, 821 | { 822 | "cell_type": "code", 823 | "execution_count": 20, 824 | "id": "3bd46c00", 825 | "metadata": {}, 826 | "outputs": [ 827 | { 828 | "name": "stdout", 829 | "output_type": "stream", 830 | "text": [ 831 | "/Users/hwa-kim/Dropbox/lab/book12/data_tmp\n" 832 | ] 833 | }, 834 | { 835 | "data": { 836 | "text/plain": [ 837 | "['b22_Python.ipynb',\n", 838 | " 'b21_Jupyter.ipynb',\n", 839 | " 'b24_numpy.ipynb',\n", 840 | " 'b25_Function.ipynb',\n", 841 | " 'b23_Pandas_Groupby.ipynb']" 842 | ] 843 | }, 844 | "execution_count": 20, 845 | "metadata": {}, 846 | "output_type": "execute_result" 847 | } 848 | ], 849 | "source": [ 850 | "## f_list의 파일 복사후 작업 폴더를 이동하여 복사 확인하기\n", 851 | "\n", 852 | "import shutil\n", 853 | "for file in f_list:\n", 854 | " shutil.copy2(file, './data_tmp')\n", 855 | "\n", 856 | "os.chdir('./data_tmp')\n", 857 | "print(os.getcwd())\n", 858 | "glob('*')" 859 | ] 860 | }, 861 | { 862 | "cell_type": "code", 863 | "execution_count": 21, 864 | "id": "8dc8e743", 865 | "metadata": {}, 866 | "outputs": [ 867 | { 868 | "name": "stdout", 869 | "output_type": "stream", 870 | "text": [ 871 | "/Users/hwa-kim/Dropbox/lab/book12/data_tmp\r\n" 872 | ] 873 | } 874 | ], 875 | "source": [ 876 | "!pwd" 877 | ] 878 | }, 879 | { 880 | "cell_type": "code", 881 | "execution_count": 22, 882 | "id": "90c81f66", 883 | "metadata": {}, 884 | "outputs": [], 885 | "source": [ 886 | "os.chdir('..')" 887 | ] 888 | }, 889 | { 890 | "cell_type": "code", 891 | "execution_count": 23, 892 | "id": "e2c7ce13", 893 | "metadata": {}, 894 | "outputs": [ 895 | { 896 | "name": "stdout", 897 | "output_type": "stream", 898 | "text": [ 899 | "/Users/hwa-kim/Dropbox/lab/book12\r\n" 900 | ] 901 | } 902 | ], 903 | "source": [ 904 | "!pwd" 905 | ] 906 | }, 907 | { 908 | "cell_type": "code", 909 | "execution_count": 24, 910 | "id": "78be9e64", 911 | "metadata": {}, 912 | "outputs": [ 913 | { 914 | "name": "stdout", 915 | "output_type": "stream", 916 | "text": [ 917 | "/Users/hwa-kim/Dropbox/lab/book12\n" 918 | ] 919 | } 920 | ], 921 | "source": [ 922 | "## 처음의 폴더로 이동하고 확인하기\n", 923 | "\n", 924 | "os.chdir(cwd)\n", 925 | "print(os.getcwd())" 926 | ] 927 | }, 928 | { 929 | "cell_type": "code", 930 | "execution_count": 25, 931 | "id": "33413f58", 932 | "metadata": {}, 933 | "outputs": [ 934 | { 935 | "name": "stdout", 936 | "output_type": "stream", 937 | "text": [ 938 | "/Users/hwa-kim/Dropbox/lab/book12\r\n" 939 | ] 940 | } 941 | ], 942 | "source": [ 943 | "!pwd" 944 | ] 945 | }, 946 | { 947 | "cell_type": "code", 948 | "execution_count": 26, 949 | "id": "3b5d0741", 950 | "metadata": {}, 951 | "outputs": [ 952 | { 953 | "name": "stdout", 954 | "output_type": "stream", 955 | "text": [ 956 | "/Users/hwa-kim/Dropbox/lab\n" 957 | ] 958 | } 959 | ], 960 | "source": [ 961 | "os.chdir('..')\n", 962 | "print(os.getcwd())" 963 | ] 964 | }, 965 | { 966 | "cell_type": "markdown", 967 | "id": "85844c89", 968 | "metadata": { 969 | "colab": {}, 970 | "colab_type": "code", 971 | "id": "tzRujJzJYyGX" 972 | }, 973 | "source": [ 974 | "## 기타 폴더 및 파일 관리 함수\n", 975 | "- os 패키지에서 제공하는 함수\n", 976 | " - 폴더 생성 mkdir()\n", 977 | " - 폴더 위치 이동 chdir()\n", 978 | " - 파일 이름 변경 rename()\n", 979 | " - 파일 삭제 remove()\n", 980 | " - 폴더 삭제 rmdir()" 981 | ] 982 | }, 983 | { 984 | "cell_type": "code", 985 | "execution_count": null, 986 | "id": "10f8fec1", 987 | "metadata": {}, 988 | "outputs": [], 989 | "source": [] 990 | } 991 | ], 992 | "metadata": { 993 | "kernelspec": { 994 | "display_name": "Python 3", 995 | "language": "python", 996 | "name": "python3" 997 | }, 998 | "language_info": { 999 | "codemirror_mode": { 1000 | "name": "ipython", 1001 | "version": 3 1002 | }, 1003 | "file_extension": ".py", 1004 | "mimetype": "text/x-python", 1005 | "name": "python", 1006 | "nbconvert_exporter": "python", 1007 | "pygments_lexer": "ipython3", 1008 | "version": "3.8.8" 1009 | }, 1010 | "toc": { 1011 | "base_numbering": 1, 1012 | "nav_menu": {}, 1013 | "number_sections": false, 1014 | "sideBar": true, 1015 | "skip_h1_title": false, 1016 | "title_cell": "Table of Contents", 1017 | "title_sidebar": "Contents", 1018 | "toc_cell": false, 1019 | "toc_position": { 1020 | "height": "calc(100% - 180px)", 1021 | "left": "10px", 1022 | "top": "150px", 1023 | "width": "232.3px" 1024 | }, 1025 | "toc_section_display": true, 1026 | "toc_window_display": true 1027 | } 1028 | }, 1029 | "nbformat": 4, 1030 | "nbformat_minor": 5 1031 | } 1032 | -------------------------------------------------------------------------------- /b51_ML_Intro.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "colab_type": "text", 7 | "id": "Dji53O40dPED" 8 | }, 9 | "source": [ 10 | "# 머신러닝\n", 11 | "\n", 12 | "- 수치를 예측하는 회귀, 카테고리를 예측하는 분류, 최적의 추천 등을 수행하는 소프트웨어로, 데이터를 보고 학습하여 점차 성능이 개선된다\n", 13 | "- 현재 인공지능을 구현하는 대표적인 방법이 머신러닝 기법이다\n", 14 | " - 인공지능을 구현하는 다른 방법으로 \"생각하는\" 컴퓨터를 만들거나, 언어를 문법적으로 이해하는 컴퓨터를 만드는 것, 또는 사람의 지식을 알고리즘이나 데이터로 구축하는 방법은 성공하지 못했다\n", 15 | " " 16 | ] 17 | }, 18 | { 19 | "cell_type": "markdown", 20 | "metadata": {}, 21 | "source": [ 22 | "- 머신러닝 동작\n", 23 | "" 24 | ] 25 | }, 26 | { 27 | "cell_type": "markdown", 28 | "metadata": {}, 29 | "source": [ 30 | "### 데이터 (X)\n", 31 | "- 훈련 (train) 데이터: 모델을 학습시키는데 사용하는 데이터\n", 32 | "- 검증 (validation) 데이터: 학습시킨 모델의 동작을 검증하는데 사용하는 데이터\n", 33 | "- 학습에 사용하는 데이터가 많을수록 예측, 추천 성능이 향상된다\n", 34 | " - 데이터 타입: 정형 데이터(테이블 데이터), 비정형 데이터(이미지, 텍스트, 센서 데이터 등)\n", 35 | "- 머신러닝 모델의 성능을 높이기 위해서는 원시(raw) 데이터로부터 적절한 학습 및 검증 데이터를 만드는 **데이터 전처리**가 반드시 필요하다\n", 36 | "\n", 37 | "### 머신러닝 모델\n", 38 | "- 입력 데이터(X)로부터 최적의 출력(y)을 얻는 소프트웨어\n", 39 | "- 최적의 출력이란 정답(label, target)을 잘 예측하는 것을 말한다\n", 40 | " - 최적의 출력을 얻기 위해서 모델을 구성하는 파라미터의 최적치를 찾는다(예: 선형 회귀에서 가중치 값)\n", 41 | "- 모델의 종류: 선형모델, 로지스틱 회귀, SVM, 결정트리, 랜덤 포레스트, kNN, 베이시언, 딥러닝 모델 (MLP, CNN, RNN 등)\n", 42 | "\n", 43 | "### 목적\n", 44 | "- 머신러닝의 목적은 다음 중 하나이다\n", 45 | " - 예측(predictive) 분석\n", 46 | "> 회귀 예측(regression): 수치를 예측 \n", 47 | "> 분류 예측(classification): 카테고리를 예측\n", 48 | " - 설명(descriptive)적 분석\n", 49 | " - 군집화(clustering)\n", 50 | " - 추천(recommendation)\n", 51 | " \n", 52 | "### 성능평가 (performance measure)\n", 53 | "- 모델이 원하는 동작을 잘 수행하는지를 평가하는 값으로, 주요 평가 척도는 다음과 같다\n", 54 | " - 회귀모델에서는 R-squared를 사용\n", 55 | " - 분류 모델에서는 정확도(accuracy), 정밀도(precision), 리콜(recall), f-1 점수, ROC-AUC 등을 사용 \n", 56 | " \n", 57 | "### 최적화기 (optimizer)\n", 58 | "- 학습을 통하여 모델 파라미터를 최적의 값으로 수렴시키는 알고리즘\n", 59 | "- 최적화 알고리즘으로는 경사하강법(GD: gradient descent)이 기본적으로 사용된다 \n", 60 | "\n", 61 | "### 손실함수 (loss function)\n", 62 | "- 최적화기는 손실함수를 최소화 하는 방향으로 동작한다\n", 63 | "- 즉, 손실함수는 최적화기의 동작이 잘 이루어지고 있는지를 모니터링하는 값이다\n", 64 | "- 손실함수로, 회귀 모델에서는 MSE(mean square error)를, 분류에서는 크로스 엔트로피(cross entrophy)를 주로 사용한다\n" 65 | ] 66 | }, 67 | { 68 | "cell_type": "markdown", 69 | "metadata": { 70 | "colab_type": "text", 71 | "id": "frUj53G19etJ" 72 | }, 73 | "source": [ 74 | "# 타이타닉 생존자 예측 \n", 75 | "\n", 76 | "" 77 | ] 78 | }, 79 | { 80 | "cell_type": "markdown", 81 | "metadata": {}, 82 | "source": [ 83 | "# 데이터\n", 84 | "- 타이타닉 탑승자 개인별 데이터를 보고 생존 여부를 예측하는 예제 데이터\n", 85 | "\n", 86 | "- Survival - 생존여부(타겟변수 y): 0 = No, 1 = Yes\n", 87 | "- Pclass - 티켓 등급: 1 = 1st, 2 = 2nd, 3 = 3rd\n", 88 | "- Sex - 성별: male, female\n", 89 | "- Age - 나이\n", 90 | "- SibSp - 동승한 형제, 배우자 수\n", 91 | "- Parch - 부모와 자녀의 수\n", 92 | "- Ticket - 티켓 번호\n", 93 | "- Fare - 승선 요금\n", 94 | "- Cabin - 캐빈(객실) 번호\n", 95 | "- Embarked - 승선한 항구: C = Cherbourg, Q = Queenstown, S = Southampton" 96 | ] 97 | }, 98 | { 99 | "cell_type": "markdown", 100 | "metadata": {}, 101 | "source": [ 102 | "## import" 103 | ] 104 | }, 105 | { 106 | "cell_type": "code", 107 | "execution_count": 1, 108 | "metadata": { 109 | "colab": { 110 | "base_uri": "https://localhost:8080/", 111 | "height": 252 112 | }, 113 | "colab_type": "code", 114 | "executionInfo": { 115 | "elapsed": 5306, 116 | "status": "ok", 117 | "timestamp": 1580277952501, 118 | "user": { 119 | "displayName": "김화종", 120 | "photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mCOtXjyLykQ_8l9Pq2rL3r5y110ynjRS1eb1EzpcQ=s64", 121 | "userId": "17353049580175403985" 122 | }, 123 | "user_tz": -540 124 | }, 125 | "id": "8B2q9YpA9etK", 126 | "outputId": "69adc8d6-edd3-4213-924c-f0b787ed72d7" 127 | }, 128 | "outputs": [], 129 | "source": [ 130 | "## 환경설정\n", 131 | "\n", 132 | "import pandas as pd\n", 133 | "import numpy as np\n", 134 | "import matplotlib.pyplot as plt\n", 135 | "import matplotlib\n", 136 | "\n", 137 | "# 맥에서 레티나 디스플레이 사용 설정\n", 138 | "%config InlineBackend.figure_format = 'retina'\n", 139 | "\n", 140 | "# 그림 크기와 폰트 설정\n", 141 | "matplotlib.rcParams['figure.figsize'] = (6,4)\n", 142 | "plt.rc('font', size=13)" 143 | ] 144 | }, 145 | { 146 | "cell_type": "markdown", 147 | "metadata": {}, 148 | "source": [ 149 | "\n", 150 | "## 데이터 전처리 종류\n", 151 | "\n", 152 | "- 데이터 클리닝 - 결측치 처리, 틀린값 처리\n", 153 | "- 스케일링 - 여러 변수 값의 범위를 동등한 조건으로 맞추는 것: 표준 스케일링, min-max 스케일링\n", 154 | "- 이상치 처리 - 이상치 탐지 및 제거\n", 155 | "- 데이터 변환 - 로그 변환, 카테고리 인코딩 등" 156 | ] 157 | }, 158 | { 159 | "cell_type": "code", 160 | "execution_count": 2, 161 | "metadata": {}, 162 | "outputs": [ 163 | { 164 | "name": "stdout", 165 | "output_type": "stream", 166 | "text": [ 167 | "0 0\n", 168 | "1 1\n", 169 | "2 1\n", 170 | "3 1\n", 171 | "4 0\n", 172 | "Name: Survived, dtype: int64\n" 173 | ] 174 | }, 175 | { 176 | "data": { 177 | "text/html": [ 178 | "
\n", 179 | "\n", 192 | "\n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | " \n", 216 | " \n", 217 | " \n", 218 | " \n", 219 | " \n", 220 | " \n", 221 | " \n", 222 | " \n", 223 | " \n", 224 | " \n", 225 | " \n", 226 | " \n", 227 | " \n", 228 | " \n", 229 | " \n", 230 | " \n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | " \n", 235 | " \n", 236 | " \n", 237 | " \n", 238 | " \n", 239 | " \n", 240 | " \n", 241 | " \n", 242 | " \n", 243 | " \n", 244 | " \n", 245 | " \n", 246 | " \n", 247 | " \n", 248 | " \n", 249 | " \n", 250 | " \n", 251 | " \n", 252 | " \n", 253 | " \n", 254 | " \n", 255 | " \n", 256 | " \n", 257 | " \n", 258 | " \n", 259 | " \n", 260 | " \n", 261 | " \n", 262 | " \n", 263 | " \n", 264 | " \n", 265 | " \n", 266 | " \n", 267 | " \n", 268 | " \n", 269 | " \n", 270 | " \n", 271 | " \n", 272 | " \n", 273 | " \n", 274 | " \n", 275 | " \n", 276 | " \n", 277 | " \n", 278 | " \n", 279 | " \n", 280 | " \n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | " \n", 289 | " \n", 290 | " \n", 291 | " \n", 292 | " \n", 293 | " \n", 294 | " \n", 295 | " \n", 296 | " \n", 297 | " \n", 298 | " \n", 299 | " \n", 300 | " \n", 301 | "
01234
Age-0.5904950.643971-0.2818780.4125090.412509
Embarked_C0.0000001.0000000.0000000.0000000.000000
Embarked_Q0.0000000.0000000.0000000.0000000.000000
Embarked_S1.0000000.0000001.0000001.0000001.000000
Fare-0.8775911.366380-0.7962811.066796-0.781901
Parch0.0000000.0000000.0000000.0000000.000000
Pclass_10.0000001.0000000.0000001.0000000.000000
Pclass_20.0000000.0000000.0000000.0000000.000000
Pclass_31.0000000.0000001.0000000.0000001.000000
Sex_female0.0000001.0000001.0000001.0000000.000000
Sex_male1.0000000.0000000.0000000.0000001.000000
SibSp1.0000001.0000000.0000001.0000000.000000
\n", 302 | "
" 303 | ], 304 | "text/plain": [ 305 | " 0 1 2 3 4\n", 306 | "Age -0.590495 0.643971 -0.281878 0.412509 0.412509\n", 307 | "Embarked_C 0.000000 1.000000 0.000000 0.000000 0.000000\n", 308 | "Embarked_Q 0.000000 0.000000 0.000000 0.000000 0.000000\n", 309 | "Embarked_S 1.000000 0.000000 1.000000 1.000000 1.000000\n", 310 | "Fare -0.877591 1.366380 -0.796281 1.066796 -0.781901\n", 311 | "Parch 0.000000 0.000000 0.000000 0.000000 0.000000\n", 312 | "Pclass_1 0.000000 1.000000 0.000000 1.000000 0.000000\n", 313 | "Pclass_2 0.000000 0.000000 0.000000 0.000000 0.000000\n", 314 | "Pclass_3 1.000000 0.000000 1.000000 0.000000 1.000000\n", 315 | "Sex_female 0.000000 1.000000 1.000000 1.000000 0.000000\n", 316 | "Sex_male 1.000000 0.000000 0.000000 0.000000 1.000000\n", 317 | "SibSp 1.000000 1.000000 0.000000 1.000000 0.000000" 318 | ] 319 | }, 320 | "execution_count": 2, 321 | "metadata": {}, 322 | "output_type": "execute_result" 323 | } 324 | ], 325 | "source": [ 326 | "## 데이터 전처리 전과정 실행\n", 327 | "\n", 328 | "# 데이터 다운로드하기\n", 329 | "df = pd.read_csv(\"https://raw.githubusercontent.com/StillWork/data/master/titanic_train.csv\")\n", 330 | "\n", 331 | "# 나이 결측치를 평균 나이로 대체 (대체한 것을 즉시 반영했다)\n", 332 | "df.Age.fillna(df.Age.mean(), inplace=True)\n", 333 | "\n", 334 | "# Embarked (항구명) 결측치가 있는 두 샘플은 삭제한다\n", 335 | "df = df[~df[\"Embarked\"].isnull()]\n", 336 | "\n", 337 | "# 사용하지 않을 컬럼 4개를 삭제한 데이터프레임을 만들고 백업한다\n", 338 | "df = df[df.columns.difference(['PassengerId','Name','Ticket','Cabin'])]\n", 339 | "\n", 340 | "# 선실등급, 성별, 항구명을 원핫 인코딩한다\n", 341 | "df = pd.get_dummies(df, columns=['Pclass','Sex','Embarked'])\n", 342 | "\n", 343 | "# 요금(Fare)은 로그를 취한 값을 사용한다\n", 344 | "df[\"Fare\"] = np.log(df.Fare +1)\n", 345 | "\n", 346 | "# 연속형 변수에 표준 스케일링을 적용한다\n", 347 | "from sklearn.preprocessing import StandardScaler\n", 348 | "scaler = StandardScaler()\n", 349 | "df.loc[:][['Age','Fare','SibSp','Parch']] = scaler.fit_transform(df[['Age','Fare','SibSp','Parch']])\n", 350 | "\n", 351 | "# 데이터분석에 사용할 X와 y 얻기\n", 352 | "X = df[df.columns.difference(['Survived'])]\n", 353 | "y = df.Survived\n", 354 | "\n", 355 | "# X, y 확인하기\n", 356 | "print(y[:5])\n", 357 | "X[:5].T" 358 | ] 359 | }, 360 | { 361 | "cell_type": "markdown", 362 | "metadata": {}, 363 | "source": [ 364 | "# 선형 분류 예측\n", 365 | "- 개인별 정보를 보고 이 사람의 생존 여부를 예측하는 선형 분류 모델을 만들어 보겠다\n", 366 | "- 분류에 대해서는 \"머신러닝\"에서 자세히 설명한다" 367 | ] 368 | }, 369 | { 370 | "cell_type": "markdown", 371 | "metadata": {}, 372 | "source": [ 373 | "## 이진 분류를 위한 결정 경계 (decision boundary)\n", 374 | "- 하나의 변수만 사용하는 경우 선형분류 결정 경계: $x_{1} > b$ \n", 375 | "- 두 개의 변수를 사용하는 경우 선형분류 결정 경계: $a_{1}x_{1}+a_{2}x_{2}+b >0$ \n", 376 | " > $x_{2} > -$$a_{1}\\over a_{2}$ $x_{1} - $$b\\over{a_{2}}$\n", 377 | "\n", 378 | "\n", 379 | "\n" 380 | ] 381 | }, 382 | { 383 | "cell_type": "markdown", 384 | "metadata": {}, 385 | "source": [ 386 | "## 모델 훈련 및 성능 측정\n", 387 | "\n", 388 | "\n", 389 | "- 목적 변수\n", 390 | " - 분류 예측 대상 데이터로서 여기서는 생존 여부 데이터인 Survived 컬럼의 값이다" 391 | ] 392 | }, 393 | { 394 | "cell_type": "code", 395 | "execution_count": 3, 396 | "metadata": {}, 397 | "outputs": [ 398 | { 399 | "data": { 400 | "text/plain": [ 401 | "(666, 223)" 402 | ] 403 | }, 404 | "execution_count": 3, 405 | "metadata": {}, 406 | "output_type": "execute_result" 407 | } 408 | ], 409 | "source": [ 410 | "## X와 y를 훈련 데이터와 검증 데이터로 나눈다 (디폴트 비율은 75%: 25%)\n", 411 | "\n", 412 | "from sklearn.model_selection import train_test_split\n", 413 | "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=8, shuffle=True)\n", 414 | "\n", 415 | "# 훈련 및 검증 데이터 갯수 확인\n", 416 | "len(X_train), len(X_test)" 417 | ] 418 | }, 419 | { 420 | "cell_type": "markdown", 421 | "metadata": {}, 422 | "source": [ 423 | "" 424 | ] 425 | }, 426 | { 427 | "cell_type": "code", 428 | "execution_count": 4, 429 | "metadata": {}, 430 | "outputs": [ 431 | { 432 | "data": { 433 | "text/plain": [ 434 | "0.8071748878923767" 435 | ] 436 | }, 437 | "execution_count": 4, 438 | "metadata": {}, 439 | "output_type": "execute_result" 440 | } 441 | ], 442 | "source": [ 443 | "## 선형 분류 모델로 SGDClassifier를 사용\n", 444 | "\n", 445 | "# 모델 생성\n", 446 | "from sklearn.linear_model import SGDClassifier\n", 447 | "model = SGDClassifier()\n", 448 | "\n", 449 | "# 학습 데이터를 사용하여 학습을 수행한다\n", 450 | "model.fit(X_train, y_train)\n", 451 | "\n", 452 | "# 검증 데이터를 사용하여 모델의 성능을 확인한다 (정확도를 알려준다)\n", 453 | "model.score(X_test, y_test)" 454 | ] 455 | }, 456 | { 457 | "cell_type": "code", 458 | "execution_count": 5, 459 | "metadata": {}, 460 | "outputs": [ 461 | { 462 | "data": { 463 | "text/html": [ 464 | "
\n", 465 | "\n", 478 | "\n", 479 | " \n", 480 | " \n", 481 | " \n", 482 | " \n", 483 | " \n", 484 | " \n", 485 | " \n", 486 | " \n", 487 | " \n", 488 | " \n", 489 | " \n", 490 | " \n", 491 | " \n", 492 | " \n", 493 | " \n", 494 | " \n", 495 | " \n", 496 | " \n", 497 | " \n", 498 | " \n", 499 | " \n", 500 | " \n", 501 | " \n", 502 | " \n", 503 | " \n", 504 | " \n", 505 | " \n", 506 | " \n", 507 | " \n", 508 | " \n", 509 | " \n", 510 | " \n", 511 | " \n", 512 | " \n", 513 | " \n", 514 | " \n", 515 | " \n", 516 | " \n", 517 | " \n", 518 | " \n", 519 | " \n", 520 | " \n", 521 | " \n", 522 | " \n", 523 | " \n", 524 | " \n", 525 | " \n", 526 | " \n", 527 | " \n", 528 | " \n", 529 | " \n", 530 | " \n", 531 | " \n", 532 | " \n", 533 | " \n", 534 | " \n", 535 | "
weight
Sex_male-2.0890
Age-1.6280
Pclass_3-1.5668
Pclass_2-0.7834
Embarked_C-0.5223
SibSp-0.5223
Embarked_S-0.2611
Embarked_Q-0.0000
Parch-0.0000
Fare0.8136
Sex_female1.3057
Pclass_11.5668
\n", 536 | "
" 537 | ], 538 | "text/plain": [ 539 | " weight\n", 540 | "Sex_male -2.0890\n", 541 | "Age -1.6280\n", 542 | "Pclass_3 -1.5668\n", 543 | "Pclass_2 -0.7834\n", 544 | "Embarked_C -0.5223\n", 545 | "SibSp -0.5223\n", 546 | "Embarked_S -0.2611\n", 547 | "Embarked_Q -0.0000\n", 548 | "Parch -0.0000\n", 549 | "Fare 0.8136\n", 550 | "Sex_female 1.3057\n", 551 | "Pclass_1 1.5668" 552 | ] 553 | }, 554 | "execution_count": 5, 555 | "metadata": {}, 556 | "output_type": "execute_result" 557 | } 558 | ], 559 | "source": [ 560 | "## 각 특성이 얼마나 중요하게 반영되었는지를 본다\n", 561 | "\n", 562 | "W = pd.DataFrame(model.coef_[0].round(4), index=X.columns\n", 563 | " , columns=['weight'])\n", 564 | "W.sort_values('weight')" 565 | ] 566 | }, 567 | { 568 | "cell_type": "code", 569 | "execution_count": 6, 570 | "metadata": {}, 571 | "outputs": [ 572 | { 573 | "data": { 574 | "text/plain": [ 575 | "" 576 | ] 577 | }, 578 | "execution_count": 6, 579 | "metadata": {}, 580 | "output_type": "execute_result" 581 | }, 582 | { 583 | "data": { 584 | "image/png": "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z1wYa+kYN25cu32amZlZ6/P0SDNrCSNHjuSBBx6omGhMmjRpYXICKZnaaKNFF0kt1dt2221ZeeWVF96fOnUqBx98MLfeeusi5SdPnsydd97JnXfeyRVXXMH111/PgAH1bas4depU9thjD/71r38tvDd79mxuv/12br/9dk4//fQOt3Xbbbex//77M2PGjIX3XnrpJS655BJuvvlm7r33XtZff/264jMzM7PewSNtZtYSdt11VwAefPDBxUbKSgnZsssuu8h10V133bVIOwDvvfce++23H7feeiv9+/fnzDPP5NFHH2Xy5Mk8++yz/OAHP6B///7ccccdHHnkkXXHfMQRRyxM2I477jgeffRR3n77be677z723Xdfvvvd7/K3v/2t3XbeeecdPv3pTzNs2DBuueUW3njjDSZNmsT3vvc9lllmGV599VVOPvnkRer84he/YPr06ay33noAfOtb32L69OmLHDvvvHPd38nMzMxaj0farOHy1gP1/oPAvIiY0xXxWM+w884706dPHxYsWMDdd9/N3nu3LRpQStJGjx7NxRdfvFjSNnPmzIXJU3Ea4iWXXMK4cePo06cPf/rTnxZJ6FZZZRVOPvlkRowYwe67787YsWO5//772XHHHTsU7z333MN1110HwCmnnMLZZ5+98NmOO+7Iddddx7777ssf//jHdtuaOnUq22+/PX/7299YfvnlF97/1re+xdtvv815553HDTfcwNSpUxk4cCAA/fr1o1+/fpT2s19uueVYaaWVOhS7mZmZ9SweabOu8ARpcZN6jl9UbMmWGgMGDGC77bYDFh9JK42iHXfccay++uq89NJLi7zX9o9//IP58+ezzDLLLDK69OMf/xiAo446apGErWi33XZj1KhRAFx11VUdjvf//u//ABg4cCDf/va3F3suifPOO6/D7Z1zzjmLJGwlhx12GADz5s3joYce6nB7ZmZm1ns4aTOzllEaJSsmbS+++CIvvPACq6yyCltvvfXC5KtYpnS+zTbbMGjQIADeeOMNHnvsMSCN4s2YMaPqsdVWWwEwfvz4Dsd6zz1p0dc99tiDFVZYoWKZTTbZhGHDhrXbVr9+/aomlZtsssnC89dff73D8ZmZmVnv4aTNGi4ihtax+mPpGN3suK35Kr3XdueddwKwyy67sMwyy1RM7ErnxcTn6aefXnh+6KGHMmDAgKrHhRdeCMCbbxa3J6yttDDKpptW2xIxef/7399uW6utthp9+1aerd6/f/+F57Nnz+5wfGZmZtZ7OGkzs5ax8847s8wyyyx8rw3apkaWkrXykbZZs2ZVfJ9t6tSpdfc/Z07HX6ucOXMmACuuuGLNch15z6xPnz4d6tMbfZuZmS2dnLSZWcsYOHAg2267LdCWlJU+SwnZFltssch7bf/4xz+YN28ekhZ5n62YTD344INERLtHtb3YKim1X0reqiku4W9mZmbWGU7azKylFKc/vvTSSzz//PML32cr2WWXXRaWKY3Ebb311gwePHhhmQ033HDh+YMPPtjwOEt7phWnYVbS3nMzMzOz9jhpM7OWUnyv7cYbbwTa3mcrKSZ2ld5nA1hvvfUWvm922WWXNTzOD3/4wwDcfvvtvPvuuxXLPPvsszzxxBMN77uotHfdggULurQfMzMzax4nbWbWUkoJ2oIFC/j+978PLPquGrQlaLfffjv//Oc/K5YBOOmkkwD429/+xvnnn1+z3+nTp/Pqq692OM5DDz0USBtjf/e7313seUTw9a9/vcPtddaQIUMA6ordzMzMehYnbWbWUgYNGrRwKmRphcbyhGyLLbZgtdVW49VXX2Xu3LlIWjhlsujoo49mjz32AOC///u/Ofjgg/nrX//Ka6+9xpQpU3j22We57rrrOOaYY1h33XX5xz/+0eE4P/KRj7DvvvsCcNZZZ3HCCSfw+OOPM3nyZB544AEOOOAArr/+ejbYYIPO/Bg6bPjw4QDccMMN3H777UybNo358+czf/58L1xiZmbWSzhpM7OWU0zSyt9nAxZL0rbccsuFI05Fffr04brrruPAAw8E4JprruFjH/sYa665JoMHD2aTTTbhgAMO4OKLL2bq1Kkst9xydcV56aWXLkyafvKTnyyMY8cdd+T666/n1FNPXbg4SrUl/ZfUl7/8ZZZddlneeust9thjDwYOHMiyyy7Lsssuu/B9PzMzM+vZuuZvEWa20MRz9m52CD3OrrvuunDvtPL32UpGjhzJtddeu7B8NSuttBLXXHMNd955J5deein/+Mc/eO2115g3bx6DBw9ms8024+Mf/zgHHnjgIhtZd8Qqq6zCPffcw/nnn8+VV17Jc889R//+/dlmm2044YQT2H///RcmjAMGDKir7Y7aeuutGTduHN///ve5//77eeut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\n", 585 | "text/plain": [ 586 | "
" 587 | ] 588 | }, 589 | "metadata": { 590 | "image/png": { 591 | "height": 251, 592 | "width": 438 593 | }, 594 | "needs_background": "light" 595 | }, 596 | "output_type": "display_data" 597 | } 598 | ], 599 | "source": [ 600 | "## 각 특성이 얼마나 중요하게 반영되었는지를 그래프로 보기\n", 601 | "\n", 602 | "W.sort_values('weight').plot(kind='barh')" 603 | ] 604 | }, 605 | { 606 | "cell_type": "markdown", 607 | "metadata": {}, 608 | "source": [ 609 | "- 위 결과를 보면 생존하는데 가장 많이 기여한 변수는 여성, 요금, 1등석 등이고\n", 610 | "- 생존하지 않는데 가장 많이 기여한 변수는 남성, 나이, 3등객실 등인 것을 알 수 있다" 611 | ] 612 | }, 613 | { 614 | "cell_type": "code", 615 | "execution_count": null, 616 | "metadata": {}, 617 | "outputs": [], 618 | "source": [] 619 | } 620 | ], 621 | "metadata": { 622 | "colab": { 623 | "collapsed_sections": [], 624 | "name": "g_15_결정트리_타이타닉_캐글.ipynb", 625 | "provenance": [] 626 | }, 627 | "kernelspec": { 628 | "display_name": "Python 3", 629 | "language": "python", 630 | "name": "python3" 631 | }, 632 | "language_info": { 633 | "codemirror_mode": { 634 | "name": "ipython", 635 | "version": 3 636 | }, 637 | "file_extension": ".py", 638 | "mimetype": "text/x-python", 639 | "name": "python", 640 | "nbconvert_exporter": "python", 641 | "pygments_lexer": "ipython3", 642 | "version": "3.8.8" 643 | }, 644 | "toc": { 645 | "base_numbering": 1, 646 | "nav_menu": {}, 647 | "number_sections": false, 648 | "sideBar": true, 649 | "skip_h1_title": false, 650 | "title_cell": "Table of Contents", 651 | "title_sidebar": "Contents", 652 | "toc_cell": false, 653 | "toc_position": { 654 | "height": "calc(100% - 180px)", 655 | "left": "10px", 656 | "top": "150px", 657 | "width": "202.675px" 658 | }, 659 | "toc_section_display": true, 660 | "toc_window_display": true 661 | } 662 | }, 663 | "nbformat": 4, 664 | "nbformat_minor": 1 665 | } 666 | --------------------------------------------------------------------------------