プログラミング学習

Kaggle×Pythonで挑戦!タイタニック号データ分析の方法と結果

記事内に商品プロモーションを含む場合があります

Kaggleの有名なタイタニック号データセットを使って、Pythonを駆使したデータ分析に挑戦してみました。データサイエンスに興味がある方や、Kaggleを使ってみたいけれど何から始めればいいか迷っている方に向けて、実際の分析プロセスをステップごとに解説します。データの前処理からモデルの選定、そして結果の評価まで、実際のコードを交えながら詳しく紹介していきますので、ぜひ参考にしてください!

前回記事:Pythonで深めるデータ分析:予測モデリングと応用手法の完全ガイド

kaggleでは、コードの共有に制限が設けられているため、安全に共有できるkaggleノートブックにコードを乗せております。
実際のコードを確認したい方は以下のkaggleノートブック参考にしてください。

kaggleノートブック

kaggleって何?

データサイエンスの世界に足を踏み入れると、必ず耳にするプラットフォームがKaggleです。Kaggleは、世界中のデータサイエンティストやエンジニアたちが集まり、データ分析のコンペティションや、豊富なデータセットを活用してスキルを磨く場です。初心者から上級者まで、多くの人々がKaggleで学び、挑戦を通じて成長しています。

データ分析を始める前の準備

機械学習の世界では、『データセットがプロジェクトの大半を占める』と言われるほど、データの確認と前処理がとても大切です。そこで、まずはKaggleからデータをダウンロードし、今回使用するデータセットの中身を見ていきましょう。

Kaggleのアカウント作成
Kaggleの利用には無料アカウントが必要です。まだアカウントを作成していない方は、以下のリンクから登録を進めてみてください。

kaggle公式サイト

Kaggleノートブックの作成

まず、Kaggleのデータセットページまたはコンペティションページから、新しいノートブックを作成します。

  • 「New Notebook」ボタンをクリックして、ノートブックを作成します。

データセットがアタッチされているか確認

データセットがノートブックにアタッチされていない可能性があります。Kaggleノートブックにデータセットをアタッチするための手順は以下の通りです。

手順:

  1. Kaggleノートブックの右側にある「Add input」ボタンをクリックします(ノートブックの画面右側、Dataセクションの下部にあります)。
  1. 「Add input」をクリックすると、Kaggleに公開されているデータセットのリストが表示されます。ここで使用したいデータセットを選択します(例: Titanicデータなど)。検索に(titanic)と入力してみてください!!
  1. データセットがアタッチされると、/kaggle/input/ディレクトリ内にそのデータが表示されるようになります。

今回のお題

タイタニック号の沈没は歴史上最も悪名高い船の難破事故の一つです。

1912 年 4 月 15 日、処女航海中、広く「沈まない」と思われていた RMS タイタニック号が氷山に衝突して沈没しました。残念ながら、乗船者全員を乗せられるだけの救命ボートがなかったため、乗客と乗組員 2,224 人のうち 1,502 人が死亡しました。

生き残るにはある程度の運の要素もあったが、一部の人々のグループは他の人々よりも生き残る可能性が高いようだ。

このチャレンジでは、乗客データ(名前、年齢、性別、社会経済階級など)を使用して、「どのような人が生き残る可能性が高いか」という質問に答える予測モデルを構築していただきます。

データの概要

データは2つのグループに分かれています。

トレーニングセット (train.csv)
これは、機械学習モデルを構築するためのデータです。トレーニングセットには、各乗客の結果("グラウンドトゥルース"とも呼ばれます)が含まれており、これを使ってモデルを学習させます。乗客の性別や乗船クラスといった「特徴」をもとにモデルが作成され、さらに新しい特徴を作り出す「特徴エンジニアリング」も活用できます。

テストセット (test.csv)
テストセットは、モデルがまだ見たことのないデータに対してどのくらい精度良く予測できるかを評価するために使用します。ここには乗客の結果が含まれていないため、モデルを使って彼らがタイタニック号の沈没から生き残ったかどうかを予測することが求められます。

提出ファイルの例 (gender_submission.csv)
また、例として、全ての女性乗客が生き残ると仮定した予測データが含まれています。これをもとに、自分の予測結果を作成し提出するイメージを掴むことができます。

データ分析を行っていきます

