<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>mmtil.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Thu, 22 Sep 2022 08:59:42 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. mmtil.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/may_o5" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[2022-09-20]]></title>
            <link>https://velog.io/@may_o5/2022-09-20</link>
            <guid>https://velog.io/@may_o5/2022-09-20</guid>
            <pubDate>Thu, 22 Sep 2022 08:59:42 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-scikit-learn-라이브러리를-활용한-지도-학습">📌 scikit-learn 라이브러리를 활용한 지도 학습</h2>
<p>✏️ 분류는 종속변수(y, 정답, target)가 이진과 다중으로 나누어지는데 이는 연속적인 값이 아닌 범주형(type, class...)으로 오지선다 같은거. 회귀는 연속적인 값. 
✏️ 이진분류는 예/아니오 식으로 나올 수 있도록 하는 것. 셋 이상의 클래스는 다중분류 예/아니오 식의 정답이 아니라 특정 정답이 나올 수 있는 것.</p>
<p>✏️ 독립변수는 x, Feature, Data라고 많이 함. 회귀는 부동소수점수(실수)를 예측하는 것. </p>
<p>✏️ 일반화 성능이 최대가 되는 모델이 최적. 모델이 복잡할수록(학습을 많이 시키면) 과대적합상태가 되어 새로운 데이터를 만났을 때 일반화되지 못한다.</p>
<p>✏️ k-최근접 이웃 알고리즘 - 가장 가까운 훈련 데이터 포인트를 최근접 이웃으로 찾아 예측에 사용.</p>
<h3 id="✅-예제">✅ 예제</h3>
<p>✔️ <strong>iris(붓꽃) 품종 분류</strong>
▶️ 독립변수(x, feature, data) : 꽃잎, 꽃받침의 길이(cm) 4가지(length, width)
▶️ 종속변수(y, class, target) : 꽃의 품종(setosa, virginica, versicolor)</p>
<p>(+ 꽃잎, 꽃받침 길이에 따른 아이리스 품종 분류이기 때문에 꽃잎, 꽃받침 길이가 독립변수가 되고 품종이 종속변수가 되는 것)
<br></p>
<p>✏️ 데이터 준비하기</p>
<pre><code># 데이터 준비하기
from sklearn.datasets import load_iris
iris_dataset = load_iris()</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/1f9a06d7-7c73-4c52-95e2-11f7db0b300e/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/may_o5/post/fef0168b-6360-4266-9541-2739dc703f2b/image.png" alt=""></p>
<p>데이터 확인하면 numpy 배열형식으로 값이 입력되어있는 것을 알 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/may_o5/post/fff782a0-33e1-45ef-8d4b-110e7a79606f/image.png" alt=""></p>
<p>shape을 이용해서 확인하면 행렬 형식(데이터프레임으로 생각하면 row가 150개인거고 column이 4개인것.)</p>
<br>

<p>✏️ 산점도 그래프 그리기</p>
<pre><code>import matplotlib.pyplot as plt
import pandas as pd

