青チャートで周囲を巻き込んで課題解決したガクチカ【韓国語とAI】


##  ガクチカ

学生時代、AIを活用した数学の理解に悩む仲間が多かったことから、自ら「青チャート」を軸にしたPython学習会を企画・主導し、グローバル志向のエンジニアリングリーダーとして、実践的な学びの場を構築しました。



学習会で仲間の声にじっくり耳を傾ける中で、私は多様性を意識したコミュニケーションの重要性を感じるようになりました。特に、宿題として出される『青チャート』の問題演習よりも、国語や韓国語による対話、つまり「言語を通じた理解」へのニーズが高いことに気づきました。中でも、女学生の多くは、数学そのものの難解さよりも、**自分の韓国語で「なぜそうなるのか」を説明し合える環境**に価値を感じているという声を寄せてくれました。

そこで私は、**『青チャート』で学ぶ数学的概念をベースにしながら、韓国語でコメントを記述したPythonコード**を用いて、AIと数学の融合韓国語ソリューションを開発し、周囲を巻き込む形で提供してきました。
具体的には、
- 三平方の定理（√(x² + y²)）を偏微分し、勾配の意味を視覚的に確認するコード、
- 勾配法と最小二乗法を用いた最適化のプロセスの可視化、
- サポートベクターマシンと決定木を用いた機械学習モデルによる分類の比較、
- 猫と犬のダミー画像を用いた画像分類の実装、
- 画像内の対象をバウンディングボックスで可視化し、判断根拠を直感的に示す機能

といった複数の要素を統合したものです。

このソリューションの特徴は、**すべてのコメントを韓国語で記載**している点です。これにより、韓国語話者の女性も「大好きな韓国語で」数学やAIの考え方にアクセスすることができます。実際に学習会では、

- 「코드에 한국어가 있어서 훨씬 이해하기 쉬웠어요（韓国語のコメントがあるおかげで、とても理解しやすかったです）」
- 「수학이 이렇게 감성적으로 다가올 수 있다니 놀라웠어요（数学がこんなにも感覚的に感じられるとは思いませんでした）」
- 「AI도 나를 배려해주는 느낌이 들어요（AIが自分に寄り添ってくれているように感じました）」

といった前向きな声が多く寄せられました。


この取り組みを通じて、私はJupyter NotebookやGitHubの活用はもちろん、LLMや生成AIを駆使したプロンプト設計や、Microsoft Officeツールを含む多様な技術手段を組み合わせることで、DX推進を現場に定着させるマネジメント力と、誰とでも信頼関係を築ける柔軟なコミュニケーション能力を養ってきました。

貴社が現場レベルでのデジタル活用に真剣に取り組んでいる姿勢に深く共感しており、私のこれまでの技術支援の知見と巻き込み力を活かすことで、貴社の優れた技術力を組織全体に広げる橋渡し役として貢献できると考えています。

大きな変革の渦中にある今だからこそ、私は“コミュニケーション × テクノロジー”の掛け算で、貴社とともによりよい社会の実現に貢献してまいります。


「저는 귀사가 현장 수준에서 디지털 활용에 진지하게 임하고 있는 모습에 깊이 공감하고 있습니다. 그동안 쌓아온 기술 지원 경험과 사람을 이끄는 역량을 바탕으로, 귀사의 뛰어난 기술력을 조직 전체로 확산시키는 연결 고리 역할을 할 수 있다고 믿습니다.

지금처럼 큰 변화의 시기이기에, 저는 “소통과 기술의 융합”을 통해 귀사와 함께 더 나은 사회를 실현하는 데 기여하고자 합니다.」


面接官「取り組み自体は素晴らしいですが、本来の目的と手段が入れ替わっているように感じます。」

To be continued...



##  채용시험에서 면접관에게 제공되는 Python 코드

