ทำนายจำนวนประชากรของไทยด้วย Scikit-learn ใน Python

สวัสดีผู้อ่านทุกท่านครับ บทความนี้ผมจะพาผู้อ่านไปสร้าง Machine learning ทำนายจำนวนประชากรของไทยด้วย Scikit-learn ในภาษา Python กันครับ

หมายเหตุ !

การทำนายในบทความนี้ เป็นเพียงตัวอย่างที่ผู้เขียนหยิบยกขึ้นมาเพื่อให้เข้าใจการสร้าง Machine learning ด้วย Scikit-learn ใน Python เท่านั้น ซึ่งไม่มีความแม่นยำเท่าไร (ไม่มีการรับประกัน % ความถูกต้องในการทำนาย) เนื่องจากการทำนายจำนวนประชากรต้องมีรายละเอียดปลีกย่อยเข้ามาช่วยคำนวณด้วยมากกว่านี้ แต่ในบทความนี้หยิบยกเพียงข้อมูลจำนวนประชากรมาใช้ในการเขียนบทความนี้

ในบทความนี้เราจะไปสร้าง machine learning ทำนายจำนวนประชากรของไทย แบบง่าย ๆ กันครับ

จากบทความก่อน ๆ Machine Learning ด้วย Scikit-learn ผมพาผู้อ่านใช้ Iris dataset สร้าง Machine learning ด้วย Scikit-learn ใน Python แบบง่าย ๆ แต่ถ้าหากต้องการนำ dataset ที่สร้างเองมาใช้ใน Scikit-learn ต้องทำอย่างไร เราไปลองสร้าง Machine learning จาก dataset ของตัวเองกันครับ

สร้าง dataset ข้อมูลประชากร

เข้าไปที่ http://countrymeters.info/en/Thailand จะเจอ

จะเห็นได้ว่า ข้อมูลมีตั้งแต่ปี ค.ศ.1951 - ค.ศ.2017 โดยข้อมูลจะถูกนับในเดือนมกราคมของปีนั้น
ทำการคัดลอกช่อง Population มา แล้วจับใส่ list ในโค้ด Python

ดูโค้ดได้ที่ https://gist.github.com/wannaphongcom/2269f8d9a032ab8cd9836890045c0343
มีทั้งหมด 67 บรรทัด

นำเข้า dataset เข้ามาใช้ใน Scikit-learn

เนื่องจากข้อมูลเรียงเป็นปี ในการเอาไปใช้ใน Scikit-learn เราต้องแปลงข้อมูลโดยจัดเรียงตามเวลาต้องใช้ pandas กับ numpy เข้ามาช่วยด้วย และใช้ matplotlib ในการนำเสนอข้อมูลในรูปกราฟ
คำสั่งควรรู้เกี่ยวกับ pandas
pandas.date_range(เวลา,periods=จำนวน,freq=ความถี่)เป็นคำสั่งสำหรับสร้างช่วงเวลาจะได้ไม่ต้องมาไล่พิมพ์ข้อมูลเวลาวันเดือนปี - อ่านเพิ่มเติม http://pandas.pydata.org/pandas-docs/stable/generated/pandas.date_range.html
pandas.DataFrame() ใช้สร้างข้อมูลแต่ละช่วงเวลา - อ่านเพิ่มเติม http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.html


ดูโค้ดได้ที่ https://gist.github.com/wannaphongcom/f4c3ba45981188ed2f4ff9ace749aef3

จำนวนประชากรของไทยตั้งแต่ปี 1951 - ปี 2017
จำนวนประชากรของไทยตั้งแต่ปี 1951 - ปี 2017

เลือก Algorithms ที่ใช้งาน

จาก
ข้อมูลประชากรที่เราเลือก มีข้อมูลมากกว่า 50 ขึ้นไป ไม่ต้องการทำนาย category แต่เราต้องการทำนาย quantity และข้อมูลเราน้อยกว่า 100K และข้อมูลเราสำคัญพอ ๆ กัน  ไม่ใช่ few features should be important สุดท้ายจึงมาตกที่ LinearRegression