3つのデータを使った分析手順を、初心者の方にも分かりやすくステップごとに説明します。まず、タイタニックのデータを使って、「どのような人が生き残る可能性が高かったか」という問いに答えるためにデータを分析していきます。

タイタニック号データ分析の最初のステップ

データ分析を始めるためには、PythonのライブラリであるPandasを使って、データを読み込み、内容を確認する必要があります。以下に、必要なステップを分かりやすく説明します。

1. ライブラリのインポート まず、データ操作に必要なPandasライブラリをインポートします。Pandasは、データの読み込み、操作、そして表示などに非常に役立つツールです。

参考コード

2. データの読み込み 次に、データを読み込むために、read_csv()関数を使います。Kaggleでは、/kaggle/input/というディレクトリにデータが保存されています。今回は、タイタニック号のトレーニングデータとテストデータを使います。

参考コード

3. データの確認 データが正しく読み込まれたかどうかを確認するために、データの一部を表示します。これには、head()メソッドを使用し、データセットの先頭5行を確認することができます。

参考コード

4. データの基本情報確認 データに欠損値があるか、データ型が正しいかなどを確認するために、info()メソッドを使用します。これにより、データの全体的な構造を確認し、各列のデータ型や欠損値の有無を把握できます。

参考コード

実際のコードはこちらから確認できます

データの内容について

このデータは、タイタニック号の乗客に関する情報が含まれているテーブルです。各行は1人の乗客を表しており、以下の情報が提供されています:

  1. PassengerId: 乗客のID番号
  2. Survived: 生存したかどうか(0 = 死亡, 1 = 生存)
  3. Pclass: 乗客の階級(1 = 1等, 2 = 2等, 3 = 3等)
  4. Name: 乗客の名前
  5. Sex: 性別(male = 男性, female = 女性)
  6. Age: 年齢
  7. SibSp: 同伴していた兄弟・配偶者の数
  8. Parch: 同伴していた親・子供の数
  9. Ticket: チケット番号
  10. Fare: 乗船料金
  11. Cabin: キャビン番号(部屋番号)、欠損値が多い
  12. Embarked: 乗船した港(C = シェルブール, Q = クイーンズタウン, S = サウサンプトン)

例として、以下の情報を解説します:

  • Braund, Mr. Owen Harris は、3等級に乗船し、男性で、22歳。彼は1人の兄弟または配偶者とともに乗船し、親または子供は同伴していませんでした。彼のチケット番号は "A/5 21171" で、乗船料金は7.25ポンド。彼は「S」(サウサンプトン)から乗船し、キャビン情報は不明です。また、彼は生存しなかったことが分かります("Survived" = 0)。

データの基本的な情報を確認

データ分析の初期段階では、データセットにどのような情報が含まれているかを確認することが重要です。このプロセスにおいては、各列にどのようなデータが存在し、欠損値(データが不足している箇所)があるかどうかを確認します。欠損値の処理は、予測モデルの性能に影響を与えるため、事前にしっかりと確認する必要があります。

データの内容について確認

データの内容について

この出力は、タイタニック号の乗客データ(DataFrame)の構造に関する情報を提供しています。以下がその意味です:

  1. <class 'pandas.core.frame.DataFrame'>: このデータは、PandasライブラリのDataFrameとして読み込まれていることを示します。DataFrameは、2次元の表形式データを扱うためのデータ構造です。
  2. RangeIndex: 891 entries, 0 to 890: このDataFrameには、891件のデータ(乗客情報)があり、インデックスは0から890までです。つまり、891人の乗客データを持っています。
  3. Data columns (total 12 columns): データには12列(属性)が含まれており、各列が異なる情報を持っています。
  4. 各列の説明:
    • PassengerId: 乗客のID番号。891件全てに値が存在し、データ型は整数(int64)。
    • Survived: 生存フラグ。0は死亡、1は生存を示し、891件全てに値が存在しています(int64)。
    • Pclass: 乗客の乗船クラス(1 = 1等、2 = 2等、3 = 3等)。これも891件全てに値があり、データ型は整数(int64)。
    • Name: 乗客の名前。891件全てに名前があり、データ型は文字列(object)。
    • Sex: 性別。男性(male)か女性(female)かを示し、891件全てに値があります(object)。
    • Age: 年齢。714件に値があり、欠損値(null)があることが分かります。データ型は浮動小数点数(float64)。
    • SibSp: 同伴している兄弟・配偶者の数。891件全てに値があり、データ型は整数(int64)。
    • Parch: 同伴している親・子供の数。891件全てに値があり、データ型は整数(int64)。
    • Ticket: チケット番号。891件全てに値があり、データ型は文字列(object)。
    • Fare: 乗船料金。891件全てに値があり、データ型は浮動小数点数(float64)。
    • Cabin: キャビン番号。891件中204件にしか値がなく、残り687件は欠損しています。データ型は文字列(object)。
    • Embarked: 乗船した港(C = シェルブール、Q = クイーンズタウン、S = サウサンプトン)。889件に値があり、2件のデータは欠損しています(object)。
  5. dtypes: float64(2), int64(5), object(5): データ型に関する概要。12列のうち、2つは浮動小数点数(float64)、5つは整数(int64)、5つは文字列(object)です。
  6. memory usage: 83.7+ KB: このDataFrameがメモリ内で占める容量が約83.7KBであることを示しています。
  7. PassengerId Survived... Cabin Embarked dtype: int64: この部分では、欠損値の数が示されています。たとえば、「Cabin」列には687件の欠損データがあり、「Embarked」列には2件の欠損があります。