```python
# Program Name: yolo5_cat_dog_ai.py
# Creation Date: 20250414
# Overview: Google Colab-compatible script to upload cat and dog images, convert .avif if needed, analyze with YOLOv5, and display bounding boxes
# Usage: Run step-by-step in Google Colab

# 프로그램 이름: yolo5_cat_dog_ai.py
# 생성일자: 20250414
# 개요: 이 코드는 Google Colab에서 고양이와 강아지 이미지를 업로드하고, 필요 시 .avif 파일을 JPEG로 변환하며, YOLOv5를 이용해 객체 탐지 및 바운딩 박스 시각화를 수행하는 스크립트입니다.
# 사용 방법: Google Colab에서 셀을 위에서 아래로 순차적으로 실행하세요.

# --------------------------------------
# Step 1: Clone YOLOv5 and install dependencies
# 단계 1: YOLOv5 저장소를 복제하고 필요한 라이브러리 설치
# --------------------------------------
!git clone https://github.com/ultralytics/yolov5
%cd yolov5
!pip install -r requirements.txt
!apt-get install -y libheif-examples  # AVIF 형식을 처리하기 위한 라이브러리 설치
!pip install imageio[ffmpeg] imageio[pyav]  # imageio를 AVIF, FFmpeg 확장 지원으로 설치

# --------------------------------------
# Step 2: Import libraries
# 단계 2: 필요한 파이썬 라이브러리 임포트
# --------------------------------------
import torch  # PyTorch는 YOLOv5 모델 실행을 위해 사용됩니다.
import matplotlib.pyplot as plt  # 그래프 및 이미지 시각화를 위한 matplotlib
from PIL import Image  # 이미지 열기 및 RGB 변환을 위한 Pillow
from google.colab import files  # Colab 환경에서 파일 업로드를 가능하게 함
import imageio.v3 as iio  # AVIF 파일 처리를 위한 imageio v3
import os
import shutil
import numpy as np
from sklearn.linear_model import LinearRegression  # 선형 회귀 분석용
from sklearn.svm import SVC  # SVM 분류기
from sklearn.tree import DecisionTreeClassifier  # 결정 트리 분류기
from sklearn.metrics import accuracy_score  # 정확도 평가
from sklearn.datasets import make_classification  # 샘플 분류 데이터 생성

# --------------------------------------
# Step 3: Upload image files (JPG/PNG/AVIF supported)
# 단계 3: 고양이/강아지 이미지 파일 업로드 (.jpg/.png/.avif 모두 지원)
# --------------------------------------
uploaded = files.upload()  # 사용자가 로컬에서 이미지를 업로드하도록 함
uploaded_files = list(uploaded.keys())  # 업로드된 파일 이름들을 리스트로 저장

# --------------------------------------
# Step 4: Convert and rename uploaded files to safe format
# 단계 4: AVIF 파일을 JPEG로 변환하고, 파일명을 안전하게 저장
# --------------------------------------
os.makedirs("images", exist_ok=True)  # 이미지 저장 폴더 생성
safe_files = []
for i, fname in enumerate(uploaded_files):
    ext = os.path.splitext(fname)[-1].lower()
    new_name = f"images/upload_{i}.jpg"  # 변환된 이미지 저장 경로
    try:
        if ext == ".avif":
            img = iio.imread(fname)  # AVIF 파일을 numpy 배열로 읽음
            Image.fromarray(img).save(new_name, format="JPEG")  # JPEG 형식으로 저장
        else:
            img = Image.open(fname).convert("RGB")  # RGB로 변환 후 저장
            img.save(new_name, format="JPEG")
        safe_files.append(new_name)
    except Exception as e:
        print(f"[Error] Skipping {fname}: {e}")  # 실패 시 에러 메시지 출력

# --------------------------------------
# Step 7: Visualize gradient of sqrt(x^2 + y^2)
# 단계 7: 함수 sqrt(x^2 + y^2)의 그래디언트(기울기)를 시각화
# --------------------------------------
x = np.linspace(-5, 5, 30)
y = np.linspace(-5, 5, 30)
X, Y = np.meshgrid(x, y)
Z = np.sqrt(X**2 + Y**2)
dZ_dx = X / Z  # x 방향으로의 편미분 (기울기)
dZ_dy = Y / Z  # y 방향으로의 편미분

plt.figure(figsize=(6, 5))
plt.contourf(X, Y, Z, cmap='viridis', alpha=0.6)  # 배경 등고선
plt.quiver(X, Y, dZ_dx, dZ_dy, color='red')  # 그래디언트 벡터 시각화
plt.title("Gradient of sqrt(x^2 + y^2)")
plt.xlabel("x")
plt.ylabel("y")
plt.colorbar(label="f(x, y)")
plt.grid()
plt.show()

# --------------------------------------
# Step 8: Linear regression (least squares)
# 단계 8: 최소제곱법을 이용한 직선 회귀 분석
# --------------------------------------
X_data = np.linspace(0, 10, 50)
Y_data = 3 * X_data + 7 + np.random.randn(50)  # 노이즈를 포함한 데이터 생성
model = LinearRegression()
model.fit(X_data.reshape(-1, 1), Y_data)
Y_pred = model.predict(X_data.reshape(-1, 1))  # 예측값 계산

plt.figure(figsize=(6, 4))
plt.scatter(X_data, Y_data, label="Data")
plt.plot(X_data, Y_pred, color='red', label="Least Squares Fit")
plt.title("Linear Regression (Least Squares)")
plt.xlabel("X")
plt.ylabel("Y")
plt.legend()
plt.grid()
plt.show()

# --------------------------------------
# Step 9: Classification with SVM and Decision Tree
# 단계 9: SVM과 결정 트리를 사용한 분류 문제 시각화
# --------------------------------------
X_cls, y_cls = make_classification(n_samples=200, n_features=2, n_redundant=0,
                                    n_clusters_per_class=1, random_state=42)
svm = SVC(kernel='linear')
svm.fit(X_cls, y_cls)
tree = DecisionTreeClassifier()
tree.fit(X_cls, y_cls)
svm_pred = svm.predict(X_cls)
tree_pred = tree.predict(X_cls)

plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1)
plt.title("SVM Classification")
plt.scatter(X_cls[:, 0], X_cls[:, 1], c=svm_pred, cmap='coolwarm', s=20)
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.grid()

plt.subplot(1, 2, 2)
plt.title("Decision Tree Classification")
plt.scatter(X_cls[:, 0], X_cls[:, 1], c=tree_pred, cmap='coolwarm', s=20)
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.grid()
plt.tight_layout()
plt.show()

print("SVM Accuracy:", accuracy_score(y_cls, svm_pred))  # SVM 정확도 출력
print("Decision Tree Accuracy:", accuracy_score(y_cls, tree_pred))  # 결정 트리 정확도 출력

# --------------------------------------
# Step 10: Perform YOLOv5 inference and show results
# 단계 10: YOLOv5를 이용한 고양이/강아지 객체 탐지 및 결과 시각화
# --------------------------------------
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)  # 사전 학습된 YOLOv5s 모델 불러오기

for img_path in safe_files:
    results = model(img_path)  # 객체 탐지 실행
    results.print()  # 탐지된 객체 정보 출력
    results.show()  # 탐지된 객체가 표시된 이미지 출력
    results.save(save_dir='runs/detect/exp')  # 탐지된 이미지 저장
```
## 결과



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043781/98e29eb9-ba93-4b2e-8c83-dead21518b5c.png)

사용할 고양이와 강아지의 이미지

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043781/0306e6af-3f3f-4a1c-9d76-896397c7748e.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043781/04950649-138c-465b-88aa-65f81432e460.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043781/64f971b4-32ef-48ac-890e-672016c037ab.png)

SVM Accuracy: 0.84
Decision Tree Accuracy: 1.0