from sklearn.linear_model import LinearRegression
model = LinearRegression()

ลงมือทำการทำนายข้อมูลประชากรด้วย Scikit-learn ในภาษา Python

X = data[['date_ordinal']]
y =np.asarray(data['value'])
model.fit(X, y) # ทำการวิเคราะห์

แล้วทำการทำนาย ลองทำนายจำนวนประชากรปี ค.ศ.2018

# ทำนายแบบปีเดียว
time2 = pd.date_range('2018', periods=1)
x= time2.tolist()
x=x[0].toordinal()
print(model.predict(x))

ผลลัพธ์ [ 74384505.71644115]
ทำนายว่าในปี ค.ศ.2018 จำนวนประชากรของไทยจะมีจำนวน 74,384,506 คน

ทำนายแบบหลายปีโดยนำเสนอบนกราฟ

ดูโค้ดได้ที่ https://gist.github.com/wannaphongcom/f74625ec7e02a0c7ff57169ae7e80d7b
ผลลัพธ์

จากการทำนายแบบไม่ละเอียด จะพบว่าในปี ค.ศ.2028 จำนวนประชากรของไทยน่าจะใกล้ 80 ล้านคน

โค้ดฉบับเต็ม

หากไม่ขึ้น กดดูโค้ดฉบับเต็มได้ที่ https://gist.github.com/wannaphongcom/e265b8d01e4ed7fe1e3aa6481adeb1a6
ลองนำความรู้ที่ได้ไปประยุกต์กันดูนะครับ

สอน Python

ติดตามบทตวามต่อไปนะครับ
ขอบคุณครับ