このデータの全体像は、タイタニック号の乗客に関する詳細情報を提供しており、生存者や乗船クラス、年齢、チケット、料金、キャビンの欠損データなど、分析を行う際に重要なデータポイントが含まれています。

欠損値の確認方法

データの欠損値を確認するためには、データセット全体を見渡し、どの列に欠損値が存在するかを確認します。Kaggleノートブック上では、Pandasのinfo()メソッドを使って、データ型や欠損値の有無を確認することができます。これにより、どの列に欠損値があるかや、各列のデータ型(数値、文字列など)を把握できます。

欠損値が確認された場合、それを適切に処理する必要があります。例えば、数値データの場合、平均値や中央値で補完することが一般的です。文字列データの場合、最も頻繁に使われている値で補完したり、場合によっては列全体を削除する選択肢もあります。

参考コード

このコードは、train_dataの基本情報を出力し、各列にどれくらいのデータが欠けているかを確認します。たとえば、"Age"列や"Cabin"列に欠損値が多いことが確認できるかもしれません。

タイタニック号データセットでの欠損値のポイント

タイタニック号データセットの場合、以下のような項目に欠損値が見られることが多いです。

  • 年齢 (Age): 一部の乗客の年齢データが欠けていることがあります。この場合、中央値などで欠損値を補完することが考えられます。
  • キャビン番号 (Cabin): 多くの乗客がキャビン情報を持っていないことがよくあります。キャビン列に欠損値が多い場合は、列自体を削除するか、欠損値を埋める他の方法を検討します。
  • 乗船港 (Embarked): 乗客がどの港から乗船したかのデータが一部欠けていることがあります。最も多く使われている港の情報を使って欠損値を補完することが可能です。

欠損値の処理

欠損値が確認された場合、その処理方法を選択します。数値データに欠損値がある場合は、以下の方法で補完が考えられます。

  • 平均値や中央値での補完: 欠損しているデータを平均値や中央値で埋める方法。
  • 削除: 欠損値が多い列は、分析に悪影響を与えるため、削除することが選択されることもあります。

参考コード

実際のコードはこちらから確認できます

ポイント

このコードは、各列の欠損値を以下の方法で処理しています。

  1. 年齢 (Age): 欠損している年齢を、データセット内の年齢の中央値で補完します。
  2. キャビン番号 (Cabin): キャビンの情報は欠損値が多いため、列全体を削除します。
  3. 乗船港 (Embarked): 欠損している港のデータを、最も多い値(モード)で補完します。

データの可視化

生存率を性別や階級ごとに可視化することで、データの背後にあるパターンや傾向を視覚的に把握できます。特に、性別や階級が生存率に与える影響を視覚化することで、どの要素が生存に寄与したのかを理解するのに役立ちます。

ライブラリのインポート

可視化に必要なライブラリであるmatplotlibseabornをインポートします。これらのライブラリを使って、グラフを作成していきます。

参考コード

matplotlibは基本的なグラフ作成ライブラリで、seabornはその上に構築された可視化ライブラリです。sns.set()を使って、グラフのスタイルをシンプルなものに設定しています。

性別ごとの生存率