# 데이터프레임을 사용하여 데이터 분석 -&gt; 독립변수(feature)와 종속변수(label)의 연관성을 확인
iris_df = pd.DataFrame(iris_dataset[&#39;data&#39;], columns=iris_dataset.feature_names)

# 각 독립변수(feature)들의 산점도 행렬 4x4

pd.plotting.scatter_matrix(iris_df, c=iris_dataset[&#39;target&#39;], figsize=(15,15),
                           marker=&#39;o&#39;, hist_kwds={&#39;bins&#39;:20}, s=60, alpha=.8)
plt.show()</code></pre><p>pandas 데이터프레임 형식으로 불러와서 산점도 차트를 그려보면</p>
<p><img src="https://velog.velcdn.com/images/may_o5/post/8cf9a33f-9e3d-4af4-b542-5ff7ea9aff80/image.png" alt=""></p>
<p>각 변수들 간의 분포형태를 확인할 수 있다.
x축이 petal length이고 y축이 petal width인 산점도가 가장 아이리스 품종이 눈에 띄게 분류되어있다.</p>
<pre><code>import numpy as np

plt.imshow([np.unique(iris_dataset[&#39;target&#39;])])
_ = plt.xticks(ticks=np.unique(iris_dataset[&#39;target&#39;]), labels=iris_dataset[&#39;target_names&#39;])  # underscore -&gt; _(값을 출력하고 싶지 않을 때 사용, 변수에 담으면 출력이 안되니까)</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/d3978fd2-65f5-4fe8-8460-ed521a7ac0e8/image.png" alt="">
종속변수(target)의 변수값이 어떻게 입력되어있는지 확인.
setosa가 0, versicolor가 1, virginica는 2.</p>
<pre><code>iris_df2 = iris_df[[&#39;petal length (cm)&#39;, &#39;petal width (cm)&#39;]]</code></pre><p>위에서 가장 적합했던 산점도의 변수만 뽑아서 데이터프레임 새로 형성.</p>
<pre><code>pd.plotting.scatter_matrix(iris_df2, c=iris_dataset[&#39;target&#39;], figsize=(15,15),
                           marker=&#39;o&#39;, hist_kwds={&#39;bins&#39;:20}, s=60, alpha=.8)
plt.show()</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/3201ea35-0300-45cf-8b70-6f4807eabfd6/image.png" alt=""></p>
<p>산점도를 그리면 2X2 형태로 그려짐</p>
<br>

<p>✏️ 훈련데이터와 테스트데이터 분리</p>
<pre><code># 훈련데이터 : 테스트 데이터 -&gt; 7:3 or 75:25 or 80:20 or 90:10 비율. 

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(iris_dataset[&#39;data&#39;], iris_dataset[&#39;target&#39;],  # 대문자 -&gt; 2개 이상일 때, 소문자 -&gt; 1개
                                                    test_size=0.25, random_state=777)  # random_state 고정된 시드부여

# 훈련데이터 확인하기 150 =&gt; 75% -&gt; 112개

X_train.shape

# 테스트데이터 확인하기 150 =&gt; 25% -&gt; 38개

X_test.shape</code></pre><br>

<p>✏️ 머신러닝 모델 설정 -&gt; k-최근접 이웃 알고리즘</p>
<pre><code>from sklearn.neighbors import KNeighborsClassifier

knn = KNeighborsClassifier(n_neighbors=1) # 이웃의 개수 1개로 지정

# 학습하기
knn.fit(X_train, y_train)

# 예측하기
y_pred = knn.predict(X_test)</code></pre><br>

<p>✏️ 모델 평가하기</p>
<pre><code># 정확도 확인하기
# 1) mean() 함수 사용해서 정확도 확인
np.mean(y_pred == y_test)</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/b960f00c-ced4-44e8-87bf-a02563087657/image.png" alt=""></p>
<p>🔼 결과</p>
<pre><code># 2) score() 함수를 사용해서 정확도 확인 -&gt; 테스트 셋으로 예측한 후 정확도 출력
knn.score(X_test, y_test)</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/fc3217c4-f8d0-45e7-baa9-c3061a266f2b/image.png" alt=""></p>
<p>🔼 결과</p>
<pre><code># 3) 평가 지표 계산
from sklearn import metrics

knn_report = metrics.classification_report(y_test, y_pred)
print(knn_report)</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/90066e4d-d37a-4a3c-ac6b-9d712143e55a/image.png" alt=""></p>
<p>🔼 결과</p>
<p>✔️ <strong>forge</strong>
▶️ 인위적으로 만들어진 이진분류 데이터셋</p>
<pre><code># 설치
pip install mglearn

# 이진 분류 데이터셋 확인하기
import mglearn
import matplotlib.pyplot as plt

import warnings
warnings.filterwarnings(&#39;ignore&#39;)

# 데이터셋 다운로드
X , y = mglearn.datasets.make_forge()

# 데이터 확인하기
print(&#39;X.shape : &#39;, X.shape)
print(&#39;y.shape : &#39;, y.shape)</code></pre><pre><code># 산점도 그리기
plt.figure(dpi=100)
plt.rc(&#39;font&#39;, family=&#39;NanumBarunGothic&#39;)

mglearn.discrete_scatter(X[:,0], X[:,1], y)

plt.legend([&#39;클래스 0&#39;, &#39;클래스 1&#39;], loc=4)
plt.xlabel(&#39;첫 번째 특성&#39;)
plt.ylabel(&#39;두 번째 특성&#39;)</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/968a37da-0acc-4654-b4b6-95b79f885b31/image.png" alt=""></p>
<br>

<p>✏️ k-최근접 이웃 알고리즘</p>
<pre><code># 1-최근접
import mglearn
import matplotlib.pyplot as plt

import warnings
warnings.filterwarnings(&#39;ignore&#39;)

plt.figure(dpi=100)
mglearn.plots.plot_knn_classification(n_neighbors=1)</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/c990d627-8099-4190-97b3-6087cfe4af1d/image.png" alt=""></p>
<p>🔼 결과</p>
<pre><code># 3-최근접
plt.figure(dpi=100)
mglearn.plots.plot_knn_classification(n_neighbors=3)</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/2999d94a-78e4-4d6b-b95b-dbb26373e158/image.png" alt=""></p>
<p>🔼 결과
: 1일 때와 3일 때의 결과가 다르다. = &gt; 최적점!</p>
<br>

<p>✏️ 이진 분류 문제 정의</p>
<pre><code># 데이터 준비하기
X, y = mglearn.datasets.make_forge() # X : 데이터(feature, 독립변수), y : 레이블(label, 종속변수)
from sklearn.model_selection import train_test_split

# 일반화 성능을 평가할 수 있도록 데이터 분리 -&gt; 훈련셋, 테스트셋
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=7)  # 75:25

X_train.shape  # 26 -&gt; 19
X_test.shape  # 26 -&gt; 7

# k-최근접 이웃 분류 모델 설정 - 위의 결과 토대로
from sklearn.neighbors import KNeighborsClassifier

clf = KNeighborsClassifier(n_neighbors=3)

# 모델 학습하기
clf.fit(X_train, y_train)

# score 함수를 사용하여 예측 정확도 확인
clf.score(X_test, y_test)
clf.score(X_train, y_train) # -&gt; 과대적합 상황</code></pre><br>

<p>✏️ KNeighborsClassifier 이웃의 수에 따른 성능평가</p>
<pre><code># 이웃의 수에 따른 정확도를 저장할 리스트 변수
train_scores = []
test_scores = []

n_neighbors_settings = range(1,15)

# 1 ~ 10까지 n_neighbors의 수를 증가시켜서 학습 후 정확도 저장
for n_neighbor in n_neighbors_settings:
  # 모델 생성
  clf = KNeighborsClassifier(n_neighbors=n_neighbor)
  clf.fit(X_train, y_train)

  # 훈련 세트 정확도 저장
  train_scores.append(clf.score(X_train, y_train))

  # 테스트 세트 정확도 저장
  test_scores.append(clf.score(X_test, y_test))

# 예측 정확도 비교 그래프 그리기
plt.figure(dpi=100)

plt.plot(n_neighbors_settings, train_scores, label=&#39;훈련 정확도&#39;)
plt.plot(n_neighbors_settings, test_scores, label=&#39;테스트 정확도&#39;)
plt.ylabel(&#39;정확도&#39;)
plt.xlabel(&#39;이웃의 수&#39;)
plt.legend()
plt.show()

# 최적점은 3!</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/f9f31b2f-41b4-432e-8748-972a142e303f/image.png" alt=""></p>
<p>✔️ <strong>위스콘신 유방암 데이터셋을 사용한 악성 종양(label 1) 예측하기</strong>
▶️ 독립변수(x, feature, data) : <code>cancer.feature_names</code> 치면 나옴
▶️ 종속변수(y, class, target) : 악성, 양성</p>
<pre><code># 데이터 불러오기
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()

# 산점도 그리기
import pandas as pd

df = pd.DataFrame(cancer[&#39;data&#39;], columns=cancer.feature_names)
pd.plotting.scatter_matrix(df, c=cancer[&#39;target&#39;], figsize=(15,15),
                           marker=&#39;o&#39;, hist_kwds={&#39;bins&#39;:20}, s=10, alpha=.8)
plt.show()</code></pre><pre><code># 종속변수의 값 확인
import numpy as np

plt.imshow([np.unique(cancer[&#39;target&#39;])])
_ = plt.xticks(ticks=np.unique(cancer[&#39;target&#39;]), labels=cancer[&#39;target_names&#39;])</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/42d9e8fb-ce34-43b5-bf02-60b43331fb2b/image.png" alt=""></p>
<p>🔼 결과(0이 악성, 1이 양성)</p>
<pre><code># 데이터 분리하기(훈련데이터, 테스트데이터)
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, random_state=7)

# 최적점 알아보
# 이웃의 수에 따른 정확도를 저장할 리스트 변수
train_scores = []
test_scores = []

n_neighbors_settings = range(1,21)

# 1 ~ 10까지 n_neighbors의 수를 증가시켜서 학습 후 정확도 저장
for n_neighbor in n_neighbors_settings:
  # 모델 생성
  clf = KNeighborsClassifier(n_neighbors=n_neighbor)
  clf.fit(X_train, y_train)

  # 훈련 세트 정확도 저장
  train_scores.append(clf.score(X_train, y_train))

  # 테스트 세트 정확도 저장
  test_scores.append(clf.score(X_test, y_test))

# 예측 정확도 비교 그래프 그리기
plt.figure(dpi=100)

plt.plot(n_neighbors_settings, train_scores, label=&#39;훈련 정확도&#39;)
plt.plot(n_neighbors_settings, test_scores, label=&#39;테스트 정확도&#39;)
plt.ylabel(&#39;정확도&#39;)
plt.xlabel(&#39;이웃의 수&#39;)
plt.legend()
plt.show()</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/bc351262-7b23-4a3a-89b4-230bf8ff549c/image.png" alt=""></p>
<p>🔼 결과(최적점은 7-8!)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022-09-19]]></title>
            <link>https://velog.io/@may_o5/2022-09-19</link>
            <guid>https://velog.io/@may_o5/2022-09-19</guid>
            <pubDate>Mon, 19 Sep 2022 08:14:53 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-머신러닝-및-딥러닝-개요">📌 머신러닝 및 딥러닝 개요</h2>
<h3 id="✅-머신러닝-프로세스">✅ 머신러닝 프로세스</h3>
<p>문제 정의 및 데이터 준비하기 -&gt; 학습하기 -&gt; 추론 및 평가 -&gt; 문제 정의 및 데이터 준비하기 -&gt; ...(문제정의를 잘못했을 경우 계속 다시 처음으로 돌아가서 문제점을 파악해야한다)</p>
<p>✏️ 문제 정의 및 데이터 준비하기</p>
<ul>
<li>명확한 문제 정의가 가장 중요</li>
<li>데이터를 자세히!!! 들여다볼 수 있어야 함.</li>
<li><blockquote>
<p>캐글 활용</p>
</blockquote>
</li>
</ul>
<p>✏️ 학습하기</p>
<ul>
<li>SOTA 모델 활용 -&gt; 내 데이터셋에 맞는 것 찾기</li>
<li>하이퍼파라미터 튜닝</li>
<li>모델 선택 -&gt; 내부요소 + 외부요소의 복합적 고려해야함</li>
</ul>
<p>✏️ 추론 및 평가</p>
<ul>
<li>추론? 학습된 모델로부터 정답이 없는 데이터에 대해 정답을 만드는 행위</li>
</ul>
<p>✏️ 용어</p>
<ul>
<li>데이터 준비하기<ul>
<li>클래스 불균형 : 클래스 분포 형태의 불균형, 이상탐지<ul>
<li>과소표집과 과대표집 : 과소표집은 다른 클래스에 비해 상대적으로 많이 나타나 있는 클래스의 개수를 줄이는 것, 과대표집은 개수가 적은 클래스를 복제하는 것(SMOTE 등 기법들을 활용)</li>
<li>회귀 : 연속적인 값 예측
(ex. 햄버거 가격, 영화 관객 수 등)
0과 1을 예측하는 로지스틱 회귀</li>
<li>분류 : 미리 정의된 여러 클래스 중 하나를 예측.
(ex. 햄버거 종류, 숫자 판별, 얼굴인식 또는 종류 구분 등.) 
이진분류, 다중분류, 다중 레이블 분류 등이 있다.</li>
<li>원핫 인코딩 : 하나의 클래스만 1이고 나머지 클래스는 전부 0으로 인코딩(더미변수같은건가 ...........)</li>
<li>교차 검증 : 모델의 타당성을 검증(과대적합 방지를 위해 사용)
학습데이터 - 모델 학습에 사용
검증 데이터 - 모델의 검증을 위해 사용, 주로 학습 도중에 사용
데이트 데이터 - 모델의 최종 성능 평가에 사용 
= &gt; 테스트 데이터는 최종 평가 이전에는 절대로 사용하면 안됨.</li>
</ul>
</li>
</ul>
</li>
<li>학습하기<ul>
<li>하이퍼파라미터 : 경험에 의해 결정되는 요소. 적합한 값을 찾기 위해 반복적인 실험과 많은 시간 투자가 필수이다.<ul>
<li>비지도 학습 : 학습 데이터에 정답이 포함되어 있지 않은 것. 모델에게 햄버거를 종류별로 여거 개 주고 같은 종류끼리 묶어보라고 하는 것(클러스터링)</li>
<li>생성 모델 : 햄버거 사진을 주고, 모델에게 다시 햄버거 사진을 그려보라고 하는 것.</li>
<li>강화 학습 : 에이전트가 주어진 환경에 대해 어떠한 행동을 결정하고, 이를 통해 얻는 보상으로 학습하는 것.</li>
<li>과대 적합 : 모델이 문제를 일반화하지 못하고 단순히 외워 새로운 데이터에 대해서는 좋은 성능을 보이지 못하는 경우.
= &gt; 해결 방안 : 학습 데이터를 더 다양하게 많이 수집, 정규화를 사용(규칙을 단순하게), 이상치 제거(but, 데이터가 많다면 제거하는 방법은 옳지 않음)</li>
<li>과소 적합 : 모델이 학습 데이터를 충분히 학습하지 않아 모든 측면에서 좋지 않은 성능을 보여주는 경우. 이와 같은 경우에는 모델이 아직 성능을 개선할 수 있는 여지가 있음. 
= &gt; 해결 방안 : 학습 데이터를 더 다양하게 많이 수집, 더 복잡한 모델을 사용, 모델을 충분히 학습시키기
❗❗ 두가지 문제를 동시에 해결할 수 있는 방안 -&gt; 양질의 데이터 수집!(사실 실무적으로는 불가능...)</li>
</ul>
</li>
</ul>
</li>
<li>평가하기<ul>
<li>혼동행렬 : 모델의 성능 평가에 사용.<ul>
<li>정확도 : 전체 데이터 중에서 실제 데이터의 정답과 모델이 예측한 정답이 같은 비율</li>
<li>정밀도와 재현율(Precision&amp;Recall) : 
정밀도 - 예측 True 중 실제 True 비율(예측잘하는거)
재현율 - 실제 True 중 예측 True 비율(실제가정말실제인가)</li>
<li>F1-Score : 정밀도와 재현율 둘 다 중요한 경우 사용(조화평균구함)</li>
<li>ROC 곡선 : 이진 분류 시스템에 대한 성능 평가 기법</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>✔️ 기존 사례에서 사용된 데이터셋을 먼저 적용해보는 것도 프로젝트를 성공으로 이끄는 지름길.
✔️ 커뮤니티 살펴보기 : Tensorflow Korea, 캐글 등..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022-09-14]]></title>
            <link>https://velog.io/@may_o5/2022-09-14</link>
            <guid>https://velog.io/@may_o5/2022-09-14</guid>
            <pubDate>Fri, 16 Sep 2022 01:02:58 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-기술-특강">📌 기술 특강</h2>
<br>

<h3 id="🗣️-김웅식교수님---빅데이터와-인공지능-및-ai와-만날-가까운-미래-예측">🗣️ 김웅식교수님 - 빅데이터와 인공지능 및 AI와 만날 가까운 미래 예측</h3>
<h4 id="✅-빅데이터의-가치">✅ 빅데이터의 가치</h4>
<p>✏️ 잦은 불량률은 빅데이터로 접근하지 않으면 규명하기 어렵다. 삼성의 갤럭시 노트 7 배터리가 여러대가 발화된 일이 있다. 삼성은 제품 20만대, 배터리 3만대를 동원하여 발화 원인을 조사하기도 했다.
이를 출시 전 빅데이터를 이용해 조사하여 예측했다면?</p>
<p>✏️ <strong>빅데이터의 특징</strong> : 3V(volume, velocity, variety)
규모가 방대하고 이 데이터의 생성주기가 빠를 뿐만아니라 이 방대한 양의 데이터를 빠르게 처리할 수 있어야 한다. 또한, 이 데이터의 종류는 다양하다는 특징.</p>
<h4 id="✅-빅데이터를-어떻게-활용하는가">✅ 빅데이터를 어떻게 활용하는가?</h4>
<p>✏️ 구글의 하둡 프레임워크가 보편화 되면서 빅데이터분석이 활발해졌다.
하둡이란 GFS(Google File System)과 MapReduce를 기반으로 빅데이터 분산처리 시스템 개발 프레임워크.</p>
<p>✏️ <strong>인공지능</strong> - 빅데이터를 분석하는 Anaystics의 핵심 방법. 머신러닝 기반의 인공지능은 빅데이터 학습을 통해 고도화되고 다양한 빅데이터 분석을 통해 다양한 분야의 인사이트를 추출할 수 있다.</p>
<h4 id="✅-인공지능">✅ 인공지능</h4>
<p>✏️ <strong>기호기반 인공지능 / 연결주의 인공지능</strong>
▶️ 기호기반 인공지능은 지식을 명제로 전환한 후 명제들 간의 연역적 추론</p>
<p>.........................
간만에 필기 열심히 햇것만 터치패드가 지혼자 드래그 하더니 싹 다 지웠다 미친거아닌가 ..........................................................
컨트롤 제트 했는데 이렇게만 살아났음 왜 이정도만 살아난건지는 저도 몰겟네요 ..^^.....................................................................................................</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022-09-07]]></title>
            <link>https://velog.io/@may_o5/2022-09-07</link>
            <guid>https://velog.io/@may_o5/2022-09-07</guid>
            <pubDate>Wed, 14 Sep 2022 05:25:53 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-유튜브-댓글-크롤링-및-워드-클라우드-시각화">📌 유튜브 댓글 크롤링 및 워드 클라우드 시각화</h2>
<p>(이것도 셀레니움을 사용해서 크롤링을 할 것이기 때문에 크롤링 전에 꼭 설치 해줘야 됨!!)</p>
<h3 id="✅-유튜브-댓글-크롤링">✅ 유튜브 댓글 크롤링</h3>
<pre><code># 라이브러리 임포트
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup

import time
import pandas as pd

import warnings
warnings.filterwarnings(&#39;ignore&#39;)</code></pre><pre><code>options = webdriver.ChromeOptions()
options.add_argument(&#39;--headless&#39;)        
options.add_argument(&#39;--no-sandbox&#39;)
options.add_argument(&#39;--disable-dev-shm-usage&#39;)

driver = webdriver.Chrome(&#39;chromedriver&#39;, options=options) # 크롬 브라우저 준비

driver.get(&#39;https://www.youtube.com/watch?v=ycEtLNlX_ss&#39;) # 열림
driver.implicitly_wait(3)

time.sleep(1.5)

driver.execute_script(&quot;window.scrollTo(0,800)&quot;) # 스크롤 800만큼 내리기
time.sleep(3)

# 댓글 수집을 위한 스크롤 내리기
last_height = driver.execute_script(&quot;return document.documentElement.scrollHeight&quot;)  # 최초 접속 시 스크롤 높이 초기화
# 스크롤 내리기를 끝날때 까지 

while True:
  driver.execute_script(&quot;window.scrollTo(0, document.documentElement.scrollHeight);&quot;)
  time.sleep(2)

  new_height = driver.execute_script(&quot;return document.documentElement.scrollHeight&quot;)

  if new_height == last_height:
    break

  last_height = new_height
  time.sleep(2)

  try:
    driver.find_element_bt_css_selecter(&#39;#dismiss-button &gt; a&#39;).click() # 유튜브 1달 무료 팝업 닫기
    time.sleep(1.5)

  except:
    pass</code></pre><p>🔼 크롤링을 위해 코딩을 통해 액션 부여하는 작업들이다.</p>
<br>

<pre><code># 댓글 크롤링
html_source = driver.page_source
soup = BeautifulSoup(html_source, &#39;html.parser&#39;)

id_list = soup.select(&#39;div#header-author &gt; h3 &gt; #author-text &gt; span&#39;)
comment_list = soup.select(&#39;yt-formatted-string#content-text&#39;)

id_final = []
comment_final = []

for i in range(len(comment_list)):
  temp_id = id_list[i].text
  temp_id = temp_id.replace(&#39;\n&#39;, &#39;&#39;).replace(&#39;\t&#39;, &#39;&#39;).replace(&#39; &#39;, &#39;&#39;).strip()
  id_final.append(temp_id) # 댓글 작성자

  temp_comment = comment_list[i].text
  temp_comment = temp_comment.replace(&#39;\n&#39;, &#39;&#39;).replace(&#39;\t&#39;, &#39;&#39;).replace(&#39;\r&#39;, &#39;&#39;).strip()
  comment_final.append(temp_comment) # 댓글 내용</code></pre><p>🔼 댓글 작성자와 댓글 내용 크롤링 작업 </p>
<br>

<pre><code># dataframe 만들기 (list -&gt; dic -&gt; dataframe)

youtube_dic = {&quot;아이디&quot;:id_final, &quot;댓글 내용&quot;:comment_final}
youtube_pd = pd.DataFrame(youtube_dic)</code></pre><p>🔼 크롤링한 것을 데이터프레임 형태로 저장</p>
<br>

<pre><code>youtube_pd.to_csv(&#39;유튜브댓글_크롤링_오후_20220909.csv&#39;, encoding=&#39;utf-8-sig&#39;, index=False)</code></pre><p>🔼 파일로 저장하는 것도 잊지말자 ..</p>
<br>

<h3 id="✅-워드-클라우드-시각화">✅ 워드 클라우드 시각화</h3>
<pre><code>df = pd.read_csv(&#39;/content/유튜브댓글_크롤링_오후_20220909.csv&#39;)
text = &quot; &quot;.join(li for li in df[&#39;댓글 내용&#39;].astype(str))</code></pre><p>데이터프레임형태로 불러온 다음 워드 클라우드 시각화를 위해 텍스트들을 join을 통해 모두 붙여준다.</p>
<p>워드 클라우드 시각화 코드는 늘 하던대로 ...
하면!!
<img src="https://velog.velcdn.com/images/may_o5/post/a209336d-7e68-4e6d-9029-7ee89ee2fb64/image.png" alt=""></p>
<p>이렇게 나옵니다
친구한테 댓글 1만개 이하인 영상 아무거나 보내보라고 한거라
이게 먼 영상이길래 사이토가 가장 크게 나타난건지는 모르겟네요 ...
영상에 나온 사람 이름인가??</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022-09-06]]></title>
            <link>https://velog.io/@may_o5/2022-09-06</link>
            <guid>https://velog.io/@may_o5/2022-09-06</guid>
            <pubDate>Wed, 14 Sep 2022 05:25:00 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-전국-의료-기관-데이터-분석">📌 전국 의료 기관 데이터 분석</h2>
<br>

<h3 id="✅-라이브러리-임포트-및-데이터-준비하기">✅ 라이브러리 임포트 및 데이터 준비하기</h3>
<pre><code>import pandas as pd
import matplotlib.pyplot as plt
import plotly.express as px

df = pd.read_csv(&#39;/content/data.csv&#39;, encoding=&#39;EUC-KR&#39;)

# NaN 데이터 확인하기
df.isna().sum()  -&gt; 소재지전화, 의료기관종별명, 의료인수, 입원실수, 병상수, 진료과목내용명

# 컬럼별 데이터 확인 -&gt; df.컬럼명.unique()</code></pre><br>

<h3 id="✅-데이터-분석하기">✅ 데이터 분석하기</h3>
<pre><code># 상세영업상태명 별 의료 기관 수
df[&#39;상세영업상태명&#39;].value_counts()

gb_df = df.groupby(by=[&#39;상세영업상태명&#39;]).size().reset_index(name=&#39;의료기관수&#39;)</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/62c91dd3-9f71-4e44-ba74-6842f52ea9ea/image.png" alt=""></p>
<p>🔼 gb_df 입력해 출력해보면 이렇게 데이터프레임형식으로 나타난다.</p>
<br>

<pre><code># 영업상태별 의료기관수 확인
px.histogram(gb_df, x=&#39;상세영업상태명&#39;, y=&#39;의료기관수&#39;)</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/dbc6bfe4-323d-4e7f-9a1c-ab907e687d22/image.png" alt=""></p>
<p>🔼 결과</p>
<br>

<pre><code># 파이차트
px.pie(gb_df, names=&#39;상세영업상태명&#39;, values=&#39;의료기관수&#39;)</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/895a058d-1734-4964-b0f8-499bf48e1370/image.png" alt=""></p>
<p>🔼 결과</p>
<br>

<pre><code># 지역명 별 의료 기관 수
df[&#39;지역명&#39;].value_counts()
lgb_df = df.groupby(by=[&#39;지역명&#39;, &#39;도시명&#39;, &#39;상세영업상태명&#39;, &#39;의료기관종별명&#39;]).size().reset_index(name=&#39;의료기관수&#39;)</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/f9ec16d6-6a91-4033-b6ee-5c5b6f53a6cb/image.png" alt=""></p>
<p>이 역시 변수명을 입력하여 출력할시 데이터프레임형태로 되어있는 것을 확인할 수 있다.</p>
<br>

<pre><code># 지역별 의료기관수 현황
px.histogram(lgb_df, x=&#39;지역명&#39;, y=&#39;의료기관수&#39;)</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/cf2437d2-1081-44e9-9b37-0780ce8607e8/image.png" alt=""></p>
<p>🔼 결과</p>
<br>

<pre><code># 지역에 따른 영업상태별 의료기관 수 확인
px.histogram(lgb_df, x=&#39;지역명&#39;, y=&#39;의료기관수&#39;, color=&#39;상세영업상태명&#39;)</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/7b1aba1b-30c9-4901-8f9e-834e498a0f70/image.png" alt=""></p>
<p>🔼 결과</p>
<br>

<pre><code># 지역에 따른 시군구별 의료기관 수 확인
px.histogram(lgb_df, x=&#39;지역명&#39;, y=&#39;의료기관수&#39;, color=&#39;도시명&#39;)</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/216ec331-869a-41ff-aa20-cc6f4dde6d62/image.png" alt=""></p>
<p>🔼 결과</p>
<br>

<pre><code># 지역에 따른 의료기관종류별 의료기관 수 확인
px.histogram(lgb_df, x=&#39;지역명&#39;, y=&#39;의료기관수&#39;, color=&#39;의료기관종별명&#39;)</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/e7ea141a-f15f-4fc7-8c60-4b7c3466dee3/image.png" alt=""></p>
<p>🔼 결과</p>
<br>

<pre><code># 지역별 의료기관수 확인하는 파이 차트
px.pie(lgb_df, names=&#39;지역명&#39;, values=&#39;의료기관수&#39;)</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/6474924f-8544-41bc-98e5-06f2135a6230/image.png" alt=""></p>
<p>🔼 결과</p>
<br>

<pre><code># 의료기관종별 의료기관수 현황
px.histogram(lgb_df, x=&#39;의료기관종별명&#39;, y=&#39;의료기관수&#39;)</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/fa0b5e12-c4b8-42ce-974a-df69f88dd023/image.png" alt=""></p>
<p>🔼 결과</p>
<br>

<pre><code># 의료기관종별 의료기관수 확인하는 파이 차트
px.pie(lgb_df, names=&#39;의료기관종별명&#39;, values=&#39;의료기관수&#39;)</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/a27e7e9e-68d5-4614-9b4c-e19f76d74c01/image.png" alt=""></p>
<p>🔼 결과</p>
<br>

<h3 id="✅-워드-클라우드-시각화">✅ 워드 클라우드 시각화</h3>
<pre><code>from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator

# 진료과목명을 하나의 text 형태로 변환
text = &quot; &quot;.join(cont for cont in df.진료과목내용명.astype(str))</code></pre><p>🔼 워드 클라우드 시각화를 위한 전처리 과정
(진료과목내용명으로 워드 클라우드 시각화)</p>
<br>

<pre><code>plt.subplots(figsize=(25, 15))

wordcloud = WordCloud(background_color=&#39;black&#39;, width=1000, height=700, font_path=fontpath).generate(text)

plt.axis(&#39;off&#39;)
plt.imshow(wordcloud, interpolation=&#39;bilinear&#39;)
plt.show()</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/5abef16a-625b-4c6e-86e7-645ca3eaab23/image.png" alt=""></p>
<p>위와 같은 결과가 나온다.</p>
<br>

<h3 id="✅-내-위치와-가장-가까운-의료기관-찾기">✅ 내 위치와 가장 가까운 의료기관 찾기</h3>
<p>✏️ 단 영업중인 병원만 검색되도록 하기
✏️ 내 위치는 도로명 주소로 입력 받고 가장 가까운 의료기관은 5개만 추출하여 지도 시각화
✏️ 내 위치 마커와 병원 마커를 표시하고 병원 마커를 클릭하면 병원명이 나오도록</p>
<h4 id="✔️-라이브러리-임포트-및-데이터-준비하기">✔️ 라이브러리 임포트 및 데이터 준비하기</h4>
<pre><code># 1) 라이브러리 임포트
import folium
import pandas as pd

# 2) 파일 업로드
df = pd.read_csv(&#39;/content/drive/MyDrive/data.csv&#39;, encoding=&#39;EUC-KR&#39;)

# NaN 데이터 확인하기
# df.isna().sum()</code></pre><h4 id="✔️-내-위치-주소를-입력하고-가까운-병원-5개만-추출하여-저장하기">✔️ 내 위치 주소를 입력하고 가까운 병원 5개만 추출하여 저장하기</h4>
<pre><code># 3) 주소를 좌표로 변환할 함수 준비
from geopy.geocoders import Nominatim

def geocoding(address):
  geolocoder = Nominatim(user_agent = &#39;South Korea&#39;, timeout=None)
  geo = geolocoder.geocode(address)
  crd = {&quot;lat&quot;:float(geo.latitude), &quot;lng&quot;:float(geo.longitude)}

  return crd

# 4) 사용자에게 주소를 입력받기
address = input(&quot;당신의 주소를 입력하시오.&quot;)
crd = geocoding(address)

# 5) 주소 좌표로 변환하여 tuple 형태로 변수에 담기
from geopy.distance import geodesic

myhome = folium.Map(location=[crd[&#39;lat&#39;],crd[&#39;lng&#39;]], zoom_start=14)

# 6) 병원데이터 dataframe에 거리 계산하여 담기
hpt = pd.DataFrame(columns=[&#39;사업장명&#39;, &#39;도시명&#39;, &#39;의료기관종별명&#39;, &#39;상세영업상태명&#39;, &#39;위도&#39;, &#39;경도&#39;, &#39;거리&#39;])
myhome = (crd[&#39;lat&#39;], crd[&#39;lng&#39;])

adr_s = address.split(&#39; &#39;)[0]
df = df.loc[df.지역명.str.contains(adr_s)]

for n in df.index:
  hpt_loc = (df.loc[n, &#39;위도&#39;], df.loc[n, &#39;경도&#39;])  # tuple 형태

  # hpt dataframe에 담기
  hpt.loc[n] = [df.loc[n, &#39;사업장명&#39;],
                df.loc[n, &#39;도시명&#39;],
                df.loc[n, &#39;의료기관종별명&#39;],
                df.loc[n, &#39;상세영업상태명&#39;],
                df.loc[n, &#39;위도&#39;], df.loc[n, &#39;경도&#39;],
                geodesic(myhome, hpt_loc).kilometers]

# 7) 내 위치에 가장 가까운 영업중인 병원 5개 뽑기
my_hpt = hpt.loc[hpt[&#39;상세영업상태명&#39;] == &#39;영업중&#39;]
my_hpt = my_hpt.sort_values(by=[&#39;거리&#39;]).head(5)</code></pre><h4 id="✔️-지도-시각화">✔️ 지도 시각화</h4>
<pre><code># 8) 지도 준비
my_map = folium.Map(location=[crd[&#39;lat&#39;], crd[&#39;lng&#39;]], zoom_start=14)
for n in my_hpt.index:
  folium.Marker([my_hpt.loc[n, &#39;위도&#39;], my_hpt.loc[n, &#39;경도&#39;]],
                popup=&#39;&lt;pre&gt;&#39;+my_hpt.loc[n, &#39;사업장명&#39;]+&#39;&lt;/pre&gt;&#39;,
                icon=folium.Icon(icon=&#39;hospital-o&#39;, prefix=&#39;fa&#39;)).add_to(my_map)
  folium.Marker([crd[&#39;lat&#39;], crd[&#39;lng&#39;]], icon=folium.Icon(color=&#39;red&#39;, icon=&#39;glyphicon glyphicon-home&#39;)).add_to(my_map)

my_map</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/1f84d036-d9f8-4a50-93fd-240b66723171/image.png" alt=""></p>
<p>🔼 지도 시각화 결과</p>
<p><br><br></p>
<h2 id="📌-네이버-공감뉴스-크롤링">📌 네이버 공감뉴스 크롤링</h2>
<pre><code>#이 부분은 처음 한번만 실행하면 됨
!pip install selenium
!apt-get update
!apt install chromium-chromedriver
!cp /usr/lib/chromium-browser/chromedriver /usr/bin</code></pre><p>셀레니움 라이브러리 사용을 위한 설치</p>
<pre><code># 1) 라이브러리 임포트
from selenium import webdriver
from bs4 import BeautifulSoup

import re
import time
from pytz import timezone
import datetime

import pandas as pd

import warnings
warnings.filterwarnings(&#39;ignore&#39;)

import matplotlib.pyplot as plt
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator


# 2) 데이터 프레임 생성
data = pd.DataFrame(columns=[&#39;순위&#39;, &#39;공감종류&#39;, &#39;기사제목&#39;, &#39;기사링크&#39;, &#39;기사내용&#39;, &#39;공감수&#39;, &#39;수집일자&#39;])


options = webdriver.ChromeOptions()
options.add_argument(&#39;--headless&#39;)   # headless -&gt; 창을 띄우지 않고 가상으로 진행하는 것
options.add_argument(&#39;--no-sandbox&#39;)
options.add_argument(&#39;--disable-dev-shm-usage&#39;) # deb/shm 디렉토리 사용X
driver = webdriver.Chrome(&#39;chromedriver&#39;, options=options)

url_list = [&#39;https://entertain.naver.com/ranking/sympathy/love&#39;,
            &#39;https://entertain.naver.com/ranking/sympathy/cheer&#39;,
            &#39;https://entertain.naver.com/ranking/sympathy/congrats&#39;,
            &#39;https://entertain.naver.com/ranking/sympathy/expect&#39;,
            &#39;https://entertain.naver.com/ranking/sympathy/surprise&#39;,
            &#39;https://entertain.naver.com/ranking/sympathy/sad&#39;]

# https://entertain.naver.com/ranking/sympathy/cheer
# https://entertain.naver.com/ranking/sympathy/congrats
# https://entertain.naver.com/ranking/sympathy/expect
# https://entertain.naver.com/ranking/sympathy/surprise
# https://entertain.naver.com/ranking/sympathy/sad


for i in range(len(url_list)):
  driver.get(url_list[i])

  driver.implicitly_wait(3)

  time.sleep(1.5)

  driver.execute_script(&#39;window.scrollTo(0,800)&#39;)
  time.sleep(3)

  html_source = driver.page_source
  soup = BeautifulSoup(html_source, &#39;html.parser&#39;)

  li = soup.select(&#39;li._inc_news_lst3_rank_reply&#39;) #ul.news_lst news_lst3 count_info &gt; li

  # 공감종류
  sym = url_list[i].split(&#39;.&#39;)[2].split(&#39;/&#39;)[3]

  for index_l in range(0, len(li)):
    try:
    # 순위
      rank = li[index_l].find(&#39;em&#39;, {&#39;class&#39;, &#39;blind&#39;}).text.replace(&#39;\n&#39;, &#39;&#39;).replace(&#39;\t&#39;, &#39;&#39;).strip()

    # 뉴스 제목
      title = li[index_l].find(&#39;a&#39;, {&#39;class&#39;, &#39;tit&#39;}).text.replace(&#39;\n&#39;, &#39;&#39;).replace(&#39;\t&#39;, &#39;&#39;).strip()

    # 뉴스 내용
      summary = li[index_l].find(&#39;p&#39;, {&#39;class&#39;, &#39;summary&#39;}).text.replace(&#39;\n&#39;, &#39;&#39;).replace(&#39;\t&#39;, &#39;&#39;).strip()

    # 뉴스 링크
      link = li[index_l].find(&#39;a&#39;).attrs[&#39;href&#39;]

    # 공감수
      sym_s = li[index_l].find(&#39;a&#39;, {&#39;class&#39;, &#39;likeitnews_item_likeit cheer&#39;}).text.replace(&#39;\n&#39;,&#39;&#39;).replace(&#39;\t&#39;,&#39;&#39;).strip().split(&#39;수&#39;)[1]

    # dataframe에 저장 (append)
      data = data.append({&#39;순위&#39; : rank,
                          &#39;공감종류&#39; : sym,
                          &#39;기사제목&#39; : title,
                          &#39;기사링크&#39; : &#39;http://entertain.naver.com&#39; + link,
                          &#39;기사내용&#39; : summary,
                          &#39;공감수&#39; : sym_s,
                          &#39;수집일자&#39; : datetime.datetime.now(timezone(&#39;Asia/Seoul&#39;)).strftime(&#39;%Y-%m-%d %H:%M:%S&#39;)}, ignore_index=True)

    except:
      pass

    print(&#39;Complets of &#39; + rank + &#39; : &#39; + title)

print(&#39;---------------------------------&#39;)
print(data)</code></pre><p>코드는 이렇게 짜봤었는데 사실 이렇게 하면 안된다!!!!!
<code>print(&#39;Complets of &#39; + rank + &#39; : &#39; + title)</code>
요 부분은 잘 출력되는데 데이터 append 과정에서 문제가 있는듯하다..
cheer만 데이터 프레임에 저장됨
글서 일단은 걍 포기하겟습니당👍</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022-09-05]]></title>
            <link>https://velog.io/@may_o5/2022-09-05</link>
            <guid>https://velog.io/@may_o5/2022-09-05</guid>
            <pubDate>Wed, 14 Sep 2022 05:24:34 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-과제리뷰">📌 과제리뷰</h2>
<p>✏️ 집계함수 -&gt; value_counts(), sum() ...</p>
<p>✏️ groupby -&gt; <code>ex. df.groupby([&#39;발생지시도&#39;])[&#39;사망자수&#39;].sum()</code></p>
<p>✏️ 정렬 - sort 사용</p>
<pre><code>ex1. df.groupby([&#39;발생지시도&#39;])[&#39;사망자수&#39;].sum().sort_values(ascending=False)</code></pre><pre><code>ex2. group_df = df.groupby([&#39;발생지시도&#39;])[[&#39;사망자수&#39;,&#39;부상자수&#39;,&#39;사상자수&#39;]].sum().sort_values(by=&#39;사망자수&#39;,ascending=False)</code></pre><p>-&gt; &#39;발생지시도&#39;가 인덱스가 됨, by=&#39; &#39;을 기준으로 sort
(+) group_df.T -&gt; 차트가 세로형태인 것을 가로 형태로 바꾸어줌</p>
<p>✏️ 그래프</p>
<pre><code>import matplotlib.pyplot as plt

plt.rcParams[&#39;figure.figsize&#39;]
plt.style.use(&#39;ggplot&#39;)
group_df[].T.plot.bar()
plt.show()</code></pre><h2 id="📌-내-주변-무료-와이파이-지도-시각화">📌 내 주변 무료 와이파이 지도 시각화</h2>
<p>(위에 적은 것들을 활용해서 .. )</p>
<h4 id="✅-라이브러리-임포트-및-데이터-준비하기">✅ 라이브러리 임포트 및 데이터 준비하기</h4>
<pre><code>import folium
import pandas as pd
import plotly.express as px

data = pd.read_csv(&#39;/content/dataset.csv&#39;, encoding=&#39;EUC-KR&#39;)
data.isna().sum() # 누락 확인 -&gt; 설치년월일 누락있음
data.설치시설구분.unique() -&gt; 서민·복지시설, 서민/복지시설,  서민·복지시설, 서민복지시설 로 중복있음-&gt; 서민복지시설(전처리)
data.loc[data.설치시설구분.str.contains(&#39;서민&#39;), &#39;설치시설구분&#39;] = &#39;서민복지시설&#39;</code></pre><br>

<h4 id="✅-데이터-분석하기">✅ 데이터 분석하기</h4>
<pre><code># 설치시도별 무료 WIFI 설치 현황 수
data[&#39;설치시도명&#39;].value_counts()

# 설치시도별, 설치시설구분, 서비스제공사명 무료 WIFI 설치 현황
group_data = data.groupby(by=[&#39;설치시도명&#39;, &#39;설치시설구분&#39;, &#39;서비스제공사명&#39;]).size().reset_index(name=&#39;총설치수&#39;) </code></pre><p>size()는 총 값을 계산해주지만 시리즈형태로 불러온다.(count는 데이터프레임)그래서 reset_index를 사용하여 컬럼으로 형태로 바꾸고 데이터 프레임 형태로 불러올 수 있다. 
그리고 또 name=&#39;&#39;을 통해 총 값 컬럼에 이름을 지정해줄 수 있다.</p>
<br>

<h4 id="✅-데이터-시각화하기">✅ 데이터 시각화하기</h4>
<pre><code># 설치시도별 WIFI 설치 현황
px.histogram(group_data, x=&#39;설치시도명&#39;, y=&#39;총설치수&#39;)</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/ad76493c-a37d-4967-bff7-2c3a2315c84c/image.png" alt=""></p>
<p>🔼 결과</p>
<br>

<pre><code># 설치시설별 WIFI 설치 현황
px.histogram(group_data, x=&#39;설치시설구분&#39;, y=&#39;총설치수&#39;)</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/7083e5e7-7487-470f-a14c-16f9518ce5d3/image.png" alt=""></p>
<p>🔼 결과</p>
<br>

<pre><code># 서비스제공사별 WIFI 설치 현황
px.histogram(group_data, x=&#39;서비스제공사명&#39;, y=&#39;총설치수&#39;)</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/28b6636d-3eea-433f-b6a9-a6daf84caeee/image.png" alt=""></p>
<p>🔼 결과</p>
<br>

<pre><code># 시도에 따른 설치시설별 와이파이 설치 현황
fig = px.histogram(data, x=&#39;설치시도명&#39;, color=&#39;설치시설구분&#39;)
fig.show()</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/d502e539-ce87-46d4-930e-426c2d1967dd/image.png" alt=""></p>
<p>🔼 결과</p>
<br>

<pre><code># 설치시도별 WIFI 설치 현황
fig = px.pie(group_data, names=&#39;설치시도명&#39;, values=&#39;총설치수&#39;)
fig.show()</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/26b856b5-ed50-470e-ba34-9bd919d014cb/image.png" alt=""></p>
<p>여기에 </p>
<pre><code>colors = [&#39;gold&#39;, &#39;mediumturquoise&#39;, &#39;darkorange&#39;, &#39;lightgreen&#39;]  # 색지정
fig.update_traces(textposition=&#39;inside&#39;, textinfo=&#39;percent+label&#39;, hoverinfo=&#39;value&#39;, textfont_size=20,
                  marker=dict(colors=colors, line=dict(color = &#39;#000000&#39;, width=2)))</code></pre><p>위의 코드를 입력하면 커스텀도 가능하다.
(textposition을 &#39;inside&#39;로 지정하여 파이차트 내부에 퍼센트나 이 값이 무엇인지 textinfo를 통해 명시가능하다. hover는 마우스 커서를 가져다대었을때 해당 정보를 보여주는 것이다.)</p>
<p><img src="https://velog.velcdn.com/images/may_o5/post/b8a020d5-7d46-4049-8f19-24877124af27/image.png" alt=""></p>
<p>모두 추가하면 이런식으로 그래프가 나타난다.</p>
<br>

<pre><code># 설치시설별 WIFI 설치 현황
fig = px.pie(group_data, names=&#39;설치시설구분&#39;, values=&#39;총설치수&#39;)
fig.update_traces(textposition=&#39;inside&#39;, textinfo=&#39;percent+label&#39;)
fig.show()</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/b0dc5dcf-7d86-48dd-8c1e-48ce2c62012a/image.png" alt=""></p>
<p>🔼 결과</p>
<h4 id="✔️-대전시-무료-와이파이-현황-분석">✔️ 대전시 무료 와이파이 현황 분석</h4>
<pre><code>dj_df = data.loc[data[&#39;설치시도명&#39;]==&#39;대전광역시&#39;]
dj_df.info()</code></pre><p>대전시 데이터만 따로 추출하여 저장</p>
<pre><code># 시군구에 따른 설치시설별 와이파이 설치 현황
fig = px.histogram(dj_df, x=&#39;설치시군구명&#39;, color=&#39;설치시설구분&#39;)
fig.show()</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/0018da7b-8c26-4446-961e-08a3e4bd7d19/image.png" alt=""></p>
<p>🔼 결과</p>
<br>

<pre><code># 시군구에 따른 관리기관별 와이파이 설치 현황
fig = px.histogram(dj_df, x=&#39;설치시군구명&#39;, color=&#39;관리기관명&#39;)
fig.show()</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/b68662f6-7567-4ad3-a21d-5324926fcbb5/image.png" alt=""></p>
<p>🔼 결과</p>
<br>

<pre><code># 집계데이터프레임 만들 때, 기준이 될 수 있는 컬럼을 모두 groupby 하자
# 합쳐서 시각화는 차트에서 제공 해줌
group_dj = dj_df.groupby(by=[&#39;설치년월&#39;, &#39;설치시군구명&#39;, &#39;설치시설구분&#39;, &#39;서비스제공사명&#39;, &#39;관리기관명&#39;]).size().reset_index(name=&#39;총설치수&#39;)</code></pre><p>groupby 후 시각화</p>
<pre><code># 시군구별 WIFI 설치 수와 설치시설 구분
fig = px.histogram(group_dj, x=&#39;설치시군구명&#39;, y=&#39;총설치수&#39;, color=&#39;설치시설구분&#39;)
fig.show()</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/96e03992-4ec6-4813-85a5-744942d7d9ac/image.png" alt=""></p>
<p>🔼 결과
위에서 groupby 하지 않고 그래프를 그렸을 때와 다른 결과가 나온다.
(아마 groupby 하면서 널값들이 있던 행들은 다 날라가서 그런거같다)</p>
<br>

<pre><code># 시군구별 WIFI 설치 수와 서비스제공사명
fig = px.histogram(group_dj, x=&#39;설치시군구명&#39;, y=&#39;총설치수&#39;, color=&#39;서비스제공사명&#39;)
fig.show()</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/5bf75edd-9f11-4cab-89e0-b51c9683c541/image.png" alt=""></p>
<p>🔼 결과</p>
<br>

<pre><code># 시군구별 WIFI 설치 현황
fig = px.pie(group_dj, names=&#39;설치시군구명&#39;, values=&#39;총설치수&#39;)
fig.update_traces(textposition=&#39;inside&#39;, textinfo=&#39;percent+label&#39;)
fig.show()</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/28dc12a6-9ad2-4643-b21f-6a393c30dd4e/image.png" alt=""></p>
<p>🔼 결과</p>
<br>

<pre><code># 설치시설구분 WIFI 설치 현황
fig = px.pie(group_dj, names=&#39;설치시설구분&#39;, values=&#39;총설치수&#39;)
fig.update_traces(textposition=&#39;inside&#39;, textinfo=&#39;percent+label&#39;)
fig.show()</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/c4e5d7a4-2239-4664-933a-0284a1cea792/image.png" alt=""></p>
<p>🔼 결과</p>
<br>

<pre><code># 서비스제공사별 WIFI 설치 현황
fig = px.pie(group_dj, names=&#39;서비스제공사명&#39;, values=&#39;총설치수&#39;)
fig.update_traces(textposition=&#39;inside&#39;, textinfo=&#39;percent+label&#39;)
fig.show()</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/ff5bec68-3a92-4377-bc8f-1bfc9207be9d/image.png" alt=""></p>
<p>🔼 결과</p>
<br>

<pre><code># 관리기관별 WIFI 설치 현황
fig = px.pie(group_dj, names=&#39;관리기관명&#39;, values=&#39;총설치수&#39;)
fig.update_traces(textposition=&#39;inside&#39;, textinfo=&#39;percent+label&#39;)
fig.show()</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/3885d306-f2ce-494b-b0ea-ea5b1487b050/image.png" alt=""></p>
<p>🔼 결과</p>
<h4 id="✔️-내-위치에-가장-가까운-무료-와이파이-찾기---지도-시각화">✔️ 내 위치에 가장 가까운 무료 와이파이 찾기 - 지도 시각화</h4>
<pre><code># 1. 내 위치 좌표 찾기
# 1) folium 지도에 click하면 좌표정보가 popup으로 띄어주고 그걸 확인해서 내 위치 좌표로 사용하는 방법
# 지도에 ClickForMarker 함수와 LatLngPopup 함수를 적용하여 위치를 Marker 표출

import folium

m = folium.Map(location=[36.3511, 127.3866], zoom_start=14)

# ClickForMarker 함수 적용
m.add_child(folium.ClickForMarker(popup=&#39;point&#39;))

# 위도/경도 팝업 활성화 시키도록 적용 -&gt; 지도를 탐색해서 좌표값 찾는데 도움
m.add_child(folium.LatLngPopup())</code></pre><p>🔼 이를 활용하여 보고 싶은 위치의 경도 위도 좌표 정보를 알아낼 수 있다.</p>
<br>

<pre><code># 2) 도로명 주소 -&gt; 좌표값으로 변환
from geopy.geocoders import Nominatim

def geocoding(address):
  geolocoder = Nominatim(user_agent = &#39;South Korea&#39;, timeout=None)
  geo = geolocoder.geocode(address)
  crd = {&quot;lat&quot;:str(geo.latitude), &quot;lng&quot;:str(geo.longitude)}

  return crd

crd = geocoding(&#39;서울 종로구 사직로 161&#39;)
print(crd[&#39;lat&#39;])
print(crd[&#39;lng&#39;])</code></pre><p>🔼 경도와 위도를 추출해내는 함수를 선언하여 address를 입력하면</p>
<p><img src="https://velog.velcdn.com/images/may_o5/post/039a4920-4e3f-476d-a671-7b48890a0f7d/image.png" alt=""></p>
<p>위와 같이 위도 경도 정보가 출력된다.</p>
<pre><code>myhome = folium.Map(location=[crd[&#39;lat&#39;],crd[&#39;lng&#39;]], zoom_start=14)

folium.Marker([crd[&#39;lat&#39;],crd[&#39;lng&#39;]], icon=folium.Icon(color=&#39;red&#39;, icon=&#39;glyphicon glyphicon-home&#39;)).add_to(myhome)
myhome</code></pre><p>위의 경도 위도 정보를 활용하여 지도 시각화를 하면</p>
<p><img src="https://velog.velcdn.com/images/may_o5/post/cc9e2522-30eb-4e1b-b3cc-28696991fbda/image.png" alt=""></p>
<p>이런 식으로 마커 표시 가능.</p>
<br>

<pre><code># 2. 나랑 가장 가까운 WIFI 찾기
from geopy.distance import geodesic

# 1) 무료 WIFI 위치 정보 가져오기
my_wifi = pd.DataFrame(columns=[&#39;설치시군구명&#39;, &#39;설치시설구분&#39;, &#39;위도&#39;, &#39;경도&#39;, &#39;거리&#39;])

myhome = (37.5759183, 126.9768292702487)

for n in data.index:
  wifi_loc = (data.loc[n, &#39;위도&#39;], data.loc[n, &#39;경도&#39;])  # tuple 형태
  print(type(wifi_loc))

  # 2) my_wifi dataframe에 담기
  my_wifi.loc[n] = [data.loc[n, &#39;설치시군구명&#39;], data.loc[n, &#39;설치시설구분&#39;], data.loc[n, &#39;위도&#39;], data.loc[n, &#39;경도&#39;], geodesic(myhome, wifi_loc).kilometers]</code></pre><p>위에서 구한 좌표 데이터를 토대로 주변 무료 와이파이 지도시각화를 하기 위해 무료 와이파이 데이터의 위도, 경도 정보를 튜플형태로 저장.
또, myhome(내 위치)와 wifi_loc(와이파이 위치)의 거리 차를 임포트한 geodesic을 이용해 데이터 프레임 거리 컬럼에 저장.</p>
<pre><code># myhome과 가장 가까운 WIFI top5 뽑기
my_wifi = my_wifi.sort_values(by=[&#39;거리&#39;]).head(10)
my_wifi</code></pre><p>그 후 거리가 가장 가까운 순으로 정렬하여 그 중 상위 10개만 저장한다.</p>
<pre><code>my_map = folium.Map(location=[37.5759183, 126.9768292702487], zoom_start=14)

for n in my_wifi.index:
  folium.Marker([my_wifi.loc[n, &#39;위도&#39;], my_wifi.loc[n, &#39;경도&#39;]],
                popup=&#39;&lt;pre&gt;&#39;+my_wifi.loc[n, &#39;설치시설구분&#39;]+&#39;&lt;/pre&gt;&#39;,
                icon=folium.Icon(icon=&#39;wifi&#39;, prefix=&#39;fa&#39;)).add_to(my_map)

  folium.Marker([37.5759183, 126.9768292702487], icon=folium.Icon(color=&#39;red&#39;, icon=&#39;glyphicon glyphicon-home&#39;)).add_to(my_map)

my_map</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/267e8127-36c8-4133-9704-7f9b20fa9448/image.png" alt=""></p>
<p>위에서 상위 10개를 뽑은 데이터를 토대로 지도 시각화한 결과</p>
<br>

<h4 id="✔️-도로명-주소를-입력받아-해당-위치에서-가장-가까운-무료-와이파이-찾기">✔️ 도로명 주소를 입력받아 해당 위치에서 가장 가까운 무료 와이파이 찾기</h4>
<pre><code># 1) 라이브러리 임포트
import folium
import pandas as pd
import plotly.express as px

# 2) wifi 데이터프레임 준비
data = pd.read_csv(&#39;/content/dataset.csv&#39;, encoding=&#39;EUC-KR&#39;)

# 3) 주소를 좌표로 변환할 함수 준비
from geopy.geocoders import Nominatim

def geocoding(address):
  geolocoder = Nominatim(user_agent = &#39;South Korea&#39;, timeout=None)
  geo = geolocoder.geocode(address)
  crd = {&quot;lat&quot;:float(geo.latitude), &quot;lng&quot;:float(geo.longitude)}

  return crd

# 4) 사용자에게 주소를 입력받기
address = input(&quot;당신의 주소를 입력하시오.&quot;)
crd = geocoding(address)

# 5) 주소 좌표로 변환하여 tuple 형태로 변수에 담기
from geopy.distance import geodesic

myhome = folium.Map(location=[crd[&#39;lat&#39;],crd[&#39;lng&#39;]], zoom_start=14)
my_wifi = pd.DataFrame(columns=[&#39;설치시군구명&#39;, &#39;설치시설구분&#39;, &#39;위도&#39;, &#39;경도&#39;, &#39;거리&#39;])

myhome = (crd[&#39;lat&#39;], crd[&#39;lng&#39;])

keypoint = address.split(&#39; &#39;)[0]
data = data.loc[data.설치시도명.str.contains(keypoint)]

# 6) my_wifi dataframe에 거리 계산하여 담기
for n in data.index:
  wifi_loc = (data.loc[n, &#39;위도&#39;], data.loc[n, &#39;경도&#39;])  # tuple 형태

  # my_wifi dataframe에 담기
  my_wifi.loc[n] = [data.loc[n, &#39;설치시군구명&#39;], data.loc[n, &#39;설치시설구분&#39;], data.loc[n, &#39;위도&#39;], data.loc[n, &#39;경도&#39;], geodesic(myhome, wifi_loc).kilometers]

# 7) 내 위치에 가장 가까운 wifi 10개 뽑기
my_wifi = my_wifi.sort_values(by=[&#39;거리&#39;]).head(10)

# 8) 지도 준비
for n in my_wifi.index:
  folium.Marker([my_wifi.loc[n, &#39;위도&#39;], my_wifi.loc[n, &#39;경도&#39;]],
                popup=&#39;&lt;pre&gt;&#39;+my_wifi.loc[n, &#39;설치시설구분&#39;]+&#39;&lt;/pre&gt;&#39;,
                icon=folium.Icon(icon=&#39;wifi&#39;, prefix=&#39;fa&#39;)).add_to(my_map)
  folium.Marker([crd[&#39;lat&#39;], crd[&#39;lng&#39;]], icon=folium.Icon(color=&#39;red&#39;, icon=&#39;glyphicon glyphicon-home&#39;)).add_to(my_map)

my_map</code></pre><p>위에서 입력한 코드와 유사하지만 도로명 주소를 사용자에게 입력받기 때문에 입력받은 주소를 함수를 통해 위도 경도로 변환하여 저장하기때문에 위도 경도 입력시 crd[&#39;lat], crd[&#39;lng&#39;]로 입력해야한다.</p>
<p><img src="https://velog.velcdn.com/images/may_o5/post/a1445a55-609e-4fba-af74-2ee0aedcb6d1/image.png" alt=""></p>
<p>이렇게 입력한 주소 중심으로 무료 와이파이가 표시된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022-09-02]]></title>
            <link>https://velog.io/@may_o5/2022-09-02-1xs08y8i</link>
            <guid>https://velog.io/@may_o5/2022-09-02-1xs08y8i</guid>
            <pubDate>Wed, 14 Sep 2022 05:23:46 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-esg-특강">📌 ESG 특강</h2>
<br>

<h3 id="✅-공생-회사-소개">✅ 공생 회사 소개</h3>
<p>: ESG 중 S의 인권적인 부분, 지역 사회 관계 구축 등을 주축에 둔 회사이다. 실제로 혁신 창업지원 사례로 실험실 창업팀 MVP 제작 및 멘토링 지원 프로그램, 라오스 불발탄 피해 절단장애인을 위한 다목적 맞춤 의수 및 자립생활용 보조기기 자급화 실증사업 등이 있다. </p>
<br>

<h3 id="✅-창업">✅ 창업</h3>
<p>: 메이커란? 다른 나라에는 Garage가 있는데 우리나라는 그런 창고공간이 주거공간에 있기가 흔치 않아서 나라에서 메이커 스페이스를 만들고자 노력하고 있다. 창업관련해서 크라우드 펀딩쪽으로도 활용가능.</p>
<br>

<h3 id="✅-소셜벤처">✅ 소셜벤처</h3>
<p>해결 가능한 사회문제들을 비즈니스를 하는 곳. 요즘에는 플라스틱 사용에 관한 환경문제가 대두되어지고 있다. 사회적 기업과의 차이점은 사회적 가치를 창출하면서도 경제적 가치 역시 창출한다는 것이다. 사례로는 닷워치, 설리번+앱, 거동이 불편한 노인 및 장애인들이 국가 지원을 받아 이용할 수 있는 저비용 퍼스널 로봇 개발 등이 있고, 창업지원 사례로는 장애 체험을 통해 문제를 발견해 메이킹 기술을 접목하여 해결방안도출해내는 일상혁신 메이커톤 등이 있다.</p>
<br>

<h3 id="✅-sdg-gdp">✅ SDG, GDP</h3>
<p>: GDP란 우리나라 안에 있는 모든 사람이 생산한 가치를 말한다. 하지만 경제적인 척도로 나라를 평가하기에 부족한 면이 있기 때문에 나온 것이 SDG이다. SDG란 지속 가능 발전 목표로 이는 지속 가능한 발전을 위한 국제적인 약속이다. 목적으로는 경제 사회 환경의 균형 발전.</p>
<br>

<h3 id="✅-csr-csv-esg">✅ CSR, CSV, ESG</h3>
<p>: CSR은 기업 활동 외 사회 공헌 활동을 말하는 것이며, CSV는 기존의 비즈니스 모델에서 사회적 가치와 경제적 가치를 창출하는 것이고 ESG는 기업의 비재무적요소이다. 이 세가지를 기준으로 기업가치를 평가하는 주요지표로 대두되고 있다. Blackrock과 미국의 전경련이 주주 이익 극대화가 비즈니스의 장기적 성과를 망칠 수 있음을 강조. 우리나라 사례로는 매일 유업의 특수분유 제조.</p>
<br>

<h3 id="✅-적정기술">✅ 적정기술</h3>
<p>: 적정기술이란 그 기술이 사용되는 사회공동체의 정치적, 문화적, 환경적 조건을 고려해 해당 지역에서 지속적인 생산과 소비가 가능하도록 만들어진 기술이다. 적정기술의 조건은 쉽게이용가능하고, 적은비용이어야하며 간단해야하며 현지 재료를 사용해야한다. 또한 변화 가능해야하며 스스로 제작할 수 있어야하고 지역 발전에 보탬이 되어야 한다는 것이다. 이의 사례로는 물을 바로 정화해 마실 수 있는 라이프 스트로, 개발도상국 아이들을 위한 저렴한 가격으로 제작된 컴퓨터 등이 있다. 또한 이외에도 보조기기를 공급을 해주거나 더 나아가 직접 제작할 수 있게끔 해줄 수 있다.</p>
<p><br><br></p>
<h2 id="📌-진로맵-그리기">📌 진로맵 그리기</h2>
<br>

<h3 id="✅-컨셉맵-bok">✅ 컨셉맵 BOK</h3>
<p>: 서로 의미있는 관계를 가지고 있는 중요한 컨셉(정보, 키워드)를 하나의 그림으로 표현. (ex. 스누피가든)</p>
<br>

<h3 id="✅-진로맵-작성cmap">✅ 진로맵 작성(+cmap)</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022-09-01]]></title>
            <link>https://velog.io/@may_o5/2022-09-01</link>
            <guid>https://velog.io/@may_o5/2022-09-01</guid>
            <pubDate>Wed, 14 Sep 2022 05:23:26 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-네이버-랭킹-뉴스-크롤링">📌 네이버 랭킹 뉴스 크롤링</h2>
<h3 id="✅-많이-본-뉴스">✅ 많이 본 뉴스</h3>
<pre><code>from urllib.request import urlopen
from bs4 import BeautifulSoup
from pytz import timezone

import pandas as pd
import datetime</code></pre><p>🔼 크롤링에 필요한 라이브러리(url, BeautifulSoup 등)와 수집일자를 출력하기 위한 라이브러리 임포트</p>
<p><img src="https://velog.velcdn.com/images/may_o5/post/1b70d9b9-cdbe-4729-8334-95b20b7985f3/image.png" alt=""></p>
<p>🔼 크롤링할 랭킹 뉴스 화면</p>
<p>개발자 모드로 보면 🔽
<img src="https://velog.velcdn.com/images/may_o5/post/aab70316-ca22-4308-9dbc-b055a6c5fefd/image.png" alt="">
이런식으로 볼 수 있다. 이 html 태그들을 확인하면서 크롤링해야한다.</p>
<br>

<pre><code># 1) 데이터 프레임 생성
data = pd.DataFrame(columns=[&#39;언론사명&#39;, &#39;순위&#39;, &#39;기사제목&#39;, &#39;기사링크&#39;, &#39;수집일자&#39;])

# 2) 네이버 랭킹 뉴스 접속 주소 준비 : https://news.naver.com/main/ranking/popularDay.naver
url = &#39;https://news.naver.com/main/ranking/popularDay.naver&#39;

# 3) url에서 html 가져오기
html = urlopen(url)

# 4) html을 파싱할 수 있는 object로 변환
bsObject = BeautifulSoup(html, &#39;html.parser&#39;, from_encoding=&#39;UTF-8&#39;)</code></pre><p>🔼 먼저 크롤링한 것을 담을 데이터 프레임을 형성하고 url을 입력후 urlopen을 해준다. BeautifulSoup을 이용하여 파싱할 수 있게 변환.</p>
<pre><code># 5) 네이버 랭킹 뉴스 정보가 있는 div만 가져오기
div = bsObject.find_all(&#39;div&#39;, {&#39;class&#39;, &#39;rankingnews_box&#39;})</code></pre><p>🔼 위의 캡쳐본을 다시 보면 확인할 수 있듯 랭킹 뉴스 정보가 div 태그 안에 rankingnews_box 라는 클래스로 선언되어 있는 것을 볼 수 있다.
find_all을 사용하여 이것들을 가져온다.</p>
<p><img src="https://velog.velcdn.com/images/may_o5/post/9cf5ee5d-b8f4-4a7d-b0ad-3f476e1dcdf5/image.png" alt=""></p>
<p>🔼 위의 캡쳐본을 확인해보면 언론사명이
<code>&lt;strong class=&quot;rankingnews_name&quot;&gt;아시아경제&lt;/strong&gt;</code> 
로 선언되어 있는 것을 볼 수 있다.</p>
<pre><code># 6) 네이버 랭킹 뉴스 상세 정보 추출
for index_div in range(0, len(div)):
  # 6-1) 언론사명 추출
  strong = div[index_div].find(&#39;strong&#39;, {&#39;class&#39;, &#39;rankingnews_name&#39;})
  press = strong.text</code></pre><p>🔼 해서 find를 이용해서 &#39;strong&#39;안의 class 명 rankingnews_name을 입력해서 추출. 그 후 press라는 변수에 저장.
(✏️ find와 find_all의 차이는?</p>
<p><img src="https://velog.velcdn.com/images/may_o5/post/ee72c350-924d-43bf-a65b-ec549d18b671/image.png" alt=""></p>
<p>🔼 위를 보면 ul 태그 안 class = &quot;rankingnews_list&quot;로 선언되어 랭킹 뉴스들이 li 태그로 하나 하나 입력되어 있는 것을 볼 수 있다.</p>
<pre><code>  # 6-2) 랭킹 뉴스 정보 추출
  ul = div[index_div].find_all(&#39;ul&#39;, {&#39;class&#39;, &#39;rankingnews_list&#39;})
  for index_r in range(0, len(ul)):
    li = ul[index_r].find_all(&#39;li&#39;)
    for index_l in range(0, len(li)):
      try:  # 예외처리
        # 순위
        rank = li[index_l].find(&#39;em&#39;, {&#39;class&#39;,&#39;list_ranking_num&#39;}).text
        # 뉴스 제목
        title= li[index_l].find(&#39;a&#39;).text
        # 뉴스 링크
        link = li[index_l].find(&#39;a&#39;).attrs[&#39;href&#39;]
        # 7) dataframe 저장(append)
        data = data.append({&#39;언론사명&#39;:press,
                            &#39;순위&#39;:rank,
                            &#39;기사제목&#39;:title,
                            &#39;기사링크&#39;:link,
                            &#39;수집일자&#39;:datetime.datetime.now(timezone(&#39;Asia/Seoul&#39;)).strftime(&#39;%Y-%m-%d %H:%M:%S&#39;)}, ignore_index=True)

      except:
        pass

      print(&#39;Complets of &#39; + rank + &#39; : &#39;, title)

print(&#39;----------------------------------------&#39;)
print(data)</code></pre><p>🔼 해서 for문을 사용해 ul 태그 안에 li 태그들을 하나하나 불러온다.
그 후 또 for문과 try를 이용하여 li 태그 속 순위, 뉴스 제목, 뉴스 링크를 데이터 프레임에 append한다.</p>
<p><img src="https://velog.velcdn.com/images/may_o5/post/ed5c00ff-7478-412a-9704-7a93481fc233/image.png" alt=""></p>
<p>🔼 이를 보면 순위는 <code>&lt;em class=&quot;list_ranking_num&quot;&gt;1&lt;/em&gt;</code>,
기사 제목과 링크는 
<code>&lt;a href=&quot;https://n.news.naver.com/article/052/0001788082?ntype=RANKING&quot; class=&quot;list_title nclicks(&#39;RBP.rnknws&#39;)&quot;&gt;휴가철·명절 두려운 반려견들...&quot;추석은 가족과 함께하고 싶어요&quot;&lt;/a&gt;</code>
(a 태그 안에 같이 있지만 링크는 href로 선언되어있어서 attrs[&#39;href&#39;]로 추출하고 제목은 텍스트므로 .text로 추출)</p>
<p>수집일자는 위에서 임포트한 라이브러리를 활용하여 현재시간을 한국시간으로 변환하여 출력.</p>
<br>

<pre><code>data.to_csv(&#39;네이버랭킹뉴스_많이본뉴스_크롤링_20220901.csv&#39;, encoding=&#39;utf-8-sig&#39;, index=False)</code></pre><p>🔼 크롤링한 데이터는 저장!!</p>
<br>

<pre><code>day_df = pd.read_csv(&#39;/content/네이버랭킹뉴스_많이본뉴스_크롤링_20220901.csv&#39;)</code></pre><p>🔼 그 후 데이터 프레임 형식으로 불러온다.</p>
<br>

<pre><code>day_df[&#39;기사제목&#39;].replace(&#39;[^\w]&#39;, &#39; &#39;, regex=True, inplace=True)</code></pre><p>🔼 그 다음에는 기사제목에 있는 특수부호들을 없애기 위한 전처리를 해준다.</p>
<br>

<pre><code>import matplotlib.pyplot as plt

from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator</code></pre><p>🔼 워드클라우드를 위한 라이브러리 임포트.
코랩은 한글 깨짐 방지 코드도 실행시켜주어야 함!!</p>
<pre><code># wordCloud 라이드버리에서는 하나의 문자열로 제공해야함
# 391의 기사제목을 하나의 text로 데이터 전처리

day_text = &quot; &quot;.join(li for li in day_df.기사제목.astype(str))
day_text</code></pre><p>🔼 워드클라우드를 위한 데이터 전처리</p>
<pre><code>plt.subplots(figsize=(25,15))
wordcloud = WordCloud(background_color=&#39;white&#39;, width=1000, height=700, font_path=fontpath).generate(day_text)
plt.axis(&#39;off&#39;)
plt.imshow(wordcloud, interpolation=&#39;bilinear&#39;)
plt.show()</code></pre><p>🔼 워드클라우드를 실행시키면!</p>
<p><img src="https://velog.velcdn.com/images/may_o5/post/969f1811-adb9-4e92-a9f6-16d119f1553b/image.png" alt=""></p>
<p>🔼 이런 결과가 나온다. 이는 9월 12일자 기준으로 크롤링된 데이터를 가지고 한 워드 클라우드이다.</p>
<br>

<h3 id="✅-댓글-많은-뉴스">✅ 댓글 많은 뉴스</h3>
<p>댓글 많은 뉴스도 링크만 수정하고 코드는 위와 동일하게 하면 된다.
(링크:<a href="https://news.naver.com/main/ranking/popularMemo.naver">https://news.naver.com/main/ranking/popularMemo.naver</a>)</p>
<pre><code>data.to_csv(&#39;네이버랭킹뉴스_댓글많은뉴스_크롤링_20220901.csv&#39;, encoding=&#39;utf-8-sig&#39;, index=False)
memo_df = pd.read_csv(&#39;/content/네이버랭킹뉴스_댓글많은뉴스_크롤링_20220901.csv&#39;)</code></pre><p>🔼 데이터 저장 후 데이터를 불러온 다음</p>
<pre><code>import re

def clean_text(inputString):
  text_rmv = re.sub(&#39;[-=+,#/\?:^.@*\&quot;※~ㆍ!』‘|\(\)\[\]`\&#39;…》\”\“\’·]&#39;, &#39; &#39;, inputString)
  return text_rmv

# text 붙이면서 데이터 전처리
memo_text = &quot; &quot;.join(clean_text(li) for li in memo_df.기사제목.astype(str))  # df.기사제목 = df[&#39;기사제목&#39;]</code></pre><p>많이 본 뉴스와 다른 방식으로 데이터 전처리. re라는 것을 임포트 한 후 특수기호를 삭제하는 함수를 선언한다. 그후 join을 이용해 텍스트를 붙일 때 데이터 전처리까지 한번에 하는 방식.</p>
<p>그 후 워드 클라우드를 해주면(코드는 위와 동일하다)</p>
<p><img src="https://velog.velcdn.com/images/may_o5/post/242d29d5-e707-4662-9616-39409f730ec3/image.png" alt="">
🔼 이런 결과가 나온다(이 역시 9월 12일자 랭킹뉴스 기준 시각화)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022-08-29~2022-09-01]]></title>
            <link>https://velog.io/@may_o5/2022-08-292022-09-01</link>
            <guid>https://velog.io/@may_o5/2022-08-292022-09-01</guid>
            <pubDate>Wed, 14 Sep 2022 05:19:54 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-과제-리뷰">📌 과제 리뷰</h2>
<p><br><br></p>
<h3 id="✅-경기도-전기차-충전소-현황-분석">✅ 경기도 전기차 충전소 현황 분석</h3>
<ol>
<li>라이브러리 임포트 및 데이터 불러오기</li>
<li>데이터 전처리</li>
<li>데이터 분석(그래프 그리기)</li>
<li>지도 시각화</li>
</ol>
<p>로 구분해서 작성해보겠다.</p>
<br>

<h4 id="✏️-1-라이브러리-임포트-및-데이터-불러오기">✏️ 1. 라이브러리 임포트 및 데이터 불러오기</h4>
<pre><code>import pandas as pd
import matplotlib.pyplot as plt
import plotly.express as px
import folium

df = pd.read_csv(&#39;/content/drive/MyDrive/전공관련/데이터 자료/전기차충전소현황.csv&#39;)</code></pre><p>데이터분석을 위해 pandas 불러왔고 그래프를 그리기 위한 matplot라이브러리와 plotly, 지도시각화를 위한 folium까지 import 완료</p>
<br>

<h4 id="✏️-2-데이터-전처리">✏️ 2. 데이터 전처리</h4>
<pre><code># 1) 시군구명 컬럼 생성 및 필요없는 컬럼 삭제
data_split = df[&#39;소재지도로명주소&#39;].str.split(&#39; &#39;)
df[&#39;시군구명&#39;] = data_split.str.get(2)
del df[&#39;소재지지번주소&#39;]
del df[&#39;소재지도로명주소&#39;]
del df[&#39;소재지우편번호&#39;]</code></pre><p>데이터 분석을 위해 필요한 건 시군구명이기때문에 소재지도로명주소 컬럼에서 시군구명만 split을 한 후 컬럼을 새로 생성했다. 그 후 우리 분석에 필요없는 지번주소 도로명주소 우편번호 이런 것들은 그냥 싹 다 삭제했다.</p>
<pre><code># 2) 컬럼 순서 정리
df = df[[&#39;충전소명&#39;,&#39;시군명&#39;, &#39;시군구명&#39;, &#39;WGS84위도&#39;, &#39;WGS84경도&#39;, &#39;운영기관명&#39;, &#39;충전기타입명&#39;]]</code></pre><p>그리고 .. 내가 약간 강박증이 있어서 새로 생성한 컬럼이 뒤에 따로 있는게 싫어서 순서를 정리해보았다. 안해도 문제없음.</p>
<pre><code># 3) NaN데이터 처리
# df.isna().sum()
df.dropna(inplace=True)
df.reset_index(drop=True, inplace=True)</code></pre><p>NaN 데이터 확인 후 dropna로 그냥 다 날려버렸다. 근데 여기서 문제. dropna로 데이터를 날리게 되면 인덱스 번호가 0,1,2,3,5,...,333,335,... 이런식으로 되어서 나중에 지도시각화할 때였나 .. 암튼 에러가 뜬다. 그래서 인덱스 번호를 리셋해주었다. 다른 조에서 에러가 났대서 구경갔다가 알게된 사실 .. 감사 ..</p>
<br>

<h4 id="✏️-3-데이터-분석그래프-그리기">✏️ 3. 데이터 분석(그래프 그리기)</h4>
<pre><code>df.to_csv(&#39;경기도전기차현황.csv&#39;, encoding=&#39;utf-8-sig&#39;)</code></pre><p>데이터 저장부터 하고 분석합시다..</p>
<pre><code># 1) 시군별 충전소 현황 - 단순한 빈도수 체크
fig = px.bar(df, x=&#39;시군명&#39;, color = &#39;시군명&#39;)
fig.show()</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/fd22d1a6-2b3f-4cf1-afdc-f630e34f70a6/image.png" alt="">
시별로 구분해서 보고 싶어서 color에 시군명을 넣어보았다.
성남시에 가장 많고 용인과 수원이 뒤따르고 있는 모습.</p>
<pre><code># 2) 각 시별 시군구별 충전소 현황
city = input(&#39;충전소 현황을 확인하고 싶은 지역을 입력하시오: &#39;)  # 지역 이름 넣기
a = df[&#39;시군명&#39;].str.contains(city)  # 해당 지역의 인덱스 찾기
df2 = df[a]  # 인구구조 저장
fig = px.bar(df2, x=&#39;시군구명&#39;, color =&#39;시군구명&#39;)
fig.show()</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/30961fa1-e7a1-4097-957b-58bb67a4fb0f/image.png" alt="">
split을 한 이유.. 사용자에게 시를 input 받아 시군구별로 비교하고 싶었다.
근데 사실 이 그래프에는 비밀이 있다. 그 시에 구가 없으면 걍 도로명주소가 나온다...
<img src="https://velog.velcdn.com/images/may_o5/post/23b3b9e3-559f-4115-b244-c7be0be5553a/image.png" alt="">
이렇게 .. 지번주소로 split을 했었다면 동으로라도 비교가 가능했을텐데 split했을 때는 이런거까지 생각하고 하지는 않았기땜에 ....</p>
<pre><code># 3) 운영기관 빈도수 그래프
fig = px.bar(df, x=&#39;운영기관명&#39;, color=&#39;운영기관명&#39;)
fig.show()</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/d4786177-e572-4b92-92ff-e0d5ade7cde8/image.png" alt="">
운영기관별로도 비교해보았다. 근데 보면 색이 연해서 ..
(나중에 교통사고데이터분석할때는 더더욱 색이 연했다)
이 색을 어케 할 수는 없나??했었는데 월요일, 그러니까 9월 5일에 교수님이 plotly로 히스토그램 그리는 방법을 알려주시면서 걍 해결됐다 .. 
교수님이 히스토그램 그리시는 거 보면서 처음 그래프 그리기 전에 빈도수 비교 그래프니까 matplot으로 히스토그램 그래프를 그렸다가 그래프가 뭔가 맘에 안들어서 plotly로 히스토그램 그래프 그리는 방법을 검색해봐야겠다 해놓고 까먹은게 기억이 났다.. 이상하게 교육장에서 과제하면 정신이 없어서 집에서 차분히 하면 잘 보이는 것들도 다 안보이고 금방 해결할 수 있는 문제도 엄청 시간을 들여 헤매게 된다 .. 나중에 교통사고 데이터 분석할때 이게 엄청 심해져서 .. 걍 집에서 처음부터 다시하게돼서 밤도 샜다 ... 
나는 뭐가 문제지
뭐가 문제긴 뭐가 문제야 집중력 문제지 ..
우짜죠 총명캔디라도 사먹어야될까요</p>
<pre><code># 4) 충전기 현황(파이차트)
ratio = df[&#39;충전기타입명&#39;].value_counts()
labels=[&#39;AC완속&#39;, &#39;DC차데모+AC3상+DC콤보&#39;, &#39;DC차데모+DC콤보&#39;, &#39;DC콤보&#39;, &#39;DC차데모+AC3상&#39;]
plt.figure(dpi=200)
plt.title(&#39;충전기 비율&#39;)
plt.pie(ratio, startangle=90, autopct=&#39;%.2f%%&#39;)
plt.legend(labels, loc=(0.9, 0.7))
plt.show()</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/7d4df82f-b5cb-4ffc-8c3b-c1f751aa41dd/image.png" alt=""></p>
<p>충전기는 파이차트로 그리고 싶어서 그리는데 아무래도 이건 총 value 같은 데이터가 없다보니까 value_counts를 써서 그렸다.
(이것도 다른조가 알려줬다 감사 ..) 
이것도 plotly 써서 그리면 좀 더 보완 가능할 거 같다.</p>
<pre><code># 5) 지역별 운영기관 분포도
fig = px.bar(df, x=&#39;시군명&#39;, color=&#39;충전기타입명&#39;)
fig.show()</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/a67ae8b8-6670-425f-b1cd-0b50b4484705/image.png" alt="">
그래프를 그리다보니까 누적그래프를 너무 ...... 그리고 싶었는데 이게 다 컬럼이다보니까 그려지지를 않아서 ..
(검색을 그짓말 안치고 50번은 하고 유튜브 영상도 5개는 본 거 같은데 groupby를 몰랐다 .. 구글링 하는 방법부터 연마해야할듯)
일단은 color로 구분하는 걸로 만족했었다 ..</p>
<br>

<h4 id="✏️-4-지도-시각화">✏️ 4. 지도 시각화</h4>
<p>우리 조는 지도시각화에 표현하고 싶은 것이 </p>
<ol>
<li>설치 취소된 충전소 맵에 표시하기</li>
<li>충전기 선호도 맵에 표시하기</li>
<li>랜드마크 찾아서 그 근처 전기차 현황 보기</li>
</ol>
<p>였다(모두 조장님의 아이디어 .. 짱!)</p>
<p>2번은 자료를 조사하다보니 차종별로 충전기 호환되는게 있고 안되는게 있어서 이걸로 표시하는 걸로 바뀌었다. 또 원래 충전기 별로 색을 구분해서 표시하려고 했는데 시각화를 하다보니 이게 별로 의미가 없는 거 같아서 사용자가 차종을 입력하면 충전 가능한 곳과 불가능한 곳으로 구분해서 표시하는 것으로 최종 결정!</p>
<p>자료는 이곳에서 참고했다!!
(<a href="https://www.ev.or.kr/portal/chargerkind">https://www.ev.or.kr/portal/chargerkind</a>)</p>
<pre><code>from ipywidgets.widgets.widget_selection import RadioButtons
# 3. 지도 시각화 - 충전소 위치
# 충전기타입별 가능한 차종 all~~~

from scipy.sparse import dok


type_1 = [&#39;블루온&#39;, &#39;레이&#39;, &#39;쏘울&#39;, &#39;아이오닉&#39;, &#39;스파크&#39;, &#39;i3&#39;, &#39;Leaf&#39;, &#39;볼트&#39;, &#39;ZOE&#39;]
type_2 = [&#39;블루온&#39;, &#39;레이&#39;, &#39;쏘울&#39;, &#39;아이오닉&#39;, &#39;Leaf&#39;, &#39;SM3 ZE&#39;, &#39;코나&#39;, &#39;니로&#39;, &#39;ZOE&#39;, &#39;스파크&#39;, &#39;볼트&#39;, &#39;i3&#39;]
type_3 = [&#39;블루온&#39;, &#39;레이&#39;, &#39;쏘울&#39;, &#39;아이오닉&#39;, &#39;Leaf&#39;, &#39;코나&#39;, &#39;니로&#39;, &#39;ZOE&#39;, &#39;스파크&#39;, &#39;볼트&#39;, &#39;i3&#39;]
type_4 = [&#39;아이오닉&#39;, &#39;코나&#39;, &#39;니로&#39;, &#39;쏘울&#39;, &#39;ZOE&#39;, &#39;스파크&#39;, &#39;볼트&#39;, &#39;i3&#39;]
type_5 = [&#39;블루온&#39;, &#39;레이&#39;, &#39;쏘울&#39;, &#39;아이오닉&#39;, &#39;Leaf&#39;, &#39;SM3 ZE&#39;]
landmark = [&#39;용인 에버랜드&#39;, &#39;수원 화성&#39;, &#39;서울대공원(서울랜드)&#39;, &#39;한국민속촌&#39;, &#39;파주 프로방스 마을&#39;]
landmark_lat = [&#39;37.27711935934&#39;, &#39;37.2869619&#39;, &#39;37.42922350891575&#39;, &#39;37.259406344922276&#39;, &#39;37.79080554013303&#39;]
landmark_lon = [&#39;127.22694956007&#39;, &#39;127.011801&#39;, &#39;127.01476688687515&#39;, &#39;127.12315632756929&#39;, &#39;126.68517789344757&#39;]


print(landmark)

carname = input(&quot;차종을 입력하세요&quot;)
ln = input(&quot;위의 랜드마크 중 하나를 골라 입력하시오&quot;)


Kmap = folium.Map(location=[df[&#39;WGS84위도&#39;].mean(), df[&#39;WGS84경도&#39;].mean()], zoom_start=10)

condition = df[&#39;충전기타입명&#39;]

for n in range(5):
  if ln in landmark[n]:
    folium.CircleMarker([float(landmark_lat[n]), float(landmark_lon[n])], radius = 100, 
                      color=&#39;orange&#39;, fill_color=&#39;orange&#39;).add_to(Kmap)

for index_draw in range(0, len(condition)):
  if condition[index_draw] == &#39;AC완속&#39; and carname in type_1:
    folium.Marker([df.loc[index_draw, &#39;WGS84위도&#39;], df.loc[index_draw, &#39;WGS84경도&#39;]],
                  popup=&#39;&lt;pre&gt;&#39;+df[&#39;충전소명&#39;][index_draw]+&#39;&lt;/pre&gt;&#39;, tooltip = &#39;블루온, 레이, 쏘울, 아이오닉, 스파크, i3, Leaf, 볼트, ZOE&#39;,
                  icon = folium.Icon(color=&#39;blue&#39;, icon=&#39;fa-car&#39;, prefix=&#39;fa&#39;)).add_to(Kmap)

  elif condition[index_draw] == &#39;DC차데모+AC3상+DC콤보&#39; and carname in type_2:
    folium.Marker([df.loc[index_draw, &#39;WGS84위도&#39;], df.loc[index_draw, &#39;WGS84경도&#39;]],
                  popup=&#39;&lt;pre&gt;&#39;+df[&#39;충전소명&#39;][index_draw]+&#39;&lt;/pre&gt;&#39;, tooltip = &#39;블루온, 레이, 쏘울, 아이오닉, Leaf, SM3 ZE, 코나, 니로, ZOE, 스파크, 볼트, i3&#39;,
                  icon = folium.Icon(color=&#39;blue&#39;, icon=&#39;fa-car&#39;, prefix=&#39;fa&#39;)).add_to(Kmap)

  elif condition[index_draw] == &#39;DC차데모+DC콤보&#39; and carname in type_3:
    folium.Marker([df.loc[index_draw, &#39;WGS84위도&#39;], df.loc[index_draw, &#39;WGS84경도&#39;]],
                  popup=&#39;&lt;pre&gt;&#39;+df[&#39;충전소명&#39;][index_draw]+&#39;&lt;/pre&gt;&#39;, tooltip = &#39;블루온, 레이, 쏘울, 아이오닉, Leaf, 코나, 니로, ZOE, 스파크, 볼트, i3&#39;,
                  icon = folium.Icon(color=&#39;blue&#39;, icon=&#39;fa-car&#39;, prefix=&#39;fa&#39;)).add_to(Kmap)

  elif condition[index_draw] == &#39;DC콤보&#39; and carname in type_4:
    folium.Marker([df.loc[index_draw, &#39;WGS84위도&#39;], df.loc[index_draw, &#39;WGS84경도&#39;]],
                  popup=&#39;&lt;pre&gt;&#39;+df[&#39;충전소명&#39;][index_draw]+&#39;&lt;/pre&gt;&#39;, tooltip = &#39;아이오닉, 코나, 니로, 쏘울, ZOE, 스파크, 볼트, i3&#39;,
                  icon = folium.Icon(color=&#39;blue&#39;, icon=&#39;fa-car&#39;, prefix=&#39;fa&#39;)).add_to(Kmap)

  else:
    folium.Marker([df.loc[index_draw, &#39;WGS84위도&#39;], df.loc[index_draw, &#39;WGS84경도&#39;]],
                  popup=&#39;&lt;pre&gt;&#39;+df[&#39;충전소명&#39;][index_draw]+&#39;&lt;/pre&gt;&#39;, tooltip = &#39;충전 불가&#39;,
                  icon = folium.Icon(color=&#39;red&#39;, icon=&#39;fa-car&#39;, prefix=&#39;fa&#39;)).add_to(Kmap)  

Kmap</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/f8c09e2c-8487-4bd9-97e3-8d40a041a47e/image.png" alt="">
차종은 코나, 랜드마크는 민속촌을 입력한 결과이다
솔직히 경기도 전기차 현황 분석은 우리가 하려고 했던 대로 결과가 잘 나온 편인 거 같다.
문제는 .. 교통사고현황이었다.
집에서 과제하고있는데도 집에 가고 싶었다 ㅎㅎ ..</p>
<p><br><br></p>
<h2 id="✅-20182021년-교통사고-현황-분석">✅ 2018~2021년 교통사고 현황 분석</h2>
<p>이번에도</p>
<ol>
<li>라이브러리 임포트 및 데이터 불러오기</li>
<li>데이터 전처리</li>
<li>데이터 분석(그래프 그리기)</li>
<li>지도 시각화</li>
<li>부산지역 교통사고 현황 분석</li>
</ol>
<p>로 구분해서 작성해보겠다.</p>
<br>

<h4 id="✏️-1-라이브러리-임포트-및-데이터-불러오기-1">✏️ 1. 라이브러리 임포트 및 데이터 불러오기</h4>
<pre><code>import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import plotly.express as px
import folium

df_18 = pd.read_csv(&#39;/content/drive/MyDrive/전공관련/데이터 자료/도로교통공단_사망교통사고정보_2018.csv&#39;)
df_19 = pd.read_csv(&#39;/content/drive/MyDrive/전공관련/데이터 자료/도로교통공단_사망교통사고정보_2019.csv&#39;)
df_20 = pd.read_csv(&#39;/content/drive/MyDrive/전공관련/데이터 자료/도로교통공단_사망교통사고정보_2020.csv&#39;)
df_21 = pd.read_csv(&#39;/content/drive/MyDrive/전공관련/데이터 자료/도로교통공단_사망 교통사고 정보_20211231.csv&#39;)</code></pre><p>이때까지만 해도 제정신이었던 거 같은데 어디서 정신머리가 가출햇을꼬...</p>
<br>

<h4 id="✏️-2-데이터-전처리-1">✏️ 2. 데이터 전처리</h4>
<pre><code># 2018년
date_18 = df_18[&#39;발생년월일시분&#39;].str.split(&#39; &#39;)
df_18[&#39;발생년월일&#39;] = pd.to_datetime(date_18.str.get(0), format=&#39;%Y-%m-%d&#39;, errors=&#39;raise&#39;)
df_18[&#39;발생시간&#39;] = date_18.str.get(1).str.split(&#39;:&#39;).str.get(0)
df_18 = df_18.astype({&#39;발생시간&#39;:&#39;int64&#39;})
df_18 = df_18.astype({&#39;발생년&#39;:&#39;str&#39;})
#df_18[&#39;발생시간&#39;] = pd.to_datetime(date_18.str.get(1), format=&#39;%H:%M&#39;, errors=&#39;raise&#39;).dt.time  -&gt; 시분초</code></pre><p>어디긴 어디야 걍 집에서 나온 순간부터 정신머리는 없었던 거 같다... 
암튼 경기도 현황이랑 유사하게 split이용해서 발생년월일시분에서 발생년월일과 발생시간만 따와서 새 컬럼을 생성하고 데이터 타입도 변경해주었다. 사실 발생년은 나중에 그래프그리다가 생성했다.</p>
<pre><code># 2019년
date_19 = df_19[&#39;발생년월일시&#39;].str.split(&#39; &#39;)
df_19[&#39;발생년월일&#39;] = pd.to_datetime(date_19.str.get(0), format=&#39;%Y-%m-%d&#39;, errors=&#39;raise&#39;)
df_19[&#39;발생시간&#39;] = date_19.str.get(1)
df_19 = df_19.astype({&#39;발생시간&#39;:&#39;int64&#39;})
df_19 = df_19.astype({&#39;발생년&#39;:&#39;str&#39;})

# 2020년
date_20 = df_20[&#39;발생년월일시&#39;].str.split(&#39; &#39;)
df_20[&#39;발생년월일&#39;] = pd.to_datetime(date_20.str.get(0), format=&#39;%Y-%m-%d&#39;, errors=&#39;raise&#39;)
df_20[&#39;발생시간&#39;] = date_20.str.get(1)
df_20 = df_20.astype({&#39;발생시간&#39;:&#39;int64&#39;})
df_20 = df_20.astype({&#39;발생년&#39;:&#39;str&#39;})

# 2021년
date_21 = df_21[&#39;발생년월일시&#39;].str.split(&#39; &#39;)
df_21[&#39;발생년월일&#39;] = pd.to_datetime(date_21.str.get(0), format=&#39;%Y-%m-%d&#39;, errors=&#39;raise&#39;)
df_21[&#39;발생시간&#39;] = date_21.str.get(1).str.split(&#39;:&#39;).str.get(0)
df_21 = df_21.astype({&#39;발생시간&#39;:&#39;int64&#39;})
df_21 = df_21.astype({&#39;발생년&#39;:&#39;str&#39;})</code></pre><p>데이터들이 다 달라서 욕하면서 전처리했다. 
근데 이걸 교육장에서는 눈치를 못챔 .. 미친거아님??? 
조장님이랑 팀원언니가 말을 해줬는데 아 ㅇㅋㅇㅋ해놓고 아무생각없이 전처리하고 나중에 집에서 하는데 지도시각화가 안돼서 그제서야 눈치챔.. 
남의 말을 귓등으로도 안들은거지 걍 
코랩도 답답햇겟다 오류로 그따구로 하는 거 아니라도 알려주는데 알아먹지도 못하고 ... 그렇게 저는 약 8시간을 그저 흘러보내고 집에 왔습니다.. 
이거 쓰니까 또 화나네 ...</p>
<pre><code># 2) 컬럼 정리
# 2-1) 18년도 사상자 = 사망자 + 중상자 + 경상자, 나머지년도 부상자 = 중상자 + 경상자)
del df_18[&#39;사상자수&#39;]
df_18[&#39;부상자수&#39;] = df_18[&#39;중상자수&#39;] + df_18[&#39;경상자수&#39;]
# 2-2) 법규위반 -&gt; 가해자법규위반
del df_18[&#39;법규위반_대분류&#39;]
df_18.rename(columns={&#39;법규위반&#39;:&#39;가해자법규위반&#39;}, inplace=True)
# 2-3) 가해자당사자분류, 피해자당사자분류
del df_18[&#39;가해자_당사자종별_대분류&#39;]
del df_18[&#39;피해자_당사자종별_대분류&#39;]
# 2-4) 발생위치 () -&gt; _
df_21.rename(columns={&#39;발생위치X(UTMK)&#39;:&#39;발생위치X_UTMK&#39;, &#39;발생위치Y(UTMK)&#39;:&#39;발생위치Y_UTMK&#39;}, inplace=True)</code></pre><p>데이터를 보면 나머지 데이터에는 사상자수가 없고 18년도에만 부상자수가 없고 이런게 있어서 처음에는 걍 18년도에만 있는 사상자 컬럼을 날리고 18년도에만 부상자수 컬럼을 추가했는데 나중에 코로나 관련된 그래프를 그리다보니까 사상자수 데이터로도 비교하고 싶어져서 결국 그때 다시 컬럼을 추가 생성했다 .. 컬럼수나 컬럼명이 다르면 데이터 합칠때 다 nan 값 처리가 되기때문에 이걸 다 하나하나 고쳐줘야한다. 이것도 몰랐다가 집에와서 알았다 .. 대체 교육장에서는 뭘했냐 저혈압인데 곧 고혈압될 거 같다 걍</p>
<pre><code># 3) 컬럼삭제
del df_18[&#39;발생년월일시분&#39;]
del df_19[&#39;발생년월일시&#39;]
del df_20[&#39;발생년월일시&#39;]
del df_21[&#39;발생년월일시&#39;]</code></pre><p>필요없는 컬럼 삭제해주고</p>
<pre><code># 4) 데이터 합치기
df_list = [df_18, df_19, df_20, df_21]
df_all = pd.concat(df_list, ignore_index=True)</code></pre><p>데이터를 합쳐주었다 ..</p>
<br>

<h4 id="✏️-3-데이터-분석그래프-그리기-1">✏️ 3. 데이터 분석(그래프 그리기)</h4>
<pre><code># 1) 년도별 사망자수 비교
fig = px.bar(df_all, x=&#39;발생년&#39;, y = &#39;사망자수&#39;)
fig.show()</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/e1328575-888d-43da-8690-ad72702239d9/image.png" alt="">
히스토그램 ....</p>
<pre><code># 2) 년도별 부상자수 비교
fig = px.bar(df_all, x=&#39;발생년&#39;, y=&#39;부상자수&#39;)
fig.show()</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/cacb087f-d373-4887-8a5f-4be1e4d39c20/image.png" alt="">
히스토그램을 했었다면 ..........</p>
<pre><code># 3) 요일별 사망자수 비교
fig = px.bar(df_all, x=&#39;요일&#39;, y=&#39;사망자수&#39;, color=&#39;주야&#39;)
fig.show()</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/59af5620-1975-4b18-9a25-9cdfade4fe95/image.png" alt=""></p>
<br>

<h4 id="✏️-4-지도-시각화-1">✏️ 4. 지도 시각화</h4>
<pre><code># 지도시각화(연도별로 컬러 구별)

df_map = folium.Map(location=[df_all[&#39;위도&#39;].mean(), df_all[&#39;경도&#39;].mean()], zoom_start=12)


df_all = df_all.astype({&#39;부상자수&#39;:&#39;float64&#39;})
df_all = df_all.astype({&#39;사망자수&#39;:&#39;float64&#39;})

acc = df_all.사고유형
year = df_all.발생년

for n in range(len(year)):
  if year[n] == &#39;2018&#39;:
    cnt = df_all[&#39;사망자수&#39;][n] + df_all[&#39;부상자수&#39;][n]
    folium.CircleMarker([df_all[&#39;위도&#39;][n],df_all[&#39;경도&#39;][n]], radius=cnt*5, popup=acc[n], 
                        color=&#39;red&#39;, fill_color=&#39;red&#39;).add_to(df_map)
  elif year[n]==&#39;2019&#39;:
    cnt = df_all[&#39;사망자수&#39;][n] + df_all[&#39;부상자수&#39;][n]
    folium.CircleMarker([df_all[&#39;위도&#39;][n],df_all[&#39;경도&#39;][n]], radius=cnt*5, popup=acc[n], 
                        color=&#39;blue&#39;, fill_color=&#39;blue&#39;).add_to(df_map)
  elif year[n]==&#39;2020&#39;:
    cnt = df_all[&#39;사망자수&#39;][n] + df_all[&#39;부상자수&#39;][n]
    folium.CircleMarker([df_all[&#39;위도&#39;][n],df_all[&#39;경도&#39;][n]], radius=cnt*5, popup=acc[n], 
                        color=&#39;green&#39;, fill_color=&#39;green&#39;).add_to(df_map)
  elif year[n]==&#39;2021&#39;:
    cnt = df_all[&#39;사망자수&#39;][n] + df_all[&#39;부상자수&#39;][n]
    folium.CircleMarker([df_all[&#39;위도&#39;][n],df_all[&#39;경도&#39;][n]], radius=cnt*5, popup=acc[n], 
                        color=&#39;yellow&#39;, fill_color=&#39;yellow&#39;).add_to(df_map)

df_map</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/2b57c59e-8e59-4d6e-9246-f5dbb05c88ae/image.png" alt=""></p>
<p>그리고 발표할 때 지도시각화한 거 보여주려고하자 화면이 노란색으로 떠가지고 결국 그냥 넘어갔었는데 그 원인을 알았다 .. 원래 CircleMarker말고 Circle로 코드를 입력했어서 반지름을 cnt * 250을 해놔서 그랬다 ...
이거 쓰면서 또 화면이 노랗게 떠서 컴퓨터가 드디어 맛이 간건가 ..... 했는데 알고보니 그래서 그런거였다.. 5로 바꾸면 잘 보인다.</p>
<br>

<h4 id="✏️-5-부산지역-교통사고-현황-분석">✏️ 5. 부산지역 교통사고 현황 분석</h4>
<p>위에까지가 교수님이 주신과제였고 이거만 하면 재미없으니까 ..
추가적으로 할 수 있는 게 뭐 없을까 고민을 하다가 부산이 도로가 막장이라 초보자들이나 여행온 사람들은 운전하기 어렵다고 한 게 생각나서 부산 데이터를 따로 저장해서 그래프를 그려보니까 전체 데이터로 년도별 분석을 한 것과 다른 특이한 그래프가 그려져서 부산지역 교통사고 현황 분석을 해보자고 결정!</p>
<p>✔️ 1. 부산 데이터 저장</p>
<pre><code>df_bs = df_all[df_all[&#39;발생지시도&#39;] == &#39;부산&#39;]
df_bs = df_bs.astype({&#39;사망자수&#39;:&#39;int64&#39;})
df_bs = df_bs.astype({&#39;부상자수&#39;:&#39;int64&#39;})

df_bs[&#39;사상자수&#39;] = df_bs[&#39;사망자수&#39;] + df_bs[&#39;부상자수&#39;]

df_bs.reset_index(drop=True, inplace=True)

# 부산 데이터 연도별로
bs_18 = df_18[df_18[&#39;발생지시도&#39;] == &#39;부산&#39;]
bs_19 = df_19[df_19[&#39;발생지시도&#39;] == &#39;부산&#39;]
bs_20 = df_20[df_20[&#39;발생지시도&#39;] == &#39;부산&#39;]
bs_21 = df_21[df_21[&#39;발생지시도&#39;] == &#39;부산&#39;]

bs_18 = bs_18.astype({&#39;사망자수&#39;:&#39;int64&#39;})
bs_19 = bs_19.astype({&#39;사망자수&#39;:&#39;int64&#39;})
bs_20 = bs_20.astype({&#39;사망자수&#39;:&#39;int64&#39;})
bs_21 = bs_21.astype({&#39;사망자수&#39;:&#39;int64&#39;})
bs_18 = bs_18.astype({&#39;부상자수&#39;:&#39;int64&#39;})
bs_19 = bs_19.astype({&#39;부상자수&#39;:&#39;int64&#39;})
bs_20 = bs_20.astype({&#39;부상자수&#39;:&#39;int64&#39;})
bs_21 = bs_21.astype({&#39;부상자수&#39;:&#39;int64&#39;})

bs_18.reset_index(drop=True, inplace=True)
bs_19.reset_index(drop=True, inplace=True)
bs_20.reset_index(drop=True, inplace=True)
bs_21.reset_index(drop=True, inplace=True)</code></pre><p>보면 알겠지만 위에서부터 시각화를 위한 변수 선언을 엄<del>~</del>청 많이 해서 .. 나중되서는 엄청 헷갈리고 정신없었다 진심으로 ..</p>
<br>

<p>✔️ 2. 그래프</p>
<pre><code># 사망자수 그래프
fig = px.bar(df_bs, x=&#39;발생년&#39;, y=&#39;사망자수&#39;)
fig.show()</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/0e2b67dd-378e-4771-90ed-094ab27d4608/image.png" alt=""></p>
<pre><code># 부상자수 그래프
fig = px.bar(df_bs, x=&#39;발생년&#39;, y=&#39;부상자수&#39;)
fig.show()</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/c641d807-8ab2-4fe7-8f09-a0ef3aa7759b/image.png" alt=""></p>
<p>그리고 .. 대망의 누적그래프 ..
<img src="https://velog.velcdn.com/images/may_o5/post/6b957205-d8dc-4681-99e6-1b5061518e4c/image.png" alt=""></p>
<p>원래 plotly로 그리고 싶었는데 구글링을 아무리 해도 뭔소리인지를 모르겠거나 dataframe을 만들어서 그리는 예시만 있거나 하고 내가 원하는 건 못찾았다 .. 
내가 그리려는건 총 value가 데이터에 주어져 있지도 않은 컬럼들인데 이거땜에 머리를 쥐어짜다가 결국엔 걍 데이터를 새로 만들었다 ...</p>
<pre><code>mydata = df_bs[[&#39;사망자수&#39;, &#39;중상자수&#39;, &#39;경상자수&#39;]]

#mydata[:121].sum() -&gt; 18년
#mydata[121:236].sum() -&gt; 19년
#mydata[236:336].sum() -&gt; 20년
#mydata[336:].sum() -&gt; 21년

samang = [123, 116, 100, 113]
js = [22, 28, 16, 13]
gs = [41, 20, 15, 20]
year=[&quot;2018&quot;, &quot;2019&quot;, &quot;2020&quot;, &quot;2021&quot;]

plt.figure(dpi=150)
plt.bar(year, samang, color=&#39;red&#39;, label=&#39;사망자&#39;)
plt.bar(year, js, color=&#39;green&#39;, bottom = np.array(samang), label=&#39;중상자&#39;)
plt.bar(year, gs, color=&#39;yellow&#39;, bottom = np.array(samang)+np.array(js), label=&#39;경상자&#39;)
plt.legend(loc=&quot;lower left&quot;,bbox_to_anchor=(0.8,1.0))
plt.show()</code></pre><p>이렇게 ............<br>sum써서 총 value를 구하고 그 값을 리스트에 저장해서 그래프 그릴때 2차원 배열을 만들어서 그린셈이다 .. 근데 이걸 groupby를 쓰면 걍 해결이라니 눈물이 낫당 당연함 요따구 코드로 그린 그래프가 아침 7시 넘어서 완성됨 이거 다 하고 고대로 노트북 덮고 씻고 출근햇다 ....... </p>
<br>

<p>우리조가 부산 데이터를 가지고 알고 싶었던 것이 2021년에 사상자수가 증가한 이유니까 이와 연관된 것이 무엇이 있을까 고민을 해보았다.</p>
<ol>
<li>코로나 사회적 거리두기와의 연관성</li>
<li>2021년 사망자수 증가 원인으로 파악되어지는 부산외곽순환고속도로가 정말 증가 원인일까?</li>
<li>안전속도 5030 정책</li>
</ol>
<p>이 세가지를 중심으로 파악해보기로 했고 결과적으로는 2번 말고는 미궁속으로 빠지게되었다 .. 근데 그건 권교수님네조가 해결해서 .......
일단 1번은 그래프가 우리가 원하는 대로 그려지지 않아서 그래프를 여러개 그려볼 수 밖에 없었다. 3번은 사실 솔직하게 말하자면 1번이 미궁으로 빠지자(처음에는 2번도 미궁이었다 ....) 뭐 더 할 거 없나?하다가 추가 된 거 였고 내가 자료조사하면서 받아놓은 안전표지 데이터가 있어서 그걸 지도 시각화를 해보려고 했는데 데이터가 너무 많아서!! 결국 그려지지 않았다.
그 외에도 뭐 더 하려고 했던 후보들도 있었으나 .. 시간관계상 ...</p>
<br>

<p><strong>1. 코로나 사회적 거리두기와의 연관성</strong></p>
<pre><code>df_bs[&#39;발생월&#39;] =  df_bs[&#39;발생년월일&#39;].dt.month
df_bs[&#39;발생년월&#39;] = pd.to_datetime(df_bs[&#39;발생년월일&#39;]).dt.to_period(&#39;M&#39;)

df_bs = df_bs.astype({&#39;발생년월&#39;:&#39;str&#39;})
df_bs = df_bs.astype({&#39;발생월&#39;:&#39;str&#39;})</code></pre><p>코로나와의 연관성을 보기 위한 시각화를 위해 발생년월과 발생월이라는 컬럼을 따로 생성했다.</p>
<pre><code># 발생년월별 사망자수 현황
fig = px.bar(df_bs, x=&#39;발생년월&#39;, y=&#39;사망자수&#39;, color=&#39;발생월&#39;)
fig.show()</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/d5185a00-bedb-4551-b2ba-46674d161a55/image.png" alt=""></p>
<p>원래 이 그래프를 사회적 거리두기 완화기간과 강화기간을 기준으로 색을 구분하고 싶었는데 실패했다. 해서 일단 발생월로 구분해본 결과이다.
보면 2020년 2,3월이 다른 년도에 비해 적다. 같은 해 1월하고만 비교해도 확연히 차이가 나는 것을 확인할 수 있다. 똑같이 코로나 발생 이후인 21년하고 비교해봐도 적다. 그럼 21년은 왜이렇게 증가했나? 원래 2.5단계이던 거리두기가 21년 1월 24일 2단계로 격하하였고 2월 15일부터 3월 31일까지는 1.5단계인 사회적 거리두기 완화기간이었기 때문이다. 4월 1일부터 2단계로 격상하자 훅 줄어들었다. 다른 년도 4월하고 비교해도 확연히 적다.
그 후 5월 21일부터 8월 9일까지 1.5단계로 격하되었고 이때 데이터를 보면 또 증가한다. 그 후 8월 10일부터 4단계로 격상되었는데 좀 줄어들다가 10월부터는 또 증가한다. 해서 4단계가 6시까지는 4인 모임이 가능하고 그 후 10시까지는 2인까지만 가능한 것이 영향을 끼치지 않았을까 해서 달별 발생시간을 비교해보았다.
<img src="https://velog.velcdn.com/images/may_o5/post/0108ac43-717a-483e-894d-b981f76490d3/image.png" alt=""></p>
<p>21년도 데이터만 비교한 것이다.
하 .. 보면 알겠지만 전혀 연관없다.
근데 이거쓰다가 눈치챈건데 0시 데이터 어디갔냐 ...........
하 걍 spss랑 R로 통계분석 할 때가 그립다....
spss는 코드가 뭐임 걍 버튼만 누르면 표 딱 그려주고 그래프 그려주고 확률이랑 계수랑 계산 다 해주고 나는 그냥 그 숫자보고 결론만 내면 되는데 ..
복학해서 통계분석하면 아 교수님 이건 개껌이죠 ㅋ 하면서 웃으면서 할 수 있을 거 같다 ...................
올 초까지만 해도 날 괴롭히던 상관분석과 회귀분석을 그리워할 줄은 몰랐다
암튼 .. 그래프를 그려고 결론이 나지 않아 10월부터 12월까지는 걍 사람들이 연말이라고 부산 놀러가서 사고난 거 아닐까 하는 그지같은 추측만 낳았다 ..................</p>
<br>

<p>** 2. 부산외곽순환고속도로가 증가 원인이라는 가설 증명**</p>
<p>이건 히트맵을 보면 알 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/may_o5/post/e840c302-913b-4d9e-8fa1-4a76d55cee40/image.png" alt=""></p>
<p>오른쪽 아래가 21년도인데 다른 년도보다 더 사고가 난 것을 확인할 수 있다.</p>
<p>사고다발지역이라는 연산로터리도 한번 봐보면
<img src="https://velog.velcdn.com/images/may_o5/post/811eae08-c66b-44a3-9d0b-4ce32412529f/image.png" alt="">
여기는 오히려 21년도에는 사상자수가 나온 사고는 안났다.</p>
<p>*<em>3. 안전속도 5030 *</em></p>
<p>이는 위에서도 설명했듯 지도시각화에 실패했다. 하지만 이것도 사상자가 증가했다는 그래프나 히트맵으로만 봐도 설명이 가능하긴 하다.
원래 이것도 발표 때 말했어야 했는데 깜빡했다 ...</p>
<p><img src="https://velog.velcdn.com/images/may_o5/post/a3cb2891-5c92-43fc-8312-efb8a83754a4/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/may_o5/post/71772083-c729-4057-972d-4451b33b1424/image.png" alt=""></p>
<p>위에는 20년도 아래는 21년도인데 이거보면 꼭 부산외곽순환도로가 아니더라도 도로에서 사고가 많이 났던 걸 확인할 수 있다.</p>
<p><br><br></p>
<p>과제 리뷰 끝 ..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022-08-26]]></title>
            <link>https://velog.io/@may_o5/2022-08-26</link>
            <guid>https://velog.io/@may_o5/2022-08-26</guid>
            <pubDate>Fri, 26 Aug 2022 08:13:50 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-크롤링">📌 크롤링</h2>
<br>

<p>✏️ 스타일 시트(CSS)</p>
<pre><code>&lt;HTML&gt;
    &lt;HEAD&gt;
        &lt;TITLE&gt;css 적용한 문장 포맷&lt;/TITLE&gt;
&lt;STYLE type=&quot;text/css&quot;&gt;
P.content1 {font-family:궁서; color:red;}    /* . -&gt; class, # -&gt; id */
.content2 {font-family:굴림; background:yellow;}
&lt;/STYLE&gt;    
    &lt;/HEAD&gt;
    &lt;BODY&gt;
    &lt;p class=&quot;content1&quot;&gt;첫번째 문단&lt;/p&gt;
    &lt;p class=&quot;content2&quot;&gt;두번째 문단&lt;/p&gt;
    &lt;p&gt;세번째 문단&lt;/p&gt;
    &lt;/BODY&gt;
&lt;/HTML&gt;</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/779fbe25-acfa-409a-8638-b10d5d6a74a7/image.png" alt=""></p>
<p>🔼 결과</p>
<br>

<h3 id="✅-타슈-크롤링-및-지도-시각화">✅ 타슈 크롤링 및 지도 시각화</h3>
<p>(주소 : <a href="https://new.tashu.or.kr/stationList.do">https://new.tashu.or.kr/stationList.do</a>)</p>
<pre><code>from urllib.request import urlopen
from bs4 import BeautifulSoup
import time
import re

import pandas as pd
import folium

# 크롤링
# 1) 데이터 프레임 생성
data = pd.DataFrame(columns=[&#39;스테이션명&#39;, &#39;위치&#39;, &#39;상태정보&#39;, &#39;위도&#39;, &#39;경도&#39;])

# 2) 타슈 사이트 접속 주소 준비 : https://new.tashu.or.kr/stationList.do
url = &#39;https://new.tashu.or.kr/stationList.do&#39;

# 3) url 접속하여 HTML에 가져오기
html = urlopen(url)

# 4) HTML 태그를 파싱(parsing)하여 변환
bsObject = BeautifulSoup(html, &#39;html.parser&#39;, from_encoding=&#39;utf-8&#39;)

# 5) 타슈 정류장 정보가 있는 table만 가져오기
table = bsObject.find_all(&#39;table&#39;, {&#39;class&#39;, &#39;board-tp-01 stationtable&#39;})

# 6) 상세 정보 추출하기
# 6-1) table 내에 tr를 찾기
tr = table[0].find_all(&#39;tr&#39;)

# 6-2) 첫 tr(테이블의 컬럼 정보)은 제거
tr = tr[1:len(tr)]

# 6-3) 타슈 정류장 상세 정보 추출
for index_tr in range(0, len(tr)):
  td = tr[index_tr].find_all(&#39;td&#39;)

  # 장소
  station = td[0].text.split(&#39;.&#39;)[1] # 1. 무역전시관입구(택시승강장) -&gt; . 자르고 -&gt; 무역전시관입구(택시승강장)

  # 위치
  location = td[1].text

  # 상태정보
  condition = td[2].text

  # 좌표 추출
  # 1) 위도(latitude)
  lat = td[3].button.attrs[&#39;data-lat&#39;]
  # 2) 경도(longitude)
  lon = td[3].button.attrs[&#39;data-ltd&#39;]

  # 7) 타슈 정류장 상세 정보 DataFrame에 담기(append)
  data = data.append({&#39;스테이션명&#39;:station,
                      &#39;위치&#39;:location,
                      &#39;상태정보&#39;:condition,
                      &#39;위도&#39;:lat,
                      &#39;경도&#39;:lon}, ignore_index=True)
  print(&#39;Complets of&#39; + station)

print(&#39;-----------------------------------------------&#39;)
print(data)

# 데이터 저장
data.to_csv(&#39;TASHU.csv&#39;, encoding=&#39;utf-8-sig&#39;)

# 데이터 준비하기
df = pd.read_csv(&#39;/content/TASHU.csv&#39;)


# 지도 시각화
# 타슈 정류장의 상태에 따라서 Maker를 다른 색으로 표시

# 1) 타슈 정류장 위치 기반으로 중심좌표를 설정
t_map = folium.Map(location=[df[&#39;위도&#39;].mean(), df[&#39;경도&#39;].mean()], zoom_start=14, tiles=&#39;Stamen Terrain&#39;)

# 2) 타슈 정류장의 상태에 따라서 Marker를 다른색으로 표시(df.상태정도.unique()) -&gt; 정상:파랑, NETWORK 에러:빨강
condition = df.상태정보 # == df[&#39;상태정보&#39;]

# 3) 타슈 정류장 Marker 추가하기
for index_draw in range(0, len(condition)):
  if condition[index_draw] == &#39;정상&#39;:
    folium.Marker([df.loc[index_draw, &#39;위도&#39;], df.loc[index_draw, &#39;경도&#39;]],
                  popup=&#39;&lt;pre&gt;&#39;+ df.loc[index_draw, &#39;스테이션명&#39;]+&#39;&lt;/pre&gt;&#39;, icon=folium.Icon(color=&#39;blue&#39;, icon=&#39;fa-bicycle&#39;, prefix=&#39;fa&#39;)).add_to(t_map)
  elif condition[index_draw] == &#39;NETWORK 에러&#39;:
    folium.Marker([df.loc[index_draw, &#39;위도&#39;], df.loc[index_draw, &#39;경도&#39;]],
                  popup=&#39;&lt;pre&gt;&#39;+ df.loc[index_draw, &#39;스테이션명&#39;]+&#39;&lt;/pre&gt;&#39;, icon=folium.Icon(color=&#39;red&#39;, icon=&#39;fa-bicycle&#39;, prefix=&#39;fa&#39;)).add_to(t_map)

t_map</code></pre><br>

<h3 id="✅-세종-어울링-크롤링-및-지도-시각화">✅ 세종 어울링 크롤링 및 지도 시각화</h3>
<p>(주소 : <a href="https://www.sejongbike.kr/userStationAction.do?process=stationTotalList&amp;menu=21">https://www.sejongbike.kr/userStationAction.do?process=stationTotalList&amp;menu=21</a>)</p>
<pre><code># 크롤링
# 1) 데이터 프레임 생성
data = pd.DataFrame(columns=[&#39;스테이션명&#39;, &#39;위치&#39;, &#39;상태정보&#39;, &#39;위도&#39;, &#39;경도&#39;])

# 2) 어울링 사이트 접속 주소 준비 : # https://www.sejongbike.kr/userStationAction.do?process=stationTotalList&amp;menu=21
url = &#39;https://www.sejongbike.kr/userStationAction.do?process=stationTotalList&amp;menu=21&#39;

# 3) url 접속하여 HTML에 가져오기
html = urlopen(url)

# 4) HTML 태그를 파싱(parsing)하여 변환
bsObject = BeautifulSoup(html, &#39;html.parser&#39;, from_encoding=&#39;utf-8&#39;)

# 5) 어울링 정류장 정보가 있는 table만 가져오기
table = bsObject.find_all(&#39;table&#39;, {&#39;class&#39;, &#39;content_table&#39;})</code></pre><p>-&gt; 접속 주소, class content_table로 변경</p>
<pre><code>  # 좌표 추출
  # 1) 위도(latitude)
  lat = td[3].a.attrs[&#39;onclick&#39;].split(&#39; &#39;)[1].replace(&quot;&#39;&quot;,&#39;&#39;).replace(&quot;,&quot;,&#39;&#39;).replace(&quot;);&quot;,&#39;&#39;) # attrs === attribute (속성)
  # onclick = td[3].a.attrs[&#39;onclick&#39;]
  # lat = onclick.split.(&#39;,&#39;)[1]
  # lat = lat.replace(&#39;\&#39;&#39;,&#39;&#39;).strip() -&gt; strip은 앞뒤 공백만 없애줌

  # 2) 경도 Longitude
  lon = td[3].a.attrs[&#39;onclick&#39;].split(&#39; &#39;)[2].replace(&quot;&#39;&quot;,&#39;&#39;).replace(&quot;,&quot;,&#39;&#39;).replace(&quot;);&quot;,&#39;&#39;) # attrs === attribute (속성)
  # lon = onclick.split(&#39;,&#39;)[2]
  # lon = lon.replace(&#39;);&#39;,&#39;&#39;).replace(&#39;\&#39;&#39;,&#39;&#39;).strip()</code></pre><p>-&gt; 타슈와는 달리 button이 아니라 a 태그 안에 onclick=&quot;javascript.openMapSize(&#39;&#39;, &#39;위도&#39;, &#39;경도&#39;)&quot;식으로 적혀있어서 그것을 split을 이용해 잘라주고 각각의 값을 담아준다.</p>
<p>html로 저장해서 보면
🔽🔽
<img src="https://velog.velcdn.com/images/may_o5/post/4f5ec094-5320-4a74-a023-7c1792c518ef/image.png" alt="">
이런식으로 나타난다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022-08-25]]></title>
            <link>https://velog.io/@may_o5/2022-08-25</link>
            <guid>https://velog.io/@may_o5/2022-08-25</guid>
            <pubDate>Thu, 25 Aug 2022 08:29:56 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-plotly를-이용한-데이터-시각화">📌 plotly를 이용한 데이터 시각화</h2>
<p><br><br></p>
<pre><code>import pandas as pd
import plotly.express as px

df = pd.read_csv(&#39;/content/도로교통공단_교통사고 정보.csv&#39;, encoding=&#39;euc-kr&#39;)

# 발생년월일시 -&gt; 시간 따로 컬럼 분리(뒤의 두자리)

# 1) 시간만 자르기 위해 문자열로 형변환
df = df.astype({&#39;발생년월일시&#39;:&#39;string&#39;})

# 2) 발생시간이라는 컬럼에 담기(ex. 2019010100 -&gt; 00)
df[&#39;발생시간&#39;] = df[&#39;발생년월일시&#39;].str[8:]  # string 슬라이싱해서 발생시간에 담음

# 3) 다시 형변환(int로)
df = df.astype({&#39;발생시간&#39;:&#39;int64&#39;})

# 4) 발생년월일시(string) -&gt; 날짜타입으로 변경
# ex) 20190101 -&gt; 20190101(년월일) 자르고 -&gt; YYYY-MM-DD인 날짜 형태로 변경

df[&#39;발생년월일시&#39;] = pd.to_datetime(df[&#39;발생년월일시&#39;].str[:8], format=&#39;%Y-%m-%d&#39;, errors=&#39;raise&#39;)</code></pre><h3 id="✅-날짜별시간별-교통사고-발생현황">✅ 날짜별/시간별 교통사고 발생현황</h3>
<pre><code>fig = px.scatter(df, x=&#39;발생년월일시&#39;, y = &#39;발생시간&#39;, color = &#39;발생지시도&#39;, size = &#39;사망자수&#39;, hover_data=[&#39;발생시간&#39;])
fig.show()</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/63c1018d-3fa6-4713-a570-81e9fb0e8257/image.png" alt=""></p>
<p>🔼 결과
이렇게 scatter 그래프를 통해 전체적인 현황을 놓고 보면 특정 시간대나 어느 날짜, 지역에 상관없이 사고가 발생하고 있다는 것을 알 수 있다.</p>
<h3 id="✅-시간대별-교통사고-사망자-현황">✅ 시간대별 교통사고 사망자 현황</h3>
<pre><code>fig = px.bar(df, x=&#39;사망자수&#39;, y=&#39;발생시간&#39;, orientation=&#39;h&#39;)
fig.show()</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/7e5e9353-6340-4dc1-ba35-48220197f672/image.png" alt=""></p>
<p>🔼 결과
19시에 가장 사고가 많이 일어나고 있다는 것을 알 수 있다.</p>
<p>❓ 세로로 하게 되면
<img src="https://velog.velcdn.com/images/may_o5/post/5dfb4c8d-96f0-4d27-be55-21986ab1e2ef/image.png" alt="">
🔼 이런식으로 그려진다. 가로로 하는 것이 가독성이 더 좋음.</p>
<h3 id="✅-지역별-교통사고-사망자-현황">✅ 지역별 교통사고 사망자 현황</h3>
<pre><code># 지역별
fig = px.bar(df, x=&#39;사망자수&#39;, y=&#39;발생지시도&#39;, orientation=&#39;h&#39;)
fig.show()</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/f763e07a-8621-4384-a58a-c01596908d49/image.png" alt="">
🔼 경기도가 가장 사망자 수가 많다.</p>
<h3 id="✅-요일별-교통사고-사망자-현황">✅ 요일별 교통사고 사망자 현황</h3>
<pre><code># 요일별
fig = px.bar(df, x=&#39;사망자수&#39;, y=&#39;요일&#39;, orienta![](https://velog.velcdn.com/images/may_o5/post/c7c26084-ffab-4631-9575-2390287e481c/image.png)
tion=&#39;h&#39;)
fig.show()</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/45efd86c-c8c7-43c6-b655-8d5c473fa6c9/image.png" alt="">
🔼 월요일에 사망사고가 가장 많이 발생하고 있다는 것을 알 수 있다.</p>
<h3 id="✅-사고유형별-교통사고-사망자-현황">✅ 사고유형별 교통사고 사망자 현황</h3>
<pre><code># 사고유형별
fig = px.bar(df, x=&#39;사망자수&#39;, y=&#39;사고유형별&#39;, orientation=&#39;h&#39;)
fig.show()</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/7c19d69e-282d-4963-b467-d98e225054a2/image.png" alt=""></p>
<p>🔼 기타가 가장 많고 횡단중 사고자가 그 다음으로 많다.
(기타사유가 가장 많은데 기타를 좀 세부분류 해주셨다면 좋았을텐데 좀,, 불편할뻔..했는데 대분류, 중분류, 가해자당사자종별 등으로 분류를 해주시긴해서 마음이 좀 덜 불편해졌다)</p>
<h3 id="✅-교통사고-현황-지도에-표시하기">✅ 교통사고 현황 지도에 표시하기</h3>
<pre><code>import folium

map = folium.Map(location=[36.321665,127.378953])


dj_df = dj_df.astype({&#39;사망자수&#39;:&#39;float64&#39;})
dj_df = dj_df.astype({&#39;부상자수&#39;:&#39;float64&#39;})

# for문을 사용하여 dj_df 데이터가 있을 때까지 반복적으로 CircleMarker를 지도에 add 시키는 작업 -&gt; 74번

for n in dj_df.index:
  # CircleMarker 사이즈 계산
  cnt = dj_df[&#39;사망자수&#39;][n] + dj_df[&#39;부상자수&#39;][n]
  folium.CircleMarker([dj_df[&#39;위도&#39;][n],dj_df[&#39;경도&#39;][n]], radius=cnt*10, popup=dj_df[&#39;사고유형&#39;][n],
                      color=&#39;#3186cc&#39;,fill_color=&#39;#3186cc&#39;).add_to(map)

map</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/cde7d116-daa4-42a5-b53e-df5e3d2c456f/image.png" alt=""></p>
<p>🔼 결과</p>
<p>(2021년 데이터 또한 분석하여 비교해보았지만 첨부는 하지 않겠습니다..)</p>
<h4 id="❓-조건문을-사용하여-색-지정하기">❓ 조건문을 사용하여 색 지정하기</h4>
<pre><code>for n in gb_df.index:
  if gb_df[&#39;사고유형&#39;][n]==&#39;기타&#39;:
    color = &#39;red&#39;
  elif gb_df[&#39;사고유형&#39;][n]==&#39;횡단중&#39;:
    color = &#39;blue&#39;
  else:
    color = &#39;green&#39;
  # CircleMarker 사이즈 계산
  cnt = gb_df[&#39;사망자수&#39;][n] + gb_df[&#39;부상자수&#39;][n]
  folium.CircleMarker([gb_df[&#39;위도&#39;][n],gb_df[&#39;경도&#39;][n]], radius=cnt*10, popup=gb_df[&#39;사고유형&#39;][n], 
                      color=color, fill_color=color).add_to(gb_map)</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/3ea3568c-2037-4d9a-bcd1-f786f3370d02/image.png" alt="">
🔼 결과
(경상북도의 데이터만 활용)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022-08-24]]></title>
            <link>https://velog.io/@may_o5/2022-08-24</link>
            <guid>https://velog.io/@may_o5/2022-08-24</guid>
            <pubDate>Thu, 25 Aug 2022 04:02:25 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-html인터넷-프로그래밍-입문">📌 HTML(인터넷 프로그래밍 입문)</h2>
<br>

<ul>
<li>HTML -&gt; &lt;태그명&gt;&lt;/태그명&gt; 형식, 대소문자 구분하지는 않음.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/may_o5/post/9b90e4aa-e4bb-4011-bbc7-1c7acfb1d280/image.png" alt=""></p>
<p>html의 기본형태
title에 적은 것은 도메인 이름이 되고, 파일 경로가 URL로 적힌다.
<img src="https://velog.velcdn.com/images/may_o5/post/c367d788-b8f8-496e-bad3-f76f8c6dba89/image.png" alt="">
파일을 열면 이런식으로 뜬다.</p>
<h3 id="✅-글자태그">✅ 글자태그</h3>
<p><img src="https://velog.velcdn.com/images/may_o5/post/b4a9e017-e2fa-4750-9ae3-7cb942a2d4ee/image.png" alt="">
Hn 태그 -&gt; 글자크기, align -&gt; 정렬
border를 쓰면 굵게도 가능하며 이탤릭체, 밑줄 등도 가능.</p>
<p><img src="https://velog.velcdn.com/images/may_o5/post/9870c2d1-9f75-4bd1-847c-0b431472f498/image.png" alt="">
🔼 결과</p>
<ul>
<li>문장 포멧</li>
</ul>
<p><img src="https://velog.velcdn.com/images/may_o5/post/bf833ce8-107e-41ad-b013-7a7f9503b842/image.png" alt="">
p는 문단구분 태그
<img src="https://velog.velcdn.com/images/may_o5/post/eac7aeff-16c6-44d4-bfcc-64b5c49de70d/image.png" alt=""></p>
<p>-&gt; br과 p의 차이</p>
<p><img src="https://velog.velcdn.com/images/may_o5/post/6236ecab-0d9a-40ab-bb1b-6aa31ab0802e/image.png" alt="">
디비젼 태그 -&gt; 레이아웃을 나누는 목적</p>
<h3 id="✅-목록태그">✅ 목록태그</h3>
<p><img src="https://velog.velcdn.com/images/may_o5/post/a9d3a001-25ee-4c13-8540-fb1f256502aa/image.png" alt="">
목록 태그는 UL, OL 등이 있고 LI가 소속.
UL type으로 square, 로마숫자(i)를 표기함
<img src="https://velog.velcdn.com/images/may_o5/post/6903cf75-e119-463e-a612-81479c7f585b/image.png" alt="">
🔼 결과</p>
<h3 id="✅-하이퍼링크-태그">✅ 하이퍼링크 태그</h3>
<p><img src="https://velog.velcdn.com/images/may_o5/post/74c9f0ae-2b4d-4de2-bbdb-b7690d6b3664/image.png" alt=""></p>
<p>위의 목록 태그 안에 a 태그를 활용하여 글자에 링크를 걸어놓았다.
<img src="https://velog.velcdn.com/images/may_o5/post/f10d1038-61a3-4d8d-8d79-bf185f3023d2/image.png" alt="">
파일을 열면 이렇게 뜨는데 글자를 누르게 되면 위의 첨부한 링크로 이동하게 된다.</p>
<h3 id="✅-이미지태그">✅ 이미지태그</h3>
<p><img src="https://velog.velcdn.com/images/may_o5/post/b2f71cdb-9755-4e19-b284-ed0a2fd2c4ba/image.png" alt=""></p>
<p>img 태그 -&gt; scr=&quot;파일경로\파일이름.확장명&quot; alt=&quot;이미지 설명&quot;
위를 보면 a 태그 안에 img 태그를 넣어서 이미지 클릭시 링크로 이동할 수 있는 로직을 짰으나 나는 이미지와 링크를 첨부하지 않아서 임의로 한글로 적어놓았음(사진 크기도 width와 height로 설정가능!)
<img src="https://velog.velcdn.com/images/may_o5/post/e2c1fb23-281b-434d-b7ff-8603d1d3698e/image.png" alt="">
🔼 결과
내 벨로그 프로필을 캡쳐하고 링크에 내 벨로그 주소를 입력해서 이미지를 누르면 벨로그에 접속할 수 있게끔 해보았다.</p>
<h3 id="✅-테이블태그">✅ 테이블태그</h3>
<p><img src="https://velog.velcdn.com/images/may_o5/post/5ebfbf92-42d8-4b4f-bc83-18a98558d5f4/image.png" alt=""></p>
<h3 id="✅-입력태그인풋은-태그안에서-바로-닫아서-추가-안됨-button은-됨">✅ 입력태그(인풋은 태그안에서 바로 닫아서 추가 안됨. button은 됨</h3>
<p><img src="https://velog.velcdn.com/images/may_o5/post/00a2c4d3-b302-413a-8dfb-b9ccc16e5a78/image.png" alt=""></p>
<p>어제 기술블로그 바로 안썼더니 노트패드에 적어놓은게 테이블 태그부터 날라갔다... 다시 해서 정리해놔야지 .. 앞으로는 진짜 바로 써야겠다 ..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022-08-23]]></title>
            <link>https://velog.io/@may_o5/2022-08-23</link>
            <guid>https://velog.io/@may_o5/2022-08-23</guid>
            <pubDate>Tue, 23 Aug 2022 09:14:33 GMT</pubDate>
            <description><![CDATA[<p>어제에 이어서 행정안전부에서 데이터를 받아 인구조사 그래프를 그렸다.</p>
<p><br><br></p>
<h2 id="📌-인구구조-다양하게-시각화하기">📌 인구구조 다양하게 시각화하기</h2>
<br>

<h3 id="✅-성별에-따른-인구분포-그래프-그리기">✅ 성별에 따른 인구분포 그래프 그리기</h3>
<pre><code>import csv
import matplotlib.pyplot as plt

f = open(&#39;/content/201902_201902_연령별인구현황_gender.csv&#39;)
data = csv.reader(f)

# 남성, 여성 데이터 담을 list 변수 선언
m_list = []
f_list = []
address = input(&#39;검색할 지역을 입력하세요&#39;)

for row in data:
  if address in row[0]:
    for i in row[3:104]:
      m_list.append(-int(i.replace(&#39;,&#39;,&#39;&#39;)))  # -int를 통해 남성 데이터 음수로 변환

    for i in row[106:]:
      f_list.append(int(i.replace(&#39;,&#39;,&#39;&#39;)))

plt.figure(dpi=200)
plt.rcParams[&#39;axes.unicode_minus&#39;] = False
plt.title(address + &#39;지역의 남녀 성별 인구 분포&#39;)
plt.barh(range(101), m_list, label = &#39;남성&#39;)
plt.barh(range(101), f_list, label = &#39;여성&#39;)
plt.legend()
plt.show()</code></pre><p>🔽 결과
<img src="https://velog.velcdn.com/images/may_o5/post/edd2dcd5-cc76-4a0b-bcfe-34adf6de6f9b/image.png" alt=""></p>
<br>

<h3 id="✅-파이-차트를-통해-성별-비율-확인하기">✅ 파이 차트를 통해 성별 비율 확인하기</h3>
<pre><code>size = []  </code></pre><p>-&gt; 남녀 인구 합계를 담을 리스트 변수 선언</p>
<pre><code>for row in data:
  if address in row[0]:
    sum_m = 0  
    sum_f = 0
    for i in row[3:104]:
      m_list.append(-int(i.replace(&#39;,&#39;,&#39;&#39;)))
      sum_m += int(i.replace(&#39;,&#39;,&#39;&#39;))  

    for i in row[106:]:
      f_list.append(int(i.replace(&#39;,&#39;,&#39;&#39;)))
      sum_f += int(i.replace(&#39;,&#39;,&#39;&#39;))
    break

size.append(sum_m)
size.append(sum_f)</code></pre><p>-&gt; 합계 구할 변수(sum_m, sum_f)를 선언하여 합계 구하기</p>
<pre><code>plt.figure(dpi=200)
color = [&#39;crimson&#39;, &#39;darkcyan&#39;]
label = [&#39;남&#39;, &#39;여&#39;]
plt.title(address + &#39;지역의 남녀 성별 인구 분포&#39;)
plt.pie(size, labels=label, autopct=&#39;%.2f%%&#39;, colors=color, startangle=90)
plt.legend()
plt.show()</code></pre><p>-&gt; 파이 차트 그리기</p>
<p>🔽 결과
<img src="https://velog.velcdn.com/images/may_o5/post/cc595949-b060-46b5-b403-52df2fecd0b0/image.png" alt="">
(대전 지역을 입력한 결과)</p>
<br>

<h3 id="✅-파이-차트-더-다양하게-그려보기">✅ 파이 차트 더 다양하게 그려보기</h3>
<pre><code>plt.figure(dpi=200)

size = [1244, 2312, 1031, 1233]
label = [&#39;A형&#39;, &#39;B형&#39;, &#39;AB형&#39;, &#39;O형&#39;]
color = [&#39;darkmagenta&#39;, &#39;deeppink&#39;, &#39;hotpink&#39;, &#39;pink&#39;]
plt.axis(&#39;equal&#39;)
plt.pie(size, labels=label, autopct=&#39;%.2f%%&#39;, colors = color, explode=(0,0,0,0.1), shadow=True, startangle=90)
plt.legend()
plt.show()</code></pre><p>-&gt; 색, explode를 이용해 강조, 그림자효과, 시작각도 조절(90도로 설정)</p>
<br>

<h3 id="✅-성별에-따른-인구분포-그래프-그리기2">✅ 성별에 따른 인구분포 그래프 그리기2</h3>
<p>-&gt; (남자 - 여자) 값을 비교하는 그래프</p>
<pre><code>import csv
import matplotlib.pyplot as plt

f = open(&#39;/content/202202_202202_연령별인구현황_gender.csv&#39;)
data = csv.reader(f)

# (남성 연령 데이터 - 여성 데이터) 를 담을 list 변수 선언
result = []

address = input(&#39;검색할 지역을 입력하세요&#39;)

for row in data:
  if address in row[0]:
    for i in range(3, 104):
      result.append(int(row[i].replace(&#39;,&#39;, &#39;&#39;)) - int(row[i+103].replace(&#39;,&#39;, &#39;&#39;)))
    break

# 시각화
plt.figure(dpi=200)
plt.rcParams[&#39;axes.unicode_minus&#39;] = False
plt.title(address + &#39;지역의 남녀 인구수&#39;)
plt.bar(range(101), result)
#plt.legend()
plt.show()</code></pre><p>🔽 결과
<img src="https://velog.velcdn.com/images/may_o5/post/3cc9175f-346d-4bd1-ab77-732f8ce7dd66/image.png" alt=""></p>
<h2 id="📌-pandas-라이브러리">📌 pandas 라이브러리</h2>
<p><br><br></p>
<h3 id="✅-사용자가-입력한-지역과-인구구조가-유사한-지역-찾기">✅ 사용자가 입력한 지역과 인구구조가 유사한 지역 찾기</h3>
<pre><code># 1) 데이터 불러오기
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df = pd.read_csv(&#39;/content/age_2019.csv&#39;, encoding = &#39;utf-8&#39;)
# df.head() -&gt; 데이터 앞에서 다섯개 확인df.tail -&gt; 뒤에서 다섯개 확인, df.info() -&gt; 데이터 정보 확인

# 2) 데이터 전처리
# 2-1) 행정코드 삭제
names_split = df[&#39;행정구역&#39;].str.split(&#39;(&#39;)
df[&#39;행정구역&#39;] = names_split.str.get(0)  # get(0) -&gt; 첫번째 인덱스에 있는 것을 가져오는 것

# 2-2) 컬럼명 변경(행정구역 제외)
columns_list = df.columns

final_col = {}
for col in columns_list[1:]:  # 행정구역 제외하고 실행
  final_col[col] = col.split(&#39;_&#39;)[2]

df.rename(columns=final_col, inplace=True)

# 2-3) 콤마(,) 제거 후 숫자 형태로 변환
df.replace(&#39;[^\w]&#39;, &#39;&#39;, regex=True, inplace=True)  # 정규식을 사용한 모든 컬럼의 특수기호 제거

# 2-4) 인덱스 변경(0,1,... -&gt; 서울특별시, 서울특별시 종로구,...)
df.set_index(keys=[&#39;행정구역&#39;], inplace=True)

# 2-5) 데이터 형변환
df = df.astype(&#39;int&#39;)

# 3) 데이터
# 3-1) (각각의 데이터) / (총 인구수) -&gt; 비율 계산
df = df.div(df[&#39;총인구수&#39;], axis=0)  # 전체 데이터를 총 인구수로 나워서 비율로 변환, axis는 축(0은 행, 1은 열)

# 3-2) 총인구수와 연령구간인구수 데이터 삭제
del df[&#39;총인구수&#39;], df[&#39;연령구간인구수&#39;]

# 정제된 파일 저장
# df.to_csv(&#39;2019_인구구조_정제데이터.csv&#39;, encoding=&#39;utf-8-sig&#39;)

# 4) 사용자에게 지역을 입력받고 그 값을 저장
address = input(&#39;인구구조가 알고 싶은 지역의 주소(읍면동 단위)를 입력해주세요: &#39;)  # 지역 이름 넣기

a = df.index.str.contains(address)  # 해당 지역의 인덱스 찾기
df2 = df[a]  # 인구구조 저장

# 5) 사용자가 선택한 인구구조와 가까운 데이터 찾기 
df.sub(df2.iloc[0], axis=1)  # df.sub -&gt; 뺄셈, df.iloc[0] -&gt; 숫자형(int), df.loc[] -&gt; 인덱스명을 적어야 함
np.power(df.sub(df2.iloc[0], axis=1),2).sum(axis=1).sort_values().index[1:6]  # 자기 자신은 빼고, power은 제곱

# ) 시각화
plt.style.use(&#39;ggplot&#39;)
df.loc[np.power(df.sub(df2.iloc[0], axis=1),2).sum(axis=1).sort_values().index[1:6]].T.plot()
plt.show()</code></pre><p>🔽 결과
<img src="https://velog.velcdn.com/images/may_o5/post/302250c2-ee9e-481d-b5f8-cf161b01d734/image.png" alt="">
(잠실2동을 입력한 결과)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022-08-22]]></title>
            <link>https://velog.io/@may_o5/2022-08-22</link>
            <guid>https://velog.io/@may_o5/2022-08-22</guid>
            <pubDate>Mon, 22 Aug 2022 08:48:27 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-우리-동네-인구-구조-시각화하기">📌 우리 동네 인구 구조 시각화하기</h2>
<p>▶️ 데이터 : 행정안전부 인구 통계</p>
<p><br><br></p>
<h3 id="✅-신도림-연령-별-인구수-그래프-그리기">✅ 신도림 연령 별 인구수 그래프 그리기</h3>
<pre><code>import csv
import matplotlib.pyplot as plt

# 1) 파일 읽어들이기
f = open(&#39;/content/age.csv&#39;)
data = csv.reader(f)

result = []  # 리스트 변수

# 2) 데이터 한줄씩 읽기
for row in data:
  # 2-1) 신도림만 추출하여 출력
  if &#39;신도림&#39; in row[0]:  # 중복되는 동이 있을 경우 and 연산자를 이용해 시도를 입력(&#39;대전&#39; in row[0] and &#39;삼성동&#39; in row[0])
    # 연령 별 인구수 데이터 result 변수에 담기
    for i in row[3:]:
      result.append(int(i))

# 3) 시각화

plt.figure(dpi=100)
plt.style.use(&#39;ggplot&#39;)  # 격자 무늬 스타일 지정
plt.plot(result)
plt.show()</code></pre><p>🔽🔽 결과
<img src="https://velog.velcdn.com/images/may_o5/post/20674a38-6051-4339-886d-d375b1e0f977/image.png" alt=""></p>
<br>

<h3 id="✅-사용자에게-주소를-입력받아-그래프-출력하기">✅ 사용자에게 주소를 입력받아 그래프 출력하기</h3>
<ul>
<li>시, 동 입력받아 그리기<pre><code>city = input(&quot;도시 이름을 입력하시오.&quot;)
dong = input(&quot;동네명(동)을 입력하시오.&quot;)</code></pre></li>
<li><blockquote>
<p>입력받을 변수 지정</p>
</blockquote>
</li>
</ul>
<br>

<pre><code>if city in row[0] and dong in row[0]: </code></pre><p>-&gt; 시와 동을 and 연산자를 이용하여 추출</p>
<br>

<pre><code>plt.title(city + &#39; &#39;+ dong + &#39;의 인구구조&#39;)</code></pre><p>-&gt; 그래프 타이틀 수정</p>
<p>🔽🔽 결과</p>
<p><img src="https://velog.velcdn.com/images/may_o5/post/11c1f1b8-cfca-4eff-a8e1-23f4cf8bae5e/image.png" alt=""></p>
<br>

<ul>
<li>전체 주소를 입력받아 출력</li>
</ul>
<pre><code>address = input(&quot;본인의 전체 주소(시 군구 읍면동)을 입력하시오.&quot;)</code></pre><p>-&gt; 주소 입력 변수</p>
<br>

<pre><code>for row in data:
  # 2-1) 사용자가 입력한 동 정보 추출하여 출력
  if row[0].split(&#39;(&#39;)[0] == address:  # 시 군구 읍면동 정보가 일치하는 정보 추출
    # 2-2) 연령 별 인구수 데이터 address 변수에 담기
    for i in row[3:]:
      result.append(int(i.replace(&#39;,&#39;, &#39;&#39;)))  # replace(A, B)를 통해 &#39;,&#39; 처리</code></pre><p>-&gt; for-if문 수정</p>
<br>

<pre><code>plt.title(address + &#39;의 인구구조&#39;)</code></pre><p>-&gt; 그래프 타이틀 수정</p>
<br>

<ul>
<li>두개의 동 입력받아 비교하기</li>
</ul>
<pre><code>result1 = []  # 리스트 변수
result2 = []
address1 = input(&quot;비교할 동네의 전체 주소(시 군구 읍면동)을 입력하시오.&quot;)
address2 = input(&quot;본인의 전체 주소(시 군구 읍면동)을 입력하시오.&quot;)</code></pre><p>-&gt; 변수 설정</p>
<pre><code>for row in data:
  # 2-1) 사용자가 입력한 동 정보 추출하여 출력
  if row[0].split(&#39;(&#39;)[0] == address1:  # 시 군구 읍면동 정보가 일치하는 정보 추출
    # 2-2) 연령 별 인구수 데이터 address 변수에 담기
    for i in row[3:]:
      result1.append(int(i.replace(&#39;,&#39;, &#39;&#39;)))  # replace(A, B)를 통해 &#39;,&#39; 처리

  if row[0].split(&#39;(&#39;)[0] == address2:  # 시 군구 읍면동 정보가 일치하는 정보 추출
    # 2-2) 연령 별 인구수 데이터 address 변수에 담기
    for i in row[3:]:
      result2.append(int(i.replace(&#39;,&#39;, &#39;&#39;)))  # replace(A, B)를 통해 &#39;,&#39; 처리</code></pre><p>-&gt; 각각의 주소를 출력하여 result 변수에 저장</p>
<pre><code>plt.figure(dpi=100)
plt.title(address1 + &#39;과 &#39; + address2 + &#39;의 인구구조&#39;)
plt.plot(result1, &#39;r&#39;, label = address1)
plt.plot(result2, &#39;b&#39;, label = address2)
plt.legend()
plt.show()</code></pre><p>-&gt; 시각화</p>
<p>🔽🔽 결과
<img src="https://velog.velcdn.com/images/may_o5/post/9dbb1605-c88a-45c7-93ae-64d1580d8541/image.png" alt=""></p>
<p><br><br></p>
<h3 id="✅-입력받은-지역의-4개년-비교20192022">✅ 입력받은 지역의 4개년 비교(2019~2022)</h3>
<pre><code>import csv
import matplotlib.pyplot as plt

# 1) 파일 읽어들이기
f1 = open(&#39;/content/age_2019.csv&#39;)
f2 = open(&#39;/content/age_2020.csv&#39;)
f3 = open(&#39;/content/age_2021.csv&#39;)
f4 = open(&#39;/content/age_2022.csv&#39;)

data1 = csv.reader(f1)
data2 = csv.reader(f2)
data3 = csv.reader(f3)
data4 = csv.reader(f4)

result1 = []  # 리스트 변수
result2 = []
result3 = []
result4 = []
address = input(&quot;알아보고자 하는 지역의 전체 주소(시 군구 읍면동)를 입력해주세요.&quot;)

# 2) 데이터 한줄씩 읽기(2019년)
for row in data1:
  # 2-1) 사용자가 입력한 주소 정보를 추출하여 출력
  if row[0].split(&#39;(&#39;)[0] == address:  # 시 군구 읍면동 정보가 일치하는 정보 추출
    # 2-2) 연령 별 인구수 데이터 address 변수에 담기
    for i in row[3:]:
      result1.append(int(i.replace(&#39;,&#39;, &#39;&#39;)))  # replace(A, B)를 통해 &#39;,&#39; 처리
# 2020년
for row in data2:
  # 2-1) 사용자가 입력한 주소 정보를 추출하여 출력
  if row[0].split(&#39;(&#39;)[0] == address:  # 시 군구 읍면동 정보가 일치하는 정보 추출
    # 2-2) 연령 별 인구수 데이터 address 변수에 담기
    for i in row[3:]:
      result2.append(int(i.replace(&#39;,&#39;, &#39;&#39;)))  # replace(A, B)를 통해 &#39;,&#39; 처리
# 2021년
for row in data3:
  # 2-1) 사용자가 입력한 주소 정보를 추출하여 출력
  if row[0].split(&#39;(&#39;)[0] == address:  # 시 군구 읍면동 정보가 일치하는 정보 추출
    # 2-2) 연령 별 인구수 데이터 address 변수에 담기
    for i in row[3:]:
      result3.append(int(i.replace(&#39;,&#39;, &#39;&#39;)))  # replace(A, B)를 통해 &#39;,&#39; 처리
# 2022년
for row in data4:
  # 2-1) 사용자가 입력한 주소 정보를 추출하여 출력
  if row[0].split(&#39;(&#39;)[0] == address:  # 시 군구 읍면동 정보가 일치하는 정보 추출
    # 2-2) 연령 별 인구수 데이터 address 변수에 담기
    for i in row[3:]:
      result4.append(int(i.replace(&#39;,&#39;, &#39;&#39;)))  # replace(A, B)를 통해 &#39;,&#39; 처리

# 시각화
plt.figure(dpi=100)
plt.title(address + &#39;의 인구구조&#39;)
plt.plot(result1, &#39;r&#39;, label = &#39;2019년도 &#39; + address + &#39; 인구분포&#39;)
plt.plot(result2, &#39;g&#39;, label = &#39;2020년도 &#39; + address + &#39; 인구분포&#39;)
plt.plot(result3, &#39;b&#39;, label = &#39;2021년도 &#39; + address + &#39; 인구분포&#39;)
plt.plot(result4, &#39;y&#39;, label = &#39;2022년도 &#39; + address + &#39; 인구분포&#39;)
plt.legend()
plt.show()</code></pre><p>🔽🔽 결과
<img src="https://velog.velcdn.com/images/may_o5/post/67f859bc-3dbf-419c-98e5-f6fe180640ce/image.png" alt=""></p>
<h3 id="✅-bar-차트-그리기">✅ bar 차트 그리기</h3>
<pre><code>plt.bar(range(len(result)),result) </code></pre><p>-&gt; plot을 bar로 변경하고 range(len())으로 x좌표 범위 설정</p>
<p>+) barh로 변경시 가로 그래프로 변경됨(horizontal)</p>
<p><br><br></p>
<h3 id="✅-팀별과제">✅ 팀별과제</h3>
<ul>
<li>사용자가 입력한 연도의 인구구조 비교하는 그래프 그리기</li>
</ul>
<pre><code>import csv
import matplotlib.pyplot as plt
import os


# 1) 파일 읽어오기
file_list = os.listdir(&#39;/content/&#39;) # 디렉토리를 이용하여 파일을 리스트 형태로 저장
print(file_list)

# 변수 생성
result = []
result_1= []

year_1 = input(&quot;비교하고자 하는 첫번째 연도를 입력하시오.&quot;)
year_2 = input(&quot;비교하고자 하는 두번째 연도를 입력하시오.&quot;)

address = input(&quot;비교할 동네주소명 [시 군 구 읍면동]&quot;)

for fl in file_list:
  if year_1 in fl:
    f_1 = open(fl)

  if year_2 in fl:
    f_2 = open(fl)    

data = csv.reader(f_1)
data1 = csv.reader(f_2)

for row in data:
  if row[0].split(&#39;(&#39;)[0] == address:
    for i in row[3:]:
      result.append(-int(i.replace(&#39;,&#39;,&#39;&#39;)))

for row in data1:
  if row[0].split(&#39;(&#39;)[0] == address:
    for i in row[3:]:
      result_1.append(int(i.replace(&#39;,&#39;,&#39;&#39;)))


plt.figure(dpi=100)
plt.style.use(&#39;ggplot&#39;)             # Bar chart 쓸 때 유의점 
plt.barh(range(len(result)), result, label = year_1 + &#39;인구구조&#39;)
plt.barh(range(len(result_1)), result_1, label = year_2 + &#39;인구구조&#39;) # range =&gt; 범위, len =&gt; 항목 갯수(나이 1,2,~ 100) ==&gt; range를 항목 개수(나이범위)로
plt.title(address + &#39;의 &#39; + year_1 + &#39;년과 &#39; + year_2 + &#39;년의 인구구조 비교&#39;)
plt.legend()
plt.show()  # barh =&gt; bar + horizontal </code></pre><p>🔽 결과
<img src="https://velog.velcdn.com/images/may_o5/post/b458626f-ff0e-45f0-a96b-8b34fbe14333/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022-08-19]]></title>
            <link>https://velog.io/@may_o5/2022-08-19</link>
            <guid>https://velog.io/@may_o5/2022-08-19</guid>
            <pubDate>Fri, 19 Aug 2022 06:03:09 GMT</pubDate>
            <description><![CDATA[<h3 id="🗣️삼성전자-mx-사업부-안드로이드-개발자-최윤찬님-특강🗣️">🗣️삼성전자 MX 사업부 안드로이드 개발자 최윤찬님 특강🗣️</h3>
<p><br><br>
<img src="https://velog.velcdn.com/images/may_o5/post/6ab9e767-d8be-4ad4-bd66-0a09c1b536b7/image.jpg" alt=""></p>
<p>이거 넘 웃겼다 ..</p>
<br>

<p>계속 공부 필요(지식 반감기가 짧음), 독서(소프트웨어 관련)
영어 무조건 .....
카타 - 작은 훈련용 코딩
펫프로젝트, 오픈 소스 프로젝트, 페어 프로그래밍 </p>
<p><br><br></p>
<p><img src="https://velog.velcdn.com/images/may_o5/post/7dc339ad-8227-42a8-bef9-7371705ce5e7/image.png" alt=""></p>
<p>이후 점심 먹고 오후에 그린 인생그래프 .. 
솔직히 대학원 졸업 이후부터는 뭘 하고있을지 잘 모르겠다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022-08-18]]></title>
            <link>https://velog.io/@may_o5/2022-08-18</link>
            <guid>https://velog.io/@may_o5/2022-08-18</guid>
            <pubDate>Thu, 18 Aug 2022 09:03:17 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-대중교통-데이터-분석">📌 대중교통 데이터 분석</h2>
<p><br><br><br></p>
<h3 id="✅-유임-승차-비율이-가장-높은-역은-어디일까">✅ 유임 승차 비율이 가장 높은 역은 어디일까</h3>
<pre><code>file_path = &#39;/content/drive/MyDrive/전공관련/파이썬/subwayfee.csv&#39;

import csv

f = open(file_path, encoding = &#39;cp949&#39;)

data = csv.reader(f)

next(data)

max = 0    # 유임승차 최대일 때 값 저장 변수
rate = 0   # 유임승차 비율을 구하는 변수
station = &#39;&#39;

for row in data:
  for i in range(4,8):
    row[i] = int(row[i])
   # rate = row[4] / row[6]   ※유임승차 비율 -&gt; 유임승차 / 무임승차  =&gt; 이렇게 할 경우 에러!(무임승차자가 0인 경우가 있어서)
  if row[6] != 0 and (row[4]+row[6]) &gt; 100000:
    rate = row[4] / (row[4] + row[6])   # 유임승차 / 전체 승차자(유임 + 무임)

  if rate &gt; max:
    max = rate
    station = row[3] + &#39; &#39; + row[1]

print(station, round(max*100, 2))  # 비율이므로 *100, 소수점자리 2번째까지 출력</code></pre><p>▶️▶️ 결과!
<code>홍대입구 공항철도 1호선 95.16</code></p>
<p>(사실 강사님 따라가기 조금 벅차서 혼자 책보고 쳤더니 이게 맞는건지는 
잘 모르겠다 ..)</p>
<br>

<p>❓ <em>무임승차자가 가장 많은 역</em></p>
<p>-&gt; rate 처리 수식만 rate = row[6] / (row[4] + row[6])로 변경 하면 됨</p>
<p><br><br></p>
<h3 id="✅-유무임-승하차-인원이-가장-많은-역">✅ 유무임 승하차 인원이 가장 많은 역</h3>
<pre><code>file_path = &#39;/content/drive/MyDrive/전공관련/파이썬/subwayfee.csv&#39;

import csv

f = open(file_path, encoding = &#39;cp949&#39;)

data = csv.reader(f)

next(data)

# 유무임승하차  변수 생성
max = [0] * 4         # max = [0,0,0,0]
station = [&#39;&#39;] * 4    # station = [&#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;]
title = [&#39;유임승차&#39;, &#39;유임하차&#39;, &#39;무임승차&#39;, &#39;무임하차&#39;]

for row in data:
  for i in range(4,8):
    row[i] = int(row[i])

    if row[i] &gt; max[i-4]:
        max[i-4] = row[i]
        station[i-4] = row[3] + &#39; &#39; + row[1]

for i in range(4):
        print(title[i] + &#39;:&#39; + station[i], max[i])</code></pre><p>▶️▶️ 결과!</p>
<pre><code>유임승차:강남 2호선 2235658
유임하차:강남 2호선 2193476
무임승차:종로3가 1호선 289163
무임하차:제기동 1호선 279438</code></pre><p><br><br></p>
<h3 id="✅-위의-결과-파이그래프로-그리기">✅ 위의 결과 파이그래프로 그리기</h3>
<pre><code>plt.pie(row[4:8])
plt.axis(&quot;equal&quot;)
plt.show()</code></pre><p>matplotlib 임포트 후 위의 코드 입력</p>
<p>▶️▶️ 결과
<img src="https://velog.velcdn.com/images/may_o5/post/829b05ee-5f9d-4ea2-9e5e-31f38bd2e07d/image.png" alt=""></p>
<p>+) 색 변경 및 해상도, 타이틀, 퍼센트 설정</p>
<pre><code>c = [&#39;#14CCC0&#39;, &#39;#389993&#39;, &#39;#FF1C6A&#39;, &#39;#CC14AF&#39;]
plt.figure(dpi=300)
plt.title(row[3] + &#39; &#39; + row[1])
plt.pie(row[4:8], colors = c, labels = title, autopct=&quot;%1.f%%&quot;)</code></pre><p><img src="https://velog.velcdn.com/images/may_o5/post/eb04c7ca-ddc6-41af-855a-29519092ec8a/image.png" alt=""></p>
<p><br><br></p>
<h3 id="✅-출근시간-승하차-그래프">✅ 출근시간 승하차 그래프</h3>
<ul>
<li>출근 시간 승하차 인원이 가장 많은 역은?</li>
</ul>
<pre><code>next(data)  # next 두번
next(data)

# 1) 변수 선언
max = 0
station = &#39;&#39;

# 2) 승하차 인원이 가장 많은 역 출력
for row in data:
  row[4:] = map(int, row[4:])  # map 함수 이용해서 한번에 형변환

  if row[10] &gt; max:
    max = row[10]
    station = row[3] + &#39;(&#39; + row[1] + &#39;)&#39;

print(station, max)</code></pre><p>▶️▶️ 결과
<code>신림(2호선) 188831</code></p>
<br>

<ul>
<li>그래프 그리기<pre><code># 1) 리스트 저장 변수 생성
result = []
</code></pre></li>
</ul>
<h1 id="2-역별-승하차-인원-인덱스-출력하여-result-변수에-저장">2) 역별 승하차 인원 인덱스 출력하여 result 변수에 저장</h1>
<p>for row in data:
  row[4:] = map(int, row[4:])
  result.append(sum(row[10:15:2]))</p>
<h1 id="3-막대-그래프-그리기">3) 막대 그래프 그리기</h1>
<p>result.sort()  # sort 이용하여 정렬</p>
<p>plt.figure(figsize=(20,5))
plt.bar(range(len(result)), result)
plt.show()</p>
<pre><code>🔽 결과 
![](https://velog.velcdn.com/images/may_o5/post/87fa57b2-3e21-46bd-8a7c-b51f2a1c8a84/image.png)
-&gt; sort 하지 않고 그래프를 그렸을 때

![](https://velog.velcdn.com/images/may_o5/post/2498f584-46dd-4ad4-95bb-f3c91e495a68/image.png)
-&gt; sort 한 경우
&lt;br&gt;&lt;br&gt;

### ✅ 사용자가 시간을 입력하여 그래프 그리기</code></pre><h1 id="1-시간-저장">1) 시간 저장</h1>
<p>time = int(input(&quot;몇시: &quot;))
if time &lt; 4:    # 24시 이후 새벽은 +24 처리 후 출력할 수 있도록 설정
  time = time + 24
idx = 2 * time -4</p>
<p>for row in data:
  row[4:] = map(int, row[4:])
  if row[idx] &gt; max:
    max = row[idx]
    station = row[3] + &#39; &#39; + row[1]</p>
<p>print(station, max)</p>
<pre><code>&lt;br&gt;
🔽 결과

![](https://velog.velcdn.com/images/may_o5/post/56bf3381-26f5-4492-a926-d8e0025121be/image.png)

&lt;br&gt;&lt;br&gt;

### ✅ 시간대별 승하차 그래프
</code></pre><h1 id="1-시간-별-승하차-변수-선언">1) 시간 별 승하차 변수 선언</h1>
<p>max_in = [0] * 24
max_out = [0] * 24
station_in = [&#39;&#39;] * 24
station_out = [&#39;&#39;] * 24</p>
<p>for row in data:
  row[4:] = map(int, row[4:])
  for idx in range(24):
    if row[2<em>idx+4] &gt;= max_in[idx]:
      max_in[idx] = row[2</em>idx+4]
      station_in[idx] = row[3] + &#39; &#39; + row[1]
    if row[2<em>idx+5] &gt;= max_out[idx]:
      max_out[idx] = row[2</em>idx+5]
      station_out[idx] = row[3] + &#39; &#39; + row[1]</p>
<p>print(station_in, max_in)
print(station_out, max_out)</p>
<p>for i in range(24):
  print(station_in[i], max_in[i], station_out[i], max_out[i])</p>
<h1 id="2-그래프-그리기">2) 그래프 그리기</h1>
<p>plt.bar(range(24), max)
plt.xticks(range(24), station, rotation=90)  # rotation로 x축 글자 눕히기
plt.show()</p>
<pre><code>
🔽 결과

![](https://velog.velcdn.com/images/may_o5/post/06c78c9c-a707-4133-be42-9535245f6e40/image.png)</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[2022-08-17]]></title>
            <link>https://velog.io/@may_o5/2022-08-17</link>
            <guid>https://velog.io/@may_o5/2022-08-17</guid>
            <pubDate>Wed, 17 Aug 2022 08:59:54 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-경영전략과-기업가-정신">📌 경영전략과 기업가 정신</h2>
<p><br><br></p>
<ul>
<li><p>계획 = 목적 + 방법
(무언가를 수행할 때 그것의 목적이 무엇인지가 중요함)</p>
</li>
<li><p>경영 -&gt; 조직의 목표를 사람들을 통해 효과적, 효율적으로 달성하는 것. 계획조직지휘통제의 과정.</p>
</li>
</ul>
<ul>
<li>What is Strategy? 그 기업이 경쟁관계에서 독특한 우월성을 유지할 것인가.</li>
<li>경영전략 프로세스 : 미션비젼(왜존재?) -&gt; 경영 환경 분석 -&gt; 경영전략 수립 </li>
<li><blockquote>
<p>실행 -&gt; 평가</p>
</blockquote>
</li>
</ul>
<ul>
<li>차별화 전략 / 비용우위 전략 : 보급형과 프리미엄, 이마트 등</li>
<li>스타벅스 일화(차별화 전략 예시)
<img src="https://velog.velcdn.com/images/may_o5/post/326049f4-e24a-46d7-aa24-606f7ccdae4e/image.jpg" alt=""></li>
</ul>
<ul>
<li>기업가 정신 : 새로운 기회를 찾아 자원의 제약에도 불구하고 자기 희생과 열정을 바탕으로 모험에 도전하는 자세</li>
<li>창의적인 생각 - 다른 관점에서 바라보기, 거꾸로 생각하기</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022-08-16]]></title>
            <link>https://velog.io/@may_o5/2022-08-16</link>
            <guid>https://velog.io/@may_o5/2022-08-16</guid>
            <pubDate>Tue, 16 Aug 2022 09:19:31 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-matplotlib를-이용하여-그래프-그리기">📌 matplotlib를 이용하여 그래프 그리기</h2>
<p><br><br><br></p>
<h3 id="✅-기본-그래프-그리기">✅ 기본 그래프 그리기</h3>
<p><code>import matplotlib.pyplot as plt</code></p>
<p>-&gt; 라이브러리 임포트</p>
<br>

<pre><code>plt.plot([1,2,3,4], [10, 20, 30, 40])
plt.show()</code></pre><p>-&gt; plt.plot을 통해서 x,y값을 입력하고 plt.show를 통해서 그래프를 나타낸다.</p>
<br>

<p><code>plt.title(&quot;ploting&quot;)</code>
-&gt; 을 통해서 그래프 이름 설정 가능</p>
<br>

<p><code>plt.legend()</code>
-&gt; plot에 label을 통해 범례 이름 설정가능</p>
<br>

<p><code>color = &#39;r&#39;, linestyle = &#39;--&#39;</code>
-&gt; color를 통해 색지정, linestyle을 통해 선모양 변경가능.(color는 c로, linestyle은 ls로 요약가능, r,g,b,k,y는 축약가능. 다른 색은 안됨)</p>
<p><br><br></p>
<h3 id="✅-내-생일의-기온-변화를-그래프로-그리기">✅ 내 생일의 기온 변화를 그래프로 그리기</h3>
<pre><code>import csv
import matplotlib.pyplot as plt
from datetime import datetime

# 최고, 평균, 최저, 날짜 기온 데이터 리스트에 담아서 출력
high = []  # 1) list 선언
avg = []
low = []
date_list = []

f = open(&#39;/content/seoul2022.csv&#39;, encoding=&#39;cp949&#39;)  # 2) 데이터 불러오기
data = csv.reader(f)
next(data)  # 3) 헤더

# 4-1) list 변수에 최고, 평균, 최저 기온 데이터 담기
for row in data:
  if row[-1] != &#39;&#39; and row[-2] != &#39;&#39; and row[-3] != &#39;&#39;:  # 4-1) 결측치 제외
  # 자신이 태어난 월과 일이 일치하는 데이터만
    if row[0].split(&#39;-&#39;)[1] == &#39;03&#39; and row[0].split(&#39;-&#39;)[2] == &#39;17&#39;:
      high.append(float(row[-1]))  # 4-2) 데이터 담기
      low.append(float(row[-2]))
      avg.append(float(row[-3]))
      date_list.append(datetime.strptime(row[0], &#39;%Y-%m-%d&#39;))  # 2022-08-01 -&gt; %Y-%m-%d

plt.figure(figsize=(10,5), dpi=200) 
plt.plot(date_list, high, &#39;r&#39;, label=&#39;high&#39;)
plt.plot(date_list, avg, &#39;g&#39;, label=&#39;avg&#39;)
plt.plot(date_list, low, &#39;b&#39;, label=&#39;low&#39;)
plt.legend()
plt.show()</code></pre><p>🔽 결과
<img src="https://velog.velcdn.com/images/may_o5/post/258f4882-13a0-4858-b0cf-77f275878f2a/image.png" alt="">
<em><strong>❓ 내가 태어난 연도부터 확인 가능한 코드는 무엇일까?(데이터 편집 없이 코드로 구현한다면)</strong></em></p>
<pre><code># 나머지 코드는 그대로
for row in data:
  if 2000 &lt;= int(row[0].split(&#39;-&#39;)[0]):
    if row[-1] != &#39;&#39; and row[-2] != &#39;&#39; and row[-3] != &#39;&#39;:
      if row[0].split(&#39;-&#39;)[1] == &#39;03&#39; and row[0].split(&#39;-&#39;)[2] == &#39;17&#39;:
        high.append(float(row[-1]))  # 4-2) 데이터 담기
        low.append(float(row[-2]))
        avg.append(float(row[-3]))
        date_list.append(datetime.strptime(row[0], &#39;%Y-%m-%d&#39;))  # 2022-08-01 -&gt; %Y-%m-%d</code></pre><p>🔽 결과
<img src="https://velog.velcdn.com/images/may_o5/post/e53914c9-d68b-45f0-9e11-b31e802de115/image.png" alt=""></p>
<p><br><br></p>
<h3 id="✅-한글-깨짐-방지-코드">✅ 한글 깨짐 방지 코드</h3>
<pre><code>import matplotlib as mpl
import matplotlib.pyplot as plt

%config InlineBackend.figure_format = &#39;retina&#39;

!apt -qq -y install fonts-nanum

import matplotlib.font_manager as fm

fontpath = &#39;/usr/share/fonts/truetype/nanum/NanumBarunGothic.ttf&#39;
font = fm.FontProperties(fname=fontpath, size=9)
plt.rc(&#39;font&#39;, family=&#39;NanumBarunGothic&#39;) 
mpl.font_manager._rebuild()</code></pre><br>

<p>그래프 코드에 아래 코드를 추가하면 된다.</p>
<pre><code>plt.rcParams[&#39;axes.unicode_minus&#39;] = False
plt.rc(&#39;font&#39;, family=&#39;NanumBarunGothic&#39;) </code></pre><p>🔽 결과
<img src="https://velog.velcdn.com/images/may_o5/post/a07d40af-362e-4f4b-94d5-887b49b7f68c/image.png" alt=""></p>
<p>✏️ 범례 위치 수정
<code>plt.legend(loc=)</code>
-&gt; loc=에 위치에 맞는 숫자를 입력하면 됨.</p>
<p><br><br></p>
<h3 id="✅-년도-입력하여-출력하기">✅ 년도 입력하여 출력하기</h3>
<pre><code>start_year = input(&quot;언제부터?&quot;)
end_year = input(&quot;언제까지?&quot;)</code></pre><p>-&gt; 년도 변수 입력</p>
<br>

<pre><code>for row in data:
  if int(start_year) &lt;= int(row[0].split(&#39;-&#39;)[0]) and int(end_year) &gt;= int(row[0].split(&#39;-&#39;)[0]):
    if row[-1] != &#39;&#39; and row[-2] != &#39;&#39; and row[-3] != &#39;&#39;:
      if row[0].split(&#39;-&#39;)[1] == &#39;03&#39; and row[0].split(&#39;-&#39;)[2] == &#39;17&#39;:
        high.append(float(row[-1]))  # 4-2) 데이터 담기
        low.append(float(row[-2]))
        avg.append(float(row[-3]))
        date_list.append(datetime.strptime(row[0].split(&#39;-&#39;)[0], &#39;%Y&#39;))</code></pre><p>-&gt; 입력받은 년도 시각화 처리 코드</p>
<br>

<pre><code>plt.title(start_year + &quot;년 이후부터&quot; + end_year + &quot;까지의 내 생일의 기온 변화 그래프&quot;)</code></pre><p>-&gt; 타이틀 입력</p>
<br>

<p>🔽 결과(start_year에 2002년, end_year에 2018년 입력한 결과)</p>
<p><img src="https://velog.velcdn.com/images/may_o5/post/7d51df40-63f7-4b46-89dd-371a4796896c/image.png" alt=""></p>
<p><br><br></p>
<h3 id="✅-다양한-그래프-그리기">✅ 다양한 그래프 그리기</h3>
<h4 id="--히스토그램">- 히스토그램</h4>
<pre><code>import csv
import matplotlib.pyplot as plt

# 최고 기온 데이터만 result 리스트에 담아서 출력
result = []  # 1) list 선언

f = open(&#39;/content/seoul2022.csv&#39;, encoding=&#39;cp949&#39;)  # 2) 데이터 불러오기
data = csv.reader(f)
next(data)  # 3) 헤더

# 4) result list 변수에 최고 기온 데이터 담기
for row in data:
  if row[-1] != &#39;&#39;:
    if row[0].split(&#39;-&#39;)[1] == &#39;08&#39;:  # 4-1) 결측치 제외
      result.append(float(row[-1]))  # 4-2) 데이터 담기

plt.figure(dpi=100) 
plt.rc(&#39;font&#39;, family=&#39;NanumBarunGothic&#39;) 
plt.rcParams[&#39;axes.unicode_minus&#39;] = False

plt.title(&quot;서울의 8월 최고 기온 데이터 히스토그램&quot;)
plt.hist(result, bins=100, color = &#39;r&#39;)
plt.show()</code></pre><p>🔽 결과
<img src="https://velog.velcdn.com/images/may_o5/post/613033a2-4dbd-49fc-9c4a-bb564eaaa1ea/image.png" alt=""></p>
<p>(※ 히스토그램은 축약 안됨)</p>
<p>✏️ 1,4,8월 최고 기온 그래프</p>
<pre><code>aug = []
jan = []
apl = []</code></pre><p>-&gt; 변수 선언</p>
<br>

<pre><code>for row in data:
  month = row[0].split(&#39;-&#39;)[1]
  if month == &#39;08&#39;:
    if row[-1] != &#39;&#39;:
      aug.append(float(row[-1]))

  if month == &#39;01&#39;:
    if row[-1] != &#39;&#39;:
      jan.append(float(row[-1]))

  if month == &#39;04&#39;:
    if row[-1] != &#39;&#39;:
      apl.append(float(row[-1]))</code></pre><p> -&gt; 각 달에 맞게 list 변수에 최고 기온 데이터 담기</p>
<br>




<pre><code>plt.hist(aug, bins=100, color = &#39;r&#39;, label = &quot;8월 최고 기온&quot;)
plt.hist(jan, bins=100, color = &#39;b&#39;, label = &quot;1월 최고 기온&quot;)
plt.hist(apl, bins=100, color = &#39;y&#39;, label = &quot;4월 최고 기온&quot;)</code></pre><p>-&gt; 히스토그램 그리기</p>
<p>🔽 결과
<img src="https://velog.velcdn.com/images/may_o5/post/cb44c5ea-a87a-4716-9410-5e2315c64b6f/image.png" alt=""></p>
<br>

<p>✏️ 8월 최고, 최저, 평균 기온 비교</p>
<pre><code>high = []
low = []
avg = []</code></pre><p>-&gt; 변수 선언</p>
<br>

<pre><code>for row in data:
  month = row[0].split(&#39;-&#39;)[1]
  if month == &#39;08&#39;:
    if row[-1] != &#39;&#39;:
      high.append(float(row[-1]))
    if row[-2] != &#39;&#39;:
      low.append(float(row[-2]))
    if row[-3] != &#39;&#39;:
      avg.append(float(row[-3]))</code></pre><p> -&gt; 각 달에 맞게 list 변수에 최고 기온 데이터 담기</p>
<br>




<pre><code>plt.hist(high, bins=100, color = &#39;r&#39;, label = &quot;8월 최고 기온&quot;)
plt.hist(low, bins=100, color = &#39;b&#39;, label = &quot;8월 최저 기온&quot;)
plt.hist(avg, bins=100, color = &#39;y&#39;, label = &quot;8월 평균 기온&quot;)</code></pre><p>-&gt; 히스토그램 그리기</p>
<p>✏️ 사용자에게 월을 입력받아 히스토그램 그리기</p>
<p><code>choice_month = input(&quot;원하는 월을 입력하시오&quot;)</code></p>
<p>-&gt; 사용자에게 원하는 달을 입력받음</p>
<br>

<pre><code>for row in data:
  month = row[0].split(&#39;-&#39;)[1]
  if month == choice_month:
    if row[-1] != &#39;&#39; and row[-2] != &#39;&#39; and row[-3] != &#39;&#39;:
      high.append(float(row[-1]))
      low.append(float(row[-2]))
      avg.append(float(row[-3]))</code></pre><p>-&gt; 입력받은 달의 최고, 최저, 평균의 데이터를 변수에 저장</p>
<br>

<pre><code>plt.hist(high, bins=100, color = &#39;r&#39;, label = choice_month + &quot;월 최고 기온&quot;)
plt.hist(low, bins=100, color = &#39;b&#39;, label = choice_month + &quot;월 최저 기온&quot;)
plt.hist(avg, bins=100, color = &#39;y&#39;, label = choice_month + &quot;월 평균 기온&quot;)

plt.title(choice_month + &quot;월 기온 데이터 히스토그램&quot;)</code></pre><p>-&gt; 히스토그램 그리기</p>
<p>🔽 결과(04 입력한 결과)
<img src="https://velog.velcdn.com/images/may_o5/post/32831ba3-ddbe-4563-b472-c84ace860c43/image.png" alt=""></p>
<h4 id="--boxplot상자그림">- boxplot(상자그림)</h4>
<p><img src="https://velog.velcdn.com/images/may_o5/post/df17dc4d-196b-4ee3-9d43-20a78b29dfb6/image.png" alt="">
-&gt; aug와 jan의 boxplot 코드를 따로 했을 때</p>
<p><img src="https://velog.velcdn.com/images/may_o5/post/6396c0ea-4be8-43e4-907a-da6240f360c0/image.png" alt="">
-&gt; boxplot([aug, jan])로 했을 때</p>
<p>히스토그램(1월과 8월 최고 기온 비교)이랑 동일한 코드, hist를 boxplot으로만 변경</p>
<br>

<p>✏️ 상자그림을 이용한 월별 기온 변화 비교</p>
<pre><code>import csv
import matplotlib.pyplot as plt

high = []
low = []
avg = []

f = open(&#39;/content/seoul2022.csv&#39;, encoding=&#39;cp949&#39;)  # 1) 데이터 불러오기
data = csv.reader(f)
next(data)  # 2) 헤더

# 3) 월별 데이터 저장형 month 변수를 선언
# month = [[0], [1],...,[10],[11]] -&gt; 총 12개
# month[0].append()

month = []

for i in range(12):
  month.append([])

# 4) 각 달에 맞게 list 변수에 데이터 담기
for row in data:
  if row[-1] != &#39;&#39;:
    month[int(row[0].split(&#39;-&#39;)[1])-1].append(float(row[-1]))
    # (row[0].split(&#39;-&#39;)[1]) -&gt; 월 출력, int를 이용해서 형변환(01-&gt;1), 인덱스는 0부터 시작이므로 -1을 한 것.

plt.figure(dpi=100) 
plt.rc(&#39;font&#39;, family=&#39;NanumBarunGothic&#39;) 
plt.rcParams[&#39;axes.unicode_minus&#39;] = False
plt.boxplot(month)

plt.title(&quot;서울 최고 기온 데이터 월별 상자 그림&quot;)
plt.legend()
plt.show()</code></pre><p>🔽 결과</p>
<p><img src="https://velog.velcdn.com/images/may_o5/post/0dac5a0a-0bc4-4247-b698-eb0f40c2300a/image.png" alt=""></p>
<p>+) 일별 비교</p>
<p><img src="https://velog.velcdn.com/images/may_o5/post/b5e34301-2202-4f8a-bcbe-5a1e9de80a59/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022-08-12]]></title>
            <link>https://velog.io/@may_o5/2022-08-12</link>
            <guid>https://velog.io/@may_o5/2022-08-12</guid>
            <pubDate>Fri, 12 Aug 2022 08:30:36 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-colab을-이용한-데이터-분석">📌 colab을 이용한 데이터 분석</h2>
<p><br><br><br></p>
<h3 id="1-변수와-문자열">1. 변수와 문자열</h3>
<p>▶️▶️ <strong><span style="background-color:yellow">변수</span></strong> - 숫자시작, 예약어와 동일한 단어사용, &#39;_&#39;를 제외한 특수문자 사용 X
(ex. 1dog, for, *dog) </p>
<p>( <em>+ 대소문자구분하긴하나 소문자를 주로 쓴다.</em>)</p>
<p>▶️▶️ <strong><span style="background-color:yellow">문자열(string)</span></strong> - &#39;+&#39;로 문자열 연결, 한 줄 이상 여러 줄로 된 문자를 사용하려면 Multiline String -&gt; (&#39;&#39;&#39;) 사용</p>
<br>

<h3 id="2-리스트">2. 리스트</h3>
<p>: <strong>여러 값을 함께 모을 수 있는 자료형 대괄호([]), 콤마(,) 사용</strong>
<br></p>
<p><strong><span style="background-color:lightblue">&lt;예시&gt;</span></strong></p>
<p><code>train = [1,2,3,4,5]</code></p>
<br>  


<p>✅ list의 특정 데이터만 추출 -&gt; <strong>indexing</strong></p>
<blockquote>
<p><strong><em>세번째 데이터만 추출-&gt; 출력하고 싶으면?</em></strong></p>
</blockquote>
<pre><code>print(train[2])</code></pre><p>✅ list의 특정 범위의 데이터만 추출 <strong>(list 슬라이싱)</strong>
  <em>❗인덱스 -&gt; [위치:번째]❗</em></p>
<p> <em><strong>특정 위치에 연속적인 데이터 가져오기</strong></em>
  (1,2,3 데이터만 추출❗)</p>
<pre><code>print(train[0:3])  </code></pre><p>✅ list에 데이터를 추가 -&gt; list에서 제공하는 <strong>append() 함수</strong> 이용</p>
<br>

<p><strong><span style="background-color:lightblue">&lt;예시&gt;</span></strong></p>
<pre><code>week = [&quot;월&quot;, &quot;화&quot;, &quot;수&quot;, &quot;목&quot;, &quot;금&quot;]
print(week)

# 토, 일을 추가
week.append(&quot;토&quot;)
week.append(&quot;일&quot;)

print(week)</code></pre><br>

<h3 id="3-딕셔너리">3. 딕셔너리</h3>
<p>▶️▶️<strong><span style="background-color:yellow">Dictionary(사전)</span></strong>  - 키와 값으로 구성되어 있는 자료형. <strong>중괄호({key : value})로 구성</strong></p>
<br>  

<p><strong><span style="background-color:lightblue">&lt;예시&gt;</span></strong></p>
<p>  <strong><code>student 변수를 선언해서 학생정보를 딕셔너리로 저장하고 출력하기</code></strong></p>
<pre><code>student = {&quot;이름&quot; : &quot;김정민&quot;, &quot;학과&quot; : &quot;빅데이터학과&quot;, &quot;학년&quot; : &quot;휴학&quot;, &quot;학번&quot; : &quot;20190177&quot;}
student</code></pre><br>

<p>✅데이터 가져오기 </p>
<p><code>print(student[&quot;이름&quot;])</code></p>
<br>  

<p>✅데이터 추가하기</p>
<p><code>student[&quot;취미&quot;] = &quot;드라마&quot;</code></p>
<h3 id="4-실전-기온데이터-분석">4. 실전! 기온데이터 분석</h3>
<p>✏️ <em>데이터 분석은 떠오르는 질문을 구체적으로 상세하게 잘 정리해야함!</em></p>
<br>


<p><strong>✅ 기온 관측 이래 서울의 최고 기온이 가장 높았던 날은?</strong></p>
<pre><code>  import csv


# 1) 데이터를 읽어온다.
f = open(&#39;/content/seoul.csv&#39;, &#39;r&#39;, encoding = &#39;cp949&#39;)
data = csv.reader(f)  # delimiter=&#39;,&#39; -&gt; 콤마인 경우에는 생략 가능
header = next(data)

max_temp = -999 # 최고 기온 값을 저장할 변수 -&gt; 정확한 값을 위해 극단적인 값 지정
max_date = &#39;&#39;   # 최고 기온이 가장 높았던 날짜를 저장할 변수

# 2) 순차적으로 최고 기온을 확인한다.(+ 날짜 출력까지)
for row in data:
  # 2-1) 결측치 데이터 처리
  if row[-1] == &#39;&#39;:
    row[-1] = - 999      # 명확한 결과를 위해 극단적인 값으로 초기화(절대 나오지 않을 값!)
  row[-1] = float(row[-1])  # 최고 기온 출력 -&gt; 실수형으로 출력 -&gt; 결측치로 인한 오류발생 -&gt; ?

# 3) 최고 기온이 가장 높았던 날짜의 데이터를 저장한다.
  if max_temp &lt; (row[-1]):
   max_temp = (row[-1])
   max_date = row[0]

f.close()

# 4) 최종 저장된 데이터를 출력한다.
print(&quot;기상 관측 이래 서울의 최고 기온이 가장 높았던 날은&quot;, max_temp, &quot;도로&quot;, max_date, &quot;였습니다.&quot;)</code></pre><p>위의 코드를 활용하여 최저 기온 가장 낮은 날도, 평균 기온이 가장 높은 날도 구해보았다.
전공에서 파이썬을 배웠을 때나 교필로 파이썬을 배웠을 때 모두 리스트를 파일로 불러오는 것을 배웠는데 전공 때는 Pandas로 하는 거만 좀 제대로 배웠던 것 같고(아닐수도 ...) 교양수업은 그때 한 과제를 봐보니까 진짜 리터럴리 한땀..한땀 리스트를 한줄 한줄 불러왔었더라.. 보자마자 저게 뭐임?하면서 걍 창 끔</p>
<p><img src="https://velog.velcdn.com/images/may_o5/post/b62befb9-fe71-4739-86f8-1034d4f0c958/image.png" alt="">
이거는 광주의 최고기온이 가장 높았던 날!
고향이 광주이기 때문에 2018년도까지는 광주에서 살아서 광주 최고기온을 한번 구해보았다.
엄마가 매년 여름마다 1994년이 제일 더웠다고 했는데 서울에서는 1994년이 안나오길래 2018년이 더 더웠구나 .. 했는데 광주는 최고기온이 1994년 7월 19일로 나왔다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022-08-11]]></title>
            <link>https://velog.io/@may_o5/2022-08-11</link>
            <guid>https://velog.io/@may_o5/2022-08-11</guid>
            <pubDate>Thu, 11 Aug 2022 09:20:49 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-팀티칭-수업---모델링-강의">📌 팀티칭 수업 - 모델링 강의</h2>
<br>
<br>

<h3 id="✏️-일반-모델링-이론">✏️ 일반 모델링 이론</h3>
<br>

<p>▶️▶️ <em><strong><span style="background-color:yellow">모델이란?</span></strong></em> 인간이 만든 것들!! 만든 의도(목적)이 있으며 대표성을 지니고 모범, 표준이 될 만한 것. 표현의 대상이 존재하며 그 표현 수단 역시 다양하다. 이를 언어매체라고 부르기로 약속. 또한, 이를 사용하는 사람, 고객이 존재한다.
예를 들어, 오페라 하우스는 시드니에 위치한 랜드마크로 오페라 극장이다. 이는 조개를 형상화 한 건물로 설명할 수 있다.</p>
  <br>
  <br>

<p>▶️▶️ <em><strong><span style="background-color:yellow">모델의 어원</span></strong></em>
라틴어 modellus(우유통)  측정 단위
-&gt; 파생어 : mould, module, model 
❗ 공통의미 : 뭔가를 담는 틀</p>
<p><span style="color:red"><em>=&gt; 인간이 사물을 인식하여 형성된 심상을 매체로 표현하는 행위</em></span>
<br></p>
<p><strong><em>그렇다면 모델링이란❓</em></strong></p>
<p>사람이 어떤 의도를 가지고 대상을 인식하여 형성된 최고의 심장을 적절한 매체를 통해 표현하는 과정.</p>
<br>


<p><del>그 후 경영 핵심 개념에 대해 설명해주셨지만 너무 길므로 설명은 패스 ..</del></p>
<br>
<br>

<hr>
<p>경영에 대해 들은 후 조를 짜서 직접 사업 계획을 세우는 일을 했다.
우리조는 시니어 층과 1인가구를 대상으로 하는 사업을 기획했는데 처음에 너무 방대해져서 .... 촬영하러 오신 대표님께 도움을 받아 겨우겨우 할 수 있었다.
<img src="https://velog.velcdn.com/images/may_o5/post/c2415fea-b8f5-4fb4-ac0b-7d3860bc4cc3/image.jpg" alt="">
우리 조는 외로운 1인가구 노년층을 대상으로 새로운 만남의 장소를 제공할 수 있는 보드게임방을 구상했다.
또 어르신들이 보드게임이 생소해서 하기 어려우실 수 있으니 20-30대 청년들을 알바생으로 모집하여 게임 룰 설명도 해드리고 말동무도 해드리는 것도 추가했다.</p>
<p><img src="https://velog.velcdn.com/images/may_o5/post/5958bf25-15d7-47b6-bfb1-0efd59e6a3d1/image.jpg" alt="">
그 후에는 레고를 이용하여 자신이 좋아하는 것을 만들어 보았다. 나는 우리집 강아지를 만들어 보았음 강아지처럼 보이나요 ...</p>
<br>

<p>또 감정도 만들어 보았는데 나는 자꾸 엄청나게 1차원적으로 만들었는데(최대한 단순하게 ..) 다른 사람들은 되게 잘 만들어서 신기했다. 어떻게 그렇게 하지??</p>
<br>

<hr>
<br>

<p>사업 구상을 하거나 경영학에 대해 강의를 들어본 적이 없어가지고 오늘은 조금 생소했었던 것 같지만 그래도 이런 것도 추후에 좋은 경험이 될거라 생각!</p>
]]></description>
        </item>
    </channel>
</rss>