7 thoughts on “ทำนายจำนวนประชากรของไทยด้วย Scikit-learn ใน Python

  1. art

    กรณีพี่จะทำtools สำหรับทำนายการเพ่ิมขึ้นรายได้ของบุคคลไปช่วยแนะนำเบือ่งต้นหน่อยครับ
    ขอบคุณครับ

    Reply
    1. wannaphong

      ต้องเตรียมข้อมูลประวัติรายได้ครับ โดยจะต้องเป็นข้อมูลเชิงปริมาณ เรียงตามเวลา แล้วนำเวลาไปแปลงเป็น proleptic Gregorian ordinal เสร็จแล้ว นำไปสร้าง ML ได้เลยครับ

      Reply
  2. art

    เราสามารถใช้ python ทำการพยากรระดับ คน ระดับตำบล ระดับอำเภอ ระดับจังหวัด ระดับประเทศได้ใหมสามารถแนะนำได้ครับ เพราะพี่กำลังเริ่มเขียน
    คอนเซป์
    1เรามีไฟล์มาเป็นแนวนอน.txt
    2.ตอ้งการ import เข้าไปใน python
    3.เลือกระยะเวลา รายเดือน รายปี ในการทำนาย
    4.ทำทั้งแบบ linear ,time seriesและ Scikit-learn
    5.plot เปรียบเทียบ
    6,generate เป็นcsv ออกมา
    ขอบคุณครับ
    พี่อาร์ต

    Reply
    1. wannaphong

      ส่วนข้อมูล ผมแนะนำว่าถ้าเป็น csv จะนำเข้ามา import ง่ายกว่า txt ครับ
      ตรงข้อ 4 นี้ใช้ Scikit-learn ในการทำครับ ส่วน linear เป็น Algorithms หนึ่งของ Scikit-learn
      ส่วน time series ใช้แปลงข้อ 3 มาครับ แล้วนำไปแปลงเป็น proleptic Gregorian ordinal อีกที ก่อนเอาเข้า Scikit-learn ที่ต้องแปลงเพื่อให้ Scikit-learn รับข้อมูลมาคำนวณได้ครับ

      Reply
  3. art

    สุดยอดเลยน้อง
    ช่วยเอาแบบcode แบบ step by step อีกทีได้ใหมครับ
    ขอบคุณครับ
    พี่อาร์ต

    Reply
  4. art

    พี่ลองเปลี่ยนค่าแต่ว่าได้แค่ปีเดียวส่วน 10ปีไม่ขึ้นช่วยดูหนอ่ยว่าผิดตรงใหนครับ
    ZXY = [0,
    13.14,
    13.06,
    37.20,
    44.45,
    49.32,
    57.14,
    64.89,
    71.84,
    79.71,
    87.91,
    100.41,
    110.02,
    116.49,
    126.60,
    128.79
    ]

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    time = pd.date_range('1951',periods=16,freq='A')
    listtime=time.tolist()
    plt.plot(listtime,ZXY)
    plt.show()#แสดงข้อมูลประชากรจากอดีต
    data=pd.dataFrame({'date':time.value,'value':ZXY})
    date['data_ordinal'] = data['data'].apply(lambda x: x.toordinal()) # แปลงวันเดือนปีไปเป็น proleptic Gregorian ordinal

    # เลือก Algorithms ที่ใช้งาน
    from sklearn.linear_model import LinearRegression
    model = LinearRegression()

    #ลงมือทำการทำนายข้อมูลประชากรด้วย Scikit-learn ในภาษา Python
    X = data [['date_ordinal']]
    y = np.asarry(data['value'])
    model.fit(X, y) # ทำการวิเคราะห์

    #ทำนายแบบปีเดียว
    time2 = pd.data_range('1967', periods=1)
    x = time2.tolist()
    x=x[0].toordinal()
    print(model.predict(x))

    #ทำนายแบบแสดงกราฟ 10ปี
    time2 = pd.date_range('1967', periods=10, freq='A')
    data2=pd.DataFrame({'data':time2.values})
    data2['date_ordinal'] = data2['date'].apply(lambda x: x.toordinal())
    x=data2[['date_ordinal']]
    aa=pd.DataFrame({'date':time2,'value':model.predict(x)})
    plt.plot(listtime+time2.tolist(),ZXY+list(model.predict(x)))
    plt.show()

    Reply
    1. wannaphong

      เขียนคำสั่งผิดหลายครับ pd.data_range ต้องเป็น pd.date_range และชื่อตัวแปรพิมพ์ผิดครับ

      ZXY = [0.0,
      13.14,
      13.06,
      37.20,
      44.45,
      49.32,
      57.14,
      64.89,
      71.84,
      79.71,
      87.91,
      100.41,
      110.02,
      116.49,
      126.60,
      128.79
      ]
      
      import pandas as pd
      import numpy as np
      import matplotlib.pyplot as plt
      time = pd.date_range('1951',periods=16,freq='A')
      listtime=time.tolist()
      plt.plot(listtime,ZXY)
      plt.show()#แสดงข้อมูลประชากรจากอดีต
      data=pd.DataFrame({'date':time.values,'value':ZXY})
      data['date_ordinal'] = data['date'].apply(lambda x: x.toordinal()) # แปลงวันเดือนปีไปเป็น proleptic Gregorian ordinal
      
      # เลือก Algorithms ที่ใช้งาน
      from sklearn.linear_model import LinearRegression
      model = LinearRegression()
      
      #ลงมือทำการทำนายข้อมูลประชากรด้วย Scikit-learn ในภาษา Python
      X = data[['date_ordinal']]
      y = np.asarray(data['value'])
      model.fit(X, y) # ทำการวิเคราะห์
      
      #ทำนายแบบปีเดียว
      time2 = pd.date_range('1967', periods=1)
      x = time2.tolist()
      x=x[0].toordinal()
      print(model.predict(x))
      
      #ทำนายแบบแสดงกราฟ 10ปี
      time2 = pd.date_range('1967', periods=10, freq='A')
      data2=pd.DataFrame({'date':time2.values})
      data2['date_ordinal'] = data2['date'].apply(lambda x: x.toordinal())
      x=data2[['date_ordinal']]
      aa=pd.DataFrame({'date':time2,'value':model.predict(x)})
      plt.plot(listtime+time2.tolist(),ZXY+list(model.predict(x)))
      plt.show()
      
      Reply

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องที่ต้องการถูกทำเครื่องหมาย *