性別ごとに生存率を可視化するためには、棒グラフを使用します。seaborncountplot()を使って、生存者(Survivedが1)と非生存者(Survivedが0)の性別ごとの分布を視覚化します。

参考コード

階級ごとの生存率

次に、乗客の階級ごとに生存率を可視化します。1等級の乗客が3等級よりも生存率が高かったかどうかを確認するため、階級ごとの分布を描画します。

参考コード

性別や階級を使った予測モデルの作成

次に、タイタニック号データを使って、生存を予測するためのモデルを作成してみます。予測モデルの基本として、ロジスティック回帰を使用します。ロジスティック回帰は、2値分類問題(生存するかしないか)を解くためのシンプルかつ効果的な手法です。

モデル作成の手順

ロジスティック回帰モデルを作成する際の基本的な手順は次の通りです。

  1. データの前処理: 欠損値やカテゴリ変数を適切に処理します。
  2. 特徴量の選定: 性別や年齢、階級など、予測に必要な特徴量を選びます。
  3. モデルの学習: 訓練データを用いてロジスティック回帰モデルを学習させます。
  4. 予測の実行: テストデータを使って、生存するかどうかの予測を行います。

データの前処理

まず、モデルに適した形式にデータを整えます。数値データ以外のカテゴリデータ(性別や乗船港など)を数値に変換し、欠損値を補完します。

参考コード

ポイント

  • 性別の数値化: Sex列は、maleを0、femaleを1として数値化しています。これにより、機械学習モデルで扱える形式に変換します。
  • 不要な列の削除: Name, Ticket, Cabin, PassengerIdは予測に影響を与えないため削除します。
  • 目的変数と説明変数: Survivedが予測したい目的変数、その他が説明変数です。

2. データの分割

次に、データを訓練用とテスト用に分割します。これにより、モデルの精度を評価できるようになります。

参考コード

3. ロジスティック回帰モデルの学習

次に、ロジスティック回帰モデルを作成し、訓練データを使って学習させます。

参考コード

次に、タイタニック号データを使って、生存を予測するためのモデルを作成してみます。予測モデルの基本として、ロジスティック回帰を使用します。ロジスティック回帰は、2値分類問題(生存するかしないか)を解くためのシンプルかつ効果的な手法です。

以下では、ロジスティック回帰モデルを使って、「どのような人が生き残る可能性が高いか」を予測する流れを説明し、Kaggleの規約に沿った参考コードを提供します。

モデル作成の手順

ロジスティック回帰モデルを作成する際の基本的な手順は次の通りです。

  1. データの前処理: 欠損値やカテゴリ変数を適切に処理します。
  2. 特徴量の選定: 性別や年齢、階級など、予測に必要な特徴量を選びます。
  3. モデルの学習: 訓練データを用いてロジスティック回帰モデルを学習させます。
  4. 予測の実行: テストデータを使って、生存するかどうかの予測を行います。

1. データの前処理

まず、モデルに適した形式にデータを整えます。数値データ以外のカテゴリデータ(性別や乗船港など)を数値に変換し、欠損値を補完します。

参考コード

  • 性別の数値化: Sex列は、maleを0、femaleを1として数値化しています。これにより、機械学習モデルで扱える形式に変換します。
  • 不要な列の削除: Name, Ticket, Cabin, PassengerIdは予測に影響を与えないため削除します。
  • 目的変数と説明変数: Survivedが予測したい目的変数、その他が説明変数です。

2. データの分割

次に、データを訓練用とテスト用に分割します。これにより、モデルの精度を評価できるようになります。

参考コード

  • データの分割: train_test_splitを使って、80%を訓練用、20%をテスト用データとして分割します。

3. ロジスティック回帰モデルの学習

次に、ロジスティック回帰モデルを作成し、訓練データを使って学習させます。

参考コード

  • ロジスティック回帰のモデル: LogisticRegression()を使ってモデルを作成します。
  • モデルの学習: fit()関数で、訓練データ(X_train, y_train)を使ってモデルを学習させます。

4. 予測と精度の評価

学習したモデルを使ってテストデータで予測を行い、その精度を評価します。

参考コード

テストデータに基づく予測

学習したロジスティック回帰モデルを使って、テストデータを基に乗客の生存を予測するプロセスは、データ分析の最後の重要なステップです。この予測プロセスでは、テストデータをモデルに渡し、生存するかどうかを計算し、その結果を評価します。

テストデータでの生存予測の手順

モデルが学習されたら、そのモデルを使ってテストデータに対して予測を行います。テストデータは、予測したい未知のデータであり、生存したかどうかの結果はわかっていない状態です。ここでは、モデルを使って生存の確率を予測します。

テストデータの準備

まず、テストデータに対して同じ前処理を行います。学習に使った訓練データと同じ形式にするため、カテゴリ変数の変換や欠損値の処理を行います。

テストデータの前処理におけるステップ:

  • 性別(Sex)を数値に変換(maleは0、femaleは1)
  • 欠損値の補完(例えば、年齢の欠損値を中央値で補完)
  • 予測に関係ない列の削除(Name, Ticket, Cabin, PassengerId など)

モデルによる予測

テストデータが準備できたら、ロジスティック回帰モデルを使って生存の予測を行います。モデルが計算した生存の確率に基づいて、各乗客が生存するか(1)、しないか(0)を予測します。

参考コード

ポイント

  • 予測の実行: model.predict()を使って、テストデータに対して生存か非生存かの予測を実行します。
  • 予測結果の確認: 予測された結果は0または1の配列となり、各乗客が生存したかどうかが示されます。

3. 予測結果の保存

予測結果をKaggleに提出するためには、結果をCSVファイルとして保存します。PassengerIdSurvivedの列を持つデータフレームを作成し、CSVファイルに書き出す必要があります。

参考コード

ポイント

  • PassengerIdの利用: テストデータのPassengerIdをそのまま利用して、乗客ごとの予測結果を紐付けます。
  • CSVの作成: 結果をKaggleの提出形式に合わせたCSVファイル(titanic_submission.csv)として保存します。これで、予測結果をKaggleに提出できる準備が整います。

実際のコードはこちらから確認できます

今回の予測モデル

使用したデータ

今回の予測では、以下の特徴量(変数)を基に、乗客が生き残ったかどうかを予測しています。

  1. 性別 (Sex):
    • 性別が生存に大きな影響を与える可能性があるため、性別を変数として使用しました。
    • male(男性)は 0female(女性)は 1 に変換して使用しています。
    • 歴史的に、女性や子供が優先的に救助されたため、性別が生存率に大きな影響を与えることが予想されます。
  2. 社会階級 (Pclass):
    • 船室の等級(クラス)も生存に影響を与えると考えられます。1等級の乗客は上流階級であり、より早く救命ボートに乗れる可能性が高かったことが考えられます。
    • Pclass1(1等級)から 3(3等級)までの数字で表されています。数字が小さいほど社会階級が高いことを示します。

予測モデル

今回使用した予測モデルはロジスティック回帰です。ロジスティック回帰は、ある出来事が発生する確率を予測するためのモデルです。具体的には、生存する確率(Survived1 になる確率)を性別と社会階級に基づいて予測します。

ロジスティック回帰モデルは、以下のように動作します:

  • 性別社会階級を元に、それぞれの乗客が生き残る確率を計算。
  • その確率が一定の閾値(通常は50%)を超えた場合、モデルは「生存する」と予測します。

予測の根拠

  1. 性別の影響:
    • 歴史的に、タイタニック号の沈没では女性が優先的に救助されたため、女性の生存率は男性よりも高いと予測されます。これは、「女性は生き残る確率が高い」という仮定に基づいています。
  2. 社会階級の影響:
    • 1等級の乗客は、3等級の乗客よりも生き残る可能性が高いと予測されます。これは、上流階級の乗客がより早く救命ボートにアクセスできた可能性があるからです。

予測結果

モデルは、以下の手順で予測を行います:

  1. 各乗客の性別(男性か女性か)と社会階級(1等級から3等級)に基づいて、生存する確率を計算。
  2. その確率が50%以上の場合、その乗客は「生存」と予測されます。50%未満の場合は「非生存」と予測されます。

具体的には、モデルは性別や社会階級などの特徴に基づいて「生存か非生存か」を予測することになります。

例えば、次のような予測が行われます:

  • 性別: 女性 (1), 社会階級: 1等級 (1) → 生存する可能性が高い
  • 性別: 男性 (0), 社会階級: 3等級 (3) → 生存する可能性が低い

このように、モデルは乗客の性別や社会階級を使って生存する可能性を予測します。

kaggleへ提出

Kaggleのスコアが0.76555という評価は、そのコンペティションの内容や評価指標によって解釈が異なりますが、いくつかの一般的な考え方を説明します。

  1. スコアの評価指標: Kaggleのコンペティションでは、精度やF1スコア、AUC(Area Under Curve)、RMSE(Root Mean Squared Error)などさまざまな評価指標が使用されます。スコアが0.76555であれば、その評価指標におけるモデルの性能が約76.6%であると解釈できます。例えば、分類問題で精度が0.76555であれば、テストデータに対して約76.6%の正解率があることを示します。
  2. ランキングと他の参加者との比較: Kaggleではスコアが他の参加者と比較されます。0.76555のスコアが良いかどうかは、ランキングで他の参加者と比較してどの位置にいるかによります。トップの参加者と比較してそれほど差がない場合、スコアが高評価されますが、もしトップとの差が大きい場合、改善の余地があると判断できます。
  3. 競技の難易度: そのコンペティションの難易度やスコアの分布にも影響されます。競技が非常に難しい場合、0.76555でも良いスコアと見なされることがあります。逆に、他の参加者が80%や90%以上のスコアを出している場合は、さらなる改善が必要かもしれません。

総合的な評価

  • 中間的なスコアといえるかもしれません。Kaggleでは通常、スコアの0.7〜0.8の範囲は「まあまあ良い」ですが、改善の余地があると考えるべきです。
  • 他の参加者と比較することで、そのスコアの相対的な意味を理解するのが重要です。

まとめ

今回のタイタニック号データ分析を通じて、データサイエンスの基本的なプロセスを体験していただきました。データの前処理から、特徴エンジニアリング、モデルの構築と評価、そして最終的なKaggleへの提出まで、実際のコードを交えながら説明しました。ロジスティック回帰を使った簡単なモデルでの予測を通じて、タイタニック号の乗客が生き残るかどうかを分析することができ、実際にKaggle上でスコアを得る流れもご紹介しました。

データサイエンス初心者の方でも、Kaggleのプラットフォームを活用して手を動かしながら学ぶことで、データ分析のスキルを着実に身に付けることができるはずです。この記事が、データ分析に興味を持っている方や、Kaggleでのチャレンジを始めたい方にとって、有益な第一歩となれば幸いです。次は、モデルの改良や他のアルゴリズムの試行など、さらなるチャレンジを通じて、より高度なデータ分析に挑戦してみましょう!

Pythonを学びたい方はこちらの記事を参考にしてみてください

プログラミング学習を進めているけれど、まだ副収入につなげられていない…そんなあなたへ!今こそ、学んだスキルを活かして副業に挑戦する絶好のチャンスです。プログラミングだけでなく、自分のスキルや商品をネットで販売する『ネットショップ』を開設してみませんか?

ネットショップを持つことで、自分の知識やスキルをより多くの人に届け、副収入を得ることが可能です。学んできたプログラミングを活かして、ショップのカスタマイズや運営も自由自在に行えますし、もし商品作成が難しい場合でも、デジタル商品やサービス提供など、いろんな選択肢があります。

このステップで一歩踏み出せば、今学んでいることが副収入に直結し、自分の時間をより有効に使うことができるはずです!一緒にネットショップを開設し、副業の第一歩を踏み出しましょう!

プログラミングを学びたいけど、どこから始めたらいいのか分からない、自分に合っているか不安…そんな悩みを持っている方におすすめしたいのが、 無料相談 サービスです!

この無料相談では、あなたの現状や目標に合わせて、最適な学習プランを一緒に考えてくれます。どんなスキルが必要なのか、どうやって学習を進めると効果的かを具体的にアドバイスしてもらえるので、無駄なく効率的にスタートを切ることができます。

さらに、プログラミング学習には同じ目標を持つ 仲間 がいること、そして頼りになる メンター の存在がとても大きな支えになります。独学ではどうしてもつまずきやすい部分も、メンターがあなたの成長に合わせて親身にサポートしてくれるので、安心して学びを進められます。

まずは 無料相談 で、あなたに合ったプランを見つけて、スキルアップへの第一歩を踏み出してみませんか?今なら、迷っている方でも気軽に相談できるチャンスです!

テックアカデミー無料メンター相談

-プログラミング学習
-, , , , , , ,